From 405b5090557cf4029139471f672dca81fefacecc Mon Sep 17 00:00:00 2001 From: Samuel Jackson Date: Mon, 14 Apr 2014 10:15:17 +0100 Subject: [PATCH 001/284] Refs #7860 Move existing code into python algorithm. --- .../WorkflowAlgorithms/Symmetrise.py | 161 ++++++++++++++---- 1 file changed, 128 insertions(+), 33 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py index 8fc7432fad09..29d93d5701bd 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py @@ -5,43 +5,138 @@ *WIKI*""" -# Algorithm to start Symmetrise +from mantid import config, logger, mtd from mantid.api import PythonAlgorithm, AlgorithmFactory from mantid.kernel import StringListValidator, StringMandatoryValidator +from mantid.simpleapi import * +import sys, platform, math, os.path, numpy as np class Symmetrise(PythonAlgorithm): + + def category(self): + return "Workflow\\MIDAS;PythonAlgorithms" + + def PyInit(self): + self.setOptionalMessage("Takes and asymmetric S(Q,w) and makes it symmetric") + self.setWikiSummary("Takes and asymmetric S(Q,w) and makes it symmetric") + + self.declareProperty(name='InputType',defaultValue='File',validator=StringListValidator(['File','Workspace']), doc='Origin of data input - File (_red.nxs) or Workspace') + self.declareProperty(name='Instrument',defaultValue='iris',validator=StringListValidator(['irs','iris','osi','osiris']), doc='Instrument') + self.declareProperty(name='Analyser',defaultValue='graphite002',validator=StringListValidator(['graphite002','graphite004']), doc='Analyser & reflection') + self.declareProperty(name='SamNumber',defaultValue='',validator=StringMandatoryValidator(), doc='Sample run number') + self.declareProperty(name='Xcut',defaultValue='',validator=StringMandatoryValidator(), doc='X cutoff value') + self.declareProperty('Verbose',defaultValue=True, doc='Switch Verbose Off/On') + self.declareProperty('Plot',defaultValue=True, doc='Switch Plot Off/On') + self.declareProperty('Save',defaultValue=False, doc='Switch Save result to nxs file Off/On') - def category(self): - return "Workflow\\MIDAS;PythonAlgorithms" - - def PyInit(self): - self.setOptionalMessage("Takes and asymmetric S(Q,w) and makes it symmetric") - self.setWikiSummary("Takes and asymmetric S(Q,w) and makes it symmetric") - - self.declareProperty(name='InputType',defaultValue='File',validator=StringListValidator(['File','Workspace']), doc='Origin of data input - File (_red.nxs) or Workspace') - self.declareProperty(name='Instrument',defaultValue='iris',validator=StringListValidator(['irs','iris','osi','osiris']), doc='Instrument') - self.declareProperty(name='Analyser',defaultValue='graphite002',validator=StringListValidator(['graphite002','graphite004']), doc='Analyser & reflection') - self.declareProperty(name='SamNumber',defaultValue='',validator=StringMandatoryValidator(), doc='Sample run number') - self.declareProperty(name='Xcut',defaultValue='',validator=StringMandatoryValidator(), doc='X cutoff value') - self.declareProperty('Verbose',defaultValue=True, doc='Switch Verbose Off/On') - self.declareProperty('Plot',defaultValue=True, doc='Switch Plot Off/On') - self.declareProperty('Save',defaultValue=False, doc='Switch Save result to nxs file Off/On') - - def PyExec(self): - - self.log().information('Symmetrise') - inType = self.getPropertyValue('InputType') - prefix = self.getPropertyValue('Instrument') - ana = self.getPropertyValue('Analyser') - sn = self.getPropertyValue('SamNumber') - sam = prefix+sn+'_'+ana+'_red' - cut = self.getPropertyValue('Xcut') - cut = float(cut) - - verbOp = self.getProperty('Verbose').value - plotOp = self.getProperty('Plot').value - saveOp = self.getProperty('Save').value - import IndirectSymm as Main - Main.SymmStart(inType,sam,cut,verbOp,plotOp,saveOp) + def PyExec(self): + + self.log().information('Symmetrise') + inType = self.getPropertyValue('InputType') + prefix = self.getPropertyValue('Instrument') + ana = self.getPropertyValue('Analyser') + sn = self.getPropertyValue('SamNumber') + sam = prefix+sn+'_'+ana+'_red' + cut = self.getPropertyValue('Xcut') + cut = float(cut) + + verbOp = self.getProperty('Verbose').value + plotOp = self.getProperty('Plot').value + saveOp = self.getProperty('Save').value + + self.SymmStart(inType,sam,cut,verbOp,plotOp,saveOp) + + + def SymmRun(self, sample,cut,Verbose,Plot,Save): + workdir = config['defaultsave.directory'] + symWS = sample[:-3] + 'sym' + hist,npt = CheckHistZero(sample) + Xin = mtd[sample].readX(0) + delx = Xin[1]-Xin[0] + if math.fabs(cut) < 1e-5: + error = 'Cut point is Zero' + logger.notice('ERROR *** ' + error) + sys.exit(error) + for n in range(0,npt): + x = Xin[n]-cut + if math.fabs(x) < delx: + ineg = n + if ineg <= 0: + error = 'Negative point('+str(ineg)+') < 0' + logger.notice('ERROR *** ' + error) + sys.exit(error) + if ineg >= npt: + error = type + 'Negative point('+str(ineg)+') > '+str(npt) + logger.notice('ERROR *** ' + error) + sys.exit(error) + for n in range(0,npt): + x = Xin[n]+Xin[ineg] + if math.fabs(x) < delx: + ipos = n + if ipos <= 0: + error = 'Positive point('+str(ipos)+') < 0' + logger.notice('ERROR *** ' + error) + sys.exit(error) + if ipos >= npt: + error = type + 'Positive point('+str(ipos)+') > '+str(npt) + logger.notice('ERROR *** ' + error) + sys.exit(error) + ncut = npt-ipos+1 + if Verbose: + logger.notice('No. points = '+str(npt)) + logger.notice('Negative : at i ='+str(ineg)+' ; x = '+str(Xin[ineg])) + logger.notice('Positive : at i ='+str(ipos)+' ; x = '+str(Xin[ipos])) + logger.notice('Copy points = '+str(ncut)) + for m in range(0,hist): + Xin = mtd[sample].readX(m) + Yin = mtd[sample].readY(m) + Ein = mtd[sample].readE(m) + Xout = [] + Yout = [] + Eout = [] + for n in range(0,ncut): + icut = npt-n-1 + Xout.append(-Xin[icut]) + Yout.append(Yin[icut]) + Eout.append(Ein[icut]) + for n in range(ncut,npt): + Xout.append(Xin[n]) + Yout.append(Yin[n]) + Eout.append(Ein[n]) + if m == 0: + CreateWorkspace(OutputWorkspace=symWS, DataX=Xout, DataY=Yout, DataE=Eout, + Nspec=1, UnitX='DeltaE') + else: + CreateWorkspace(OutputWorkspace='__tmp', DataX=Xout, DataY=Yout, DataE=Eout, + Nspec=1, UnitX='DeltaE') + ConjoinWorkspaces(InputWorkspace1=symWS, InputWorkspace2='__tmp',CheckOverlapping=False) + if Save: + path = os.path.join(workdir,symWS+'.nxs') + SaveNexusProcessed(InputWorkspace=symWS, Filename=path) + if Verbose: + logger.notice('Output file : ' + path) + if Plot: + self.plotSymm(symWS,sample) + + def SymmStart(self, inType,sname,cut,Verbose,Plot,Save): + from IndirectCommon import CheckHistZero, StartTime, EndTime, getDefaultWorkingDirectory + from IndirectImport import import_mantidplot + + StartTime('Symmetrise') + workdir = config['defaultsave.directory'] + if inType == 'File': + spath = os.path.join(workdir, sname+'.nxs') # path name for sample nxs file + LoadNexusProcessed(FileName=spath, OutputWorkspace=sname) + message = 'Input from File : '+spath + else: + message = 'Input from Workspace : '+sname + if Verbose: + logger.notice(message) + self.SymmRun(sname,cut,Verbose,Plot,Save) + EndTime('Symmetrise') + + def plotSymm(self, sym,sample): + mp = import_mantidplot() + tot_plot=mp.plotSpectrum([sym,sample],0) AlgorithmFactory.subscribe(Symmetrise) # Register algorithm with Mantid From bf80fa0ce81733b929af4f7d303c1e455f2832e3 Mon Sep 17 00:00:00 2001 From: Samuel Jackson Date: Mon, 14 Apr 2014 11:15:37 +0100 Subject: [PATCH 002/284] Refs #7860 Modify algorithm to just take a workspace as input. Also do some light refactoring at the same time. --- .../WorkflowAlgorithms/Symmetrise.py | 164 +++++++++--------- 1 file changed, 85 insertions(+), 79 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py index 29d93d5701bd..902d58eed6d4 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py @@ -1,13 +1,13 @@ """*WIKI* Symmetrise takes an asymmetric S(Q,w) - i.e. one in which the moduli of xmin & xmax are different. Typically xmax is > mod(xmin). -A negative value of x is chosen (Xcut) so that the curve for mod(Xcut) to xmax is reflected and inserted for x less than the Xcut. +A negative value of x is chosen (XCut) so that the curve for mod(XCut) to xmax is reflected and inserted for x less than the XCut. *WIKI*""" from mantid import config, logger, mtd -from mantid.api import PythonAlgorithm, AlgorithmFactory -from mantid.kernel import StringListValidator, StringMandatoryValidator +from mantid.api import PythonAlgorithm, AlgorithmFactory, WorkspaceProperty +from mantid.kernel import StringListValidator, StringMandatoryValidator, Direction from mantid.simpleapi import * import sys, platform, math, os.path, numpy as np @@ -17,126 +17,132 @@ def category(self): return "Workflow\\MIDAS;PythonAlgorithms" def PyInit(self): - self.setOptionalMessage("Takes and asymmetric S(Q,w) and makes it symmetric") - self.setWikiSummary("Takes and asymmetric S(Q,w) and makes it symmetric") - - self.declareProperty(name='InputType',defaultValue='File',validator=StringListValidator(['File','Workspace']), doc='Origin of data input - File (_red.nxs) or Workspace') - self.declareProperty(name='Instrument',defaultValue='iris',validator=StringListValidator(['irs','iris','osi','osiris']), doc='Instrument') - self.declareProperty(name='Analyser',defaultValue='graphite002',validator=StringListValidator(['graphite002','graphite004']), doc='Analyser & reflection') - self.declareProperty(name='SamNumber',defaultValue='',validator=StringMandatoryValidator(), doc='Sample run number') - self.declareProperty(name='Xcut',defaultValue='',validator=StringMandatoryValidator(), doc='X cutoff value') - self.declareProperty('Verbose',defaultValue=True, doc='Switch Verbose Off/On') - self.declareProperty('Plot',defaultValue=True, doc='Switch Plot Off/On') - self.declareProperty('Save',defaultValue=False, doc='Switch Save result to nxs file Off/On') + self.setOptionalMessage("Takes an asymmetric S(Q,w) and makes it symmetric") + self.setWikiSummary("Takes an asymmetric S(Q,w) and makes it symmetric") + + self.declareProperty(WorkspaceProperty("Sample", "", Direction.Input), doc='Sample to run with') + self.declareProperty('XCut', 0.0, doc='X cut off value') + + self.declareProperty('Verbose',defaultValue=True, doc='Switch verbose output Off/On') + self.declareProperty('Plot',defaultValue=True, doc='Switch plotting Off/On') + self.declareProperty('Save',defaultValue=False, doc='Switch saving result to nxs file Off/On') + self.declareProperty(WorkspaceProperty("OutputWorkspace", "", Direction.Output), doc='Name to call the output workspace.') + def PyExec(self): + from IndirectCommon import CheckHistZero, StartTime, EndTime, getDefaultWorkingDirectory - self.log().information('Symmetrise') - inType = self.getPropertyValue('InputType') - prefix = self.getPropertyValue('Instrument') - ana = self.getPropertyValue('Analyser') - sn = self.getPropertyValue('SamNumber') - sam = prefix+sn+'_'+ana+'_red' - cut = self.getPropertyValue('Xcut') - cut = float(cut) - - verbOp = self.getProperty('Verbose').value - plotOp = self.getProperty('Plot').value - saveOp = self.getProperty('Save').value + StartTime('Symmetrise') + self._setup() + num_spectra, npt = CheckHistZero(self._sample) - self.SymmStart(inType,sam,cut,verbOp,plotOp,saveOp) + sample_x = mtd[self._sample].readX(0) + if math.fabs(self._x_cut) < 1e-5: + raise ValueError('XCut point is Zero') + + delta_x = sample_x[1]-sample_x[0] + # diff = np.absolute(sample_x - self._x_cut) + # ineg = np.where(diff < delta_x)[0] - def SymmRun(self, sample,cut,Verbose,Plot,Save): - workdir = config['defaultsave.directory'] - symWS = sample[:-3] + 'sym' - hist,npt = CheckHistZero(sample) - Xin = mtd[sample].readX(0) - delx = Xin[1]-Xin[0] - if math.fabs(cut) < 1e-5: - error = 'Cut point is Zero' - logger.notice('ERROR *** ' + error) - sys.exit(error) - for n in range(0,npt): - x = Xin[n]-cut - if math.fabs(x) < delx: + for n in range(npt): + x = sample_x[n]-self._x_cut + if math.fabs(x) < delta_x: ineg = n + if ineg <= 0: error = 'Negative point('+str(ineg)+') < 0' logger.notice('ERROR *** ' + error) sys.exit(error) + if ineg >= npt: error = type + 'Negative point('+str(ineg)+') > '+str(npt) logger.notice('ERROR *** ' + error) sys.exit(error) - for n in range(0,npt): - x = Xin[n]+Xin[ineg] - if math.fabs(x) < delx: + + for n in range(npt): + x = sample_x[n]+sample_x[ineg] + if math.fabs(x) < delta_x: ipos = n + if ipos <= 0: error = 'Positive point('+str(ipos)+') < 0' logger.notice('ERROR *** ' + error) sys.exit(error) + if ipos >= npt: error = type + 'Positive point('+str(ipos)+') > '+str(npt) logger.notice('ERROR *** ' + error) sys.exit(error) + ncut = npt-ipos+1 - if Verbose: + + if self._verbose: logger.notice('No. points = '+str(npt)) - logger.notice('Negative : at i ='+str(ineg)+' ; x = '+str(Xin[ineg])) - logger.notice('Positive : at i ='+str(ipos)+' ; x = '+str(Xin[ipos])) - logger.notice('Copy points = '+str(ncut)) - for m in range(0,hist): - Xin = mtd[sample].readX(m) - Yin = mtd[sample].readY(m) - Ein = mtd[sample].readE(m) + logger.notice('Negative : at i ='+str(ineg)+' ; x = '+str(sample_x[ineg])) + logger.notice('Positive : at i ='+str(ipos)+' ; x = '+str(sample_x[ipos])) + logger.notice('Copy points = '+str(xcut)) + + for m in range(num_spectra): + sample_x = mtd[self._sample].readX(m) + Yin = mtd[self._sample].readY(m) + Ein = mtd[self._sample].readE(m) Xout = [] Yout = [] Eout = [] for n in range(0,ncut): icut = npt-n-1 - Xout.append(-Xin[icut]) + Xout.append(-sample_x[icut]) Yout.append(Yin[icut]) Eout.append(Ein[icut]) for n in range(ncut,npt): - Xout.append(Xin[n]) + Xout.append(sample_x[n]) Yout.append(Yin[n]) Eout.append(Ein[n]) + if m == 0: - CreateWorkspace(OutputWorkspace=symWS, DataX=Xout, DataY=Yout, DataE=Eout, + CreateWorkspace(OutputWorkspace=self._output_workspace, DataX=Xout, DataY=Yout, DataE=Eout, Nspec=1, UnitX='DeltaE') else: CreateWorkspace(OutputWorkspace='__tmp', DataX=Xout, DataY=Yout, DataE=Eout, Nspec=1, UnitX='DeltaE') - ConjoinWorkspaces(InputWorkspace1=symWS, InputWorkspace2='__tmp',CheckOverlapping=False) - if Save: - path = os.path.join(workdir,symWS+'.nxs') - SaveNexusProcessed(InputWorkspace=symWS, Filename=path) - if Verbose: - logger.notice('Output file : ' + path) - if Plot: - self.plotSymm(symWS,sample) - - def SymmStart(self, inType,sname,cut,Verbose,Plot,Save): - from IndirectCommon import CheckHistZero, StartTime, EndTime, getDefaultWorkingDirectory - from IndirectImport import import_mantidplot + ConjoinWorkspaces(InputWorkspace1=self._output_workspace, InputWorkspace2='__tmp',CheckOverlapping=False) - StartTime('Symmetrise') - workdir = config['defaultsave.directory'] - if inType == 'File': - spath = os.path.join(workdir, sname+'.nxs') # path name for sample nxs file - LoadNexusProcessed(FileName=spath, OutputWorkspace=sname) - message = 'Input from File : '+spath - else: - message = 'Input from Workspace : '+sname - if Verbose: - logger.notice(message) - self.SymmRun(sname,cut,Verbose,Plot,Save) + + if self._save: + workdir = getDefaultWorkingDirectory() + file_path = os.path.join(workdir,self._output_workspace+'.nxs') + SaveNexusProcessed(InputWorkspace=self._output_workspace, Filename=file_path) + + if self._verbose: + logger.notice('Output file : ' + file_path) + + if self._plot: + self._plotSymmetrise() + + self.setProperty("OutputWorkspace", self._output_workspace) EndTime('Symmetrise') - def plotSymm(self, sym,sample): + + def _setup(self): + """ + Get the algorithm properties. + """ + self._sample = self.getPropertyValue('Sample') + self._x_cut = self.getProperty('XCut').value + + self._verbose = self.getProperty('Verbose').value + self._plot = self.getProperty('Plot').value + self._save = self.getProperty('Save').value + + self._output_workspace = self.getPropertyValue('OutputWorkspace') + + def _plotSymmetrise(self): + """ + Plot the first spectrum of the input and output workspace together + """ + from IndirectImport import import_mantidplot mp = import_mantidplot() - tot_plot=mp.plotSpectrum([sym,sample],0) + tot_plot = mp.plotSpectrum([self._output_workspace, self._sample],0) AlgorithmFactory.subscribe(Symmetrise) # Register algorithm with Mantid From 01ee9ecdc780c6023eb8715c89ddaf2f5d9cec35 Mon Sep 17 00:00:00 2001 From: Samuel Jackson Date: Mon, 14 Apr 2014 13:23:28 +0100 Subject: [PATCH 003/284] Refs #7860 Refactor code with numpy and slicing. --- .../WorkflowAlgorithms/Symmetrise.py | 126 ++++++++---------- 1 file changed, 58 insertions(+), 68 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py index 902d58eed6d4..e5d862c173c9 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py @@ -5,11 +5,15 @@ *WIKI*""" -from mantid import config, logger, mtd +from mantid import logger, mtd from mantid.api import PythonAlgorithm, AlgorithmFactory, WorkspaceProperty -from mantid.kernel import StringListValidator, StringMandatoryValidator, Direction +from mantid.kernel import Direction from mantid.simpleapi import * -import sys, platform, math, os.path, numpy as np + +import math +import os.path +import numpy as np + class Symmetrise(PythonAlgorithm): @@ -35,80 +39,52 @@ def PyExec(self): StartTime('Symmetrise') self._setup() num_spectra, npt = CheckHistZero(self._sample) - sample_x = mtd[self._sample].readX(0) if math.fabs(self._x_cut) < 1e-5: raise ValueError('XCut point is Zero') delta_x = sample_x[1]-sample_x[0] - # diff = np.absolute(sample_x - self._x_cut) - # ineg = np.where(diff < delta_x)[0] - for n in range(npt): - x = sample_x[n]-self._x_cut - if math.fabs(x) < delta_x: - ineg = n - - if ineg <= 0: - error = 'Negative point('+str(ineg)+') < 0' - logger.notice('ERROR *** ' + error) - sys.exit(error) - - if ineg >= npt: - error = type + 'Negative point('+str(ineg)+') > '+str(npt) - logger.notice('ERROR *** ' + error) - sys.exit(error) - - for n in range(npt): - x = sample_x[n]+sample_x[ineg] - if math.fabs(x) < delta_x: - ipos = n - - if ipos <= 0: - error = 'Positive point('+str(ipos)+') < 0' - logger.notice('ERROR *** ' + error) - sys.exit(error) - - if ipos >= npt: - error = type + 'Positive point('+str(ipos)+') > '+str(npt) - logger.notice('ERROR *** ' + error) - sys.exit(error) - + negative_diff = np.absolute(sample_x - self._x_cut) + ineg = np.where(negative_diff < delta_x)[0][-1] + self._check_bounds(ineg, npt, label='Negative') + + positive_diff = np.absolute(sample_x + sample_x[ineg]) + ipos = np.where(positive_diff < delta_x)[0][-1] + self._check_bounds(ipos, npt, label='Positive') + ncut = npt-ipos+1 if self._verbose: - logger.notice('No. points = '+str(npt)) - logger.notice('Negative : at i ='+str(ineg)+' ; x = '+str(sample_x[ineg])) - logger.notice('Positive : at i ='+str(ipos)+' ; x = '+str(sample_x[ipos])) - logger.notice('Copy points = '+str(xcut)) + logger.notice('No. points = %d' % npt) + logger.notice('Negative : at i =%d; x = %f' % (ineg, sample_x[ineg])) + logger.notice('Positive : at i =%d; x = %f' % (ipos, sample_x[ipos])) + logger.notice('Copy points = %d' % ncut) - for m in range(num_spectra): - sample_x = mtd[self._sample].readX(m) - Yin = mtd[self._sample].readY(m) - Ein = mtd[self._sample].readE(m) - Xout = [] - Yout = [] - Eout = [] - for n in range(0,ncut): - icut = npt-n-1 - Xout.append(-sample_x[icut]) - Yout.append(Yin[icut]) - Eout.append(Ein[icut]) - for n in range(ncut,npt): - Xout.append(sample_x[n]) - Yout.append(Yin[n]) - Eout.append(Ein[n]) - - if m == 0: - CreateWorkspace(OutputWorkspace=self._output_workspace, DataX=Xout, DataY=Yout, DataE=Eout, - Nspec=1, UnitX='DeltaE') - else: - CreateWorkspace(OutputWorkspace='__tmp', DataX=Xout, DataY=Yout, DataE=Eout, - Nspec=1, UnitX='DeltaE') - ConjoinWorkspaces(InputWorkspace1=self._output_workspace, InputWorkspace2='__tmp',CheckOverlapping=False) + CloneWorkspace(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) + for m in xrange(num_spectra): + x = mtd[self._sample].readX(m) + y = mtd[self._output_workspace].readY(m) + e = mtd[self._output_workspace].readE(m) + + x_out = np.zeros(x.size) + y_out = np.zeros(y.size) + e_out = np.zeros(e.size) + + x_out[:ncut] = -x[npt:npt-ncut:-1] + y_out[:ncut] = y[npt:npt-ncut-1:-1] + e_out[:ncut] = e[npt:npt-ncut-1:-1] + x_out[ncut:] = x[ncut:] + y_out[ncut:] = y[ncut:] + e_out[ncut:] = e[ncut:] + + mtd[self._output_workspace].setX(m, np.asarray(x_out)) + mtd[self._output_workspace].setY(m, np.asarray(y_out)) + mtd[self._output_workspace].setE(m, np.asarray(e_out)) + if self._save: workdir = getDefaultWorkingDirectory() file_path = os.path.join(workdir,self._output_workspace+'.nxs') @@ -123,7 +99,6 @@ def PyExec(self): self.setProperty("OutputWorkspace", self._output_workspace) EndTime('Symmetrise') - def _setup(self): """ Get the algorithm properties. @@ -135,7 +110,21 @@ def _setup(self): self._plot = self.getProperty('Plot').value self._save = self.getProperty('Save').value - self._output_workspace = self.getPropertyValue('OutputWorkspace') + self._output_workspace = self.getPropertyValue('OutputWorkspace') + + def _check_bounds(self, index, num_pts, label=''): + """ + Check if the index falls within the bounds of the x range. + Throws a ValueError if the x point falls outside of the range. + + @param index - value of the index within the x range. + @param num_pts - total number of points in the range. + @param label - label to call the point if an error is thrown. + """ + if index <= 0: + raise ValueError('%s point %d < 0' % (label, index)) + elif index >= num_pts: + raise ValueError('%s point %d > %d' % (label, index, num_pts)) def _plotSymmetrise(self): """ @@ -143,6 +132,7 @@ def _plotSymmetrise(self): """ from IndirectImport import import_mantidplot mp = import_mantidplot() - tot_plot = mp.plotSpectrum([self._output_workspace, self._sample],0) + mp.plotSpectrum([self._output_workspace, self._sample],0) -AlgorithmFactory.subscribe(Symmetrise) # Register algorithm with Mantid +# Register algorithm with Mantid +AlgorithmFactory.subscribe(Symmetrise) From 47061039e6ec11c3e0bed5f7b15907673aac48e2 Mon Sep 17 00:00:00 2001 From: Samuel Jackson Date: Mon, 14 Apr 2014 13:44:16 +0100 Subject: [PATCH 004/284] Refs #7860 Fix PEP8 warnings. --- .../WorkflowAlgorithms/Symmetrise.py | 253 +++++++++--------- 1 file changed, 132 insertions(+), 121 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py index e5d862c173c9..0e38deff58ee 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py @@ -1,14 +1,15 @@ -"""*WIKI* - -Symmetrise takes an asymmetric S(Q,w) - i.e. one in which the moduli of xmin & xmax are different. Typically xmax is > mod(xmin). -A negative value of x is chosen (XCut) so that the curve for mod(XCut) to xmax is reflected and inserted for x less than the XCut. +"""*WIKI* +Symmetrise takes an asymmetric S(Q,w) - i.e. one in which the +moduli of xmin & xmax are different. Typically xmax is > mod(xmin). +A negative value of x is chosen (XCut) so that the curve for mod(XCut) to xmax +is reflected and inserted for x less than the XCut. *WIKI*""" from mantid import logger, mtd from mantid.api import PythonAlgorithm, AlgorithmFactory, WorkspaceProperty from mantid.kernel import Direction -from mantid.simpleapi import * +from mantid.simpleapi import CloneWorkspace, SaveNexusProcessed import math import os.path @@ -17,122 +18,132 @@ class Symmetrise(PythonAlgorithm): - def category(self): - return "Workflow\\MIDAS;PythonAlgorithms" - - def PyInit(self): - self.setOptionalMessage("Takes an asymmetric S(Q,w) and makes it symmetric") - self.setWikiSummary("Takes an asymmetric S(Q,w) and makes it symmetric") - - self.declareProperty(WorkspaceProperty("Sample", "", Direction.Input), doc='Sample to run with') - self.declareProperty('XCut', 0.0, doc='X cut off value') - - self.declareProperty('Verbose',defaultValue=True, doc='Switch verbose output Off/On') - self.declareProperty('Plot',defaultValue=True, doc='Switch plotting Off/On') - self.declareProperty('Save',defaultValue=False, doc='Switch saving result to nxs file Off/On') - - self.declareProperty(WorkspaceProperty("OutputWorkspace", "", Direction.Output), doc='Name to call the output workspace.') - - def PyExec(self): - from IndirectCommon import CheckHistZero, StartTime, EndTime, getDefaultWorkingDirectory - - StartTime('Symmetrise') - self._setup() - num_spectra, npt = CheckHistZero(self._sample) - sample_x = mtd[self._sample].readX(0) - - if math.fabs(self._x_cut) < 1e-5: - raise ValueError('XCut point is Zero') - - delta_x = sample_x[1]-sample_x[0] - - negative_diff = np.absolute(sample_x - self._x_cut) - ineg = np.where(negative_diff < delta_x)[0][-1] - self._check_bounds(ineg, npt, label='Negative') - - positive_diff = np.absolute(sample_x + sample_x[ineg]) - ipos = np.where(positive_diff < delta_x)[0][-1] - self._check_bounds(ipos, npt, label='Positive') - - ncut = npt-ipos+1 - - if self._verbose: - logger.notice('No. points = %d' % npt) - logger.notice('Negative : at i =%d; x = %f' % (ineg, sample_x[ineg])) - logger.notice('Positive : at i =%d; x = %f' % (ipos, sample_x[ipos])) - logger.notice('Copy points = %d' % ncut) - - CloneWorkspace(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) - - for m in xrange(num_spectra): - x = mtd[self._sample].readX(m) - y = mtd[self._output_workspace].readY(m) - e = mtd[self._output_workspace].readE(m) - - x_out = np.zeros(x.size) - y_out = np.zeros(y.size) - e_out = np.zeros(e.size) - - x_out[:ncut] = -x[npt:npt-ncut:-1] - y_out[:ncut] = y[npt:npt-ncut-1:-1] - e_out[:ncut] = e[npt:npt-ncut-1:-1] - - x_out[ncut:] = x[ncut:] - y_out[ncut:] = y[ncut:] - e_out[ncut:] = e[ncut:] - - mtd[self._output_workspace].setX(m, np.asarray(x_out)) - mtd[self._output_workspace].setY(m, np.asarray(y_out)) - mtd[self._output_workspace].setE(m, np.asarray(e_out)) - - if self._save: - workdir = getDefaultWorkingDirectory() - file_path = os.path.join(workdir,self._output_workspace+'.nxs') - SaveNexusProcessed(InputWorkspace=self._output_workspace, Filename=file_path) - - if self._verbose: - logger.notice('Output file : ' + file_path) - - if self._plot: - self._plotSymmetrise() - - self.setProperty("OutputWorkspace", self._output_workspace) - EndTime('Symmetrise') - - def _setup(self): - """ - Get the algorithm properties. - """ - self._sample = self.getPropertyValue('Sample') - self._x_cut = self.getProperty('XCut').value - - self._verbose = self.getProperty('Verbose').value - self._plot = self.getProperty('Plot').value - self._save = self.getProperty('Save').value - - self._output_workspace = self.getPropertyValue('OutputWorkspace') - - def _check_bounds(self, index, num_pts, label=''): - """ - Check if the index falls within the bounds of the x range. - Throws a ValueError if the x point falls outside of the range. - - @param index - value of the index within the x range. - @param num_pts - total number of points in the range. - @param label - label to call the point if an error is thrown. - """ - if index <= 0: - raise ValueError('%s point %d < 0' % (label, index)) - elif index >= num_pts: - raise ValueError('%s point %d > %d' % (label, index, num_pts)) - - def _plotSymmetrise(self): - """ - Plot the first spectrum of the input and output workspace together - """ - from IndirectImport import import_mantidplot - mp = import_mantidplot() - mp.plotSpectrum([self._output_workspace, self._sample],0) + def category(self): + return "Workflow\\MIDAS;PythonAlgorithms" + + def PyInit(self): + self.setOptionalMessage("Takes an asymmetric S(Q,w) and makes it symmetric") + self.setWikiSummary("Takes an asymmetric S(Q,w) and makes it symmetric") + + self.declareProperty(WorkspaceProperty("Sample", "", Direction.Input), + doc='Sample to run with') + self.declareProperty('XCut', 0.0, doc='X cut off value') + + self.declareProperty('Verbose', defaultValue=True, + doc='Switch verbose output Off/On') + self.declareProperty('Plot', defaultValue=True, + doc='Switch plotting Off/On') + self.declareProperty('Save', defaultValue=False, + doc='Switch saving result to nxs file Off/On') + + self.declareProperty(WorkspaceProperty("OutputWorkspace", "", + Direction.Output), doc='Name to call the output workspace.') + + def PyExec(self): + from IndirectCommon import CheckHistZero, StartTime, EndTime, \ + getDefaultWorkingDirectory + + StartTime('Symmetrise') + self._setup() + num_spectra, num_pts = CheckHistZero(self._sample) + sample_x = mtd[self._sample].readX(0) + + if math.fabs(self._x_cut) < 1e-5: + raise ValueError('XCut point is Zero') + + delta_x = sample_x[1] - sample_x[0] + + negative_diff = np.absolute(sample_x - self._x_cut) + negative_index = np.where(negative_diff < delta_x)[0][-1] + self._check_bounds(negative_index, num_pts, label='Negative') + + positive_diff = np.absolute(sample_x + sample_x[negative_index]) + positive_index = np.where(positive_diff < delta_x)[0][-1] + self._check_bounds(positive_index, num_pts, label='Positive') + + pivot = num_pts - positive_index + 1 + + if self._verbose: + logger.notice('No. points = %d' % num_pts) + logger.notice('Negative : at i =%d; x = %f' + % (negative_index, sample_x[negative_index])) + logger.notice('Positive : at i =%d; x = %f' + % (positive_index, sample_x[positive_index])) + logger.notice('Copy points = %d' % pivot) + + CloneWorkspace(InputWorkspace=self._sample, + OutputWorkspace=self._output_workspace) + + for index in xrange(num_spectra): + x = mtd[self._output_workspace].readX(index) + y = mtd[self._output_workspace].readY(index) + e = mtd[self._output_workspace].readE(index) + + x_out = np.zeros(x.size) + y_out = np.zeros(y.size) + e_out = np.zeros(e.size) + + x_out[:pivot] = -x[num_pts:num_pts - pivot:-1] + y_out[:pivot] = y[num_pts:num_pts - pivot - 1:-1] + e_out[:pivot] = e[num_pts:num_pts - pivot - 1:-1] + + x_out[pivot:] = x[pivot:] + y_out[pivot:] = y[pivot:] + e_out[pivot:] = e[pivot:] + + mtd[self._output_workspace].setX(index, np.asarray(x_out)) + mtd[self._output_workspace].setY(index, np.asarray(y_out)) + mtd[self._output_workspace].setE(index, np.asarray(e_out)) + + if self._save: + workdir = getDefaultWorkingDirectory() + file_path = os.path.join(workdir, self._output_workspace + '.nxs') + SaveNexusProcessed(InputWorkspace=self._output_workspace, + Filename=file_path) + + if self._verbose: + logger.notice('Output file : ' + file_path) + + if self._plot: + self._plotSymmetrise() + + self.setProperty("OutputWorkspace", self._output_workspace) + EndTime('Symmetrise') + + def _setup(self): + """ + Get the algorithm properties. + """ + self._sample = self.getPropertyValue('Sample') + self._x_cut = self.getProperty('XCut').value + + self._verbose = self.getProperty('Verbose').value + self._plot = self.getProperty('Plot').value + self._save = self.getProperty('Save').value + + self._output_workspace = self.getPropertyValue('OutputWorkspace') + + def _check_bounds(self, index, num_pts, label=''): + """ + Check if the index falls within the bounds of the x range. + Throws a ValueError if the x point falls outside of the range. + + @param index - value of the index within the x range. + @param num_pts - total number of points in the range. + @param label - label to call the point if an error is thrown. + """ + if index <= 0: + raise ValueError('%s point %d < 0' % (label, index)) + elif index >= num_pts: + raise ValueError('%s point %d > %d' % (label, index, num_pts)) + + def _plotSymmetrise(self): + """ + Plot the first spectrum of the input and output workspace together. + """ + from IndirectImport import import_mantidplot + mp = import_mantidplot() + mp.plotSpectrum([self._output_workspace, self._sample], 0) # Register algorithm with Mantid AlgorithmFactory.subscribe(Symmetrise) From 71e15db31477226793585e2bbc207fb1d23f73bb Mon Sep 17 00:00:00 2001 From: Samuel Jackson Date: Mon, 14 Apr 2014 14:50:53 +0100 Subject: [PATCH 005/284] Refs #7860 Further refactoring --- .../WorkflowAlgorithms/Symmetrise.py | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py index 0e38deff58ee..9d16bb3b90a8 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py @@ -40,8 +40,7 @@ def PyInit(self): Direction.Output), doc='Name to call the output workspace.') def PyExec(self): - from IndirectCommon import CheckHistZero, StartTime, EndTime, \ - getDefaultWorkingDirectory + from IndirectCommon import CheckHistZero, StartTime, EndTime StartTime('Symmetrise') self._setup() @@ -51,6 +50,7 @@ def PyExec(self): if math.fabs(self._x_cut) < 1e-5: raise ValueError('XCut point is Zero') + #find range of values to flip delta_x = sample_x[1] - sample_x[0] negative_diff = np.absolute(sample_x - self._x_cut) @@ -74,6 +74,7 @@ def PyExec(self): CloneWorkspace(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) + #for each spectrum copy positive values to the negative for index in xrange(num_spectra): x = mtd[self._output_workspace].readX(index) y = mtd[self._output_workspace].readY(index) @@ -91,21 +92,15 @@ def PyExec(self): y_out[pivot:] = y[pivot:] e_out[pivot:] = e[pivot:] - mtd[self._output_workspace].setX(index, np.asarray(x_out)) - mtd[self._output_workspace].setY(index, np.asarray(y_out)) - mtd[self._output_workspace].setE(index, np.asarray(e_out)) + mtd[self._output_workspace].setX(index, x_out) + mtd[self._output_workspace].setY(index, y_out) + mtd[self._output_workspace].setE(index, e_out) if self._save: - workdir = getDefaultWorkingDirectory() - file_path = os.path.join(workdir, self._output_workspace + '.nxs') - SaveNexusProcessed(InputWorkspace=self._output_workspace, - Filename=file_path) - - if self._verbose: - logger.notice('Output file : ' + file_path) + self._save_output() if self._plot: - self._plotSymmetrise() + self._plot_output() self.setProperty("OutputWorkspace", self._output_workspace) EndTime('Symmetrise') @@ -137,7 +132,20 @@ def _check_bounds(self, index, num_pts, label=''): elif index >= num_pts: raise ValueError('%s point %d > %d' % (label, index, num_pts)) - def _plotSymmetrise(self): + def _save_output(self): + """ + Save the output workspace to the user's default working directory + """ + from IndirectCommon import getDefaultWorkingDirectory + workdir = getDefaultWorkingDirectory() + file_path = os.path.join(workdir, self._output_workspace + '.nxs') + SaveNexusProcessed(InputWorkspace=self._output_workspace, + Filename=file_path) + + if self._verbose: + logger.notice('Output file : ' + file_path) + + def _plot_output(self): """ Plot the first spectrum of the input and output workspace together. """ From 19b887b9004748785eaeef475ab4bf7bdade109c Mon Sep 17 00:00:00 2001 From: Samuel Jackson Date: Mon, 14 Apr 2014 14:52:15 +0100 Subject: [PATCH 006/284] Refs #7860 Remove redundant code from project. --- Code/Mantid/scripts/Inelastic/IndirectSymm.py | 98 ------------------- 1 file changed, 98 deletions(-) delete mode 100644 Code/Mantid/scripts/Inelastic/IndirectSymm.py diff --git a/Code/Mantid/scripts/Inelastic/IndirectSymm.py b/Code/Mantid/scripts/Inelastic/IndirectSymm.py deleted file mode 100644 index d22e7da68771..000000000000 --- a/Code/Mantid/scripts/Inelastic/IndirectSymm.py +++ /dev/null @@ -1,98 +0,0 @@ -# SYMMetrise -# -from mantid.simpleapi import * -from mantid import config, logger, mtd -from IndirectCommon import * -from IndirectImport import import_mantidplot -import sys, platform, math, os.path, numpy as np -mp = import_mantidplot() - -def SymmRun(sample,cut,Verbose,Plot,Save): - workdir = config['defaultsave.directory'] - symWS = sample[:-3] + 'sym' - hist,npt = CheckHistZero(sample) - Xin = mtd[sample].readX(0) - delx = Xin[1]-Xin[0] - if math.fabs(cut) < 1e-5: - error = 'Cut point is Zero' - logger.notice('ERROR *** ' + error) - sys.exit(error) - for n in range(0,npt): - x = Xin[n]-cut - if math.fabs(x) < delx: - ineg = n - if ineg <= 0: - error = 'Negative point('+str(ineg)+') < 0' - logger.notice('ERROR *** ' + error) - sys.exit(error) - if ineg >= npt: - error = type + 'Negative point('+str(ineg)+') > '+str(npt) - logger.notice('ERROR *** ' + error) - sys.exit(error) - for n in range(0,npt): - x = Xin[n]+Xin[ineg] - if math.fabs(x) < delx: - ipos = n - if ipos <= 0: - error = 'Positive point('+str(ipos)+') < 0' - logger.notice('ERROR *** ' + error) - sys.exit(error) - if ipos >= npt: - error = type + 'Positive point('+str(ipos)+') > '+str(npt) - logger.notice('ERROR *** ' + error) - sys.exit(error) - ncut = npt-ipos+1 - if Verbose: - logger.notice('No. points = '+str(npt)) - logger.notice('Negative : at i ='+str(ineg)+' ; x = '+str(Xin[ineg])) - logger.notice('Positive : at i ='+str(ipos)+' ; x = '+str(Xin[ipos])) - logger.notice('Copy points = '+str(ncut)) - for m in range(0,hist): - Xin = mtd[sample].readX(m) - Yin = mtd[sample].readY(m) - Ein = mtd[sample].readE(m) - Xout = [] - Yout = [] - Eout = [] - for n in range(0,ncut): - icut = npt-n-1 - Xout.append(-Xin[icut]) - Yout.append(Yin[icut]) - Eout.append(Ein[icut]) - for n in range(ncut,npt): - Xout.append(Xin[n]) - Yout.append(Yin[n]) - Eout.append(Ein[n]) - if m == 0: - CreateWorkspace(OutputWorkspace=symWS, DataX=Xout, DataY=Yout, DataE=Eout, - Nspec=1, UnitX='DeltaE') - else: - CreateWorkspace(OutputWorkspace='__tmp', DataX=Xout, DataY=Yout, DataE=Eout, - Nspec=1, UnitX='DeltaE') - ConjoinWorkspaces(InputWorkspace1=symWS, InputWorkspace2='__tmp',CheckOverlapping=False) -# Nspec=nt, UnitX='MomentumTransfer', VerticalAxisUnit='Text', VerticalAxisValues='Taxis') -# start output - if Save: - path = os.path.join(workdir,symWS+'.nxs') - SaveNexusProcessed(InputWorkspace=symWS, Filename=path) - if Verbose: - logger.notice('Output file : ' + path) - if Plot: - plotSymm(symWS,sample) - -def SymmStart(inType,sname,cut,Verbose,Plot,Save): - StartTime('Symmetrise') - workdir = config['defaultsave.directory'] - if inType == 'File': - spath = os.path.join(workdir, sname+'.nxs') # path name for sample nxs file - LoadNexusProcessed(FileName=spath, OutputWorkspace=sname) - message = 'Input from File : '+spath - else: - message = 'Input from Workspace : '+sname - if Verbose: - logger.notice(message) - SymmRun(sname,cut,Verbose,Plot,Save) - EndTime('Symmetrise') - -def plotSymm(sym,sample): - tot_plot=mp.plotSpectrum([sym,sample],0) From 4f837f2f9c9bbc43069bcd8c30b5c32955b9d8a3 Mon Sep 17 00:00:00 2001 From: Michael Wedel Date: Thu, 7 Aug 2014 13:18:06 +0200 Subject: [PATCH 007/284] Refs #9711. Refactored PoldiMerge to use MergeRuns Consequently, WorkspaceGroups can be handled now as well. --- .../plugins/algorithms/PoldiMerge.py | 54 +++++++++++-------- .../plugins/algorithms/PoldiMergeTest.py | 19 +++++++ 2 files changed, 51 insertions(+), 22 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py index 6c19116f6395..75ae00ed6b1c 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py @@ -13,10 +13,10 @@ def category(self): def name(self): return "PoldiMerge" - + def summary(self): return "PoldiMerge takes a list of workspace names and adds the counts, resulting in a new workspace." - + def PyInit(self): self.declareProperty(StringArrayProperty(name="WorkspaceNames", direction=Direction.Input), @@ -33,32 +33,28 @@ def PyExec(self): self.log().information("Workspaces to merge: %i" % (len(workspaceNames))) - if False in [AnalysisDataService.doesExist(x) for x in workspaceNames]: - raise KeyError("Not all strings in the input list are valid workspace names.") + workspaces = [] - workspaces = [AnalysisDataService.retrieve(x) for x in workspaceNames] - - # Create a target workspace for the summation. It inherits the log of - # the first workspace used in the summation. - output = WorkspaceFactory.create(workspaces[0]) + for wsName in workspaceNames: + if not AnalysisDataService.doesExist(wsName): + raise KeyError("Not all strings in the input list are valid workspace names.") - xdata = workspaces[0].dataX(0) - ydata = np.zeros(len(xdata)) + ws = AnalysisDataService.retrieve(wsName) + workspaces += self.getWorkspacesRecursive(ws) - for h in range(output.getNumberHistograms()): - output.setX(h, xdata) - output.setY(h, ydata) - AnalysisDataService.addOrReplace(self.outputWorkspaceName, output) + workspaceCount = len(workspaces) - while workspaces: - current = workspaces.pop(0) + for i in range(workspaceCount): + currentWorkspace = workspaces[i] + for j in range(workspaceCount): + if i != j: + try: + self.canMerge(currentWorkspace, workspaces[j]) + except RuntimeError as error: + self.handleError(error) - try: - if self.canMerge(output, current): - output += current - except RuntimeError as error: - self.handleError(error) + output = MergeRuns(workspaceNames) self.setProperty("OutputWorkspace", output) @@ -96,4 +92,18 @@ def handleError(self, error): raise RuntimeError("Workspaces can not be merged. %s. Aborting." % (str(error))) + def getWorkspacesRecursive(self, workspace): + returnList = [] + if isinstance(workspace, WorkspaceGroup): + for i in range(workspace.getNumberOfEntries()): + returnList += self.getWorkspacesRecursive(workspace.getItem(i)) + + elif isinstance(workspace, MatrixWorkspace): + returnList.append(workspace) + + else: + raise RuntimeError("Can only merge MatrixWorkspaces, this is " + type(workspace)) + + return returnList + AlgorithmFactory.subscribe(PoldiMerge) diff --git a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/PoldiMergeTest.py b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/PoldiMergeTest.py index 97fdde8f1946..520a7cb7bf1d 100644 --- a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/PoldiMergeTest.py +++ b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/PoldiMergeTest.py @@ -25,6 +25,8 @@ def __init__(self, *args): self.badTimingOffset = CreateWorkspace(rightDataBadOffset, ydata, OutputWorkspace="BadTimingOffset") self.badTimingDelta = CreateWorkspace(rightDataBadDelta, ydata, OutputWorkspace="BadTimingDelta") + self.groupGood = GroupWorkspaces(["Base", "GoodTiming"], OutputWorkspace="GoodGroup") + goodProperty = 10.0 badProperty = 20.0 @@ -56,6 +58,23 @@ def test_happyCase(self): DeleteWorkspace("PoldiMergeOutput") + def test_workspaceGroup(self): + output = self.__runMerge__("GoodGroup") + + self.assertTrue(isinstance(output, MatrixWorkspace)) + + dataX = output.dataX(0) + self.assertEqual(dataX[0], 0.0) + self.assertEqual(dataX[-1], 3.0) + self.assertEqual(len(dataX), 4) + + dataY = output.dataY(0) + self.assertEqual(dataY[0], 2.0) + self.assertEqual(dataY[1], 2.0) + self.assertEqual(len(dataY), 4) + + DeleteWorkspace("PoldiMergeOutput") + def test_timingDelta(self): self.assertRaises(RuntimeError, lambda: self.__runMerge__("Base,BadTimingDelta")) self.assertFalse(AnalysisDataService.doesExist("PoldiMergeOutput")) From d373dabaa703c7e35a5de7612a49a385842d9157 Mon Sep 17 00:00:00 2001 From: Michael Wedel Date: Thu, 7 Aug 2014 17:26:06 +0200 Subject: [PATCH 008/284] Refs #9711. Instruments are compared as well now. --- .../plugins/algorithms/PoldiMerge.py | 53 ++++++++++++++----- .../plugins/algorithms/PoldiMergeTest.py | 2 +- 2 files changed, 42 insertions(+), 13 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py index 75ae00ed6b1c..6cc76b4f4ffb 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py @@ -6,7 +6,11 @@ class PoldiMerge(PythonAlgorithm): comparedPropertyNames = ["TablePositionX", "TablePositionY", "TablePositionZ", "ChopperSpeed"] + comparedInstrumentParameters = [("detector", "two_theta"), + ("chopper", "t0"), + ("chopper", "t0_const")] outputWorkspaceName = None + checkInstruments = True def category(self): return "SINQ\\Poldi" @@ -27,7 +31,11 @@ def PyInit(self): direction=Direction.Output), doc="Workspace where all counts from the list workspaces have been added") + self.declareProperty("CheckInstruments", True, "If checked, only workspaces with equal instrument parameters are merged. Do not disable without a very good reason.") + def PyExec(self): + self.checkInstruments = self.getProperty("CheckInstruments").value + workspaceNames = self.getProperty("WorkspaceNames").value self.outputWorkspaceName = self.getProperty("OutputWorkspace").valueAsStr @@ -36,23 +44,22 @@ def PyExec(self): workspaces = [] for wsName in workspaceNames: - if not AnalysisDataService.doesExist(wsName): - raise KeyError("Not all strings in the input list are valid workspace names.") + if not AnalysisDataService.doesExist(wsName): + raise KeyError("Not all strings in the input list are valid workspace names.") - ws = AnalysisDataService.retrieve(wsName) - workspaces += self.getWorkspacesRecursive(ws) + ws = AnalysisDataService.retrieve(wsName) + workspaces += self.getWorkspacesRecursive(ws) workspaceCount = len(workspaces) for i in range(workspaceCount): - currentWorkspace = workspaces[i] - for j in range(workspaceCount): - if i != j: - try: - self.canMerge(currentWorkspace, workspaces[j]) - except RuntimeError as error: - self.handleError(error) + currentWorkspace = workspaces[i] + for j in range(i + 1, workspaceCount): + try: + self.canMerge(currentWorkspace, workspaces[j]) + except RuntimeError as error: + self.handleError(error) output = MergeRuns(workspaceNames) @@ -65,7 +72,7 @@ def canMerge(self, leftWorkspace, rightWorkspace): leftRun = leftWorkspace.getRun() rightRun = rightWorkspace.getRun() - return self.propertiesMatch(leftRun, rightRun) + return self.propertiesMatch(leftRun, rightRun) and self.instrumentsMatch(leftWorkspace, rightWorkspace) def timingsMatch(self, leftXData, rightXData): leftDeltaX = leftXData[1] - leftXData[0] @@ -73,6 +80,28 @@ def timingsMatch(self, leftXData, rightXData): return abs(leftDeltaX - rightDeltaX) < 1e-4 and abs(rightXData[0] - leftXData[0]) < 1e-4 + def instrumentsMatch(self, leftWorkspace, rightWorkspace): + leftInstrument = leftWorkspace.getInstrument() + rightInstrument = rightWorkspace.getInstrument() + + return (not self.checkInstruments) or self.instrumentParametersMatch(leftInstrument, rightInstrument) + + def instrumentParametersMatch(self, leftInstrument, rightInstrument): + if not (leftInstrument.getDetector(0).getPos() == rightInstrument.getDetector(0).getPos()): + raise RuntimeError("Detector positions are not equal") + + for parameterTuple in self.comparedInstrumentParameters: + leftValue = self.getParameterValue(leftInstrument, parameterTuple) + rightValue = self.getParameterValue(rightInstrument, parameterTuple) + + if abs(leftValue - rightValue) > 1e-12: + raise RuntimeError("Instrument parameter '%s'/'%s' does not match" % parameterTuple) + + return True; + + def getParameterValue(self, instrument, parameterTuple): + return instrument.getComponentByName(parameterTuple[0]).getNumberParameter(parameterTuple[1])[0] + def propertiesMatch(self, leftRun, rightRun): for propertyName in self.comparedPropertyNames: if abs(self.getPropertyValue(leftRun.getProperty(propertyName)) - self.getPropertyValue(rightRun.getProperty(propertyName))) > 1e-4: diff --git a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/PoldiMergeTest.py b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/PoldiMergeTest.py index 520a7cb7bf1d..d139c7d894b1 100644 --- a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/PoldiMergeTest.py +++ b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/PoldiMergeTest.py @@ -39,7 +39,7 @@ def __init__(self, *args): self.goodTimingBadProperties.getRun().addProperty(p, badProperty, True) def __runMerge__(self, workspaceNames): - return PoldiMerge(WorkspaceNames=workspaceNames, OutputWorkspace="PoldiMergeOutput") + return PoldiMerge(WorkspaceNames=workspaceNames, OutputWorkspace="PoldiMergeOutput", CheckInstruments=False) def test_happyCase(self): output = self.__runMerge__("Base,GoodTiming") From 95b576f94a3d0bf4834ebef1cfbd3fea11e1ef82 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 19 Aug 2014 12:18:27 +0100 Subject: [PATCH 009/284] Remove WIKI header from Symmetrise.py Refs #7860 --- .../plugins/algorithms/WorkflowAlgorithms/Symmetrise.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py index 9d16bb3b90a8..722432d7e584 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py @@ -1,11 +1,3 @@ -"""*WIKI* -Symmetrise takes an asymmetric S(Q,w) - i.e. one in which the -moduli of xmin & xmax are different. Typically xmax is > mod(xmin). - -A negative value of x is chosen (XCut) so that the curve for mod(XCut) to xmax -is reflected and inserted for x less than the XCut. -*WIKI*""" - from mantid import logger, mtd from mantid.api import PythonAlgorithm, AlgorithmFactory, WorkspaceProperty from mantid.kernel import Direction From d4290a1a8f366529b58d8f295a6cf6a5d43f4292 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 19 Aug 2014 17:00:06 +0100 Subject: [PATCH 010/284] Initial addition of Symmetrise tab Refs #7860 --- .../WorkflowAlgorithms/Symmetrise.py | 6 +- .../MantidQt/CustomInterfaces/CMakeLists.txt | 31 ++-- .../IndirectDataReduction.h | 1 + .../IndirectDataReduction.ui | 138 ++++++++++++++++-- .../IndirectSymmetrise.h | 76 ++++++++++ .../src/IndirectDataReduction.cpp | 16 +- .../src/IndirectSymmetrise.cpp | 96 ++++++++++++ 7 files changed, 332 insertions(+), 32 deletions(-) create mode 100644 Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h create mode 100644 Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py index 722432d7e584..a7874877fb8c 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py @@ -13,10 +13,10 @@ class Symmetrise(PythonAlgorithm): def category(self): return "Workflow\\MIDAS;PythonAlgorithms" - def PyInit(self): - self.setOptionalMessage("Takes an asymmetric S(Q,w) and makes it symmetric") - self.setWikiSummary("Takes an asymmetric S(Q,w) and makes it symmetric") + def summary(self): + return "Takes an asymmetric S(Q,w) and makes it symmetric" + def PyInit(self): self.declareProperty(WorkspaceProperty("Sample", "", Direction.Input), doc='Sample to run with') self.declareProperty('XCut', 0.0, doc='X cut off value') diff --git a/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt b/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt index 8bfa3c243c24..8907caa89dc3 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt +++ b/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt @@ -4,7 +4,7 @@ set ( SRC_FILES src/ConvFit.cpp src/CreateMDWorkspace.cpp src/CreateMDWorkspaceAlgDialog.cpp - src/DirectConvertToEnergy.cpp + src/DirectConvertToEnergy.cpp src/Elwin.cpp src/EventNexusFileMemento.cpp src/Fury.cpp @@ -13,12 +13,12 @@ set ( SRC_FILES src/IDATab.cpp src/IndirectBayes.cpp src/IndirectBayesTab.cpp - src/IndirectCalibration.cpp - src/IndirectConvertToEnergy.cpp + src/IndirectCalibration.cpp + src/IndirectConvertToEnergy.cpp src/IndirectDataAnalysis.cpp - src/IndirectDataReduction.cpp - src/IndirectDataReductionTab.cpp - src/IndirectDiagnostics.cpp + src/IndirectDataReduction.cpp + src/IndirectDataReductionTab.cpp + src/IndirectDiagnostics.cpp src/IndirectDiffractionReduction.cpp src/IndirectLoadAscii.cpp src/IndirectLoadAsciiTab.cpp @@ -27,8 +27,9 @@ set ( SRC_FILES src/IndirectNeutron.cpp src/IndirectSimulation.cpp src/IndirectSimulationTab.cpp - src/IndirectSqw.cpp - src/IndirectTransmission.cpp + src/IndirectSqw.cpp + src/IndirectSymmetrise.cpp + src/IndirectTransmission.cpp src/JumpFit.cpp src/MSDFit.cpp src/MantidEV.cpp @@ -75,7 +76,7 @@ set ( INC_FILES inc/MantidQtCustomInterfaces/ConvFit.h inc/MantidQtCustomInterfaces/CreateMDWorkspace.h inc/MantidQtCustomInterfaces/CreateMDWorkspaceAlgDialog.h - inc/MantidQtCustomInterfaces/DirectConvertToEnergy.h + inc/MantidQtCustomInterfaces/DirectConvertToEnergy.h inc/MantidQtCustomInterfaces/DllConfig.h inc/MantidQtCustomInterfaces/Elwin.h inc/MantidQtCustomInterfaces/EventNexusFileMemento.h @@ -85,11 +86,11 @@ set ( INC_FILES inc/MantidQtCustomInterfaces/IDATab.h inc/MantidQtCustomInterfaces/IndirectBayes.h inc/MantidQtCustomInterfaces/IndirectBayesTab.h - inc/MantidQtCustomInterfaces/IndirectCalibration.h - inc/MantidQtCustomInterfaces/IndirectConvertToEnergy.h + inc/MantidQtCustomInterfaces/IndirectCalibration.h + inc/MantidQtCustomInterfaces/IndirectConvertToEnergy.h inc/MantidQtCustomInterfaces/IndirectDataAnalysis.h - inc/MantidQtCustomInterfaces/IndirectDataReduction.h - inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h + inc/MantidQtCustomInterfaces/IndirectDataReduction.h + inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h inc/MantidQtCustomInterfaces/IndirectDiagnostics.h inc/MantidQtCustomInterfaces/IndirectDiffractionReduction.h inc/MantidQtCustomInterfaces/IndirectLoadAscii.h @@ -100,7 +101,8 @@ set ( INC_FILES inc/MantidQtCustomInterfaces/IndirectSimulation.h inc/MantidQtCustomInterfaces/IndirectSimulationTab.h inc/MantidQtCustomInterfaces/IndirectSqw.h - inc/MantidQtCustomInterfaces/IndirectTransmission.h + inc/MantidQtCustomInterfaces/IndirectSymmetrise.h + inc/MantidQtCustomInterfaces/IndirectTransmission.h inc/MantidQtCustomInterfaces/JumpFit.h inc/MantidQtCustomInterfaces/MSDFit.h inc/MantidQtCustomInterfaces/MantidEV.h @@ -175,6 +177,7 @@ set ( MOC_FILES inc/MantidQtCustomInterfaces/Background.h inc/MantidQtCustomInterfaces/IndirectSimulation.h inc/MantidQtCustomInterfaces/IndirectSimulationTab.h inc/MantidQtCustomInterfaces/IndirectSqw.h + inc/MantidQtCustomInterfaces/IndirectSymmetrise.h inc/MantidQtCustomInterfaces/IndirectTransmission.h inc/MantidQtCustomInterfaces/JumpFit.h inc/MantidQtCustomInterfaces/MSDFit.h diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.h index 3806e24b16f9..53514feebbbb 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.h @@ -113,6 +113,7 @@ namespace MantidQt IndirectDataReductionTab* m_tab_calibration; IndirectDataReductionTab* m_tab_trans; IndirectDataReductionTab* m_tab_moments; + IndirectDataReductionTab* m_tab_symmetrise; Poco::NObserver m_changeObserver; ///< Poco observer for changes in user directory settings QString m_dataDir; ///< default data search directory diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui index 36818279961e..f747e684f5e0 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui @@ -6,7 +6,7 @@ 0 0 - 621 + 672 761 @@ -1513,16 +1513,12 @@ Later steps in the process (saving, renaming) will not be done. Time Slice - + - - - - - - - - + + + + @@ -1739,6 +1735,128 @@ Later steps in the process (saving, renaming) will not be done. + + + Symmetrise + + + + + + Input + + + + + + + 0 + 0 + + + + false + + + + + + + + + + Symmetrise + + + + 6 + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Output + + + + 6 + + + + + true + + + Verbose + + + + + + + Qt::Horizontal + + + + 165 + 20 + + + + + + + + Plot Result + + + + + + + Qt::Horizontal + + + + 164 + 20 + + + + + + + + Save Result + + + + + + + + S(Q, w) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h new file mode 100644 index 000000000000..8ca2db7e1540 --- /dev/null +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h @@ -0,0 +1,76 @@ +#ifndef MANTIDQTCUSTOMINTERFACES_INDIRECTSYMMETRISE_H_ +#define MANTIDQTCUSTOMINTERFACES_INDIRECTSYMMETRISE_H_ + +#include "MantidQtCustomInterfaces/IndirectDataReductionTab.h" + +#include "MantidAPI/MatrixWorkspace.h" +#include "MantidKernel/System.h" + +// Suppress a warning coming out of code that isn't ours +#if defined(__INTEL_COMPILER) + #pragma warning disable 1125 +#elif defined(__GNUC__) + #if (__GNUC__ >= 4 && __GNUC_MINOR__ >= 6 ) + #pragma GCC diagnostic push + #endif + #pragma GCC diagnostic ignored "-Woverloaded-virtual" +#endif +#include +#if defined(__INTEL_COMPILER) + #pragma warning enable 1125 +#elif defined(__GNUC__) + #if (__GNUC__ >= 4 && __GNUC_MINOR__ >= 6 ) + #pragma GCC diagnostic pop + #endif +#endif + +namespace MantidQt +{ +namespace CustomInterfaces +{ + /** IndirectSymmetrise + + @author Dan Nixon + @date 23/07/2014 + + Copyright © 2013 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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. + + Mantid 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, see . + + File change history is stored at: + Code Documentation is available at: + */ + class DLLExport IndirectSymmetrise : public IndirectDataReductionTab + { + Q_OBJECT + + public: + IndirectSymmetrise(Ui::IndirectDataReduction& uiForm, QWidget * parent = 0); + virtual ~IndirectSymmetrise(); + + virtual void setup(); + virtual void run(); + virtual bool validate(); + + private slots: + void plotRawInput(); + void updateRangeSelector(QtProperty *prop, double value); + + }; +} // namespace CustomInterfaces +} // namespace Mantid + +#endif //MANTIDQTCUSTOMINTERFACES_INDIRECTSYMMETRISE_H_ diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp index 4f2fe9195e69..bcbd8721f4a3 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp @@ -13,6 +13,7 @@ #include "MantidQtCustomInterfaces/IndirectDiagnostics.h" #include "MantidQtCustomInterfaces/IndirectMoments.h" #include "MantidQtCustomInterfaces/IndirectSqw.h" +#include "MantidQtCustomInterfaces/IndirectSymmetrise.h" #include "MantidQtCustomInterfaces/IndirectTransmission.h" #include @@ -105,6 +106,8 @@ void IndirectDataReduction::runClicked() m_tab_diagnostics->runTab(); else if ( tabName == "S(Q, w)" ) m_tab_sqw->runTab(); + else if ( tabName == "Symmetrise" ) + m_tab_symmetrise->runTab(); else if (tabName == "Transmission") m_tab_trans->runTab(); else if(tabName == "Moments") @@ -124,6 +127,7 @@ void IndirectDataReduction::initLayout() m_tab_calibration = new IndirectCalibration(m_uiForm, this); m_tab_trans = new IndirectTransmission(m_uiForm, this); m_tab_moments = new IndirectMoments(m_uiForm, this); + m_tab_symmetrise = new IndirectSymmetrise(m_uiForm, this); // Assume we get a incompatiable instrument to start with m_uiForm.pbRun->setEnabled(false); @@ -133,14 +137,14 @@ void IndirectDataReduction::initLayout() // signal/slot connections to respond to changes in instrument selection combo boxes connect(m_uiForm.cbInst, SIGNAL(instrumentSelectionChanged(const QString&)), this, SLOT(userSelectInstrument(const QString&))); - // connect "?" (Help) Button + // Connect "?" (Help) Button connect(m_uiForm.pbHelp, SIGNAL(clicked()), this, SLOT(helpClicked())); - // connect the "Run" button + // Connect the "Run" button connect(m_uiForm.pbRun, SIGNAL(clicked()), this, SLOT(runClicked())); - // connect the "Manage User Directories" Button + // Connect the "Manage User Directories" Button connect(m_uiForm.pbManageDirectories, SIGNAL(clicked()), this, SLOT(openDirectoryDialog())); - // ignals for tabs running Python + // Signals for tabs running Python connect(m_tab_convert_to_energy, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); connect(m_tab_sqw, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); connect(m_tab_calibration, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); @@ -148,13 +152,14 @@ void IndirectDataReduction::initLayout() connect(m_tab_trans, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); connect(m_tab_moments, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); - // ignals for tabs showing mesage boxes + // Signals for tabs showing mesage boxes connect(m_tab_convert_to_energy, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); connect(m_tab_sqw, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); connect(m_tab_calibration, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); connect(m_tab_diagnostics, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); connect(m_tab_trans, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); connect(m_tab_moments, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); + connect(m_tab_symmetrise, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); // Run any tab setup code m_tab_convert_to_energy->setupTab(); @@ -163,6 +168,7 @@ void IndirectDataReduction::initLayout() m_tab_calibration->setupTab(); m_tab_trans->setupTab(); m_tab_moments->setupTab(); + m_tab_symmetrise->setupTab(); } /** diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp new file mode 100644 index 000000000000..99750711a15d --- /dev/null +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -0,0 +1,96 @@ +#include "MantidQtCustomInterfaces/IndirectSymmetrise.h" + +#include "MantidAPI/MatrixWorkspace.h" +#include "MantidKernel/Logger.h" +#include "MantidQtCustomInterfaces/UserInputValidator.h" + +#include + +namespace +{ + Mantid::Kernel::Logger g_log("IndirectSymmetrise"); +} + +namespace MantidQt +{ +namespace CustomInterfaces +{ + //---------------------------------------------------------------------------------------------- + /** Constructor + */ + IndirectSymmetrise::IndirectSymmetrise(Ui::IndirectDataReduction& uiForm, QWidget * parent) : + IndirectDataReductionTab(uiForm, parent) + { + // Property Tree + m_propTrees["SymmPropTree"] = new QtTreePropertyBrowser(); + m_uiForm.symm_properties->addWidget(m_propTrees["SymmPropTree"]); + + // Editor Factories + DoubleEditorFactory *doubleEditorFactory = new DoubleEditorFactory(); + m_propTrees["SymmPropTree"]->setFactoryForManager(m_dblManager, doubleEditorFactory); + + // Create Properties + m_properties["XCut"] = m_dblManager->addProperty("X Cut"); + /* m_dblManager->setMinimum(m_properties["XCut"], 0); */ + m_propTrees["SymmPropTree"]->addProperty(m_properties["XCut"]); + + // Raw plot + m_plots["SymmRawPlot"] = new QwtPlot(m_parentWidget); + m_curves["SymmRawPlot"] = new QwtPlotCurve(); + + m_rangeSelectors["SlicePeak"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"]); + m_rangeSelectors["SliceBackground"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"]); + + m_plots["SymmRawPlot"]->setAxisFont(QwtPlot::xBottom, parent->font()); + m_plots["SymmRawPlot"]->setAxisFont(QwtPlot::yLeft, parent->font()); + m_plots["SymmRawPlot"]->setCanvasBackground(Qt::white); + m_uiForm.symm_plot->addWidget(m_plots["SymmRawPlot"]); + + // Refresh the plot windows + /* m_plots["SymmRawPlot"]->replot(); */ + + // SIGNAL/SLOT CONNECTIONS + + /* // Update properties when a range selector is changed */ + /* connect(m_rangeSelectors["SlicePeak"], SIGNAL(minValueChanged(double)), this, SLOT(sliceMinChanged(double))); */ + /* connect(m_rangeSelectors["SlicePeak"], SIGNAL(maxValueChanged(double)), this, SLOT(sliceMaxChanged(double))); */ + /* connect(m_rangeSelectors["SliceBackground"], SIGNAL(minValueChanged(double)), this, SLOT(sliceMinChanged(double))); */ + /* connect(m_rangeSelectors["SliceBackground"], SIGNAL(maxValueChanged(double)), this, SLOT(sliceMaxChanged(double))); */ + /* // Update range selctors when a property is changed */ + /* connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(sliceUpdateRS(QtProperty*, double))); */ + } + + //---------------------------------------------------------------------------------------------- + /** Destructor + */ + IndirectSymmetrise::~IndirectSymmetrise() + { + } + + void IndirectSymmetrise::setup() + { + } + + void IndirectSymmetrise::run() + { + //TODO + } + + bool IndirectSymmetrise::validate() + { + //TODO + return false; + } + + void IndirectSymmetrise::plotRawInput() + { + //TODO + } + + void IndirectSymmetrise::updateRangeSelector(QtProperty *prop, double value) + { + //TODO + } + +} // namespace CustomInterfaces +} // namespace Mantid From 4dae20b9f7711e2ca2c078b694db77fff3860abe Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 20 Aug 2014 10:56:10 +0100 Subject: [PATCH 011/284] Added more to Symmetrise tab Refs #7860 --- .../IndirectSymmetrise.h | 6 +- .../src/IndirectDataReductionTab.cpp | 5 +- .../src/IndirectSymmetrise.cpp | 127 +++++++++++++++--- 3 files changed, 115 insertions(+), 23 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h index 8ca2db7e1540..a66902bd9206 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h @@ -66,8 +66,10 @@ namespace CustomInterfaces virtual bool validate(); private slots: - void plotRawInput(); - void updateRangeSelector(QtProperty *prop, double value); + void plotRawInput(const QString &workspaceName); + void updateRawPlot(); + void replotNewSpectrum(QtProperty *prop, double value); + void updateRangeSelectors(QtProperty *prop, double value); }; } // namespace CustomInterfaces diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp index bcb3456cb015..04ad1e643dd9 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp @@ -228,9 +228,12 @@ namespace CustomInterfaces if(cID == "") cID = plotID; - //check if we can plot + // Check if we can plot if( wsIndex >= workspace->getNumberHistograms() || workspace->readX(0).size() < 2 ) + { + g_log.error("Spectrum index out of range for this workspace"); return; + } QwtWorkspaceSpectrumData wsData(*workspace, static_cast(wsIndex), false); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 99750711a15d..17c87c5a637f 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -31,15 +31,29 @@ namespace CustomInterfaces // Create Properties m_properties["XCut"] = m_dblManager->addProperty("X Cut"); - /* m_dblManager->setMinimum(m_properties["XCut"], 0); */ m_propTrees["SymmPropTree"]->addProperty(m_properties["XCut"]); + QtProperty* rawPlotProps = m_grpManager->addProperty("Raw Plot"); + m_propTrees["SymmPropTree"]->addProperty(rawPlotProps); + + m_properties["PreviewSpec"] = m_dblManager->addProperty("Spectrum No"); + m_dblManager->setDecimals(m_properties["PreviewSpec"], 0); + rawPlotProps->addSubProperty(m_properties["PreviewSpec"]); + + m_properties["PreviewRange"] = m_dblManager->addProperty("X Range"); + rawPlotProps->addSubProperty(m_properties["PreviewRange"]); + // Raw plot m_plots["SymmRawPlot"] = new QwtPlot(m_parentWidget); m_curves["SymmRawPlot"] = new QwtPlotCurve(); - m_rangeSelectors["SlicePeak"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"]); - m_rangeSelectors["SliceBackground"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"]); + m_rangeSelectors["NegativeXCut"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE); + m_rangeSelectors["PositiveXCut"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE); + + m_rangeSelectors["CentreMark"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + MantidWidgets::RangeSelector::XSINGLE, true, true); + m_rangeSelectors["CentreMark"]->setColour(Qt::cyan); + m_rangeSelectors["CentreMark"]->setMinimum(0.0); m_plots["SymmRawPlot"]->setAxisFont(QwtPlot::xBottom, parent->font()); m_plots["SymmRawPlot"]->setAxisFont(QwtPlot::yLeft, parent->font()); @@ -47,17 +61,22 @@ namespace CustomInterfaces m_uiForm.symm_plot->addWidget(m_plots["SymmRawPlot"]); // Refresh the plot windows - /* m_plots["SymmRawPlot"]->replot(); */ + m_plots["SymmRawPlot"]->replot(); // SIGNAL/SLOT CONNECTIONS - - /* // Update properties when a range selector is changed */ - /* connect(m_rangeSelectors["SlicePeak"], SIGNAL(minValueChanged(double)), this, SLOT(sliceMinChanged(double))); */ - /* connect(m_rangeSelectors["SlicePeak"], SIGNAL(maxValueChanged(double)), this, SLOT(sliceMaxChanged(double))); */ - /* connect(m_rangeSelectors["SliceBackground"], SIGNAL(minValueChanged(double)), this, SLOT(sliceMinChanged(double))); */ - /* connect(m_rangeSelectors["SliceBackground"], SIGNAL(maxValueChanged(double)), this, SLOT(sliceMaxChanged(double))); */ - /* // Update range selctors when a property is changed */ - /* connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(sliceUpdateRS(QtProperty*, double))); */ + // Update range selctors when a property is changed + connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRangeSelectors(QtProperty*, double))); + // Plot a new spectrum when the user changes the value of the preview spectrum + connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(replotNewSpectrum(QtProperty*, double))); + // Plot miniplot when file has finished loading + connect(m_uiForm.symm_dsInput, SIGNAL(dataReady(const QString&)), this, SLOT(plotRawInput(const QString&))); + + // Set default XCut value + m_dblManager->setValue(m_properties["XCut"], 0.3); + + // Set default x axis range + std::pair defaultRange(-1.0, 1.0); + setAxisRange("SymmRawPlot", QwtPlot::xBottom, defaultRange); } //---------------------------------------------------------------------------------------------- @@ -71,25 +90,93 @@ namespace CustomInterfaces { } + bool IndirectSymmetrise::validate() + { + // Check for a valid input file + if(!m_uiForm.symm_dsInput->isValid()) + return false; + + // Check for a valid XCut value + if(m_dblManager->value(m_properties["XCut"]) <= 0.0) + return false; + + return true; + } + void IndirectSymmetrise::run() { - //TODO + using namespace Mantid::API; + + QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); + QString outputWorkspaceName = workspaceName.left(workspaceName.length() - 4) + "_Symmetrise"; + + bool plot = m_uiForm.symm_ckPlot->isChecked(); + bool verbose = m_uiForm.symm_ckVerbose->isChecked(); + bool save = m_uiForm.symm_ckSave->isChecked(); + + double x_cut = m_dblManager->value(m_properties["XCut"]); + + IAlgorithm_sptr symmetriseAlg = AlgorithmManager::Instance().create("Symmetrise", -1); + symmetriseAlg->initialize(); + symmetriseAlg->setProperty("Sample", workspaceName.toStdString()); + symmetriseAlg->setProperty("XCut", x_cut); + symmetriseAlg->setProperty("Plot", plot); + symmetriseAlg->setProperty("Verbose", verbose); + symmetriseAlg->setProperty("Save", save); + symmetriseAlg->setProperty("OutputWorkspace", outputWorkspaceName.toStdString()); + + // Execute algorithm on seperate thread + runAlgorithm(symmetriseAlg); + } + + void IndirectSymmetrise::plotRawInput(const QString &workspaceName) + { + UNUSED_ARG(workspaceName); + + updateRawPlot(); + + auto axisRange = getCurveRange("SymmRawPlot"); + double symmRange = fmax(fabs(axisRange.first), fabs(axisRange.second)); + g_log.information() << "Symmetrise x axis range +/- " << symmRange << std::endl; + m_dblManager->setValue(m_properties["PreviewRange"], symmRange); + + updateRawPlot(); } - bool IndirectSymmetrise::validate() + void IndirectSymmetrise::updateRawPlot() { - //TODO - return false; + if(!m_uiForm.symm_dsInput->isValid()) + return; + + QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); + int spectrumNumber = static_cast(m_dblManager->value(m_properties["PreviewSpec"])); + + Mantid::API::MatrixWorkspace_sptr input = boost::dynamic_pointer_cast( + Mantid::API::AnalysisDataService::Instance().retrieve(workspaceName.toStdString())); + + std::pairrange; + range.first = -m_dblManager->value(m_properties["PreviewRange"]); + range.second = m_dblManager->value(m_properties["PreviewRange"]); + setAxisRange("SymmRawPlot", QwtPlot::xBottom, range); + + plotMiniPlot(input, spectrumNumber, "SymmRawPlot"); } - void IndirectSymmetrise::plotRawInput() + void IndirectSymmetrise::replotNewSpectrum(QtProperty *prop, double value) { - //TODO + UNUSED_ARG(value); + + if((prop == m_properties["PreviewSpec"]) || (prop == m_properties["PreviewRange"])) + updateRawPlot(); } - void IndirectSymmetrise::updateRangeSelector(QtProperty *prop, double value) + void IndirectSymmetrise::updateRangeSelectors(QtProperty *prop, double value) { - //TODO + if(prop == m_properties["XCut"]) + { + m_rangeSelectors["NegativeXCut"]->setMinimum(-value); + m_rangeSelectors["PositiveXCut"]->setMinimum(value); + } } } // namespace CustomInterfaces From e96cf67c779b9b2a71a5c0101d423bd5b1c4cce9 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 20 Aug 2014 11:16:48 +0100 Subject: [PATCH 012/284] Fix Windows compile error Refs #7860 --- .../Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 17c87c5a637f..2ef9cfc31548 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -136,7 +136,7 @@ namespace CustomInterfaces updateRawPlot(); auto axisRange = getCurveRange("SymmRawPlot"); - double symmRange = fmax(fabs(axisRange.first), fabs(axisRange.second)); + double symmRange = std::max(fabs(axisRange.first), fabs(axisRange.second)); g_log.information() << "Symmetrise x axis range +/- " << symmRange << std::endl; m_dblManager->setValue(m_properties["PreviewRange"], symmRange); From 2fd5ce03af13b68feb1ba5f1a9c038bad2d5d5d1 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 20 Aug 2014 15:08:09 +0100 Subject: [PATCH 013/284] Temp removal of failing usage example Refs #7860 --- .../docs/source/algorithms/Symmetrise-v1.rst | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst index bc93a312b7dc..5db2b72386b4 100644 --- a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst +++ b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst @@ -14,26 +14,26 @@ moduli of xmin & xmax are different. Typically xmax is > mod(xmin). A negative value of x is chosen (Xcut) so that the curve for mod(Xcut) to xmax is reflected and inserted for x less than the Xcut. -Usage ------ +.. Usage +.. ----- -**Example - Running Symmetrise on an asymmetric workspace.** +.. **Example - Running Symmetrise on an asymmetric workspace.** -.. testcode:: ExSymmetriseSimple +.. .. testcode:: ExSymmetriseSimple - import numpy as np +.. import numpy as np - #create an asymmetric line shape - def rayleigh(x, sigma): - return (x / sigma**2) * np.exp( -x**2 / (2*sigma**2)) +.. #create an asymmetric line shape +.. def rayleigh(x, sigma): +.. return (x / sigma**2) * np.exp( -x**2 / (2*sigma**2)) - dataX = np.arange(0, 10, 0.01) - dataY = rayleigh(dataX, 1) +.. dataX = np.arange(0, 10, 0.01) +.. dataY = rayleigh(dataX, 1) - ws = CreateWorkspace(dataX, dataY) - ws = ScaleX(ws, -1, "Add") #centre the peak over 0 +.. ws = CreateWorkspace(dataX, dataY) +.. ws = ScaleX(ws, -1, "Add") #centre the peak over 0 - ws = RenameWorkspace(ws, OutputWorkspace="iris00001_graphite002_red") - Symmetrise('00001', '-0.001', InputType='Workspace') +.. ws = RenameWorkspace(ws, OutputWorkspace="iris00001_graphite002_red") +.. Symmetrise('00001', '-0.001', InputType='Workspace') .. categories:: From 1267f5ab25528e7fc20e955c4ded35e1b7e296fa Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 21 Aug 2014 10:28:50 +0100 Subject: [PATCH 014/284] Refactoring, fixed usage example Refs #7860 --- .../WorkflowAlgorithms/Symmetrise.py | 35 +++++++++---------- .../docs/source/algorithms/Symmetrise-v1.rst | 27 +++++++------- 2 files changed, 29 insertions(+), 33 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py index a7874877fb8c..16957d20a5ff 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py @@ -21,9 +21,9 @@ def PyInit(self): doc='Sample to run with') self.declareProperty('XCut', 0.0, doc='X cut off value') - self.declareProperty('Verbose', defaultValue=True, + self.declareProperty('Verbose', defaultValue=False, doc='Switch verbose output Off/On') - self.declareProperty('Plot', defaultValue=True, + self.declareProperty('Plot', defaultValue=False, doc='Switch plotting Off/On') self.declareProperty('Save', defaultValue=False, doc='Switch saving result to nxs file Off/On') @@ -42,7 +42,7 @@ def PyExec(self): if math.fabs(self._x_cut) < 1e-5: raise ValueError('XCut point is Zero') - #find range of values to flip + # find range of values to flip delta_x = sample_x[1] - sample_x[0] negative_diff = np.absolute(sample_x - self._x_cut) @@ -53,36 +53,33 @@ def PyExec(self): positive_index = np.where(positive_diff < delta_x)[0][-1] self._check_bounds(positive_index, num_pts, label='Positive') - pivot = num_pts - positive_index + 1 - if self._verbose: logger.notice('No. points = %d' % num_pts) logger.notice('Negative : at i =%d; x = %f' % (negative_index, sample_x[negative_index])) logger.notice('Positive : at i =%d; x = %f' % (positive_index, sample_x[positive_index])) - logger.notice('Copy points = %d' % pivot) CloneWorkspace(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) - #for each spectrum copy positive values to the negative + # for each spectrum copy positive values to the negative for index in xrange(num_spectra): - x = mtd[self._output_workspace].readX(index) - y = mtd[self._output_workspace].readY(index) - e = mtd[self._output_workspace].readE(index) + x_in = mtd[self._output_workspace].readX(index) + y_in = mtd[self._output_workspace].readY(index) + e_in = mtd[self._output_workspace].readE(index) - x_out = np.zeros(x.size) - y_out = np.zeros(y.size) - e_out = np.zeros(e.size) + x_out = np.zeros(x_in.size) + y_out = np.zeros(y_in.size) + e_out = np.zeros(e_in.size) - x_out[:pivot] = -x[num_pts:num_pts - pivot:-1] - y_out[:pivot] = y[num_pts:num_pts - pivot - 1:-1] - e_out[:pivot] = e[num_pts:num_pts - pivot - 1:-1] + x_out[:positive_index] = -x_in[negative_index + positive_index:negative_index:-1] + y_out[:positive_index] = y_in[negative_index + positive_index:negative_index:-1] + e_out[:positive_index] = e_in[negative_index + positive_index:negative_index:-1] - x_out[pivot:] = x[pivot:] - y_out[pivot:] = y[pivot:] - e_out[pivot:] = e[pivot:] + x_out[positive_index:] = x_in[positive_index:] + y_out[positive_index:] = y_in[positive_index:] + e_out[positive_index:] = e_in[positive_index:] mtd[self._output_workspace].setX(index, x_out) mtd[self._output_workspace].setY(index, y_out) diff --git a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst index 5db2b72386b4..fb0eb92a347b 100644 --- a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst +++ b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst @@ -14,26 +14,25 @@ moduli of xmin & xmax are different. Typically xmax is > mod(xmin). A negative value of x is chosen (Xcut) so that the curve for mod(Xcut) to xmax is reflected and inserted for x less than the Xcut. -.. Usage -.. ----- +Usage +----- -.. **Example - Running Symmetrise on an asymmetric workspace.** +**Example - Running Symmetrise on an asymmetric workspace.** -.. .. testcode:: ExSymmetriseSimple +.. testcode:: ExSymmetriseSimple -.. import numpy as np + import numpy as np -.. #create an asymmetric line shape -.. def rayleigh(x, sigma): -.. return (x / sigma**2) * np.exp( -x**2 / (2*sigma**2)) + # create an asymmetric line shape + def rayleigh(x, sigma): + return (x / sigma ** 2) * np.exp(-x ** 2 / (2 * sigma ** 2)) -.. dataX = np.arange(0, 10, 0.01) -.. dataY = rayleigh(dataX, 1) + dataX = np.arange(0, 10, 0.01) + dataY = rayleigh(dataX, 1) -.. ws = CreateWorkspace(dataX, dataY) -.. ws = ScaleX(ws, -1, "Add") #centre the peak over 0 + ws = CreateWorkspace(dataX, dataY) + ws = ScaleX(ws, -1, "Add") # centre the peak over 0 -.. ws = RenameWorkspace(ws, OutputWorkspace="iris00001_graphite002_red") -.. Symmetrise('00001', '-0.001', InputType='Workspace') + symm_ws = Symmetrise(Sample=ws, XCut=-0.001) .. categories:: From 8ac50cb8b0d19a5b13ab019de3ad07baa8665531 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Wed, 27 Aug 2014 11:14:33 +0100 Subject: [PATCH 015/284] Add a SampleShapeValidator type It is used for checking that a workspace has a valid sample shape. Refs #10169 --- Code/Mantid/Framework/API/CMakeLists.txt | 31 ++++++----- .../API/inc/MantidAPI/SampleShapeValidator.h | 52 +++++++++++++++++++ .../API/src/SampleShapeValidator.cpp | 50 ++++++++++++++++++ .../API/test/SampleShapeValidatorTest.h | 46 ++++++++++++++++ 4 files changed, 165 insertions(+), 14 deletions(-) create mode 100644 Code/Mantid/Framework/API/inc/MantidAPI/SampleShapeValidator.h create mode 100644 Code/Mantid/Framework/API/src/SampleShapeValidator.cpp create mode 100644 Code/Mantid/Framework/API/test/SampleShapeValidatorTest.h diff --git a/Code/Mantid/Framework/API/CMakeLists.txt b/Code/Mantid/Framework/API/CMakeLists.txt index ae0dfd6951d5..e5a323064068 100644 --- a/Code/Mantid/Framework/API/CMakeLists.txt +++ b/Code/Mantid/Framework/API/CMakeLists.txt @@ -10,7 +10,7 @@ set ( SRC_FILES src/AnalysisDataService.cpp src/ArchiveSearchFactory.cpp src/Axis.cpp - src/BinEdgeAxis.cpp + src/BinEdgeAxis.cpp src/BoxController.cpp src/CatalogFactory.cpp src/CatalogManager.cpp @@ -42,9 +42,9 @@ set ( SRC_FILES src/FunctionProperty.cpp src/FunctionValues.cpp src/GridDomain.cpp - src/GridDomain1D.cpp - src/HistoryItem.cpp - src/HistoryView.cpp + src/GridDomain1D.cpp + src/HistoryItem.cpp + src/HistoryView.cpp src/IDomainCreator.cpp src/IEventList.cpp src/IEventWorkspace.cpp @@ -104,8 +104,9 @@ set ( SRC_FILES src/Run.cpp src/Sample.cpp src/SampleEnvironment.cpp + src/SampleShapeValidator.cpp src/ScopedWorkspace.cpp - src/ScriptBuilder.cpp + src/ScriptBuilder.cpp src/ScriptRepository.cpp src/ScriptRepositoryFactory.cpp src/SpectraAxis.cpp @@ -143,7 +144,7 @@ set ( INC_FILES inc/MantidAPI/AnalysisDataService.h inc/MantidAPI/ArchiveSearchFactory.h inc/MantidAPI/Axis.h - inc/MantidAPI/BinEdgeAxis.h + inc/MantidAPI/BinEdgeAxis.h inc/MantidAPI/BoxController.h inc/MantidAPI/CatalogFactory.h inc/MantidAPI/CatalogManager.h @@ -180,9 +181,9 @@ set ( INC_FILES inc/MantidAPI/FunctionProperty.h inc/MantidAPI/FunctionValues.h inc/MantidAPI/GridDomain.h - inc/MantidAPI/GridDomain1D.h + inc/MantidAPI/GridDomain1D.h inc/MantidAPI/HistoryItem.h - inc/MantidAPI/HistoryView.h + inc/MantidAPI/HistoryView.h inc/MantidAPI/IAlgorithm.h inc/MantidAPI/IArchiveSearch.h inc/MantidAPI/IBackgroundFunction.h @@ -262,8 +263,9 @@ set ( INC_FILES inc/MantidAPI/Run.h inc/MantidAPI/Sample.h inc/MantidAPI/SampleEnvironment.h + inc/MantidAPI/SampleShapeValidator.h inc/MantidAPI/ScopedWorkspace.h - inc/MantidAPI/ScriptBuilder.h + inc/MantidAPI/ScriptBuilder.h inc/MantidAPI/ScriptRepository.h inc/MantidAPI/ScriptRepositoryFactory.h inc/MantidAPI/SingleValueParameter.h @@ -296,7 +298,7 @@ set ( TEST_FILES AlgorithmTest.h AnalysisDataServiceTest.h AsynchronousTest.h - BinEdgeAxisTest.h + BinEdgeAxisTest.h BoxControllerTest.h CompositeFunctionTest.h CoordTransformTest.h @@ -316,8 +318,8 @@ set ( TEST_FILES FunctionPropertyTest.h FunctionTest.h FunctionValuesTest.h - HistoryItemTest.h - HistoryViewTest.h + HistoryItemTest.h + HistoryViewTest.h IEventListTest.h IFunction1DSpectrumTest.h IFunction1DTest.h @@ -352,9 +354,10 @@ set ( TEST_FILES PropertyNexusTest.h RunTest.h SampleEnvironmentTest.h + SampleShapeValidatorTest.h SampleTest.h - ScriptBuilderTest.h ScopedWorkspaceTest.h + ScriptBuilderTest.h SpectraAxisTest.h SpectrumDetectorMappingTest.h TextAxisTest.h @@ -362,8 +365,8 @@ set ( TEST_FILES VectorParameterTest.h WorkspaceFactoryTest.h WorkspaceGroupTest.h - WorkspaceHistoryTest.h WorkspaceHistoryIOTest.h + WorkspaceHistoryTest.h WorkspaceOpOverloadsTest.h WorkspacePropertyTest.h ) diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/SampleShapeValidator.h b/Code/Mantid/Framework/API/inc/MantidAPI/SampleShapeValidator.h new file mode 100644 index 000000000000..57270adc5444 --- /dev/null +++ b/Code/Mantid/Framework/API/inc/MantidAPI/SampleShapeValidator.h @@ -0,0 +1,52 @@ +#ifndef MANTID_API_SAMPLESHAPEVALIDATOR_H_ +#define MANTID_API_SAMPLESHAPEVALIDATOR_H_ + +#include "MantidAPI/DllConfig.h" +#include "MantidAPI/ExperimentInfo.h" + +#include "MantidKernel/TypedValidator.h" + +namespace Mantid +{ + namespace API + { + + /** + Verify that a workspace has valid sample shape. + + Copyright © 2014 ISIS Rutherford Appleton Laboratory + & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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. + + Mantid 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, see . + + File change history is stored at: + Code Documentation is available at: + */ + class MANTID_API_DLL SampleShapeValidator : + public Kernel::TypedValidator > + { + public: + std::string getType() const; + Kernel::IValidator_sptr clone() const; + + private: + std::string checkValidity(const boost::shared_ptr& value) const; + }; + + } // namespace API +} // namespace Mantid + +#endif /* MANTID_API_SAMPLESHAPEVALIDATOR_H_ */ diff --git a/Code/Mantid/Framework/API/src/SampleShapeValidator.cpp b/Code/Mantid/Framework/API/src/SampleShapeValidator.cpp new file mode 100644 index 000000000000..a4b6d74adafd --- /dev/null +++ b/Code/Mantid/Framework/API/src/SampleShapeValidator.cpp @@ -0,0 +1,50 @@ +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- +#include "MantidAPI/SampleShapeValidator.h" +#include "MantidGeometry/Objects/Object.h" + +namespace Mantid +{ + namespace API + { + //----------------------------------------------------------------------------- + // Public methods + //----------------------------------------------------------------------------- + + /// @copydoc TypedValidator::getType + std::string SampleShapeValidator::getType() const + { + return "SampleShape"; + } + + /// @copydoc TypedValidator::clone + Kernel::IValidator_sptr SampleShapeValidator::clone() const + { + return boost::make_shared(); + } + + //----------------------------------------------------------------------------- + // Private methods + //----------------------------------------------------------------------------- + + /** + * Checks that the workspace has a valid sample shape defined + * @param value :: The workspace to test + * @return A user level description if a problem exists or "" + */ + std::string SampleShapeValidator::checkValidity( const boost::shared_ptr& value ) const + { + const auto & sampleShape = value->sample().getShape(); + if(sampleShape.hasValidShape()) + { + return ""; + } + else + { + return "Invalid or no shape defined for sample"; + } + } + + } // namespace API +} // namespace Mantid diff --git a/Code/Mantid/Framework/API/test/SampleShapeValidatorTest.h b/Code/Mantid/Framework/API/test/SampleShapeValidatorTest.h new file mode 100644 index 000000000000..e61bcef54ef4 --- /dev/null +++ b/Code/Mantid/Framework/API/test/SampleShapeValidatorTest.h @@ -0,0 +1,46 @@ +#ifndef MANTID_API_SAMPLESHAPEVALIDATORTEST_H_ +#define MANTID_API_SAMPLESHAPEVALIDATORTEST_H_ + +#include + +#include "MantidAPI/SampleShapeValidator.h" +#include "MantidTestHelpers/ComponentCreationHelper.h" +#include "MantidTestHelpers/FakeObjects.h" + +#include "boost/make_shared.hpp" + +using Mantid::API::SampleShapeValidator; + +class SampleShapeValidatorTest : public CxxTest::TestSuite +{ +public: + // This pair of boilerplate methods prevent the suite being created statically + // This means the constructor isn't called when running other tests + static SampleShapeValidatorTest *createSuite() { return new SampleShapeValidatorTest(); } + static void destroySuite( SampleShapeValidatorTest *suite ) { delete suite; } + + void test_validator_passes_for_workspace_with_defined_sample_shape() + { + auto fakeWS = boost::make_shared(); + // Add a sample shape + auto sphere = ComponentCreationHelper::createSphere(1.0, V3D(), "sphere"); + fakeWS->mutableSample().setShape(*sphere); + + auto sampleValidator = boost::make_shared(); + TS_ASSERT_EQUALS( sampleValidator->isValid(fakeWS), "" ); + } + + void test_validator_throws_error_for_workspace_without_shape() + { + auto fakeWS = boost::make_shared(); + + auto sampleValidator = boost::make_shared(); + TS_ASSERT_EQUALS( sampleValidator->isValid(fakeWS), + "Invalid or no shape defined for sample" ); + } + + +}; + + +#endif /* MANTID_API_SAMPLESHAPEVALIDATORTEST_H_ */ From 660c36a138f7a9dc0ff79739d0e751af408a3b17 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Mon, 1 Sep 2014 17:56:21 +0100 Subject: [PATCH 016/284] Add unit & performance test for V3D::rotate. Refs #10169 --- Code/Mantid/Framework/Kernel/test/V3DTest.h | 99 +++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/Code/Mantid/Framework/Kernel/test/V3DTest.h b/Code/Mantid/Framework/Kernel/test/V3DTest.h index 98f6367c1948..e5d7fb2112c9 100644 --- a/Code/Mantid/Framework/Kernel/test/V3DTest.h +++ b/Code/Mantid/Framework/Kernel/test/V3DTest.h @@ -8,6 +8,7 @@ #include #include "MantidKernel/V3D.h" +#include "MantidKernel/Matrix.h" #include "MantidTestHelpers/NexusTestHelper.h" using Mantid::Kernel::V3D; @@ -300,6 +301,63 @@ class V3DTest: public CxxTest::TestSuite TS_ASSERT_DELTA( a.angle(d), M_PI, 0.0001); } + void testRotate() + { + V3D direc(1,1,1); + const double theta = 45.0*M_PI/180.0; + const double invRt2(1.0/sqrt(2.0)); + + // rotate around X + Mantid::Kernel::Matrix rx(3,3); + rx[0][0] = 1.0; + rx[1][1] = cos(theta); + rx[1][2] = -sin(theta); + rx[2][2] = cos(theta); + rx[2][1] = sin(theta); + direc.rotate(rx); + + TS_ASSERT_DELTA(direc.X(), 1.0, 1e-08); + TS_ASSERT_DELTA(direc.Y(), 0.0, 1e-08); + TS_ASSERT_DELTA(direc.Z(), 2.0*invRt2, 1e-08); + + // rotate around Y + direc = V3D(1,1,1); + Mantid::Kernel::Matrix ry(3,3); + ry[0][0] = cos(theta); + ry[0][2] = sin(theta); + ry[1][1] = 1.0; + ry[2][0] = -sin(theta); + ry[2][2] = cos(theta); + direc.rotate(ry); + + TS_ASSERT_DELTA(direc.X(), 2.0*invRt2, 1e-08); + TS_ASSERT_DELTA(direc.Y(), 1.0, 1e-08); + TS_ASSERT_DELTA(direc.Z(), 0.0, 1e-08); + + // rotate around Z + direc = V3D(1,1,1); + Mantid::Kernel::Matrix rz(3,3); + rz[0][0] = cos(theta); + rz[0][1] = -sin(theta); + rz[1][0] = sin(theta); + rz[1][1] = cos(theta); + rz[2][2] = 1.0; + direc.rotate(rz); + + TS_ASSERT_DELTA(direc.X(), 0.0, 1e-08); + TS_ASSERT_DELTA(direc.Y(), 2.0*invRt2, 1e-08); + TS_ASSERT_DELTA(direc.Z(), 1.0, 1e-08); + + // General rotation + Mantid::Kernel::Matrix Rt = rz*ry*rx; + direc = V3D(1,1,1); + direc.rotate(Rt); + + TS_ASSERT_DELTA(direc.X(), invRt2*(1+invRt2), 1e-08); + TS_ASSERT_DELTA(direc.Y(), invRt2*(1+invRt2), 1e-08); + TS_ASSERT_DELTA(direc.Z(), 1.0-invRt2, 1e-08); + } + void testSpherical() { double r = 3, theta = 45.0, phi = 45.0; @@ -539,4 +597,45 @@ class V3DTest: public CxxTest::TestSuite }; +//--------------------------------------------------------------------------- +// Performance tests +//--------------------------------------------------------------------------- + +class V3DTestPerformance : public CxxTest::TestSuite +{ +public: + // This pair of boilerplate methods prevent the suite being created statically + // This means the constructor isn't called when running other tests + static V3DTestPerformance *createSuite() { return new V3DTestPerformance(); } + static void destroySuite( V3DTestPerformance *suite ) { delete suite; } + + V3DTestPerformance() + { + const double theta = 45.0*M_PI/180.0; + + // rotate around X + m_rotx = Mantid::Kernel::Matrix(3,3); + m_rotx[0][0] = 1.0; + m_rotx[1][1] = cos(theta); + m_rotx[1][2] = -sin(theta); + m_rotx[2][2] = cos(theta); + m_rotx[2][1] = sin(theta); + } + + void testRotate() + { + V3D direction(1.0,1.0,1.0); + for(size_t i = 0; i < 100000; ++i) + { + direction = V3D(1.0,1.0,1.0); + direction.rotate(m_rotx); + } + // Do something so the compiler doesn't optimise the loop away + TS_ASSERT_DELTA(direction.Y(), 0.0, 1e-08); + } + +private: + Mantid::Kernel::Matrix m_rotx; +}; + #endif From 86d75d393245c1ecc139acd3ad840d9281c4ef1e Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Tue, 2 Sep 2014 08:19:34 +0100 Subject: [PATCH 017/284] Fix doxygen warnings in SampleShapeValidator Refs #10169 --- Code/Mantid/Framework/API/src/SampleShapeValidator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/API/src/SampleShapeValidator.cpp b/Code/Mantid/Framework/API/src/SampleShapeValidator.cpp index a4b6d74adafd..21ef26c0e499 100644 --- a/Code/Mantid/Framework/API/src/SampleShapeValidator.cpp +++ b/Code/Mantid/Framework/API/src/SampleShapeValidator.cpp @@ -12,13 +12,13 @@ namespace Mantid // Public methods //----------------------------------------------------------------------------- - /// @copydoc TypedValidator::getType + /// @return A string identifier for the type of validator std::string SampleShapeValidator::getType() const { return "SampleShape"; } - /// @copydoc TypedValidator::clone + /// @return A copy of the validator as a new object Kernel::IValidator_sptr SampleShapeValidator::clone() const { return boost::make_shared(); From 576347b030ee2b752c54f31caf5ac7c9157eeb63 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Mon, 1 Sep 2014 17:57:56 +0100 Subject: [PATCH 018/284] Improve performance of V3D::rotate. Avoids instantiating two additional matrices for the calculation. Refs #10169 --- Code/Mantid/Framework/Kernel/src/V3D.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/Code/Mantid/Framework/Kernel/src/V3D.cpp b/Code/Mantid/Framework/Kernel/src/V3D.cpp index 8e06fb397002..1710acb8373b 100644 --- a/Code/Mantid/Framework/Kernel/src/V3D.cpp +++ b/Code/Mantid/Framework/Kernel/src/V3D.cpp @@ -556,15 +556,10 @@ V3D::rotate(const Kernel::Matrix& A) @param A :: Rotation matrix (needs to be >3x3) */ { - Matrix Pv(3,1); - Pv[0][0]=x; - Pv[1][0]=y; - Pv[2][0]=z; - Matrix Po=A*Pv; - x=Po[0][0]; - y=Po[1][0]; - z=Po[2][0]; - return; + double xold(x), yold(y), zold(z); + x = A[0][0]*xold + A[0][1]*yold + A[0][2]*zold; + y = A[1][0]*xold + A[1][1]*yold + A[1][2]*zold; + z = A[2][0]*xold + A[2][1]*yold + A[2][2]*zold; } /** From 769898783948258b70b4d87719f74ac894c34e92 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Mon, 1 Sep 2014 11:12:07 +0100 Subject: [PATCH 019/284] Checkpoint CalculateMSVesuvio Refs #10169 --- .../Framework/CurveFitting/CMakeLists.txt | 7 +- .../MantidCurveFitting/CalculateMSVesuvio.h | 140 ++++++ .../CurveFitting/src/CalculateMSVesuvio.cpp | 421 ++++++++++++++++++ .../test/CalculateMSVesuvioTest.h | 147 ++++++ 4 files changed, 713 insertions(+), 2 deletions(-) create mode 100644 Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h create mode 100644 Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp create mode 100644 Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h diff --git a/Code/Mantid/Framework/CurveFitting/CMakeLists.txt b/Code/Mantid/Framework/CurveFitting/CMakeLists.txt index c0906757d86a..403c02e38b34 100644 --- a/Code/Mantid/Framework/CurveFitting/CMakeLists.txt +++ b/Code/Mantid/Framework/CurveFitting/CMakeLists.txt @@ -12,6 +12,7 @@ set ( SRC_FILES src/Bk2BkExpConvPV.cpp src/BoundaryConstraint.cpp src/CalculateGammaBackground.cpp + src/CalculateMSVesuvio.cpp src/Chebyshev.cpp src/ComptonPeakProfile.cpp src/ComptonProfile.cpp @@ -99,7 +100,7 @@ set ( SRC_FILES src/FakeMinimizer.cpp ) - + set ( SRC_UNITY_IGNORE_FILES src/Fit1D.cpp src/GSLFunctions.cpp ) set ( INC_FILES @@ -117,6 +118,7 @@ set ( INC_FILES inc/MantidCurveFitting/Bk2BkExpConvPV.h inc/MantidCurveFitting/BoundaryConstraint.h inc/MantidCurveFitting/CalculateGammaBackground.h + inc/MantidCurveFitting/CalculateMSVesuvio.h inc/MantidCurveFitting/Chebyshev.h inc/MantidCurveFitting/ComptonPeakProfile.h inc/MantidCurveFitting/ComptonProfile.h @@ -206,7 +208,7 @@ set ( INC_FILES inc/MantidCurveFitting/VesuvioResolution.h inc/MantidCurveFitting/Voigt.h ) - + set ( TEST_FILES # ChebyshevPolynomialBackgroundTest.h # RefinePowderInstrumentParametersTest.h @@ -220,6 +222,7 @@ set ( TEST_FILES Bk2BkExpConvPVTest.h BoundaryConstraintTest.h CalculateGammaBackgroundTest.h + CalculateMSVesuvioTest.h ChebyshevTest.h CompositeFunctionTest.h ComptonPeakProfileTest.h diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h new file mode 100644 index 000000000000..9ba2e2e8c0af --- /dev/null +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -0,0 +1,140 @@ +#ifndef MANTID_CURVEFITTING_CALCULATEMSVESUVIO_H_ +#define MANTID_CURVEFITTING_CALCULATEMSVESUVIO_H_ +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- +#include "MantidAPI/Algorithm.h" +#include "MantidGeometry/Instrument/ReferenceFrame.h" + +#include +#include +#include + +namespace Mantid +{ + namespace CurveFitting + { + //----------------------------------------------------------------------------- + // CurveFitting forward declarations + //----------------------------------------------------------------------------- + struct DetectorParams; + struct ResolutionParams; + + /** + Calculates the multiple scattering & total scattering contributions + for a flat-plate or cylindrical sample. + + Copyright © 2014 ISIS Rutherford Appleton Laboratory & + NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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. + + Mantid 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, see . + + File change history is stored at: + Code Documentation is available at: + */ + class DLLExport CalculateMSVesuvio : public API::Algorithm + { + private: + // Struct to store cache instrument geometry + struct InstrumentGeometry + { + InstrumentGeometry(); + + boost::shared_ptr refframe; + double srcR1; + double srcR2; + double sampleHeight; + double sampleWidth; + }; + // Produces random numbers with various probability distributions + class RandomNumberGenerator + { + typedef boost::uniform_real uniform_double; + typedef boost::normal_distribution gaussian_double; + public: + RandomNumberGenerator(const int seed); + /// Returns a flat random number between 0.0 & 1.0 + double flat(); + /// Returns a random number distributed by a normal distribution + double gaussian(const double mean, const double sigma); + + private: + boost::mt19937 m_generator; + }; + // Stores counts for each scatter order + // for a "run" of a given number of events + struct Simulation + { + Simulation(const size_t order, const size_t ntimes); + + std::vector> counts; + size_t maxorder; + double weight; + size_t nmscat; + }; + // Accumulates and averages the results of each simulation + struct SimulationAggregator + { + SimulationAggregator(const size_t nruns, + const size_t order, + const size_t ntimes); + // Adds a result as part of the average + void add(const Simulation & result); + + Simulation averaged; + double prefactor; + }; + + public: + CalculateMSVesuvio(); + ~CalculateMSVesuvio(); + + virtual const std::string name() const; + virtual int version() const; + virtual const std::string category() const; + virtual const std::string summary() const; + + private: + void init(); + void exec(); + + void cacheInputGeometry(); + void calculateMS(const size_t wsIndex, API::ISpectrum & totalsc, + API::ISpectrum & multsc) const; + Simulation simulate(const size_t nevents, const size_t nscatters, + const DetectorParams & detpar, + const ResolutionParams &respar) const; + double calculateTOF(const size_t nscatters, + const DetectorParams & detpar, + const ResolutionParams &respar, + Simulation & counts) const; + + // single-event helpers + double initialTOF(const double mean, const double sigma) const; + double moderatorPos(double & widthPos, double & heightPos) const; + + // Member Variables + RandomNumberGenerator *m_randgen; + InstrumentGeometry m_instgeom; + + API::MatrixWorkspace_sptr m_inputWS; + API::Progress *m_progress; + }; + + } // namespace CurveFitting +} // namespace Mantid + +#endif /* MANTID_CURVEFITTING_CALCULATEMSVESUVIO_H_ */ diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp new file mode 100644 index 000000000000..2af53eacf4d4 --- /dev/null +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -0,0 +1,421 @@ +//----------------------------------------------------------------------------- +// Includes +// +#include "MantidCurveFitting/CalculateMSVesuvio.h" +// Use helpers for storing detector/resolution parameters +#include "MantidCurveFitting/ConvertToYSpace.h" +#include "MantidCurveFitting/VesuvioResolution.h" + +#include "MantidAPI/SampleShapeValidator.h" +#include "MantidAPI/WorkspaceValidators.h" + +#include "MantidGeometry/Instrument/DetectorGroup.h" +#include "MantidGeometry/Instrument/ParameterMap.h" + +#include "MantidKernel/BoundedValidator.h" +#include "MantidKernel/CompositeValidator.h" +#include "MantidKernel/MersenneTwister.h" + +#include + +namespace Mantid +{ + namespace CurveFitting + { + using namespace Kernel; + using namespace API; + + namespace + { + const size_t NSIMULATIONS = 10; + const size_t NEVENTS = 500000; + const size_t NSCATTERS = 3; + } // end anonymous namespace + + //------------------------------------------------------------------------- + // InstrumentGeometry cache + //------------------------------------------------------------------------- + + CalculateMSVesuvio::InstrumentGeometry::InstrumentGeometry() : + refframe(), srcR1(0.0), srcR2(0.0), + sampleHeight(0.0), sampleWidth(0.0) + { + } + + //------------------------------------------------------------------------- + // RandomNumberGenerator helper + //------------------------------------------------------------------------- + /** + * Produces random numbers with various probability distributions + */ + CalculateMSVesuvio:: + RandomNumberGenerator::RandomNumberGenerator(const int seed) : m_generator() + { + m_generator.seed(static_cast(seed)); + } + /// Returns a flat random number between 0.0 & 1.0 + double CalculateMSVesuvio:: + RandomNumberGenerator::flat() + { + return uniform_double()(m_generator, + uniform_double::param_type(0.0, 1.0)); + } + /// Returns a random number distributed by a normal distribution + double CalculateMSVesuvio:: + RandomNumberGenerator::gaussian(const double mean, const double sigma) + { + return gaussian_double()(m_generator, + gaussian_double::param_type(mean, sigma)); + } + + //------------------------------------------------------------------------- + // Simulation helpers + //------------------------------------------------------------------------- + /** + * Stores counts for each scatter order + * for a "run" of a given number of events + */ + CalculateMSVesuvio::Simulation:: + Simulation(const size_t order, const size_t ntimes) : + counts(order, std::vector(ntimes)), + maxorder(order), weight(0.0), nmscat(0) + {} + + /** + * Accumulates and averages the results + * of each simulation + */ + CalculateMSVesuvio::SimulationAggregator:: + SimulationAggregator(const size_t nruns, + const size_t order, + const size_t ntimes) : + averaged(order, ntimes), + prefactor(1.0/static_cast(nruns)) + {} + + /** Adds a result as part of the average + * @param result A new simulation result + */ + void CalculateMSVesuvio::SimulationAggregator:: + add(const Simulation & result) + { + // No check is performed whether the number of + // stated runs has been reached or the order is the same + for(size_t i = 0; i < averaged.maxorder; ++i) + { + auto & avgcounts = averaged.counts[i]; + const auto & rescounts = result.counts[i]; + std::vector::iterator avgIter(avgcounts.begin()); + std::vector::const_iterator resIter(rescounts.begin()); + for(; avgIter != avgcounts.end(); ++avgIter, ++resIter) + { + *avgIter += prefactor*(*resIter); + } + } + } + + //------------------------------------------------------------------------- + // Algorithm definitions + //------------------------------------------------------------------------- + + // Register the algorithm into the AlgorithmFactory + DECLARE_ALGORITHM(CalculateMSVesuvio) + + /// Constructor + CalculateMSVesuvio::CalculateMSVesuvio() : Algorithm(), + m_randgen(NULL), m_instgeom(), + + m_inputWS(), + m_progress(NULL) + { + } + + /// Destructor + CalculateMSVesuvio::~CalculateMSVesuvio() + { + delete m_randgen; + } + + /// @copydoc Algorithm::name + const std::string CalculateMSVesuvio::name() const + { + return "CalculateMSVesuvio"; + } + + /// @copydoc Algorithm::version + int CalculateMSVesuvio::version() const + { + return 1; + } + + /// @copydoc Algorithm::category + const std::string CalculateMSVesuvio::category() const + { + return "Corrections"; + } + + /// @copydoc Algorithm::summary + const std::string CalculateMSVesuvio::summary() const + { + return "Corrects for the effects of multiple scattering " + "on a flat plate or cylindrical sample."; + } + + /** + * Initialize the algorithm's properties. + */ + void CalculateMSVesuvio::init() + { + // Inputs + auto inputWSValidator = boost::make_shared(); + inputWSValidator->add("TOF"); + inputWSValidator->add(); + declareProperty(new WorkspaceProperty<>("InputWorkspace","", + Direction::Input, inputWSValidator), + "Input workspace to be corrected, in units of TOF."); + + auto positiveNonZero = boost::make_shared>(); + positiveNonZero->setLower(0.0); + positiveNonZero->setLowerExclusive(true); + declareProperty("BeamUmbraRadius", -1.0, positiveNonZero, + "Radius, in cm, of part in total shadow."); + declareProperty("BeamPenumbraRadius", -1.0, positiveNonZero, + "Radius, in cm, of part in partial shadow."); + setPropertyGroup("BeamUmbraRadius", "Beam"); + setPropertyGroup("BeamPenumbraRadius", "Beam"); + + auto positiveInt = boost::make_shared>(); + positiveInt->setLower(1); + declareProperty("Seed", 123456789, positiveInt, + "Seed the random number generator with this value"); + + // Outputs + declareProperty(new WorkspaceProperty<>("TotalScatteringWS","", Direction::Output), + "Workspace to store the calculated total scattering counts"); + declareProperty(new WorkspaceProperty<>("MultipleScatteringWS","", Direction::Output), + "Workspace to store the calculated total scattering counts"); + } + + /** + * Execute the algorithm. + */ + void CalculateMSVesuvio::exec() + { + m_inputWS = getProperty("InputWorkspace"); + cacheInputGeometry(); + // Values used frequently + const int64_t nhist = static_cast(m_inputWS->getNumberHistograms()); + + // Create new workspaces + MatrixWorkspace_sptr totalsc = WorkspaceFactory::Instance().create(m_inputWS); + MatrixWorkspace_sptr multsc = WorkspaceFactory::Instance().create(m_inputWS); + + // Initialize random number generator + m_randgen = new RandomNumberGenerator(getProperty("Seed")); + + // Setup progress + m_progress = new API::Progress(this, 0.0, 1.0, nhist); + for(int64_t i = 0; i < nhist; ++i) + { + m_progress->report("Calculating corrections"); + + // Copy over the X-values + const MantidVec & xValues = m_inputWS->readX(i); + totalsc->dataX(i) = xValues; + multsc->dataX(i) = xValues; + + // Final detector position + Geometry::IDetector_const_sptr detector; + try + { + detector = m_inputWS->getDetector(i); + } + catch(Kernel::Exception::NotFoundError&) + { + // intel compiler doesn't like continue in a catch inside an OMP loop + } + if(!detector) + { + std::ostringstream os; + os << "No valid detector object found for spectrum at workspace index '" << i << "'. No correction calculated."; + g_log.information(os.str()); + continue; + } + + // the output spectrum objects have references to where the data will be stored + calculateMS(i, *totalsc->getSpectrum(i), *multsc->getSpectrum(i)); + } + + setProperty("TotalScatteringWS", totalsc); + setProperty("MultipleScatteringWS", multsc); + } + + /** + * Caches sample, detector geometry for speed in later calculations + */ + void CalculateMSVesuvio::cacheInputGeometry() + { + const auto instrument = m_inputWS->getInstrument(); + const auto rframe = instrument->getReferenceFrame(); + m_instgeom.refframe = rframe; + + m_instgeom.srcR1 = getProperty("BeamUmbraRadius"); + m_instgeom.srcR2 = getProperty("BeamPenumbraRadius"); + if(m_instgeom.srcR2 < m_instgeom.srcR1) + { + std::ostringstream os; + os << "Invalid beam radius parameters. Penumbra value=" + << m_instgeom.srcR2 << " < Umbra value=" + << m_instgeom.srcR1; + throw std::invalid_argument(os.str()); + } + + // Sample shape + const auto & sampleShape = m_inputWS->sample().getShape(); + // We know the shape is valid from the property validator but we + // need to check if it is cuboid or cylinder + int objType(-1); + double radius(-1.0), height(-1.0); + std::vector pts; + sampleShape.GetObjectGeom(objType, pts, radius, height); + if(objType != 1 && objType != 3) + { + throw std::invalid_argument("Invalid sample shape. Currently only " + "cuboid or cylinder are supported"); + } + assert(pts.size() == 4); + if(objType == 1) // cuboid + { + auto horiz = rframe->pointingHorizontal(); + m_instgeom.sampleWidth = fabs(pts[0][horiz] - pts[3][horiz]); + auto up = rframe->pointingUp(); + m_instgeom.sampleHeight = fabs(pts[0][up] - pts[1][up]); + } + else + { + m_instgeom.sampleWidth = 2.0*radius; + m_instgeom.sampleHeight = height; + } + } + + /** + * Calculate the total scattering and contributions from higher-order scattering for given + * spectrum + * @param wsIndex The index on the input workspace for the chosen spectrum + * @param totalsc A non-const reference to the spectrum that will contain the total scattering calculation + * @param multsc A non-const reference to the spectrum that will contain the multiple scattering contribution + */ + void CalculateMSVesuvio::calculateMS(const size_t wsIndex, API::ISpectrum & totalsc, + API::ISpectrum & multsc) const + { + // Detector information + DetectorParams detpar = ConvertToYSpace::getDetectorParameters(m_inputWS, wsIndex); + // t0 is stored in seconds here, whereas here we want microseconds + detpar.t0 *= 1e6; + + const Geometry::IDetector_const_sptr detector = m_inputWS->getDetector(wsIndex); + const auto & pmap = m_inputWS->instrumentParameters(); + // Resolution information + ResolutionParams respar; + respar.dl1 = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_l1"); + respar.dl2 = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_l2"); + respar.dthe = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_theta"); //radians + respar.dEnLorentz = ConvertToYSpace::getComponentParameter(detector, pmap, "hwhm_lorentz"); + respar.dEnGauss = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_gauss"); + + // Final counts averaged over all simulations + SimulationAggregator avgCounts(NSIMULATIONS, NSCATTERS, m_inputWS->blocksize()); + for(size_t i = 0; i < NSIMULATIONS; ++i) + { + avgCounts.add(simulate(NEVENTS, NSCATTERS, detpar, respar)); + } + + } + + /** + * Perform a single simulation of a given number of events for up to a maximum number of + * scatterings on a chosen detector + * @param nevents The number of neutron events to simulate + * @param nscatters Maximum order of scattering that should be simulated + * @param detpar Detector information describing the final detector position + * @param respar Resolution information on the intrument as a whole + * @return A new simulation object storing the calculated number of counts + */ + CalculateMSVesuvio::Simulation + CalculateMSVesuvio::simulate(const size_t nevents, const size_t nscatters, + const DetectorParams & detpar, + const ResolutionParams &respar) const + { + Simulation simulCounts(NSCATTERS, m_inputWS->blocksize()); + for(size_t i = 0; i < nevents; ++i) + { + simulCounts.weight += calculateTOF(nscatters, detpar, respar, simulCounts); + } + + return simulCounts; + } + + /** + * + * @param nscatters Maximum order of scattering that should be simulated + * @param detpar Detector information describing the final detector position + * @param respar Resolution information on the intrument as a whole + * @param counts [Output] Store the calculated counts here + * @return + */ + double CalculateMSVesuvio::calculateTOF(const size_t nscatters, const DetectorParams &detpar, + const ResolutionParams &respar, + Simulation &counts) const + { + double weightSum(0.0); + std::vector weightsPerScatter(nscatters, 1.0); // start at 1.0 + std::vector tofs(nscatters, 0.0); + + tofs[0] = initialTOF(0.0, detpar.t0); + // moderator coord in lab frame + V3D srcLab(0.0, -detpar.l1, 0.0); + weightsPerScatter[0] *= moderatorPos(srcLab[0], srcLab[2]); +// if(heightLab > m_instgeom.sampleHeight || +// widthLab > m_instgeom.sampleWidth) return 0.0; // misses sample + + + return weightSum; + } + + /** + * Sample a tof value from a gaussian distribution + * @param centre The value of the centra point of the distribution + * @param sigma Width of the distribution + * @return New variable distributed accordingly + */ + double CalculateMSVesuvio::initialTOF(const double centre, const double sigma) const + { + return m_randgen->gaussian(centre, sigma); + } + + /** + * Sample from the moderator assuming it can be seen + * as a cylindrical ring with inner and outer radius + * @param widthPos [Out] Position in the width direction of the generated point + * @param heightPos [Out] Position in the height direction of the generated point + */ + double CalculateMSVesuvio::moderatorPos(double &widthPos, double &heightPos) const + { + double radius(-1.0); + do + { + widthPos = -m_instgeom.srcR2 + 2.0*m_instgeom.srcR2*m_randgen->flat(); + heightPos = -m_instgeom.srcR2 + 2.0*m_instgeom.srcR2*m_randgen->flat(); + using std::sqrt; + radius = sqrt(widthPos*widthPos + heightPos*heightPos); + } + while(radius > m_instgeom.srcR2); + + if(radius > m_instgeom.srcR1) + return (m_instgeom.srcR2 - radius)/(m_instgeom.srcR2 - m_instgeom.srcR1); + else + return 1.0; // inside umbra unit weight + } + + } // namespace Algorithms +} // namespace Mantid diff --git a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h new file mode 100644 index 000000000000..80f724597bba --- /dev/null +++ b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h @@ -0,0 +1,147 @@ +#ifndef MANTID_CURVEFITTING_CALCULATEMSVESUIVIOTEST_H_ +#define MANTID_CURVEFITTING_CALCULATEMSVESUIVIOTEST_H_ + +#include + +#include "MantidCurveFitting/CalculateMSVesuvio.h" + +#include "MantidTestHelpers/ComponentCreationHelper.h" +#include "MantidTestHelpers/WorkspaceCreationHelper.h" + +#include "ComptonProfileTestHelpers.h" + +using Mantid::CurveFitting::CalculateMSVesuvio; + +class CalculateMSVesuvioTest : public CxxTest::TestSuite +{ +public: + // This pair of boilerplate methods prevent the suite being created statically + // This means the constructor isn't called when running other tests + static CalculateMSVesuvioTest *createSuite() { return new CalculateMSVesuvioTest(); } + static void destroySuite( CalculateMSVesuvioTest *suite ) { delete suite; } + + // ------------------------ Success Cases ----------------------------------------- + + void test_init() + { + CalculateMSVesuvio alg; + TS_ASSERT_THROWS_NOTHING(alg.initialize()); + TS_ASSERT(alg.isInitialized()); + } + + void test_exec_with_flat_plate_sample() + { + auto alg = createTestAlgorithm(createFlatPlateSampleWS()); + + TS_ASSERT_THROWS_NOTHING(alg->execute()); + TS_ASSERT(alg->isExecuted()); + } + + // ------------------------ Failure Cases ----------------------------------------- + + void test_setting_input_workspace_not_in_tof_throws_invalid_argument() + { + CalculateMSVesuvio alg; + alg.initialize(); + + auto testWS = WorkspaceCreationHelper::Create2DWorkspace(1, 1); + TS_ASSERT_THROWS(alg.setProperty("InputWorkspace", testWS), std::invalid_argument); + } + + void test_setting_workspace_with_no_sample_shape_throws_invalid_argument() + { + CalculateMSVesuvio alg; + alg.initialize(); + + auto testWS = WorkspaceCreationHelper::Create2DWorkspace(1, 1); + testWS->getAxis(0)->setUnit("TOF"); + TS_ASSERT_THROWS(alg.setProperty("InputWorkspace", testWS), std::invalid_argument); + } + + void test_input_workspace_and_sampleshape_not_cuboid_or_cylinder_throws_invalid_argument_on_execution() + { + auto testWS = createFlatPlateSampleWS(); + auto sampleShape = ComponentCreationHelper::createSphere(1, Mantid::Kernel::V3D(), + "sample-shape"); + testWS->mutableSample().setShape(*sampleShape); // overwrite shape + auto alg = createTestAlgorithm(testWS); + + TS_ASSERT_THROWS(alg->execute(), std::invalid_argument); + } + + void test_setting_zero_or_negative_beam_radius_values_throws_invalid_argument() + { + CalculateMSVesuvio alg; + alg.initialize(); + + TS_ASSERT_THROWS(alg.setProperty("BeamUmbraRadius", -1.5), std::invalid_argument); + TS_ASSERT_THROWS(alg.setProperty("BeamUmbraRadius", 0.0), std::invalid_argument); + TS_ASSERT_THROWS(alg.setProperty("BeamPenumbraRadius", -1.5), std::invalid_argument); + TS_ASSERT_THROWS(alg.setProperty("BeamPenumbraRadius", 0.0), std::invalid_argument); + } + + void test_setting_umbra_less_than_penumbra_throws_invalid_argument() + { + auto testWS = createFlatPlateSampleWS(); + auto alg = createTestAlgorithm(testWS); + + alg->setProperty("BeamUmbraRadius", 2.5); + alg->setProperty("BeamPenumbraRadius", 1.5); + + TS_ASSERT_THROWS(alg->execute(), std::invalid_argument); + } + +private: + + Mantid::API::IAlgorithm_sptr createTestAlgorithm(const Mantid::API::MatrixWorkspace_sptr & inputWS) + { + Mantid::API::IAlgorithm_sptr alg = boost::shared_ptr(new CalculateMSVesuvio); + alg->initialize(); + alg->setRethrows(true); + alg->setChild(true); + // inputs + alg->setProperty("InputWorkspace", inputWS); + alg->setProperty("BeamUmbraRadius", 1.5); + alg->setProperty("BeamPenumbraRadius", 2.5); + // outputs + alg->setPropertyValue("TotalScatteringWS", "__unused_for_child"); + alg->setPropertyValue("MultipleScatteringWS", "__unused_for_child"); + + return alg; + } + + struct ones + { + double operator()(const double, size_t) { return 1.0; } // don't care about Y values, just use 1.0 everywhere + }; + + Mantid::API::MatrixWorkspace_sptr createFlatPlateSampleWS() + { + auto testWS = createTestWorkspace(); + // Sample shape + const double height(0.1), width(0.02), thick(0.005); + auto sampleShape = ComponentCreationHelper::createCuboid(width, height, thick); + testWS->mutableSample().setShape(*sampleShape); + + return testWS; + } + + + + Mantid::API::MatrixWorkspace_sptr createTestWorkspace() + { + using namespace Mantid::Geometry; + using namespace Mantid::Kernel; + + const int nhist(1); + const double x0(50.0), x1(562.0), dx(1.0); + const bool singleMassSpec(false), foilChanger(false); + auto ws2d = ComptonProfileTestHelpers::createTestWorkspace(nhist, x0, x1, dx, singleMassSpec, foilChanger); + + return ws2d; + } + +}; + + +#endif /* MANTID_CURVEFITTING_CALCULATEMSVESUIVIOTEST_H_ */ From a134ee0513b4e13f9f9d9dcb9ce18d354830c8c4 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 3 Sep 2014 15:27:03 +0100 Subject: [PATCH 020/284] Edited algo to act as intended Refs #7860 --- .../{WorkflowAlgorithms => }/Symmetrise.py | 50 +++++++++++-------- 1 file changed, 30 insertions(+), 20 deletions(-) rename Code/Mantid/Framework/PythonInterface/plugins/algorithms/{WorkflowAlgorithms => }/Symmetrise.py (74%) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py similarity index 74% rename from Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py rename to Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 16957d20a5ff..ba0da303ac43 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -1,7 +1,7 @@ from mantid import logger, mtd from mantid.api import PythonAlgorithm, AlgorithmFactory, WorkspaceProperty from mantid.kernel import Direction -from mantid.simpleapi import CloneWorkspace, SaveNexusProcessed +from mantid.simpleapi import CreateWorkspace, CopyLogs, CopySample, CopyInstrumentParameters, SaveNexusProcessed import math import os.path @@ -42,7 +42,7 @@ def PyExec(self): if math.fabs(self._x_cut) < 1e-5: raise ValueError('XCut point is Zero') - # find range of values to flip + # Find range of values to flip delta_x = sample_x[1] - sample_x[0] negative_diff = np.absolute(sample_x - self._x_cut) @@ -53,6 +53,8 @@ def PyExec(self): positive_index = np.where(positive_diff < delta_x)[0][-1] self._check_bounds(positive_index, num_pts, label='Positive') + new_data_size = 2*num_pts - (positive_index + negative_index) + 1 + if self._verbose: logger.notice('No. points = %d' % num_pts) logger.notice('Negative : at i =%d; x = %f' @@ -60,26 +62,34 @@ def PyExec(self): logger.notice('Positive : at i =%d; x = %f' % (positive_index, sample_x[positive_index])) - CloneWorkspace(InputWorkspace=self._sample, - OutputWorkspace=self._output_workspace) - - # for each spectrum copy positive values to the negative - for index in xrange(num_spectra): - x_in = mtd[self._output_workspace].readX(index) - y_in = mtd[self._output_workspace].readY(index) - e_in = mtd[self._output_workspace].readE(index) + zeros = np.zeros(new_data_size * num_spectra) + CreateWorkspace(OutputWorkspace=self._output_workspace, + DataX=zeros, DataY=zeros, DataE=zeros, + NSpec=num_spectra) - x_out = np.zeros(x_in.size) - y_out = np.zeros(y_in.size) - e_out = np.zeros(e_in.size) + CopyLogs(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) + # CopyInstrumentParameters(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) + # CopySample(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) - x_out[:positive_index] = -x_in[negative_index + positive_index:negative_index:-1] - y_out[:positive_index] = y_in[negative_index + positive_index:negative_index:-1] - e_out[:positive_index] = e_in[negative_index + positive_index:negative_index:-1] - - x_out[positive_index:] = x_in[positive_index:] - y_out[positive_index:] = y_in[positive_index:] - e_out[positive_index:] = e_in[positive_index:] + # For each spectrum copy positive values to the negative + for index in xrange(num_spectra): + x_in = mtd[self._sample].readX(index) + y_in = mtd[self._sample].readY(index) + e_in = mtd[self._sample].readE(index) + + x_out = np.zeros(new_data_size) + y_out = np.zeros(new_data_size) + e_out = np.zeros(new_data_size) + + # Left hand side of cut + x_out[:num_pts - negative_index] = -x_in[num_pts:negative_index:-1] + y_out[:num_pts - negative_index] = y_in[num_pts:negative_index:-1] + e_out[:num_pts - negative_index] = e_in[num_pts:negative_index:-1] + + # Right hand side of cut + x_out[num_pts - negative_index:] = x_in[positive_index:] + y_out[num_pts - negative_index:] = y_in[positive_index:] + e_out[num_pts - negative_index:] = e_in[positive_index:] mtd[self._output_workspace].setX(index, x_out) mtd[self._output_workspace].setY(index, y_out) From 9801cb6bcac49639a6188dc94ea57cc4138057b7 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 3 Sep 2014 15:50:49 +0100 Subject: [PATCH 021/284] Fixed negative and positive edge finding Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index ba0da303ac43..0d86699f2d3e 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -45,7 +45,7 @@ def PyExec(self): # Find range of values to flip delta_x = sample_x[1] - sample_x[0] - negative_diff = np.absolute(sample_x - self._x_cut) + negative_diff = np.absolute(sample_x + self._x_cut) negative_index = np.where(negative_diff < delta_x)[0][-1] self._check_bounds(negative_index, num_pts, label='Negative') @@ -53,7 +53,7 @@ def PyExec(self): positive_index = np.where(positive_diff < delta_x)[0][-1] self._check_bounds(positive_index, num_pts, label='Positive') - new_data_size = 2*num_pts - (positive_index + negative_index) + 1 + new_data_size = 2 * num_pts - (positive_index + negative_index) + 1 if self._verbose: logger.notice('No. points = %d' % num_pts) @@ -82,14 +82,14 @@ def PyExec(self): e_out = np.zeros(new_data_size) # Left hand side of cut - x_out[:num_pts - negative_index] = -x_in[num_pts:negative_index:-1] - y_out[:num_pts - negative_index] = y_in[num_pts:negative_index:-1] - e_out[:num_pts - negative_index] = e_in[num_pts:negative_index:-1] + x_out[:num_pts - positive_index] = -x_in[num_pts:positive_index:-1] + y_out[:num_pts - positive_index] = y_in[num_pts:positive_index:-1] + e_out[:num_pts - positive_index] = e_in[num_pts:positive_index:-1] # Right hand side of cut - x_out[num_pts - negative_index:] = x_in[positive_index:] - y_out[num_pts - negative_index:] = y_in[positive_index:] - e_out[num_pts - negative_index:] = e_in[positive_index:] + x_out[num_pts - positive_index:] = x_in[negative_index:] + y_out[num_pts - positive_index:] = y_in[negative_index:] + e_out[num_pts - positive_index:] = e_in[negative_index:] mtd[self._output_workspace].setX(index, x_out) mtd[self._output_workspace].setY(index, y_out) From de5e53745c62a4fff2299c9dc1ea2ca502933ce3 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 3 Sep 2014 16:25:26 +0100 Subject: [PATCH 022/284] Refactoring, restrict IDR UI to reduced files/ws Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 40 ++++++++++--------- .../IndirectDataReduction.ui | 6 +++ .../src/IndirectSymmetrise.cpp | 8 ++-- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 0d86699f2d3e..43d36e99ca5b 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -36,7 +36,7 @@ def PyExec(self): StartTime('Symmetrise') self._setup() - num_spectra, num_pts = CheckHistZero(self._sample) + num_spectra, sample_aray_len = CheckHistZero(self._sample) sample_x = mtd[self._sample].readX(0) if math.fabs(self._x_cut) < 1e-5: @@ -47,28 +47,29 @@ def PyExec(self): negative_diff = np.absolute(sample_x + self._x_cut) negative_index = np.where(negative_diff < delta_x)[0][-1] - self._check_bounds(negative_index, num_pts, label='Negative') + self._check_bounds(negative_index, sample_aray_len, label='Negative') positive_diff = np.absolute(sample_x + sample_x[negative_index]) positive_index = np.where(positive_diff < delta_x)[0][-1] - self._check_bounds(positive_index, num_pts, label='Positive') + self._check_bounds(positive_index, sample_aray_len, label='Positive') - new_data_size = 2 * num_pts - (positive_index + negative_index) + 1 + new_array_len = 2 * sample_aray_len - (positive_index + negative_index) + 1 if self._verbose: - logger.notice('No. points = %d' % num_pts) + logger.notice('No. points = %d' % sample_aray_len) logger.notice('Negative : at i =%d; x = %f' % (negative_index, sample_x[negative_index])) logger.notice('Positive : at i =%d; x = %f' % (positive_index, sample_x[positive_index])) + logger.notice('New array size = %d' % new_array_len) - zeros = np.zeros(new_data_size * num_spectra) + zeros = np.zeros(new_array_len * num_spectra) CreateWorkspace(OutputWorkspace=self._output_workspace, DataX=zeros, DataY=zeros, DataE=zeros, NSpec=num_spectra) CopyLogs(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) - # CopyInstrumentParameters(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) + CopyInstrumentParameters(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) # CopySample(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) # For each spectrum copy positive values to the negative @@ -77,24 +78,27 @@ def PyExec(self): y_in = mtd[self._sample].readY(index) e_in = mtd[self._sample].readE(index) - x_out = np.zeros(new_data_size) - y_out = np.zeros(new_data_size) - e_out = np.zeros(new_data_size) + x_out = np.zeros(new_array_len) + y_out = np.zeros(new_array_len) + e_out = np.zeros(new_array_len) # Left hand side of cut - x_out[:num_pts - positive_index] = -x_in[num_pts:positive_index:-1] - y_out[:num_pts - positive_index] = y_in[num_pts:positive_index:-1] - e_out[:num_pts - positive_index] = e_in[num_pts:positive_index:-1] + x_out[:sample_aray_len - positive_index] = -x_in[sample_aray_len:positive_index:-1] + y_out[:sample_aray_len - positive_index] = y_in[sample_aray_len:positive_index:-1] + e_out[:sample_aray_len - positive_index] = e_in[sample_aray_len:positive_index:-1] # Right hand side of cut - x_out[num_pts - positive_index:] = x_in[negative_index:] - y_out[num_pts - positive_index:] = y_in[negative_index:] - e_out[num_pts - positive_index:] = e_in[negative_index:] + x_out[sample_aray_len - positive_index:] = x_in[negative_index:] + y_out[sample_aray_len - positive_index:] = y_in[negative_index:] + e_out[sample_aray_len - positive_index:] = e_in[negative_index:] mtd[self._output_workspace].setX(index, x_out) mtd[self._output_workspace].setY(index, y_out) mtd[self._output_workspace].setE(index, e_out) + logger.information('Spectra %d out of %d done' + % (index, num_spectra)) + if self._save: self._save_output() @@ -149,8 +153,8 @@ def _plot_output(self): Plot the first spectrum of the input and output workspace together. """ from IndirectImport import import_mantidplot - mp = import_mantidplot() - mp.plotSpectrum([self._output_workspace, self._sample], 0) + mtd_plot = import_mantidplot() + mtd_plot.plotSpectrum([self._output_workspace, self._sample], 0) # Register algorithm with Mantid AlgorithmFactory.subscribe(Symmetrise) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui index f747e684f5e0..2ef55e4e8b35 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui @@ -1757,6 +1757,12 @@ Later steps in the process (saving, renaming) will not be done. false + + _red + + + _red.nxs + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 2ef9cfc31548..87bb582bbe83 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -47,8 +47,8 @@ namespace CustomInterfaces m_plots["SymmRawPlot"] = new QwtPlot(m_parentWidget); m_curves["SymmRawPlot"] = new QwtPlotCurve(); - m_rangeSelectors["NegativeXCut"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE); - m_rangeSelectors["PositiveXCut"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE); + m_rangeSelectors["NegativeXCut"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, false); + m_rangeSelectors["PositiveXCut"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, false); m_rangeSelectors["CentreMark"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, true); @@ -78,14 +78,14 @@ namespace CustomInterfaces std::pair defaultRange(-1.0, 1.0); setAxisRange("SymmRawPlot", QwtPlot::xBottom, defaultRange); } - + //---------------------------------------------------------------------------------------------- /** Destructor */ IndirectSymmetrise::~IndirectSymmetrise() { } - + void IndirectSymmetrise::setup() { } From f695f9a5263be7d63a5d83f40c4d0861c70ff54a Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 3 Sep 2014 16:56:44 +0100 Subject: [PATCH 023/284] Refactor, fix issue with some sample workspaces Some workspaces have differing numbers of array elements for X, Y and E values, just choose the samllest and trim the longer arrays Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 50 ++++++++++++------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 43d36e99ca5b..cd39d58b8398 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -36,68 +36,80 @@ def PyExec(self): StartTime('Symmetrise') self._setup() - num_spectra, sample_aray_len = CheckHistZero(self._sample) + num_spectra, _ = CheckHistZero(self._sample) sample_x = mtd[self._sample].readX(0) if math.fabs(self._x_cut) < 1e-5: raise ValueError('XCut point is Zero') - # Find range of values to flip + # Find the smallest data array in the first spectra + len_x = len(mtd[self._sample].readX(0)) + len_y = len(mtd[self._sample].readY(0)) + len_e = len(mtd[self._sample].readE(0)) + sample_array_len = min(len_x, len_y, len_e) - 1 + delta_x = sample_x[1] - sample_x[0] + # Find array index of negative XCut negative_diff = np.absolute(sample_x + self._x_cut) negative_index = np.where(negative_diff < delta_x)[0][-1] - self._check_bounds(negative_index, sample_aray_len, label='Negative') + self._check_bounds(negative_index, sample_array_len, label='Negative') + # FInd array index of positive XCut positive_diff = np.absolute(sample_x + sample_x[negative_index]) positive_index = np.where(positive_diff < delta_x)[0][-1] - self._check_bounds(positive_index, sample_aray_len, label='Positive') + self._check_bounds(positive_index, sample_array_len, label='Positive') - new_array_len = 2 * sample_aray_len - (positive_index + negative_index) + 1 + # Calculate number of elements neede dfor new array (per spectra) + new_array_len = 2 * sample_array_len - (positive_index + negative_index) + 1 if self._verbose: - logger.notice('No. points = %d' % sample_aray_len) - logger.notice('Negative : at i =%d; x = %f' + logger.notice('No. points = %d' % sample_array_len) + logger.notice('Negative at i=%d, x=%f' % (negative_index, sample_x[negative_index])) - logger.notice('Positive : at i =%d; x = %f' + logger.notice('Positive at i=%d, x=%f' % (positive_index, sample_x[positive_index])) logger.notice('New array size = %d' % new_array_len) + # Create an empty workspace with enough storage for the new data zeros = np.zeros(new_array_len * num_spectra) CreateWorkspace(OutputWorkspace=self._output_workspace, DataX=zeros, DataY=zeros, DataE=zeros, NSpec=num_spectra) + # Copy logs and properties from sample workspace CopyLogs(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) CopyInstrumentParameters(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) # CopySample(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) # For each spectrum copy positive values to the negative for index in xrange(num_spectra): - x_in = mtd[self._sample].readX(index) - y_in = mtd[self._sample].readY(index) - e_in = mtd[self._sample].readE(index) + # Strip any additional array cells + x_in = mtd[self._sample].readX(index)[:sample_array_len + 1] + y_in = mtd[self._sample].readY(index)[:sample_array_len + 1] + e_in = mtd[self._sample].readE(index)[:sample_array_len + 1] + # Get some zeroed data to overwrite with copies from sample x_out = np.zeros(new_array_len) y_out = np.zeros(new_array_len) e_out = np.zeros(new_array_len) # Left hand side of cut - x_out[:sample_aray_len - positive_index] = -x_in[sample_aray_len:positive_index:-1] - y_out[:sample_aray_len - positive_index] = y_in[sample_aray_len:positive_index:-1] - e_out[:sample_aray_len - positive_index] = e_in[sample_aray_len:positive_index:-1] + x_out[:sample_array_len - positive_index] = -x_in[sample_array_len:positive_index:-1] + y_out[:sample_array_len - positive_index] = y_in[sample_array_len:positive_index:-1] + e_out[:sample_array_len - positive_index] = e_in[sample_array_len:positive_index:-1] # Right hand side of cut - x_out[sample_aray_len - positive_index:] = x_in[negative_index:] - y_out[sample_aray_len - positive_index:] = y_in[negative_index:] - e_out[sample_aray_len - positive_index:] = e_in[negative_index:] + x_out[sample_array_len - positive_index:] = x_in[negative_index:] + y_out[sample_array_len - positive_index:] = y_in[negative_index:] + e_out[sample_array_len - positive_index:] = e_in[negative_index:] mtd[self._output_workspace].setX(index, x_out) mtd[self._output_workspace].setY(index, y_out) mtd[self._output_workspace].setE(index, e_out) logger.information('Spectra %d out of %d done' - % (index, num_spectra)) + % (index + 1, num_spectra)) if self._save: self._save_output() @@ -154,7 +166,7 @@ def _plot_output(self): """ from IndirectImport import import_mantidplot mtd_plot = import_mantidplot() - mtd_plot.plotSpectrum([self._output_workspace, self._sample], 0) + mtd_plot.plotSpectrum([self._sample, self._output_workspace], 0) # Register algorithm with Mantid AlgorithmFactory.subscribe(Symmetrise) From 56052cfc29f7dca3bed952e29ad550028d0267e7 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Wed, 3 Sep 2014 17:39:04 +0100 Subject: [PATCH 024/284] Add code for calculation of first scattering. Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 49 ++-- .../inc/MantidCurveFitting/ConvertToYSpace.h | 1 + .../CurveFitting/src/CalculateMSVesuvio.cpp | 268 ++++++++++++------ .../CurveFitting/src/ConvertToYSpace.cpp | 5 +- .../test/CalculateMSVesuvioTest.h | 31 +- 5 files changed, 237 insertions(+), 117 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index 9ba2e2e8c0af..c8b03cdff0c7 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -5,6 +5,7 @@ //----------------------------------------------------------------------------- #include "MantidAPI/Algorithm.h" #include "MantidGeometry/Instrument/ReferenceFrame.h" +#include "MantidKernel/V3D.h" #include #include @@ -48,17 +49,6 @@ namespace Mantid class DLLExport CalculateMSVesuvio : public API::Algorithm { private: - // Struct to store cache instrument geometry - struct InstrumentGeometry - { - InstrumentGeometry(); - - boost::shared_ptr refframe; - double srcR1; - double srcR2; - double sampleHeight; - double sampleWidth; - }; // Produces random numbers with various probability distributions class RandomNumberGenerator { @@ -117,21 +107,40 @@ namespace Mantid Simulation simulate(const size_t nevents, const size_t nscatters, const DetectorParams & detpar, const ResolutionParams &respar) const; - double calculateTOF(const size_t nscatters, - const DetectorParams & detpar, - const ResolutionParams &respar, - Simulation & counts) const; + double calculateCounts(const size_t nscatters, + const DetectorParams & detpar, + const ResolutionParams &respar, + Simulation & counts) const; // single-event helpers - double initialTOF(const double mean, const double sigma) const; - double moderatorPos(double & widthPos, double & heightPos) const; + double generateSrcPos(const double l, Kernel::V3D & srcPos) const; + double generateE0(const double l1, const double t2, double &weight) const; + double generateTOF(const double gaussTOF, const double en0, const double dl1) const; + Kernel::V3D generateScatter(const Kernel::V3D &startPos, const Kernel::V3D &direc, + double &weight) const; // Member Variables - RandomNumberGenerator *m_randgen; - InstrumentGeometry m_instgeom; + RandomNumberGenerator *m_randgen; // random number generator + + size_t m_acrossDir, m_upDir, m_beamDir; // indices of each direction + double m_srcR1; // beam umbra radius (m) + double m_srcR2; // beam penumbra radius (m) + double m_halfSampleHeight; // half-height of sample (m) + double m_halfSampleWidth; // half-width of sample (m) + double m_halfSampleThick; // half-thickness of sample(m) + double m_maxWidthSampleFrame; // Maximum width in sample frame (m) + Kernel::DblMatrix const *m_goniometer; // sample rotation + Geometry::Object const *m_sampleShape; // sample shape + Kernel::V3D m_samplePos; + + double m_mu; //attenuation xsec + + double m_tmin; // minimum tof value + double m_tmax; // maximum tof value + double m_dt; // tof value step - API::MatrixWorkspace_sptr m_inputWS; API::Progress *m_progress; + API::MatrixWorkspace_sptr m_inputWS; }; } // namespace CurveFitting diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/ConvertToYSpace.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/ConvertToYSpace.h index 3bbbfeaa2292..caadecb04434 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/ConvertToYSpace.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/ConvertToYSpace.h @@ -14,6 +14,7 @@ namespace CurveFitting { double l1; ///< source-sample distance in metres double l2; ///< sample-detector distance in metres + Kernel::V3D pos; ///< Full 3D position double theta; ///< scattering angle in radians double t0; ///< time delay in seconds double efixed; ///< final energy diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 2af53eacf4d4..ce1e1279a513 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -9,8 +9,8 @@ #include "MantidAPI/SampleShapeValidator.h" #include "MantidAPI/WorkspaceValidators.h" -#include "MantidGeometry/Instrument/DetectorGroup.h" #include "MantidGeometry/Instrument/ParameterMap.h" +#include "MantidGeometry/Objects/Track.h" #include "MantidKernel/BoundedValidator.h" #include "MantidKernel/CompositeValidator.h" @@ -22,25 +22,22 @@ namespace Mantid { namespace CurveFitting { - using namespace Kernel; using namespace API; + using namespace Kernel; + using Geometry::Link; + using Geometry::ParameterMap; + using Geometry::Track; namespace { const size_t NSIMULATIONS = 10; - const size_t NEVENTS = 500000; + const size_t NEVENTS = 100000; const size_t NSCATTERS = 3; - } // end anonymous namespace + const size_t MAX_SCATTER_PT_TRIES = 500; + /// Conversion constant + const double MASS_TO_MEV = 0.5*PhysicalConstants::NeutronMass/PhysicalConstants::meV; - //------------------------------------------------------------------------- - // InstrumentGeometry cache - //------------------------------------------------------------------------- - - CalculateMSVesuvio::InstrumentGeometry::InstrumentGeometry() : - refframe(), srcR1(0.0), srcR2(0.0), - sampleHeight(0.0), sampleWidth(0.0) - { - } + } // end anonymous namespace //------------------------------------------------------------------------- // RandomNumberGenerator helper @@ -123,10 +120,13 @@ namespace Mantid /// Constructor CalculateMSVesuvio::CalculateMSVesuvio() : Algorithm(), - m_randgen(NULL), m_instgeom(), - - m_inputWS(), - m_progress(NULL) + m_randgen(NULL), + m_acrossDir(0), m_upDir(1), m_beamDir(3), m_srcR1(0.0), m_srcR2(0.0), + m_halfSampleHeight(0.0), m_halfSampleWidth(0.0), m_halfSampleThick(0.0), + m_maxWidthSampleFrame(0.0), m_goniometer(NULL), m_sampleShape(NULL), m_samplePos(), + m_mu(-1.0), + m_tmin(-1.0), m_tmax(-1.0), m_dt(-1.0), + m_progress(NULL), m_inputWS() { } @@ -204,7 +204,10 @@ namespace Mantid m_inputWS = getProperty("InputWorkspace"); cacheInputGeometry(); // Values used frequently - const int64_t nhist = static_cast(m_inputWS->getNumberHistograms()); + const auto & inX = m_inputWS->readX(0); + m_tmin = inX.front(); + m_tmax = inX.back(); + m_dt = inX[1] - m_tmin; // Create new workspaces MatrixWorkspace_sptr totalsc = WorkspaceFactory::Instance().create(m_inputWS); @@ -214,6 +217,7 @@ namespace Mantid m_randgen = new RandomNumberGenerator(getProperty("Seed")); // Setup progress + const int64_t nhist = static_cast(m_inputWS->getNumberHistograms()); m_progress = new API::Progress(this, 0.0, 1.0, nhist); for(int64_t i = 0; i < nhist; ++i) { @@ -256,46 +260,38 @@ namespace Mantid void CalculateMSVesuvio::cacheInputGeometry() { const auto instrument = m_inputWS->getInstrument(); + m_samplePos = instrument->getSample()->getPos(); + const auto rframe = instrument->getReferenceFrame(); - m_instgeom.refframe = rframe; + m_acrossDir = rframe->pointingHorizontal(); + m_upDir = rframe->pointingUp(); + m_beamDir = rframe->pointingAlongBeam(); - m_instgeom.srcR1 = getProperty("BeamUmbraRadius"); - m_instgeom.srcR2 = getProperty("BeamPenumbraRadius"); - if(m_instgeom.srcR2 < m_instgeom.srcR1) + m_srcR1 = getProperty("BeamUmbraRadius"); + m_srcR2 = getProperty("BeamPenumbraRadius"); + if(m_srcR2 < m_srcR1) { std::ostringstream os; os << "Invalid beam radius parameters. Penumbra value=" - << m_instgeom.srcR2 << " < Umbra value=" - << m_instgeom.srcR1; + << m_srcR2 << " < Umbra value=" + << m_srcR1; throw std::invalid_argument(os.str()); } + // Sample rotation specified by a goniometer + m_goniometer = &(m_inputWS->run().getGoniometerMatrix()); // Sample shape - const auto & sampleShape = m_inputWS->sample().getShape(); - // We know the shape is valid from the property validator but we - // need to check if it is cuboid or cylinder - int objType(-1); - double radius(-1.0), height(-1.0); - std::vector pts; - sampleShape.GetObjectGeom(objType, pts, radius, height); - if(objType != 1 && objType != 3) - { - throw std::invalid_argument("Invalid sample shape. Currently only " - "cuboid or cylinder are supported"); - } - assert(pts.size() == 4); - if(objType == 1) // cuboid - { - auto horiz = rframe->pointingHorizontal(); - m_instgeom.sampleWidth = fabs(pts[0][horiz] - pts[3][horiz]); - auto up = rframe->pointingUp(); - m_instgeom.sampleHeight = fabs(pts[0][up] - pts[1][up]); - } - else - { - m_instgeom.sampleWidth = 2.0*radius; - m_instgeom.sampleHeight = height; - } + m_sampleShape = &(m_inputWS->sample().getShape()); + // We know the shape is valid from the property validator + // Use the bounding box as an approximation to determine the extents + // as this will match in both height and width for a cuboid & cylinder + // sample shape + Geometry::BoundingBox bounds = m_sampleShape->getBoundingBox(); + V3D boxWidth = bounds.width(); + // Use half-width/height for easier calculation later + m_halfSampleWidth = 0.5*boxWidth[m_acrossDir]; + m_halfSampleHeight = 0.5*boxWidth[m_upDir]; + m_halfSampleThick = 0.5*boxWidth[m_beamDir]; } /** @@ -349,7 +345,7 @@ namespace Mantid Simulation simulCounts(NSCATTERS, m_inputWS->blocksize()); for(size_t i = 0; i < nevents; ++i) { - simulCounts.weight += calculateTOF(nscatters, detpar, respar, simulCounts); + simulCounts.weight += calculateCounts(nscatters, detpar, respar, simulCounts); } return simulCounts; @@ -363,59 +359,169 @@ namespace Mantid * @param counts [Output] Store the calculated counts here * @return */ - double CalculateMSVesuvio::calculateTOF(const size_t nscatters, const DetectorParams &detpar, - const ResolutionParams &respar, - Simulation &counts) const + double CalculateMSVesuvio::calculateCounts(const size_t nscatters, const DetectorParams &detpar, + const ResolutionParams &respar, + Simulation &counts) const { double weightSum(0.0); - std::vector weightsPerScatter(nscatters, 1.0); // start at 1.0 + std::vector weights(nscatters, 1.0); // start at 1.0 std::vector tofs(nscatters, 0.0); - tofs[0] = initialTOF(0.0, detpar.t0); - // moderator coord in lab frame - V3D srcLab(0.0, -detpar.l1, 0.0); - weightsPerScatter[0] *= moderatorPos(srcLab[0], srcLab[2]); -// if(heightLab > m_instgeom.sampleHeight || -// widthLab > m_instgeom.sampleWidth) return 0.0; // misses sample + // Initial TOF based on uncertainty in time measurement on detector + // moderator coord in lab frame + V3D srcPos; + generateSrcPos(detpar.l1, srcPos); // fills in x,y,z + // transform to sample frame + srcPos.rotate(*m_goniometer); + if(fabs(srcPos[0]) > m_halfSampleWidth || + fabs(srcPos[1]) > m_halfSampleHeight) return 0.0; // misses sample + + const double vel2 = sqrt(detpar.efixed/MASS_TO_MEV); + const double t2 = detpar.l2/vel2; + double en0 = generateE0(detpar.l1, t2, weights[0]); + tofs[0] = generateTOF(en0, detpar.t0, respar.dl1); // correction for resolution in l1 + + // Neutron paths. No beam divergence so initial direction is parallel to beam direction + V3D startPos(srcPos); + V3D particleDir; + particleDir[m_beamDir] = 1.0; + + V3D scatterPt = generateScatter(startPos, particleDir, weights[0]); + double distFromStart = scatterPt.distance(startPos); + // Compute TOF for first scatter event + double vel = sqrt(en0/MASS_TO_MEV); + tofs[0] += (distFromStart*1e6/vel); return weightSum; } - /** - * Sample a tof value from a gaussian distribution - * @param centre The value of the centra point of the distribution - * @param sigma Width of the distribution - * @return New variable distributed accordingly - */ - double CalculateMSVesuvio::initialTOF(const double centre, const double sigma) const - { - return m_randgen->gaussian(centre, sigma); - } - /** * Sample from the moderator assuming it can be seen * as a cylindrical ring with inner and outer radius - * @param widthPos [Out] Position in the width direction of the generated point - * @param heightPos [Out] Position in the height direction of the generated point + * @param l1 Src-sample distance (m) + * @param srcPos [Out] Position in the height direction of the generated point */ - double CalculateMSVesuvio::moderatorPos(double &widthPos, double &heightPos) const + double CalculateMSVesuvio::generateSrcPos(const double l1, + Kernel::V3D &srcPos) const { - double radius(-1.0); + double radius(-1.0), widthPos(0.0), heightPos(0.0); do { - widthPos = -m_instgeom.srcR2 + 2.0*m_instgeom.srcR2*m_randgen->flat(); - heightPos = -m_instgeom.srcR2 + 2.0*m_instgeom.srcR2*m_randgen->flat(); + widthPos = -m_srcR2 + 2.0*m_srcR2*m_randgen->flat(); + heightPos = -m_srcR2 + 2.0*m_srcR2*m_randgen->flat(); using std::sqrt; radius = sqrt(widthPos*widthPos + heightPos*heightPos); } - while(radius > m_instgeom.srcR2); - - if(radius > m_instgeom.srcR1) - return (m_instgeom.srcR2 - radius)/(m_instgeom.srcR2 - m_instgeom.srcR1); + while(radius > m_srcR2); + // assign to output + srcPos[m_acrossDir] = widthPos; + srcPos[m_upDir] = heightPos; + srcPos[m_beamDir] = -l1; + + if(radius > m_srcR1) + return (m_srcR2 - radius)/(m_srcR2 - m_srcR1); else return 1.0; // inside umbra unit weight } + /** + * Generate an incident energy based on a randomly-selected TOF value + * It is assigned a weight = (2.0*E0/(T-t2))/E0^0.9. + * @param l1 Distance from src to sample (metres) + * @param t2 Nominal time from sample to detector (seconds) + * @param weight [Out] Weight factor to modify for the generated energy value + * @return + */ + double CalculateMSVesuvio::generateE0(const double l1, const double t2, double &weight) const + { + const double tof = m_tmin + (m_tmax - m_tmin)*m_randgen->flat(); + const double t1 = (tof - t2); + const double vel0 = l1/t1; + const double en0 = MASS_TO_MEV*vel0*vel0; + + weight *= 2.0*weight/t1/pow(weight, 0.9); + weight *= 1e-4; // Reduce weight to ~1 + + return en0; + } + + /** + * Generate an initial tof from this distribution: + * 1-(0.5*X**2/T0**2+X/T0+1)*EXP(-X/T0), where x is the time and t0 + * is the src-sample time. + * @param dt0 Error in time resolution (us) + * @param en0 Value of the incident energy + * @param dl1 S.d of moderator to sample distance + * @return tof Guass TOF modified for asymmetric pulse + */ + double CalculateMSVesuvio::generateTOF(const double en0, const double dt0, + const double dl1) const + { + const double vel1 = sqrt(en0/MASS_TO_MEV); + const double dt1 = (dl1/vel1)*1e6; + const double xmin(0.0), xmax(15.0*dt1); + double dx = 0.5*(xmax - xmin); + // Generate a random y position in th distribution + const double yv = m_randgen->flat(); + + double xt(xmin); + double tof = m_randgen->gaussian(0.0, dt0); + while(true) + { + xt += dx; + //Y=1-(0.5*X**2/T0**2+X/T0+1)*EXP(-X/T0) + double y = 1.0 - (0.5*xt*xt/(dt1*dt1) + xt/dt1 + 1)*exp(-xt/dt1); + if(fabs(y - yv) < 1e-4) + { + tof += xt - 3*dt1; + break; + } + if(y > yv) + { + dx = -fabs(0.5*dx); + } + else + { + dx = fabs(0.5*dx); + } + } + return tof; + } + + /** + * Generate a scatter event and update the weight according to the + * amount the beam would be attenuted by the sample + * @param startPos Starting position + * @param direc Direction of travel for the neutron + * @param weight [InOut] Multiply the incoming weight by the attenuation factor + * @return The generated scattering point + */ + Kernel::V3D CalculateMSVesuvio::generateScatter(const Kernel::V3D &startPos, const Kernel::V3D &direc, + double &weight) const + { + Track particleTrack(startPos, direc); + if(m_sampleShape->interceptSurface(particleTrack) != 1) + { + throw std::runtime_error("CalculateMSVesuvio::calculateCounts - " + "Sample shape appears to have a hole in it?. Unable to continue"); + } + // Find distance inside object and compute probability of scattering + const auto & link = particleTrack.begin(); + double totalObjectDist = link->distInsideObject; + const double scatterProb = 1.0 - exp(-m_mu*totalObjectDist); + // Select a random point on the track that is the actual scatter point + // from the scattering probability distribution + const double dist = -log(1.0 - m_randgen->flat()*scatterProb)/m_mu; + // From start point advance in direction of travel by computed distance to find scatter point + // Track is defined as set of links and exit point of first link is entry to sample! + V3D scatterPt = link->entryPoint; + scatterPt += direc*dist; + // Update weight + weight *= scatterProb; + + return scatterPt; + } + } // namespace Algorithms } // namespace Mantid diff --git a/Code/Mantid/Framework/CurveFitting/src/ConvertToYSpace.cpp b/Code/Mantid/Framework/CurveFitting/src/ConvertToYSpace.cpp index 0c615888a88a..687fcf100e59 100644 --- a/Code/Mantid/Framework/CurveFitting/src/ConvertToYSpace.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/ConvertToYSpace.cpp @@ -34,10 +34,10 @@ namespace Mantid //---------------------------------------------------------------------------------------------- /// Algorithm's name for identification. @see Algorithm::name - const std::string ConvertToYSpace::name() const { return "ConvertToYSpace";}; + const std::string ConvertToYSpace::name() const { return "ConvertToYSpace";} /// Algorithm's version for identification. @see Algorithm::version - int ConvertToYSpace::version() const { return 1;}; + int ConvertToYSpace::version() const { return 1;} /// Algorithm's category for identification. @see Algorithm::category const std::string ConvertToYSpace::category() const { return "Transforms\\Units";} @@ -75,6 +75,7 @@ namespace Mantid const auto & pmap = ws->constInstrumentParameters(); detpar.l1 = sample->getDistance(*source); detpar.l2 = det->getDistance(*sample); + detpar.pos = det->getPos(); detpar.theta = ws->detectorTwoTheta(det); detpar.t0 = ConvertToYSpace::getComponentParameter(det, pmap, "t0")*1e-6; // Convert to seconds detpar.efixed = ConvertToYSpace::getComponentParameter(det, pmap, "efixed"); diff --git a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h index 80f724597bba..6bdfef3266c5 100644 --- a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h +++ b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h @@ -4,6 +4,7 @@ #include #include "MantidCurveFitting/CalculateMSVesuvio.h" +#include "MantidGeometry/Instrument/Goniometer.h" #include "MantidTestHelpers/ComponentCreationHelper.h" #include "MantidTestHelpers/WorkspaceCreationHelper.h" @@ -29,7 +30,7 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite TS_ASSERT(alg.isInitialized()); } - void test_exec_with_flat_plate_sample() + void test_exec_with_flat_plate_sample_and_no_goniometer() { auto alg = createTestAlgorithm(createFlatPlateSampleWS()); @@ -37,6 +38,20 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite TS_ASSERT(alg->isExecuted()); } + void test_exec_with_flat_plate_sample_and_goniometer() + { + auto testWS = createFlatPlateSampleWS(); + Mantid::Geometry::Goniometer sampleRot; + // 45.0 deg rotation around Y + sampleRot.pushAxis("phi", 0.0, 1.0, 0.0, 45.0, + Mantid::Geometry::CW, Mantid::Geometry::angDegrees); + testWS->mutableRun().setGoniometer(sampleRot, false); + auto alg = createTestAlgorithm(testWS); + + TS_ASSERT_THROWS_NOTHING(alg->execute()); + TS_ASSERT(alg->isExecuted()); + } + // ------------------------ Failure Cases ----------------------------------------- void test_setting_input_workspace_not_in_tof_throws_invalid_argument() @@ -58,17 +73,6 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite TS_ASSERT_THROWS(alg.setProperty("InputWorkspace", testWS), std::invalid_argument); } - void test_input_workspace_and_sampleshape_not_cuboid_or_cylinder_throws_invalid_argument_on_execution() - { - auto testWS = createFlatPlateSampleWS(); - auto sampleShape = ComponentCreationHelper::createSphere(1, Mantid::Kernel::V3D(), - "sample-shape"); - testWS->mutableSample().setShape(*sampleShape); // overwrite shape - auto alg = createTestAlgorithm(testWS); - - TS_ASSERT_THROWS(alg->execute(), std::invalid_argument); - } - void test_setting_zero_or_negative_beam_radius_values_throws_invalid_argument() { CalculateMSVesuvio alg; @@ -119,7 +123,7 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite { auto testWS = createTestWorkspace(); // Sample shape - const double height(0.1), width(0.02), thick(0.005); + const double height(0.05), width(0.01), thick(0.0025); auto sampleShape = ComponentCreationHelper::createCuboid(width, height, thick); testWS->mutableSample().setShape(*sampleShape); @@ -127,7 +131,6 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite } - Mantid::API::MatrixWorkspace_sptr createTestWorkspace() { using namespace Mantid::Geometry; From 8f76688d74471d3c930450859e3db4ef674ae267 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 4 Sep 2014 08:59:37 +0100 Subject: [PATCH 025/284] Added unit test, improved usage example Refs #7860 --- .../python/plugins/algorithms/CMakeLists.txt | 1 + .../plugins/algorithms/SymmetriseTest.py | 29 +++++++++++++++++++ .../docs/source/algorithms/Symmetrise-v1.rst | 10 +++---- 3 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py diff --git a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/CMakeLists.txt b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/CMakeLists.txt index a49dab7bcbd5..17fdc6610d61 100644 --- a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/CMakeLists.txt +++ b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/CMakeLists.txt @@ -33,6 +33,7 @@ set ( TEST_PY_FILES Stitch1DManyTest.py SuggestTibCNCSTest.py SuggestTibHYSPECTest.py + SymmetriseTest.py UpdatePeakParameterTableValueTest.py SANSSubtractTest.py ExportSampleLogsToCSVFileTest.py diff --git a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py new file mode 100644 index 000000000000..713c9edfa7da --- /dev/null +++ b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py @@ -0,0 +1,29 @@ +import unittest +import numpy as np +from mantid.simpleapi import * +from mantid.api import * + + +class SymmetriseTest(unittest.TestCase): + + def setUp(self): + self._sample_ws = self._generate_sample_ws('symm_test_sample_ws') + + def test_basic(self): + symm_test_out_ws= Symmetrise(Sample=self._sample_ws, XCut=0.05) + + def _rayleigh(self, x, sigma): + return (x / sigma ** 2) * np.exp(-x ** 2 / (2 * sigma ** 2)) + + def _generate_sample_ws(self, ws_name): + data_x = np.arange(0, 10, 0.01) + data_y = self._rayleigh(data_x, 1) + + CreateWorkspace(DataX=data_x, DataY=data_y, OutputWorkspace=ws_name) + ScaleX(InputWorkspace=ws_name, Factor=-1, Operation="Add", OutputWorkspace=ws_name) # centre the peak over 0 + + return mtd[ws_name] + + +if __name__ == '__main__': + unittest.main() diff --git a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst index fb0eb92a347b..3c5704b229f6 100644 --- a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst +++ b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst @@ -27,12 +27,12 @@ Usage def rayleigh(x, sigma): return (x / sigma ** 2) * np.exp(-x ** 2 / (2 * sigma ** 2)) - dataX = np.arange(0, 10, 0.01) - dataY = rayleigh(dataX, 1) + data_x = np.arange(0, 10, 0.01) + data_y = rayleigh(data_x, 1) - ws = CreateWorkspace(dataX, dataY) - ws = ScaleX(ws, -1, "Add") # centre the peak over 0 + sample_ws = CreateWorkspace(data_x, data_y) + sample_ws = ScaleX(sample_ws, -1, "Add") # centre the peak over 0 - symm_ws = Symmetrise(Sample=ws, XCut=-0.001) + symm_ws = Symmetrise(Sample=sample_ws, XCut=0.05) .. categories:: From 97cb4ba78c0ace867633b227f18c9b175a61ef79 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 4 Sep 2014 12:30:25 +0100 Subject: [PATCH 026/284] Added preview window to IDR:Symmetrise Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 63 ++++++--- .../IndirectDataReduction.ui | 26 ++++ .../IndirectSymmetrise.h | 2 + .../src/IndirectDataReductionTab.cpp | 16 +-- .../src/IndirectSymmetrise.cpp | 133 ++++++++++++++++-- 5 files changed, 200 insertions(+), 40 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index cd39d58b8398..1f7bc06b6951 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -1,7 +1,7 @@ from mantid import logger, mtd -from mantid.api import PythonAlgorithm, AlgorithmFactory, WorkspaceProperty +from mantid.api import PythonAlgorithm, AlgorithmFactory, WorkspaceProperty, PropertyMode from mantid.kernel import Direction -from mantid.simpleapi import CreateWorkspace, CopyLogs, CopySample, CopyInstrumentParameters, SaveNexusProcessed +from mantid.simpleapi import CreateWorkspace, CopyLogs, CopySample, CopyInstrumentParameters, SaveNexusProcessed, CreateEmptyTableWorkspace import math import os.path @@ -11,13 +11,13 @@ class Symmetrise(PythonAlgorithm): def category(self): - return "Workflow\\MIDAS;PythonAlgorithms" + return 'Workflow\\MIDAS;PythonAlgorithms' def summary(self): - return "Takes an asymmetric S(Q,w) and makes it symmetric" + return 'Takes an asymmetric S(Q,w) and makes it symmetric' def PyInit(self): - self.declareProperty(WorkspaceProperty("Sample", "", Direction.Input), + self.declareProperty(WorkspaceProperty('Sample', '', Direction.Input), doc='Sample to run with') self.declareProperty('XCut', 0.0, doc='X cut off value') @@ -28,9 +28,12 @@ def PyInit(self): self.declareProperty('Save', defaultValue=False, doc='Switch saving result to nxs file Off/On') - self.declareProperty(WorkspaceProperty("OutputWorkspace", "", + self.declareProperty(WorkspaceProperty('OutputWorkspace', '', Direction.Output), doc='Name to call the output workspace.') + self.declareProperty(WorkspaceProperty('OutputPropertiesTable', '', + Direction.Output, PropertyMode.Optional), doc='Name to call the properties output table workspace.') + def PyExec(self): from IndirectCommon import CheckHistZero, StartTime, EndTime @@ -52,23 +55,23 @@ def PyExec(self): # Find array index of negative XCut negative_diff = np.absolute(sample_x + self._x_cut) - negative_index = np.where(negative_diff < delta_x)[0][-1] - self._check_bounds(negative_index, sample_array_len, label='Negative') + self._negative_index = np.where(negative_diff < delta_x)[0][-1] + self._check_bounds(self._negative_index, sample_array_len, label='Negative') # FInd array index of positive XCut - positive_diff = np.absolute(sample_x + sample_x[negative_index]) - positive_index = np.where(positive_diff < delta_x)[0][-1] - self._check_bounds(positive_index, sample_array_len, label='Positive') + positive_diff = np.absolute(sample_x + sample_x[self._negative_index]) + self._positive_index = np.where(positive_diff < delta_x)[0][-1] + self._check_bounds(self._positive_index, sample_array_len, label='Positive') # Calculate number of elements neede dfor new array (per spectra) - new_array_len = 2 * sample_array_len - (positive_index + negative_index) + 1 + new_array_len = 2 * sample_array_len - (self._positive_index + self._negative_index) + 1 if self._verbose: logger.notice('No. points = %d' % sample_array_len) logger.notice('Negative at i=%d, x=%f' - % (negative_index, sample_x[negative_index])) + % (self._negative_index, sample_x[self._negative_index])) logger.notice('Positive at i=%d, x=%f' - % (positive_index, sample_x[positive_index])) + % (self._positive_index, sample_x[self._positive_index])) logger.notice('New array size = %d' % new_array_len) # Create an empty workspace with enough storage for the new data @@ -95,14 +98,14 @@ def PyExec(self): e_out = np.zeros(new_array_len) # Left hand side of cut - x_out[:sample_array_len - positive_index] = -x_in[sample_array_len:positive_index:-1] - y_out[:sample_array_len - positive_index] = y_in[sample_array_len:positive_index:-1] - e_out[:sample_array_len - positive_index] = e_in[sample_array_len:positive_index:-1] + x_out[:sample_array_len - self._positive_index] = -x_in[sample_array_len:self._positive_index:-1] + y_out[:sample_array_len - self._positive_index] = y_in[sample_array_len:self._positive_index:-1] + e_out[:sample_array_len - self._positive_index] = e_in[sample_array_len:self._positive_index:-1] # Right hand side of cut - x_out[sample_array_len - positive_index:] = x_in[negative_index:] - y_out[sample_array_len - positive_index:] = y_in[negative_index:] - e_out[sample_array_len - positive_index:] = e_in[negative_index:] + x_out[sample_array_len - self._positive_index:] = x_in[self._negative_index:] + y_out[sample_array_len - self._positive_index:] = y_in[self._negative_index:] + e_out[sample_array_len - self._positive_index:] = e_in[self._negative_index:] mtd[self._output_workspace].setX(index, x_out) mtd[self._output_workspace].setY(index, y_out) @@ -117,7 +120,11 @@ def PyExec(self): if self._plot: self._plot_output() - self.setProperty("OutputWorkspace", self._output_workspace) + if self._props_output_workspace != '': + self._generate_props_table() + + self.setProperty('OutputWorkspace', self._output_workspace) + EndTime('Symmetrise') def _setup(self): @@ -132,6 +139,7 @@ def _setup(self): self._save = self.getProperty('Save').value self._output_workspace = self.getPropertyValue('OutputWorkspace') + self._props_output_workspace = self.getPropertyValue('OutputPropertiesTable') def _check_bounds(self, index, num_pts, label=''): """ @@ -147,6 +155,19 @@ def _check_bounds(self, index, num_pts, label=''): elif index >= num_pts: raise ValueError('%s point %d > %d' % (label, index, num_pts)) + def _generate_props_table(self): + """ + Creates a table workspace with values calculated in algorithm. + """ + props_table = CreateEmptyTableWorkspace(OutputWorkspace=self._props_output_workspace) + + props_table.addColumn('int', 'NegativeCutIndex') + props_table.addColumn('int', 'PositiveCutIndex') + + props_table.addRow([self._negative_index, self._positive_index]) + + self.setProperty('OutputPropertiesTable', self._props_output_workspace) + def _save_output(self): """ Save the output workspace to the user's default working directory diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui index 2ef55e4e8b35..10cdd7649540 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui @@ -1786,6 +1786,32 @@ Later steps in the process (saving, renaming) will not be done. + + + + Preview + + + + + + + + Preview + + + + + + + + + + + + + + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h index a66902bd9206..a6b88d632e70 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h @@ -70,6 +70,8 @@ namespace CustomInterfaces void updateRawPlot(); void replotNewSpectrum(QtProperty *prop, double value); void updateRangeSelectors(QtProperty *prop, double value); + void preview(); + void previewAlgDone(bool error); }; } // namespace CustomInterfaces diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp index 04ad1e643dd9..830928f6edc1 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp @@ -41,7 +41,7 @@ namespace CustomInterfaces IndirectDataReductionTab::~IndirectDataReductionTab() { } - + void IndirectDataReductionTab::runTab() { if(validate()) @@ -66,7 +66,7 @@ namespace CustomInterfaces /** * Run the load algorithm with the supplied filename and spectrum range - * + * * @param filename :: The name of the file to load * @param outputName :: The name of the output workspace * @param specMin :: Lower spectra bound @@ -91,7 +91,7 @@ namespace CustomInterfaces load->setProperty("SpectrumMax", specMax); load->execute(); - + //If reloading fails we're out of options return load->isExecuted(); } @@ -104,7 +104,7 @@ namespace CustomInterfaces std::map IndirectDataReductionTab::getInstrumentDetails() { std::map instDetails; - + QString pyInput = "from IndirectEnergyConversion import getReflectionDetails\n" "instrument = '" + m_uiForm.cbInst->currentText() + "'\n" @@ -186,7 +186,7 @@ namespace CustomInterfaces * a specturm index. * * This method uses the analysis data service to retrieve the workspace. - * + * * @param workspace :: The name of the workspace * @param index :: The spectrum index of the workspace * @param plotID :: String index of the plot in the m_plots map @@ -213,7 +213,7 @@ namespace CustomInterfaces /** * Plot a workspace to the miniplot given a workspace pointer and * a specturm index. - * + * * @param workspace :: Pointer to the workspace * @param wsIndex :: The spectrum index of the workspace * @param plotID :: String index of the plot in the m_plots map @@ -262,7 +262,7 @@ namespace CustomInterfaces /** * Sets the edge bounds of plot to prevent the user inputting invalid values * Also sets limits for range selector movement - * + * * @param rsID :: The string index of the range selector in the map m_rangeSelectors * @param min :: The lower bound property in the property browser * @param max :: The upper bound property in the property browser @@ -280,7 +280,7 @@ namespace CustomInterfaces /** * Set the position of the guides on the mini plot - * + * * @param rsID :: The string index of the range selector in the map m_rangeSelectors * @param lower :: The lower bound property in the property browser * @param upper :: The upper bound property in the property browser diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 87bb582bbe83..f606ff057549 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -1,6 +1,7 @@ #include "MantidQtCustomInterfaces/IndirectSymmetrise.h" #include "MantidAPI/MatrixWorkspace.h" +#include "MantidAPI/ITableWorkspace.h" #include "MantidKernel/Logger.h" #include "MantidQtCustomInterfaces/UserInputValidator.h" @@ -11,6 +12,8 @@ namespace Mantid::Kernel::Logger g_log("IndirectSymmetrise"); } +using namespace Mantid::API; + namespace MantidQt { namespace CustomInterfaces @@ -21,15 +24,18 @@ namespace CustomInterfaces IndirectSymmetrise::IndirectSymmetrise(Ui::IndirectDataReduction& uiForm, QWidget * parent) : IndirectDataReductionTab(uiForm, parent) { - // Property Tree + // Property Trees m_propTrees["SymmPropTree"] = new QtTreePropertyBrowser(); m_uiForm.symm_properties->addWidget(m_propTrees["SymmPropTree"]); + m_propTrees["SymmPVPropTree"] = new QtTreePropertyBrowser(); + m_uiForm.symm_previewProperties->addWidget(m_propTrees["SymmPVPropTree"]); + // Editor Factories DoubleEditorFactory *doubleEditorFactory = new DoubleEditorFactory(); m_propTrees["SymmPropTree"]->setFactoryForManager(m_dblManager, doubleEditorFactory); - // Create Properties + // Raw Properties m_properties["XCut"] = m_dblManager->addProperty("X Cut"); m_propTrees["SymmPropTree"]->addProperty(m_properties["XCut"]); @@ -43,25 +49,68 @@ namespace CustomInterfaces m_properties["PreviewRange"] = m_dblManager->addProperty("X Range"); rawPlotProps->addSubProperty(m_properties["PreviewRange"]); + // Preview Properties + // Mainly used for display rather than getting user input + m_properties["NegativeYValue"] = m_dblManager->addProperty("Negative Y"); + m_propTrees["SymmPVPropTree"]->addProperty(m_properties["NegativeYValue"]); + + m_properties["PositiveYValue"] = m_dblManager->addProperty("Positive Y"); + m_propTrees["SymmPVPropTree"]->addProperty(m_properties["PositiveYValue"]); + + m_properties["DeltaY"] = m_dblManager->addProperty("Delta Y"); + m_propTrees["SymmPVPropTree"]->addProperty(m_properties["DeltaY"]); + // Raw plot m_plots["SymmRawPlot"] = new QwtPlot(m_parentWidget); m_curves["SymmRawPlot"] = new QwtPlotCurve(); - m_rangeSelectors["NegativeXCut"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, false); - m_rangeSelectors["PositiveXCut"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, false); + m_rangeSelectors["NegativeXCut_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + MantidWidgets::RangeSelector::XSINGLE, true, false); + m_rangeSelectors["PositiveXCut_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + MantidWidgets::RangeSelector::XSINGLE, true, false); + + m_rangeSelectors["NegativeXCutYPos"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + MantidWidgets::RangeSelector::YSINGLE, true, false); + m_rangeSelectors["PositiveXCutYPos"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + MantidWidgets::RangeSelector::YSINGLE, true, false); - m_rangeSelectors["CentreMark"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + m_rangeSelectors["NegativeXCutYPos"]->setColour(Qt::red); + m_rangeSelectors["PositiveXCutYPos"]->setColour(Qt::red); + m_rangeSelectors["NegativeXCutYPos"]->setMinimum(0); + m_rangeSelectors["PositiveXCutYPos"]->setMinimum(0); + + m_rangeSelectors["CentreMark_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, true); - m_rangeSelectors["CentreMark"]->setColour(Qt::cyan); - m_rangeSelectors["CentreMark"]->setMinimum(0.0); + m_rangeSelectors["CentreMark_Raw"]->setColour(Qt::cyan); + m_rangeSelectors["CentreMark_Raw"]->setMinimum(0.0); m_plots["SymmRawPlot"]->setAxisFont(QwtPlot::xBottom, parent->font()); m_plots["SymmRawPlot"]->setAxisFont(QwtPlot::yLeft, parent->font()); m_plots["SymmRawPlot"]->setCanvasBackground(Qt::white); m_uiForm.symm_plot->addWidget(m_plots["SymmRawPlot"]); + // Preview plot + m_plots["SymmPreviewPlot"] = new QwtPlot(m_parentWidget); + m_curves["SymmPreviewPlot"] = new QwtPlotCurve(); + + m_rangeSelectors["NegativeXCut_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], + MantidWidgets::RangeSelector::XSINGLE, true, true); + m_rangeSelectors["PositiveXCut_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], + MantidWidgets::RangeSelector::XSINGLE, true, true); + + m_rangeSelectors["CentreMark_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], + MantidWidgets::RangeSelector::XSINGLE, true, true); + m_rangeSelectors["CentreMark_PV"]->setColour(Qt::cyan); + m_rangeSelectors["CentreMark_PV"]->setMinimum(0.0); + + m_plots["SymmPreviewPlot"]->setAxisFont(QwtPlot::xBottom, parent->font()); + m_plots["SymmPreviewPlot"]->setAxisFont(QwtPlot::yLeft, parent->font()); + m_plots["SymmPreviewPlot"]->setCanvasBackground(Qt::white); + m_uiForm.symm_previewPlot->addWidget(m_plots["SymmPreviewPlot"]); + // Refresh the plot windows m_plots["SymmRawPlot"]->replot(); + m_plots["SymmPreviewPlot"]->replot(); // SIGNAL/SLOT CONNECTIONS // Update range selctors when a property is changed @@ -70,6 +119,8 @@ namespace CustomInterfaces connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(replotNewSpectrum(QtProperty*, double))); // Plot miniplot when file has finished loading connect(m_uiForm.symm_dsInput, SIGNAL(dataReady(const QString&)), this, SLOT(plotRawInput(const QString&))); + // Preview symmetrise + connect(m_uiForm.symm_previewButton, SIGNAL(clicked()), this, SLOT(preview())); // Set default XCut value m_dblManager->setValue(m_properties["XCut"], 0.3); @@ -77,6 +128,7 @@ namespace CustomInterfaces // Set default x axis range std::pair defaultRange(-1.0, 1.0); setAxisRange("SymmRawPlot", QwtPlot::xBottom, defaultRange); + setAxisRange("SymmPreviewPlot", QwtPlot::xBottom, defaultRange); } //---------------------------------------------------------------------------------------------- @@ -105,8 +157,6 @@ namespace CustomInterfaces void IndirectSymmetrise::run() { - using namespace Mantid::API; - QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); QString outputWorkspaceName = workspaceName.left(workspaceName.length() - 4) + "_Symmetrise"; @@ -160,6 +210,10 @@ namespace CustomInterfaces setAxisRange("SymmRawPlot", QwtPlot::xBottom, range); plotMiniPlot(input, spectrumNumber, "SymmRawPlot"); + + // Match X axis range on preview plot + setAxisRange("SymmPreviewPlot", QwtPlot::xBottom, range); + m_plots["SymmPreviewPlot"]->replot(); } void IndirectSymmetrise::replotNewSpectrum(QtProperty *prop, double value) @@ -174,10 +228,67 @@ namespace CustomInterfaces { if(prop == m_properties["XCut"]) { - m_rangeSelectors["NegativeXCut"]->setMinimum(-value); - m_rangeSelectors["PositiveXCut"]->setMinimum(value); + m_rangeSelectors["NegativeXCut_Raw"]->setMinimum(-value); + m_rangeSelectors["PositiveXCut_Raw"]->setMinimum(value); + + m_rangeSelectors["NegativeXCut_PV"]->setMinimum(-value); + m_rangeSelectors["PositiveXCut_PV"]->setMinimum(value); } } + void IndirectSymmetrise::preview() + { + connect(m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); + + QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); + + if(workspaceName.isEmpty()) + return; + + double x_cut = m_dblManager->value(m_properties["XCut"]); + + IAlgorithm_sptr symmetriseAlg = AlgorithmManager::Instance().create("Symmetrise", -1); + symmetriseAlg->initialize(); + symmetriseAlg->setProperty("Sample", workspaceName.toStdString()); + symmetriseAlg->setProperty("XCut", x_cut); + symmetriseAlg->setProperty("Plot", false); + symmetriseAlg->setProperty("Verbose", false); + symmetriseAlg->setProperty("Save", false); + symmetriseAlg->setProperty("OutputWorkspace", "__Symmetrise_temp"); + symmetriseAlg->setProperty("OutputPropertiesTable", "__SymmetriseProps_temp"); + + runAlgorithm(symmetriseAlg); + } + + void IndirectSymmetrise::previewAlgDone(bool error) + { + if(error) + return; + + QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); + int spectrumNumber = static_cast(m_dblManager->value(m_properties["PreviewSpec"])); + + MatrixWorkspace_sptr sampleWS = AnalysisDataService::Instance().retrieveWS(workspaceName.toStdString()); + ITableWorkspace_sptr propsTable = AnalysisDataService::Instance().retrieveWS("__SymmetriseProps_temp"); + + int negativeIndex = propsTable->getColumn("NegativeCutIndex")->cell(0); + int positiveIndex = propsTable->getColumn("PositiveCutIndex")->cell(0); + + double negativeY = sampleWS->dataY(0)[negativeIndex]; + double positiveY = sampleWS->dataY(0)[positiveIndex]; + double deltaY = fabs(negativeY - positiveY); + + m_dblManager->setValue(m_properties["NegativeYValue"], negativeY); + m_dblManager->setValue(m_properties["PositiveYValue"], positiveY); + m_dblManager->setValue(m_properties["DeltaY"], deltaY); + + m_rangeSelectors["NegativeXCutYPos"]->setMinimum(negativeY); + m_rangeSelectors["PositiveXCutYPos"]->setMinimum(positiveY); + + plotMiniPlot("__Symmetrise_temp", spectrumNumber, "SymmPreviewPlot"); + + disconnect(m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); + } + } // namespace CustomInterfaces } // namespace Mantid From 829ff5b887055cea0049f921f10315abe78051c9 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 4 Sep 2014 15:41:45 +0100 Subject: [PATCH 027/284] Added spectra range option, updated UI Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 76 ++++++++++++++----- .../IndirectSymmetrise.h | 2 +- .../src/IndirectSymmetrise.cpp | 76 ++++++++++++++++--- 3 files changed, 123 insertions(+), 31 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 1f7bc06b6951..b915fc158f38 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -1,6 +1,6 @@ from mantid import logger, mtd from mantid.api import PythonAlgorithm, AlgorithmFactory, WorkspaceProperty, PropertyMode -from mantid.kernel import Direction +from mantid.kernel import Direction, IntArrayProperty, IntArrayMandatoryValidator from mantid.simpleapi import CreateWorkspace, CopyLogs, CopySample, CopyInstrumentParameters, SaveNexusProcessed, CreateEmptyTableWorkspace import math @@ -28,6 +28,9 @@ def PyInit(self): self.declareProperty('Save', defaultValue=False, doc='Switch saving result to nxs file Off/On') + self.declareProperty(IntArrayProperty(name='SpectraRange'), + doc='Range of spectra to symmetrise (defaults to entire range if not set)') + self.declareProperty(WorkspaceProperty('OutputWorkspace', '', Direction.Output), doc='Name to call the output workspace.') @@ -35,15 +38,13 @@ def PyInit(self): Direction.Output, PropertyMode.Optional), doc='Name to call the properties output table workspace.') def PyExec(self): - from IndirectCommon import CheckHistZero, StartTime, EndTime + from IndirectCommon import StartTime, EndTime StartTime('Symmetrise') self._setup() - num_spectra, _ = CheckHistZero(self._sample) - sample_x = mtd[self._sample].readX(0) - if math.fabs(self._x_cut) < 1e-5: - raise ValueError('XCut point is Zero') + # The number of spectra that will actually be changed + num_symm_spectra = self._spectra_range[1] - self._spectra_range[0] + 1 # Find the smallest data array in the first spectra len_x = len(mtd[self._sample].readX(0)) @@ -51,6 +52,7 @@ def PyExec(self): len_e = len(mtd[self._sample].readE(0)) sample_array_len = min(len_x, len_y, len_e) - 1 + sample_x = mtd[self._sample].readX(0) delta_x = sample_x[1] - sample_x[0] # Find array index of negative XCut @@ -58,12 +60,12 @@ def PyExec(self): self._negative_index = np.where(negative_diff < delta_x)[0][-1] self._check_bounds(self._negative_index, sample_array_len, label='Negative') - # FInd array index of positive XCut + # Find array index of positive XCut positive_diff = np.absolute(sample_x + sample_x[self._negative_index]) self._positive_index = np.where(positive_diff < delta_x)[0][-1] self._check_bounds(self._positive_index, sample_array_len, label='Positive') - # Calculate number of elements neede dfor new array (per spectra) + # Calculate number of elements needed for new array (per spectra) new_array_len = 2 * sample_array_len - (self._positive_index + self._negative_index) + 1 if self._verbose: @@ -74,11 +76,14 @@ def PyExec(self): % (self._positive_index, sample_x[self._positive_index])) logger.notice('New array size = %d' % new_array_len) + x_unit = mtd[self._sample].getXDimension().getUnits() + # Create an empty workspace with enough storage for the new data - zeros = np.zeros(new_array_len * num_spectra) + zeros = np.zeros(new_array_len * num_symm_spectra) CreateWorkspace(OutputWorkspace=self._output_workspace, DataX=zeros, DataY=zeros, DataE=zeros, - NSpec=num_spectra) + NSpec=num_symm_spectra, + UnitX=x_unit) # Copy logs and properties from sample workspace CopyLogs(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) @@ -86,11 +91,15 @@ def PyExec(self): # CopySample(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) # For each spectrum copy positive values to the negative - for index in xrange(num_spectra): + output_spectrum_index = 0 + for spectrum_no in range(self._spectra_range[0], self._spectra_range[1] + 1): + # Get index of original spectra + spectrum_index = mtd[self._sample].getIndexFromSpectrumNumber(spectrum_no) + # Strip any additional array cells - x_in = mtd[self._sample].readX(index)[:sample_array_len + 1] - y_in = mtd[self._sample].readY(index)[:sample_array_len + 1] - e_in = mtd[self._sample].readE(index)[:sample_array_len + 1] + x_in = mtd[self._sample].readX(spectrum_index)[:sample_array_len + 1] + y_in = mtd[self._sample].readY(spectrum_index)[:sample_array_len + 1] + e_in = mtd[self._sample].readE(spectrum_index)[:sample_array_len + 1] # Get some zeroed data to overwrite with copies from sample x_out = np.zeros(new_array_len) @@ -107,12 +116,17 @@ def PyExec(self): y_out[sample_array_len - self._positive_index:] = y_in[self._negative_index:] e_out[sample_array_len - self._positive_index:] = e_in[self._negative_index:] - mtd[self._output_workspace].setX(index, x_out) - mtd[self._output_workspace].setY(index, y_out) - mtd[self._output_workspace].setE(index, e_out) + # Set output spectrum data + mtd[self._output_workspace].setX(output_spectrum_index, x_out) + mtd[self._output_workspace].setY(output_spectrum_index, y_out) + mtd[self._output_workspace].setE(output_spectrum_index, e_out) + + # Set output spectrum number + mtd[self._output_workspace].getSpectrum(output_spectrum_index).setSpectrumNo(spectrum_no) - logger.information('Spectra %d out of %d done' - % (index + 1, num_spectra)) + output_spectrum_index += 1 + + logger.information('Symmetrise spectra %d' % spectrum_no) if self._save: self._save_output() @@ -129,15 +143,36 @@ def PyExec(self): def _setup(self): """ - Get the algorithm properties. + Get the algorithm properties and validate them. """ + from IndirectCommon import CheckHistZero + self._sample = self.getPropertyValue('Sample') + + num_sample_spectra, _ = CheckHistZero(self._sample) + min_spectra_number = mtd[self._sample].getSpectrum(0).getSpectrumNo() + max_spectra_number = mtd[self._sample].getSpectrum(num_sample_spectra - 1).getSpectrumNo() + self._x_cut = self.getProperty('XCut').value + if math.fabs(self._x_cut) < 1e-5: + raise ValueError('XCut point is Zero') + self._verbose = self.getProperty('Verbose').value self._plot = self.getProperty('Plot').value self._save = self.getProperty('Save').value + self._spectra_range = self.getProperty('SpectraRange').value + + if len(self._spectra_range) < 2: + self._spectra_range = [min_spectra_number, max_spectra_number] + else: + if self._spectra_range[0] > self._spectra_range[1]: + raise ValueError('Invalid spectra range') + + if self._spectra_range[1] > max_spectra_number: + raise ValueError('Max spectrum number out of range') + self._output_workspace = self.getPropertyValue('OutputWorkspace') self._props_output_workspace = self.getPropertyValue('OutputPropertiesTable') @@ -187,6 +222,7 @@ def _plot_output(self): """ from IndirectImport import import_mantidplot mtd_plot = import_mantidplot() + mtd_plot.plotSpectrum([self._sample, self._output_workspace], 0) # Register algorithm with Mantid diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h index a6b88d632e70..3eb019206bef 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h @@ -67,7 +67,7 @@ namespace CustomInterfaces private slots: void plotRawInput(const QString &workspaceName); - void updateRawPlot(); + void updateMiniPlots(); void replotNewSpectrum(QtProperty *prop, double value); void updateRangeSelectors(QtProperty *prop, double value); void preview(); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index f606ff057549..c8d1ce0d1380 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -64,21 +64,27 @@ namespace CustomInterfaces m_plots["SymmRawPlot"] = new QwtPlot(m_parentWidget); m_curves["SymmRawPlot"] = new QwtPlotCurve(); + // Indicators for negative and positive XCut values on X axis m_rangeSelectors["NegativeXCut_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, false); m_rangeSelectors["PositiveXCut_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, false); + m_rangeSelectors["NegativeXCut_Raw"]->setColour(Qt::darkGreen); + m_rangeSelectors["PositiveXCut_Raw"]->setColour(Qt::darkGreen); + + // Indicators for Y value at each XCut position m_rangeSelectors["NegativeXCutYPos"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::YSINGLE, true, false); m_rangeSelectors["PositiveXCutYPos"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::YSINGLE, true, false); m_rangeSelectors["NegativeXCutYPos"]->setColour(Qt::red); - m_rangeSelectors["PositiveXCutYPos"]->setColour(Qt::red); + m_rangeSelectors["PositiveXCutYPos"]->setColour(Qt::blue); m_rangeSelectors["NegativeXCutYPos"]->setMinimum(0); m_rangeSelectors["PositiveXCutYPos"]->setMinimum(0); + // Indicator for centre of symmetry (x=0) m_rangeSelectors["CentreMark_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, true); m_rangeSelectors["CentreMark_Raw"]->setColour(Qt::cyan); @@ -93,11 +99,16 @@ namespace CustomInterfaces m_plots["SymmPreviewPlot"] = new QwtPlot(m_parentWidget); m_curves["SymmPreviewPlot"] = new QwtPlotCurve(); + // Indicators for negative and positive XCut values on X axis m_rangeSelectors["NegativeXCut_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], MantidWidgets::RangeSelector::XSINGLE, true, true); m_rangeSelectors["PositiveXCut_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], MantidWidgets::RangeSelector::XSINGLE, true, true); + m_rangeSelectors["NegativeXCut_PV"]->setColour(Qt::darkGreen); + m_rangeSelectors["PositiveXCut_PV"]->setColour(Qt::darkGreen); + + // Indicator for centre of symmetry (x=0) m_rangeSelectors["CentreMark_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], MantidWidgets::RangeSelector::XSINGLE, true, true); m_rangeSelectors["CentreMark_PV"]->setColour(Qt::cyan); @@ -179,21 +190,33 @@ namespace CustomInterfaces runAlgorithm(symmetriseAlg); } + /** + * Plots a new workspace in the mini plot when it is loaded form the data selector. + * + * @param workspaceName Name of the workspace that has been laoded + */ void IndirectSymmetrise::plotRawInput(const QString &workspaceName) { - UNUSED_ARG(workspaceName); + // Set the preview spectrum number to the first spectrum in the workspace + MatrixWorkspace_sptr sampleWS = AnalysisDataService::Instance().retrieveWS(workspaceName.toStdString()); + int minSpectrumRange = sampleWS->getSpectrum(0)->getSpectrumNo(); + m_dblManager->setValue(m_properties["PreviewSpec"], static_cast(minSpectrumRange)); - updateRawPlot(); + updateMiniPlots(); + // Set the preview range to the maximum absolute X value auto axisRange = getCurveRange("SymmRawPlot"); double symmRange = std::max(fabs(axisRange.first), fabs(axisRange.second)); g_log.information() << "Symmetrise x axis range +/- " << symmRange << std::endl; m_dblManager->setValue(m_properties["PreviewRange"], symmRange); - updateRawPlot(); + updateMiniPlots(); } - void IndirectSymmetrise::updateRawPlot() + /** + * Updates the mini plots. + */ + void IndirectSymmetrise::updateMiniPlots() { if(!m_uiForm.symm_dsInput->isValid()) return; @@ -204,26 +227,35 @@ namespace CustomInterfaces Mantid::API::MatrixWorkspace_sptr input = boost::dynamic_pointer_cast( Mantid::API::AnalysisDataService::Instance().retrieve(workspaceName.toStdString())); + // Set the X axis range based on the range specified by the user std::pairrange; range.first = -m_dblManager->value(m_properties["PreviewRange"]); range.second = m_dblManager->value(m_properties["PreviewRange"]); setAxisRange("SymmRawPlot", QwtPlot::xBottom, range); - plotMiniPlot(input, spectrumNumber, "SymmRawPlot"); + // Plot the spectrum chosen by the user + size_t spectrumIndex = input->getIndexFromSpectrumNumber(spectrumNumber); + plotMiniPlot(input, spectrumIndex, "SymmRawPlot"); // Match X axis range on preview plot setAxisRange("SymmPreviewPlot", QwtPlot::xBottom, range); m_plots["SymmPreviewPlot"]->replot(); } + /** + * Redraws mini plots when user changes previw range or spectrum. + */ void IndirectSymmetrise::replotNewSpectrum(QtProperty *prop, double value) { UNUSED_ARG(value); if((prop == m_properties["PreviewSpec"]) || (prop == m_properties["PreviewRange"])) - updateRawPlot(); + updateMiniPlots(); } + /** + * Updates position of XCut range selectors when used changed value of XCut. + */ void IndirectSymmetrise::updateRangeSelectors(QtProperty *prop, double value) { if(prop == m_properties["XCut"]) @@ -236,30 +268,46 @@ namespace CustomInterfaces } } + /** + * Handles a request to preview the symmetrise. + * + * Runs Symmetrise on the current spectrum and plots in preview mini plot. + * + * @see IndirectSymmetrise::previewAlgDone() + */ void IndirectSymmetrise::preview() { + // Handle algorithm completion signal connect(m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); + // Do nothing if no data has been laoded QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); - if(workspaceName.isEmpty()) return; + bool verbose = m_uiForm.symm_ckVerbose->isChecked(); double x_cut = m_dblManager->value(m_properties["XCut"]); + long spectrumNumber = static_cast(m_dblManager->value(m_properties["PreviewSpec"])); + std::vector spectraRange(2, spectrumNumber); + // Run the algorithm on the preview spectrum only IAlgorithm_sptr symmetriseAlg = AlgorithmManager::Instance().create("Symmetrise", -1); symmetriseAlg->initialize(); symmetriseAlg->setProperty("Sample", workspaceName.toStdString()); symmetriseAlg->setProperty("XCut", x_cut); symmetriseAlg->setProperty("Plot", false); - symmetriseAlg->setProperty("Verbose", false); + symmetriseAlg->setProperty("Verbose", verbose); symmetriseAlg->setProperty("Save", false); + symmetriseAlg->setProperty("SpectraRange", spectraRange); symmetriseAlg->setProperty("OutputWorkspace", "__Symmetrise_temp"); symmetriseAlg->setProperty("OutputPropertiesTable", "__SymmetriseProps_temp"); runAlgorithm(symmetriseAlg); } + /** + * Handles completion of the preview algorithm. + */ void IndirectSymmetrise::previewAlgDone(bool error) { if(error) @@ -270,23 +318,31 @@ namespace CustomInterfaces MatrixWorkspace_sptr sampleWS = AnalysisDataService::Instance().retrieveWS(workspaceName.toStdString()); ITableWorkspace_sptr propsTable = AnalysisDataService::Instance().retrieveWS("__SymmetriseProps_temp"); + MatrixWorkspace_sptr symmWS = AnalysisDataService::Instance().retrieveWS("__Symmetrise_temp"); + // Get the index of XCut on each side of zero int negativeIndex = propsTable->getColumn("NegativeCutIndex")->cell(0); int positiveIndex = propsTable->getColumn("PositiveCutIndex")->cell(0); + // Get the Y values for each XCut and the difference between them double negativeY = sampleWS->dataY(0)[negativeIndex]; double positiveY = sampleWS->dataY(0)[positiveIndex]; double deltaY = fabs(negativeY - positiveY); + // Show values in property tree m_dblManager->setValue(m_properties["NegativeYValue"], negativeY); m_dblManager->setValue(m_properties["PositiveYValue"], positiveY); m_dblManager->setValue(m_properties["DeltaY"], deltaY); + // Set indicator positions m_rangeSelectors["NegativeXCutYPos"]->setMinimum(negativeY); m_rangeSelectors["PositiveXCutYPos"]->setMinimum(positiveY); - plotMiniPlot("__Symmetrise_temp", spectrumNumber, "SymmPreviewPlot"); + // Plot preview plot + size_t spectrumIndex = symmWS->getIndexFromSpectrumNumber(spectrumNumber); + plotMiniPlot("__Symmetrise_temp", spectrumIndex, "SymmPreviewPlot"); + // Don't want this to trigger when the algorithm is run for all spectra disconnect(m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); } From 58fffdb3b1f8f31cd5b7477a636f501dc5637f86 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 4 Sep 2014 16:15:01 +0100 Subject: [PATCH 028/284] Fix compile issue with algorithm runner Refs #7860 --- .../inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h | 4 ++-- .../CustomInterfaces/src/IndirectDataReductionTab.cpp | 6 +++--- .../MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h index 816d12016471..07b5210d5f81 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h @@ -135,8 +135,8 @@ namespace CustomInterfaces /// Double editor facotry for the properties browser DoubleEditorFactory* m_dblEdFac; - /// Algorithm runner object to execute algorithms on a seperate thread from the gui - MantidQt::API::AlgorithmRunner* m_algRunner; + /// Algorithm runner object to execute algorithms on a seperate thread from the GUI + MantidQt::API::AlgorithmRunner m_algRunner; /// Use a Python runner for when we need the output of a script MantidQt::API::PythonRunner m_pythonRunner; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp index 830928f6edc1..51b32e730922 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp @@ -19,11 +19,11 @@ namespace CustomInterfaces m_properties(), m_dblManager(new QtDoublePropertyManager()), m_blnManager(new QtBoolPropertyManager()), m_grpManager(new QtGroupPropertyManager()), m_dblEdFac(new DoubleEditorFactory()), + m_algRunner(NULL), m_uiForm(uiForm) { m_parentWidget = dynamic_cast(parent); - m_algRunner = new MantidQt::API::AlgorithmRunner(m_parentWidget); m_valInt = new QIntValidator(m_parentWidget); m_valDbl = new QDoubleValidator(m_parentWidget); m_valPosDbl = new QDoubleValidator(m_parentWidget); @@ -31,7 +31,7 @@ namespace CustomInterfaces const double tolerance = 0.00001; m_valPosDbl->setBottom(tolerance); - QObject::connect(m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(algorithmFinished(bool))); + connect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(algorithmFinished(bool))); connect(&m_pythonRunner, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); } @@ -303,7 +303,7 @@ namespace CustomInterfaces void IndirectDataReductionTab::runAlgorithm(const Mantid::API::IAlgorithm_sptr algorithm) { algorithm->setRethrows(true); - m_algRunner->startAlgorithm(algorithm); + m_algRunner.startAlgorithm(algorithm); } /** diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index c8d1ce0d1380..7797a92de31b 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -278,7 +278,7 @@ namespace CustomInterfaces void IndirectSymmetrise::preview() { // Handle algorithm completion signal - connect(m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); + connect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); // Do nothing if no data has been laoded QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); @@ -343,7 +343,7 @@ namespace CustomInterfaces plotMiniPlot("__Symmetrise_temp", spectrumIndex, "SymmPreviewPlot"); // Don't want this to trigger when the algorithm is run for all spectra - disconnect(m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); + disconnect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); } } // namespace CustomInterfaces From 37b3a7e4ce66db6aa355f91a7364578d990c3e37 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 4 Sep 2014 16:56:28 +0100 Subject: [PATCH 029/284] Check point CalculateMSVesuvio Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 42 ++- .../CurveFitting/src/CalculateMSVesuvio.cpp | 249 ++++++++++++++---- .../test/CalculateMSVesuvioTest.h | 34 +++ 3 files changed, 271 insertions(+), 54 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index c8b03cdff0c7..370c389aa162 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -49,6 +49,30 @@ namespace Mantid class DLLExport CalculateMSVesuvio : public API::Algorithm { private: + + // Holds date on the compton scattering properties of an atom + struct ComptonNeutronAtom + { + ComptonNeutronAtom() + : mass(-1.0), sclength(-1.0), profile(-1.0) {} + double mass; // in amu + double sclength; // 4pi/xsec + double profile; // s.d of J(y) + }; + + // Holds data about sample as a whole. + struct SampleComptonProperties + { + SampleComptonProperties(const int nprops) + : atoms(nprops), density(-1.0), totalxsec(-1.0), + mu(-1.0) {} + + std::vector atoms; + double density; // g/cm^3 + double totalxsec; // total free-scattering cross section + double mu; // attenuation factor (1/m) + }; + // Produces random numbers with various probability distributions class RandomNumberGenerator { @@ -62,8 +86,10 @@ namespace Mantid double gaussian(const double mean, const double sigma); private: + RandomNumberGenerator(); boost::mt19937 m_generator; }; + // Stores counts for each scatter order // for a "run" of a given number of events struct Simulation @@ -75,6 +101,7 @@ namespace Mantid double weight; size_t nmscat; }; + // Accumulates and averages the results of each simulation struct SimulationAggregator { @@ -101,7 +128,7 @@ namespace Mantid void init(); void exec(); - void cacheInputGeometry(); + void cacheInputs(); void calculateMS(const size_t wsIndex, API::ISpectrum & totalsc, API::ISpectrum & multsc) const; Simulation simulate(const size_t nevents, const size_t nscatters, @@ -110,19 +137,22 @@ namespace Mantid double calculateCounts(const size_t nscatters, const DetectorParams & detpar, const ResolutionParams &respar, - Simulation & counts) const; + Simulation & simulation) const; // single-event helpers - double generateSrcPos(const double l, Kernel::V3D & srcPos) const; + Kernel::V3D generateSrcPos(const double l1) const; double generateE0(const double l1, const double t2, double &weight) const; double generateTOF(const double gaussTOF, const double en0, const double dl1) const; Kernel::V3D generateScatter(const Kernel::V3D &startPos, const Kernel::V3D &direc, double &weight) const; + std::pair calculateE1Range(const double theta, const double en0) const; + double partialDiffXSec(const double en0, const double en1, const double theta) const; // Member Variables RandomNumberGenerator *m_randgen; // random number generator - size_t m_acrossDir, m_upDir, m_beamDir; // indices of each direction + size_t m_acrossIdx, m_upIdx, m_beamIdx; // indices of each direction + Kernel::V3D m_beamDir; // Directional vector for beam double m_srcR1; // beam umbra radius (m) double m_srcR2; // beam penumbra radius (m) double m_halfSampleHeight; // half-height of sample (m) @@ -131,9 +161,7 @@ namespace Mantid double m_maxWidthSampleFrame; // Maximum width in sample frame (m) Kernel::DblMatrix const *m_goniometer; // sample rotation Geometry::Object const *m_sampleShape; // sample shape - Kernel::V3D m_samplePos; - - double m_mu; //attenuation xsec + SampleComptonProperties *m_sampleProps; // description of sample properties double m_tmin; // minimum tof value double m_tmax; // maximum tof value diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index ce1e1279a513..64fcfa94e4fd 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -12,6 +12,8 @@ #include "MantidGeometry/Instrument/ParameterMap.h" #include "MantidGeometry/Objects/Track.h" +#include "MantidKernel/ArrayLengthValidator.h" +#include "MantidKernel/ArrayProperty.h" #include "MantidKernel/BoundedValidator.h" #include "MantidKernel/CompositeValidator.h" #include "MantidKernel/MersenneTwister.h" @@ -121,10 +123,10 @@ namespace Mantid /// Constructor CalculateMSVesuvio::CalculateMSVesuvio() : Algorithm(), m_randgen(NULL), - m_acrossDir(0), m_upDir(1), m_beamDir(3), m_srcR1(0.0), m_srcR2(0.0), + m_acrossIdx(0), m_upIdx(1), m_beamIdx(3), m_beamDir(), m_srcR1(0.0), m_srcR2(0.0), m_halfSampleHeight(0.0), m_halfSampleWidth(0.0), m_halfSampleThick(0.0), - m_maxWidthSampleFrame(0.0), m_goniometer(NULL), m_sampleShape(NULL), m_samplePos(), - m_mu(-1.0), + m_maxWidthSampleFrame(0.0), m_goniometer(NULL), m_sampleShape(NULL), + m_sampleProps(NULL), m_tmin(-1.0), m_tmax(-1.0), m_dt(-1.0), m_progress(NULL), m_inputWS() { @@ -134,6 +136,8 @@ namespace Mantid CalculateMSVesuvio::~CalculateMSVesuvio() { delete m_randgen; + delete m_progress; + delete m_sampleProps; } /// @copydoc Algorithm::name @@ -174,9 +178,28 @@ namespace Mantid Direction::Input, inputWSValidator), "Input workspace to be corrected, in units of TOF."); + // -- Sample -- + auto positiveInt = boost::make_shared>(); + positiveInt->setLower(1); + declareProperty("NoOfMasses", -1, positiveInt, + "The number of masses contained within the sample"); + auto positiveNonZero = boost::make_shared>(); positiveNonZero->setLower(0.0); positiveNonZero->setLowerExclusive(true); + declareProperty("SampleDensity", -1.0, positiveNonZero, + "The density of the sample in gm/cm^3"); + + auto nonEmptyArray = boost::make_shared>(); + declareProperty(new ArrayProperty("AtomicProperties", nonEmptyArray), + "Atomic properties of masses within the sample. " + "The expected format is 3 consecutive values per mass: " + "mass(amu), cross-section (barns) & s.d of Compton profile."); + setPropertyGroup("NoOfMasses", "Sample"); + setPropertyGroup("SampleDensity", "Sample"); + setPropertyGroup("AtomicProperties", "Sample"); + + // -- Beam -- declareProperty("BeamUmbraRadius", -1.0, positiveNonZero, "Radius, in cm, of part in total shadow."); declareProperty("BeamPenumbraRadius", -1.0, positiveNonZero, @@ -184,8 +207,7 @@ namespace Mantid setPropertyGroup("BeamUmbraRadius", "Beam"); setPropertyGroup("BeamPenumbraRadius", "Beam"); - auto positiveInt = boost::make_shared>(); - positiveInt->setLower(1); + // -- Algorithm -- declareProperty("Seed", 123456789, positiveInt, "Seed the random number generator with this value"); @@ -202,12 +224,7 @@ namespace Mantid void CalculateMSVesuvio::exec() { m_inputWS = getProperty("InputWorkspace"); - cacheInputGeometry(); - // Values used frequently - const auto & inX = m_inputWS->readX(0); - m_tmin = inX.front(); - m_tmax = inX.back(); - m_dt = inX[1] - m_tmin; + cacheInputs(); // Create new workspaces MatrixWorkspace_sptr totalsc = WorkspaceFactory::Instance().create(m_inputWS); @@ -255,17 +272,18 @@ namespace Mantid } /** - * Caches sample, detector geometry for speed in later calculations + * Caches inputs insuitable form for speed in later calculations */ - void CalculateMSVesuvio::cacheInputGeometry() + void CalculateMSVesuvio::cacheInputs() { + // -- Geometry -- const auto instrument = m_inputWS->getInstrument(); - m_samplePos = instrument->getSample()->getPos(); + m_beamDir = instrument->getSample()->getPos() - instrument->getSource()->getPos(); const auto rframe = instrument->getReferenceFrame(); - m_acrossDir = rframe->pointingHorizontal(); - m_upDir = rframe->pointingUp(); - m_beamDir = rframe->pointingAlongBeam(); + m_acrossIdx = rframe->pointingHorizontal(); + m_upIdx = rframe->pointingUp(); + m_beamIdx = rframe->pointingAlongBeam(); m_srcR1 = getProperty("BeamUmbraRadius"); m_srcR2 = getProperty("BeamPenumbraRadius"); @@ -289,9 +307,48 @@ namespace Mantid Geometry::BoundingBox bounds = m_sampleShape->getBoundingBox(); V3D boxWidth = bounds.width(); // Use half-width/height for easier calculation later - m_halfSampleWidth = 0.5*boxWidth[m_acrossDir]; - m_halfSampleHeight = 0.5*boxWidth[m_upDir]; - m_halfSampleThick = 0.5*boxWidth[m_beamDir]; + m_halfSampleWidth = 0.5*boxWidth[m_acrossIdx]; + m_halfSampleHeight = 0.5*boxWidth[m_upIdx]; + m_halfSampleThick = 0.5*boxWidth[m_beamIdx]; + + // -- Workspace -- + const auto & inX = m_inputWS->readX(0); + m_tmin = inX.front(); + m_tmax = inX.back(); + m_dt = inX[1] - m_tmin; + + // -- Sample -- + int nmasses = getProperty("NoOfMasses"); + std::vector sampleInfo = getProperty("AtomicProperties"); + int nInputAtomProps = static_cast(sampleInfo.size()); + const int nExptdAtomProp(3); + if(nInputAtomProps != nExptdAtomProp*nmasses) + { + std::ostringstream os; + os << "Inconsistent AtomicProperties list defined. Expected " << nExptdAtomProp*nmasses + << " values, however, only " << sampleInfo.size() << " have been given."; + throw std::invalid_argument(os.str()); + } + m_sampleProps = new SampleComptonProperties(nInputAtomProps); + m_sampleProps->density = getProperty("SampleDensity"); + + double totalMass(0.0); + m_sampleProps->totalxsec = 0.0; + for(int i = 0; i < nInputAtomProps; ++i) + { + auto & comptonAtom = m_sampleProps->atoms[i]; + comptonAtom.mass = sampleInfo[nExptdAtomProp*i]; + totalMass += comptonAtom.mass; + + const double xsec = sampleInfo[nExptdAtomProp*i + 1]; + comptonAtom.sclength = sqrt(xsec/4.0*M_PI); + const double factor = 1.0 + (PhysicalConstants::NeutronMassAMU/comptonAtom.mass); + m_sampleProps->totalxsec += (xsec/(factor*factor)); + + comptonAtom.profile = sampleInfo[nExptdAtomProp*i + 2]; + } + const double numberDensity = m_sampleProps->density*1e6/totalMass; // formula units/m^3 + m_sampleProps->mu = numberDensity*m_sampleProps->totalxsec*1e-28; } /** @@ -356,22 +413,21 @@ namespace Mantid * @param nscatters Maximum order of scattering that should be simulated * @param detpar Detector information describing the final detector position * @param respar Resolution information on the intrument as a whole - * @param counts [Output] Store the calculated counts here + * @param simulation [Output] Store the calculated counts here * @return */ double CalculateMSVesuvio::calculateCounts(const size_t nscatters, const DetectorParams &detpar, const ResolutionParams &respar, - Simulation &counts) const + Simulation &simulation) const { double weightSum(0.0); - std::vector weights(nscatters, 1.0); // start at 1.0 - std::vector tofs(nscatters, 0.0); + std::vector weights(nscatters, 1.0), // start at 1.0 + tofs(nscatters, 0.0), scAngs(nscatters, 0.0),en0(nscatters, 0.0); // Initial TOF based on uncertainty in time measurement on detector // moderator coord in lab frame - V3D srcPos; - generateSrcPos(detpar.l1, srcPos); // fills in x,y,z + V3D srcPos = generateSrcPos(detpar.l1); // transform to sample frame srcPos.rotate(*m_goniometer); if(fabs(srcPos[0]) > m_halfSampleWidth || @@ -379,20 +435,47 @@ namespace Mantid const double vel2 = sqrt(detpar.efixed/MASS_TO_MEV); const double t2 = detpar.l2/vel2; - double en0 = generateE0(detpar.l1, t2, weights[0]); - tofs[0] = generateTOF(en0, detpar.t0, respar.dl1); // correction for resolution in l1 + en0[0] = generateE0(detpar.l1, t2, weights[0]); + tofs[0] = generateTOF(en0[0], detpar.t0, respar.dl1); // correction for resolution in l1 - // Neutron paths. No beam divergence so initial direction is parallel to beam direction - V3D startPos(srcPos); - V3D particleDir; - particleDir[m_beamDir] = 1.0; + // Neutron path + // Algorithm has initial direction pointing to origin + V3D particleDir = V3D() - srcPos; - V3D scatterPt = generateScatter(startPos, particleDir, weights[0]); - double distFromStart = scatterPt.distance(startPos); + // first scatter + V3D scatterPt = generateScatter(srcPos, particleDir, weights[0]); + double distFromStart = scatterPt.distance(srcPos); // Compute TOF for first scatter event - double vel = sqrt(en0/MASS_TO_MEV); + double vel = sqrt(en0[0]/MASS_TO_MEV); tofs[0] += (distFromStart*1e6/vel); + // multiple scatters + for(size_t i = 1; i < nscatters; ++i) + { + weights[i] = weights[i-1]; + tofs[i] = tofs[i-1]; + + // Generate a new direction of travel + double randth = acos(2.0*m_randgen->flat() - 1.0); + double randphi = 2.0*M_PI*m_randgen->flat(); + V3D oldDir = particleDir; + particleDir.spherical_rad(1.0, randth, randphi); + scAngs[i-1] = particleDir.angle(oldDir); + + // Update weight + scatterPt = generateScatter(scatterPt, particleDir, weights[i]); + auto e1range = calculateE1Range(scAngs[i-1], en0[i-1]); + en0[i] = e1range.first + m_randgen->flat()*(e1range.second - e1range.first); + const double d2sig =partialDiffXSec(en0[i-1], en0[i], scAngs[i-1]); + double weight = d2sig*4.0*M_PI*(e1range.second - e1range.first)/m_sampleProps->totalxsec; + // accumulate total weight + simulation.nmscat += 1; + weightSum += weight; + weights[i] *= weight; // account for this scatter on top of previous + + // Increment time of flight... + } + return weightSum; } @@ -400,10 +483,9 @@ namespace Mantid * Sample from the moderator assuming it can be seen * as a cylindrical ring with inner and outer radius * @param l1 Src-sample distance (m) - * @param srcPos [Out] Position in the height direction of the generated point + * @returns Position on the moderator of the generated point */ - double CalculateMSVesuvio::generateSrcPos(const double l1, - Kernel::V3D &srcPos) const + V3D CalculateMSVesuvio::generateSrcPos(const double l1) const { double radius(-1.0), widthPos(0.0), heightPos(0.0); do @@ -415,14 +497,12 @@ namespace Mantid } while(radius > m_srcR2); // assign to output - srcPos[m_acrossDir] = widthPos; - srcPos[m_upDir] = heightPos; - srcPos[m_beamDir] = -l1; + V3D srcPos; + srcPos[m_acrossIdx] = widthPos; + srcPos[m_upIdx] = heightPos; + srcPos[m_beamIdx] = -l1; - if(radius > m_srcR1) - return (m_srcR2 - radius)/(m_srcR2 - m_srcR1); - else - return 1.0; // inside umbra unit weight + return srcPos; } /** @@ -509,10 +589,10 @@ namespace Mantid // Find distance inside object and compute probability of scattering const auto & link = particleTrack.begin(); double totalObjectDist = link->distInsideObject; - const double scatterProb = 1.0 - exp(-m_mu*totalObjectDist); + const double scatterProb = 1.0 - exp(-m_sampleProps->mu*totalObjectDist); // Select a random point on the track that is the actual scatter point // from the scattering probability distribution - const double dist = -log(1.0 - m_randgen->flat()*scatterProb)/m_mu; + const double dist = -log(1.0 - m_randgen->flat()*scatterProb)/m_sampleProps->mu; // From start point advance in direction of travel by computed distance to find scatter point // Track is defined as set of links and exit point of first link is entry to sample! V3D scatterPt = link->entryPoint; @@ -523,5 +603,80 @@ namespace Mantid return scatterPt; } + /** + * @param theta Neutron scattering angle (radians) + * @param en0 Computed incident energy + * @return The range of allowed final energies for the neutron + */ + std::pair CalculateMSVesuvio::calculateE1Range(const double theta, const double en0) const + { + const double k0 = sqrt(en0/PhysicalConstants::E_mev_toNeutronWavenumberSq); + const double sth(sin(theta)), cth(cos(theta)); + + double e1min(1e10), e1max(-1e10); // large so that anything else is smaller + const auto & atoms = m_sampleProps->atoms; + for(size_t i = 0; i < atoms.size(); ++i) + { + const double mass = atoms[i].mass; + + const double fraction = (cth + sqrt(mass*mass - sth*sth))/(1.0 + mass); + const double k1 = fraction*k0; + const double en1 = PhysicalConstants::E_mev_toNeutronWavenumberSq*k1*k1; + const double qr = sqrt(k0*k0 + k1*k1 - 2.0*k0*k1*cth); + const double wr = en0 - en1; + const double width = PhysicalConstants::E_mev_toNeutronWavenumberSq*atoms[i].profile*qr/mass; + const double e1a = en0 - wr - 10.0*width; + const double e1b = en0 - wr + 10.0*width; + if(e1a < e1min) e1min = e1a; + if(e1b > e1min) e1max = e1b; + } + if(e1min < 0.0) e1min = 0.0; + return std::make_pair(e1min, e1max); + } + + /** + * Compute the partial differential cross section for this energy and theta. + * @param en0 Initial energy (meV) + * @param en1 Final energy (meV) + * @param theta Scattering angle + * @return Value of differential cross section + */ + double CalculateMSVesuvio::partialDiffXSec(const double en0, const double en1, const double theta) const + { + const double rt2pi = sqrt(2.0*M_PI); + + const double k0 = sqrt(en0/PhysicalConstants::E_mev_toNeutronWavenumberSq); + const double k1 = sqrt(en1/PhysicalConstants::E_mev_toNeutronWavenumberSq); + const double q = sqrt(k0*k0 + k1*k1 - 2.0*k0*k1*cos(theta)); + const double w = en0 - en1; + + double pdcs(0.0); + const auto & atoms = m_sampleProps->atoms; + if(q > 0.0) // avoid continuous checking in loop + { + for(size_t i = 0; i < atoms.size(); ++i) + { + const double jstddev = atoms[i].profile; + const double mass = atoms[i].mass; + const double y = 0.5*mass*w/(4.18036*q) - q; + const double jy = exp(-0.5*y*y/(jstddev*jstddev))/(jstddev*rt2pi); + const double sqw = mass*jy/(4.18036*q); + + const double sclength = atoms[i].sclength; + pdcs += sclength*sclength*(k1/k0)*sqw; + } + } + else + { + for(size_t i = 0; i < atoms.size(); ++i) + { + const double sclength = atoms[i].sclength; + pdcs += sclength*sclength; + } + } + + return pdcs; + } + } // namespace Algorithms } // namespace Mantid diff --git a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h index 6bdfef3266c5..0d3dfabc2335 100644 --- a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h +++ b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h @@ -73,6 +73,36 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite TS_ASSERT_THROWS(alg.setProperty("InputWorkspace", testWS), std::invalid_argument); } + void test_setting_nmasses_zero_or_negative_throws_invalid_argument() + { + CalculateMSVesuvio alg; + alg.initialize(); + + TS_ASSERT_THROWS(alg.setProperty("NoOfMasses", -1), std::invalid_argument); + TS_ASSERT_THROWS(alg.setProperty("NoOfMasses", 0), std::invalid_argument); + } + + void test_setting_sampledensity_zero_or_negative_throws_invalid_argument() + { + CalculateMSVesuvio alg; + alg.initialize(); + + TS_ASSERT_THROWS(alg.setProperty("SampleDensity", -1), std::invalid_argument); + TS_ASSERT_THROWS(alg.setProperty("SampleDensity", 0), std::invalid_argument); + } + + + void test_setting_atomic_properties_not_length_three_times_nmasses_throws_invalid_argument_on_execute() + { + auto alg = createTestAlgorithm(createFlatPlateSampleWS()); + + alg->setProperty("NoOfMasses", 2); + const double sampleProps[5] = {1.007900, 0.9272392, 5.003738, 16.00000, 3.2587662E-02}; + alg->setProperty("AtomicProperties", std::vector(sampleProps, sampleProps + 5)); + + TS_ASSERT_THROWS(alg->execute(), std::invalid_argument); + } + void test_setting_zero_or_negative_beam_radius_values_throws_invalid_argument() { CalculateMSVesuvio alg; @@ -105,6 +135,10 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite alg->setChild(true); // inputs alg->setProperty("InputWorkspace", inputWS); + alg->setProperty("NoOfMasses", 3); + alg->setProperty("SampleDensity", 241.0); + const double sampleProps[9] = {1.007900, 0.9272392, 5.003738, 16.00000, 3.2587662E-02, 13.92299, 27.50000, 4.0172841E-02, 15.07701}; + alg->setProperty("AtomicProperties", std::vector(sampleProps, sampleProps + 9)); alg->setProperty("BeamUmbraRadius", 1.5); alg->setProperty("BeamPenumbraRadius", 2.5); // outputs From 7e2752fd43fa43aa2263d6abcb3be6aebe852860 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 9 Sep 2014 11:26:59 +0100 Subject: [PATCH 030/284] Remove need for algorithm runner for now Refs #7860 --- .../MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 7797a92de31b..4f88573c5f21 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -278,7 +278,8 @@ namespace CustomInterfaces void IndirectSymmetrise::preview() { // Handle algorithm completion signal - connect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); + // TODO: Temp. removal to checkbuild #10092 + /* connect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); */ // Do nothing if no data has been laoded QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); @@ -343,7 +344,8 @@ namespace CustomInterfaces plotMiniPlot("__Symmetrise_temp", spectrumIndex, "SymmPreviewPlot"); // Don't want this to trigger when the algorithm is run for all spectra - disconnect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); + // TODO: Temp. removal to checkbuild #10092 + /* disconnect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); */ } } // namespace CustomInterfaces From 5ba4dc5864d367a88c2deda927b3e96d32d81e9c Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Tue, 9 Sep 2014 17:35:26 +0100 Subject: [PATCH 031/284] Finished off algorithm. Needs further testing. Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 68 +- .../CurveFitting/src/CalculateMSVesuvio.cpp | 628 +++++++++++++++--- .../test/CalculateMSVesuvioTest.h | 59 +- .../test/ComptonProfileTestHelpers.h | 37 +- 4 files changed, 669 insertions(+), 123 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index 370c389aa162..d1d6dc322d75 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -101,28 +101,47 @@ namespace Mantid double weight; size_t nmscat; }; + // Stores counts for each scatter order with errors + struct SimulationWithErrors + { + SimulationWithErrors(const size_t order, const size_t ntimes) : + sim(order, ntimes), errors(order, std::vector(ntimes)) {} + + void normalise(); + Simulation sim; + std::vector> errors; + + }; - // Accumulates and averages the results of each simulation + // Accumulates and averages the results of a set of simulations struct SimulationAggregator { - SimulationAggregator(const size_t nruns, - const size_t order, - const size_t ntimes); - // Adds a result as part of the average - void add(const Simulation & result); - - Simulation averaged; - double prefactor; + SimulationAggregator(const size_t nruns); + + // Creates a placeholder for a new simulation + Simulation & newSimulation(const size_t order, + const size_t ntimes); + SimulationWithErrors average() const; + + std::vector results; }; public: CalculateMSVesuvio(); ~CalculateMSVesuvio(); - virtual const std::string name() const; - virtual int version() const; - virtual const std::string category() const; - virtual const std::string summary() const; + /// @copydoc Algorithm::name + virtual const std::string name() const { return "CalculateMSVesuvio"; } + /// @copydoc Algorithm::version + virtual int version() const { return 1; } + /// @copydoc Algorithm::category + virtual const std::string category() const { return "Corrections"; } + /// @copydoc Algorithm::summary + virtual const std::string summary() const + { + return "Corrects for the effects of multiple scattering " + "on a flat plate or cylindrical sample."; + } private: void init(); @@ -131,9 +150,10 @@ namespace Mantid void cacheInputs(); void calculateMS(const size_t wsIndex, API::ISpectrum & totalsc, API::ISpectrum & multsc) const; - Simulation simulate(const size_t nevents, const size_t nscatters, - const DetectorParams & detpar, - const ResolutionParams &respar) const; + void simulate(const size_t nevents, const size_t nscatters, + const DetectorParams & detpar, + const ResolutionParams &respar, + Simulation & simulCounts) const; double calculateCounts(const size_t nscatters, const DetectorParams & detpar, const ResolutionParams &respar, @@ -147,25 +167,23 @@ namespace Mantid double &weight) const; std::pair calculateE1Range(const double theta, const double en0) const; double partialDiffXSec(const double en0, const double en1, const double theta) const; + Kernel::V3D generateDetectorPos(const double l2, const double angle, const double energy) const; + double generateE1(const double angle, const double e1nom, const double e1res) const; // Member Variables RandomNumberGenerator *m_randgen; // random number generator size_t m_acrossIdx, m_upIdx, m_beamIdx; // indices of each direction Kernel::V3D m_beamDir; // Directional vector for beam - double m_srcR1; // beam umbra radius (m) - double m_srcR2; // beam penumbra radius (m) - double m_halfSampleHeight; // half-height of sample (m) - double m_halfSampleWidth; // half-width of sample (m) - double m_halfSampleThick; // half-thickness of sample(m) + double m_srcR1, m_srcR2; // beam umbra, penumbra radius (m) + double m_halfSampleHeight, m_halfSampleWidth, m_halfSampleThick; // (m) double m_maxWidthSampleFrame; // Maximum width in sample frame (m) Kernel::DblMatrix const *m_goniometer; // sample rotation Geometry::Object const *m_sampleShape; // sample shape SampleComptonProperties *m_sampleProps; // description of sample properties - - double m_tmin; // minimum tof value - double m_tmax; // maximum tof value - double m_dt; // tof value step + double m_detHeight, m_detWidth, m_detThick; // (m) + double m_tmin, m_tmax, m_delt; // min, max & dt TOF value + double m_foilRes; // resolution in energy of foil API::Progress *m_progress; API::MatrixWorkspace_sptr m_inputWS; diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 64fcfa94e4fd..b36b7d0f83b5 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -1,6 +1,6 @@ //----------------------------------------------------------------------------- // Includes -// +//----------------------------------------------------------------------------- #include "MantidCurveFitting/CalculateMSVesuvio.h" // Use helpers for storing detector/resolution parameters #include "MantidCurveFitting/ConvertToYSpace.h" @@ -17,6 +17,7 @@ #include "MantidKernel/BoundedValidator.h" #include "MantidKernel/CompositeValidator.h" #include "MantidKernel/MersenneTwister.h" +#include "MantidKernel/VectorHelper.h" #include @@ -39,6 +40,274 @@ namespace Mantid /// Conversion constant const double MASS_TO_MEV = 0.5*PhysicalConstants::NeutronMass/PhysicalConstants::meV; + /** + * Generate the final energy of a neutron for gold foil analyser at 293K + * in double-difference mode: + * - THIN FOIL NUMBER DENSITY = 1.456E20 ATOMS/SQ CM. + * - THICK FOIL NUMBER DENSITY = 3.0* 1.456E20 ATOMS/SQ CM. + * @param randv A random number between 0.0 & 1.0, sample from a flat distribution + * @return A value to use for the final energy + */ + double finalEnergyAuDD(const double randv) + { + // Tabulated values of absoprtion energies from S.F. Mughabghab, Neutron Cross Sections, Academic + // Press, Orlando, Florida, 1984. + const double ENERGIES[300] = {\ + 2000.0, 2020.7, 2041.5, 2062.2, 2082.9, 2103.7, 2124.4, 2145.2, 2165.9, 2186.6, 2207.4, 2228.1, + 2248.8, 2269.6, 2290.3, 2311.0, 2331.8, 2352.5, 2373.2, 2394.0, 2414.7, 2435.5, 2456.2, 2476.9, + 2497.7, 2518.4, 2539.1, 2559.9, 2580.6, 2601.3, 2622.1, 2642.8, 2663.5, 2684.3, 2705.0, 2725.8, + 2746.5, 2767.2, 2788.0, 2808.7, 2829.4, 2850.2, 2870.9, 2891.6, 2912.4, 2933.1, 2953.8, 2974.6, + 2995.3, 3016.1, 3036.8, 3057.5, 3078.3, 3099.0, 3119.7, 3140.5, 3161.2, 3181.9, 3202.7, 3223.4, + 3244.1, 3264.9, 3285.6, 3306.4, 3327.1, 3347.8, 3368.6, 3389.3, 3410.0, 3430.8, 3451.5, 3472.2, + 3493.0, 3513.7, 3534.4, 3555.2, 3575.9, 3596.7, 3617.4, 3638.1, 3658.9, 3679.6, 3700.3, 3721.1, + 3741.8, 3762.5, 3783.3, 3804.0, 3824.7, 3845.5, 3866.2, 3887.0, 3907.7, 3928.4, 3949.2, 3969.9, + 3990.6, 4011.4, 4032.1, 4052.8, 4073.6, 4094.3, 4115.1, 4135.8, 4156.5, 4177.3, 4198.0, 4218.7, + 4239.5, 4260.2, 4280.9, 4301.7, 4322.4, 4343.1, 4363.9, 4384.6, 4405.4, 4426.1, 4446.8, 4467.6, + 4488.3, 4509.0, 4529.8, 4550.5, 4571.2, 4592.0, 4612.7, 4633.4, 4654.2, 4674.9, 4695.7, 4716.4, + 4737.1, 4757.9, 4778.6, 4799.3, 4820.1, 4840.8, 4861.5, 4882.3, 4903.0, 4923.7, 4944.5, 4965.2, + 4986.0, 5006.7, 5027.4, 5048.2, 5068.9, 5089.6, 5110.4, 5131.1, 5151.8, 5172.6, 5193.3, 5214.0, + 5234.8, 5255.5, 5276.3, 5297.0, 5317.7, 5338.5, 5359.2, 5379.9, 5400.7, 5421.4, 5442.1, 5462.9, + 5483.6, 5504.3, 5525.1, 5545.8, 5566.6, 5587.3, 5608.0, 5628.8, 5649.5, 5670.2, 5691.0, 5711.7, + 5732.4, 5753.2, 5773.9, 5794.6, 5815.4, 5836.1, 5856.9, 5877.6, 5898.3, 5919.1, 5939.8, 5960.5, + 5981.3, 6002.0, 6022.7, 6043.5, 6064.2, 6085.0, 6105.7, 6126.4, 6147.2, 6167.9, 6188.6, 6209.4, + 6230.1, 6250.8, 6271.6, 6292.3, 6313.0, 6333.8, 6354.5, 6375.3, 6396.0, 6416.7, 6437.5, 6458.2, + 6478.9, 6499.7, 6520.4, 6541.1, 6561.9, 6582.6, 6603.3, 6624.1, 6644.8, 6665.6, 6686.3, 6707.0, + 6727.8, 6748.5, 6769.2, 6790.0, 6810.7, 6831.4, 6852.2, 6872.9, 6893.6, 6914.4, 6935.1, 6955.9, + 6976.6, 6997.3, 7018.1, 7038.8, 7059.5, 7080.3, 7101.0, 7121.7, 7142.5, 7163.2, 7183.9, 7204.7, + 7225.4, 7246.2, 7266.9, 7287.6, 7308.4, 7329.1, 7349.8, 7370.6, 7391.3, 7412.0, 7432.8, 7453.5, + 7474.2, 7495.0, 7515.7, 7536.5, 7557.2, 7577.9, 7598.7, 7619.4, 7640.1, 7660.9, 7681.6, 7702.3, + 7723.1, 7743.8, 7764.5, 7785.3, 7806.0, 7826.8, 7847.5, 7868.2, 7889.0, 7909.7, 7930.4, 7951.2, + 7971.9, 7992.6, 8013.4, 8034.1, 8054.8, 8075.6, 8096.3, 8117.1, 8137.8, 8158.5, 8179.3, 8200.0 + }; + + const double XVALUES[300] = {\ + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00010, 0.00010, + 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, + 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, + 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, + 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, 0.00030, 0.00030, 0.00030, 0.00030, 0.00030, 0.00030, + 0.00030, 0.00030, 0.00040, 0.00040, 0.00040, 0.00040, 0.00040, 0.00050, 0.00050, 0.00050, 0.00050, 0.00060, + 0.00060, 0.00070, 0.00070, 0.00070, 0.00080, 0.00090, 0.00090, 0.00100, 0.00110, 0.00110, 0.00120, 0.00130, + 0.00150, 0.00160, 0.00170, 0.00190, 0.00210, 0.00230, 0.00260, 0.00290, 0.00320, 0.00360, 0.00410, 0.00470, + 0.00540, 0.00620, 0.00720, 0.00840, 0.00990, 0.01180, 0.01420, 0.01740, 0.02140, 0.02680, 0.03410, 0.04400, + 0.05770, 0.07680, 0.10360, 0.14050, 0.18960, 0.25110, 0.32310, 0.40240, 0.48540, 0.56870, 0.64930, 0.72370, + 0.78850, 0.84150, 0.88240, 0.91260, 0.93440, 0.95000, 0.96130, 0.96960, 0.97570, 0.98030, 0.98380, 0.98650, + 0.98870, 0.99040, 0.99180, 0.99290, 0.99380, 0.99460, 0.99520, 0.99580, 0.99620, 0.99660, 0.99700, 0.99730, + 0.99750, 0.99770, 0.99790, 0.99810, 0.99830, 0.99840, 0.99850, 0.99860, 0.99870, 0.99880, 0.99890, 0.99900, + 0.99900, 0.99910, 0.99910, 0.99920, 0.99920, 0.99930, 0.99930, 0.99940, 0.99940, 0.99940, 0.99940, 0.99950, + 0.99950, 0.99950, 0.99950, 0.99960, 0.99960, 0.99960, 0.99960, 0.99960, 0.99960, 0.99970, 0.99970, 0.99970, + 0.99970, 0.99970, 0.99970, 0.99970, 0.99970, 0.99970, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, + 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99990, 0.99990, + 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, + 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, + 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, + 0.99990, 0.99990, 0.99990, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, + 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, + 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 + }; + + for(size_t i = 0; i < 299; ++i) + { + if(XVALUES[i] < randv && XVALUES[i+1] > randv) + { + double ef = ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); + if(ef < 100.0) ef = 0.0; + return ef; + } + } + return 0.0; + + + } + + /** + * Generate the final energy of a neutron for gold foil analyser at 293K + * with number density of 7.35E19 atoms/cm^2 in yap difference mode. + * @param randv A random number between 0.0 & 1.0, sample from a flat distribution + * @return A value to use for the final energy + */ + double finalEnergyAuYap(const double randv) + { + // Tabulated values of absoprtion energies from S.F. Mughabghab, Neutron Cross Sections, Academic + // Press, Orlando, Florida, 1984. + const double ENERGIES[600] = {\ + 4000.0, 4003.3, 4006.7, 4010.0, 4013.4, 4016.7, 4020.0, 4023.4, 4026.7, 4030.1, 4033.4, 4036.7, + 4040.1, 4043.4, 4046.7, 4050.1, 4053.4, 4056.8, 4060.1, 4063.4, 4066.8, 4070.1, 4073.5, 4076.8, + 4080.1, 4083.5, 4086.8, 4090.2, 4093.5, 4096.8, 4100.2, 4103.5, 4106.8, 4110.2, 4113.5, 4116.9, + 4120.2, 4123.5, 4126.9, 4130.2, 4133.6, 4136.9, 4140.2, 4143.6, 4146.9, 4150.3, 4153.6, 4156.9, + 4160.3, 4163.6, 4166.9, 4170.3, 4173.6, 4177.0, 4180.3, 4183.6, 4187.0, 4190.3, 4193.7, 4197.0, + 4200.3, 4203.7, 4207.0, 4210.4, 4213.7, 4217.0, 4220.4, 4223.7, 4227.0, 4230.4, 4233.7, 4237.1, + 4240.4, 4243.7, 4247.1, 4250.4, 4253.8, 4257.1, 4260.4, 4263.8, 4267.1, 4270.5, 4273.8, 4277.1, + 4280.5, 4283.8, 4287.1, 4290.5, 4293.8, 4297.2, 4300.5, 4303.8, 4307.2, 4310.5, 4313.9, 4317.2, + 4320.5, 4323.9, 4327.2, 4330.6, 4333.9, 4337.2, 4340.6, 4343.9, 4347.2, 4350.6, 4353.9, 4357.3, + 4360.6, 4363.9, 4367.3, 4370.6, 4374.0, 4377.3, 4380.6, 4384.0, 4387.3, 4390.7, 4394.0, 4397.3, + 4400.7, 4404.0, 4407.3, 4410.7, 4414.0, 4417.4, 4420.7, 4424.0, 4427.4, 4430.7, 4434.1, 4437.4, + 4440.7, 4444.1, 4447.4, 4450.8, 4454.1, 4457.4, 4460.8, 4464.1, 4467.4, 4470.8, 4474.1, 4477.5, + 4480.8, 4484.1, 4487.5, 4490.8, 4494.2, 4497.5, 4500.8, 4504.2, 4507.5, 4510.9, 4514.2, 4517.5, + 4520.9, 4524.2, 4527.5, 4530.9, 4534.2, 4537.6, 4540.9, 4544.2, 4547.6, 4550.9, 4554.3, 4557.6, + 4560.9, 4564.3, 4567.6, 4571.0, 4574.3, 4577.6, 4581.0, 4584.3, 4587.6, 4591.0, 4594.3, 4597.7, + 4601.0, 4604.3, 4607.7, 4611.0, 4614.4, 4617.7, 4621.0, 4624.4, 4627.7, 4631.1, 4634.4, 4637.7, + 4641.1, 4644.4, 4647.7, 4651.1, 4654.4, 4657.8, 4661.1, 4664.4, 4667.8, 4671.1, 4674.5, 4677.8, + 4681.1, 4684.5, 4687.8, 4691.2, 4694.5, 4697.8, 4701.2, 4704.5, 4707.8, 4711.2, 4714.5, 4717.9, + 4721.2, 4724.5, 4727.9, 4731.2, 4734.6, 4737.9, 4741.2, 4744.6, 4747.9, 4751.3, 4754.6, 4757.9, + 4761.3, 4764.6, 4767.9, 4771.3, 4774.6, 4778.0, 4781.3, 4784.6, 4788.0, 4791.3, 4794.7, 4798.0, + 4801.3, 4804.7, 4808.0, 4811.4, 4814.7, 4818.0, 4821.4, 4824.7, 4828.0, 4831.4, 4834.7, 4838.1, + 4841.4, 4844.7, 4848.1, 4851.4, 4854.8, 4858.1, 4861.4, 4864.8, 4868.1, 4871.5, 4874.8, 4878.1, + 4881.5, 4884.8, 4888.1, 4891.5, 4894.8, 4898.2, 4901.5, 4904.8, 4908.2, 4911.5, 4914.9, 4918.2, + 4921.5, 4924.9, 4928.2, 4931.6, 4934.9, 4938.2, 4941.6, 4944.9, 4948.2, 4951.6, 4954.9, 4958.3, + 4961.6, 4964.9, 4968.3, 4971.6, 4975.0, 4978.3, 4981.6, 4985.0, 4988.3, 4991.7, 4995.0, 4998.3, + 5001.7, 5005.0, 5008.3, 5011.7, 5015.0, 5018.4, 5021.7, 5025.0, 5028.4, 5031.7, 5035.1, 5038.4, + 5041.7, 5045.1, 5048.4, 5051.8, 5055.1, 5058.4, 5061.8, 5065.1, 5068.4, 5071.8, 5075.1, 5078.5, + 5081.8, 5085.1, 5088.5, 5091.8, 5095.2, 5098.5, 5101.8, 5105.2, 5108.5, 5111.9, 5115.2, 5118.5, + 5121.9, 5125.2, 5128.5, 5131.9, 5135.2, 5138.6, 5141.9, 5145.2, 5148.6, 5151.9, 5155.3, 5158.6, + 5161.9, 5165.3, 5168.6, 5172.0, 5175.3, 5178.6, 5182.0, 5185.3, 5188.6, 5192.0, 5195.3, 5198.7, + 5202.0, 5205.3, 5208.7, 5212.0, 5215.4, 5218.7, 5222.0, 5225.4, 5228.7, 5232.1, 5235.4, 5238.7, + 5242.1, 5245.4, 5248.7, 5252.1, 5255.4, 5258.8, 5262.1, 5265.4, 5268.8, 5272.1, 5275.5, 5278.8, + 5282.1, 5285.5, 5288.8, 5292.2, 5295.5, 5298.8, 5302.2, 5305.5, 5308.8, 5312.2, 5315.5, 5318.9, + 5322.2, 5325.5, 5328.9, 5332.2, 5335.6, 5338.9, 5342.2, 5345.6, 5348.9, 5352.3, 5355.6, 5358.9, + 5362.3, 5365.6, 5368.9, 5372.3, 5375.6, 5379.0, 5382.3, 5385.6, 5389.0, 5392.3, 5395.7, 5399.0, + 5402.3, 5405.7, 5409.0, 5412.4, 5415.7, 5419.0, 5422.4, 5425.7, 5429.0, 5432.4, 5435.7, 5439.1, + 5442.4, 5445.7, 5449.1, 5452.4, 5455.8, 5459.1, 5462.4, 5465.8, 5469.1, 5472.5, 5475.8, 5479.1, + 5482.5, 5485.8, 5489.1, 5492.5, 5495.8, 5499.2, 5502.5, 5505.8, 5509.2, 5512.5, 5515.9, 5519.2, + 5522.5, 5525.9, 5529.2, 5532.6, 5535.9, 5539.2, 5542.6, 5545.9, 5549.2, 5552.6, 5555.9, 5559.3, + 5562.6, 5565.9, 5569.3, 5572.6, 5576.0, 5579.3, 5582.6, 5586.0, 5589.3, 5592.7, 5596.0, 5599.3, + 5602.7, 5606.0, 5609.3, 5612.7, 5616.0, 5619.4, 5622.7, 5626.0, 5629.4, 5632.7, 5636.1, 5639.4, + 5642.7, 5646.1, 5649.4, 5652.8, 5656.1, 5659.4, 5662.8, 5666.1, 5669.4, 5672.8, 5676.1, 5679.5, + 5682.8, 5686.1, 5689.5, 5692.8, 5696.2, 5699.5, 5702.8, 5706.2, 5709.5, 5712.9, 5716.2, 5719.5, + 5722.9, 5726.2, 5729.5, 5732.9, 5736.2, 5739.6, 5742.9, 5746.2, 5749.6, 5752.9, 5756.3, 5759.6, + 5762.9, 5766.3, 5769.6, 5773.0, 5776.3, 5779.6, 5783.0, 5786.3, 5789.6, 5793.0, 5796.3, 5799.7, + 5803.0, 5806.3, 5809.7, 5813.0, 5816.4, 5819.7, 5823.0, 5826.4, 5829.7, 5833.1, 5836.4, 5839.7, + 5843.1, 5846.4, 5849.7, 5853.1, 5856.4, 5859.8, 5863.1, 5866.4, 5869.8, 5873.1, 5876.5, 5879.8, + 5883.1, 5886.5, 5889.8, 5893.2, 5896.5, 5899.8, 5903.2, 5906.5, 5909.8, 5913.2, 5916.5, 5919.9, + 5923.2, 5926.5, 5929.9, 5933.2, 5936.6, 5939.9, 5943.2, 5946.6, 5949.9, 5953.3, 5956.6, 5959.9, + 5963.3, 5966.6, 5970.0, 5973.3, 5976.6, 5980.0, 5983.3, 5986.6, 5990.0, 5993.3, 5996.7, 6000.0 + }; + + const double XVALUES[600] = {\ + 0.00000, 0.00000, 0.00000, 0.00002, 0.00003, 0.00003, 0.00004, 0.00005, 0.00005, 0.00006, 0.00007, 0.00007, + 0.00008, 0.00009, 0.00010, 0.00010, 0.00011, 0.00012, 0.00013, 0.00014, 0.00015, 0.00015, 0.00016, 0.00017, + 0.00018, 0.00019, 0.00020, 0.00021, 0.00022, 0.00023, 0.00024, 0.00025, 0.00026, 0.00027, 0.00028, 0.00029, + 0.00030, 0.00031, 0.00032, 0.00033, 0.00034, 0.00035, 0.00037, 0.00038, 0.00039, 0.00040, 0.00041, 0.00043, + 0.00044, 0.00045, 0.00047, 0.00048, 0.00049, 0.00051, 0.00052, 0.00054, 0.00055, 0.00057, 0.00058, 0.00060, + 0.00061, 0.00063, 0.00065, 0.00066, 0.00068, 0.00070, 0.00072, 0.00074, 0.00075, 0.00077, 0.00079, 0.00081, + 0.00083, 0.00085, 0.00087, 0.00089, 0.00092, 0.00094, 0.00096, 0.00098, 0.00101, 0.00103, 0.00106, 0.00108, + 0.00111, 0.00113, 0.00116, 0.00118, 0.00121, 0.00124, 0.00127, 0.00130, 0.00133, 0.00136, 0.00139, 0.00142, + 0.00146, 0.00149, 0.00152, 0.00156, 0.00159, 0.00163, 0.00167, 0.00171, 0.00174, 0.00178, 0.00182, 0.00187, + 0.00191, 0.00195, 0.00200, 0.00204, 0.00209, 0.00214, 0.00219, 0.00224, 0.00229, 0.00235, 0.00240, 0.00246, + 0.00251, 0.00257, 0.00263, 0.00269, 0.00276, 0.00282, 0.00289, 0.00296, 0.00303, 0.00310, 0.00318, 0.00325, + 0.00333, 0.00341, 0.00349, 0.00358, 0.00367, 0.00376, 0.00385, 0.00394, 0.00404, 0.00414, 0.00425, 0.00435, + 0.00446, 0.00458, 0.00469, 0.00481, 0.00494, 0.00507, 0.00520, 0.00533, 0.00548, 0.00562, 0.00577, 0.00592, + 0.00608, 0.00625, 0.00642, 0.00659, 0.00677, 0.00696, 0.00716, 0.00736, 0.00757, 0.00778, 0.00800, 0.00823, + 0.00847, 0.00872, 0.00898, 0.00924, 0.00952, 0.00980, 0.01010, 0.01041, 0.01073, 0.01106, 0.01141, 0.01177, + 0.01214, 0.01253, 0.01293, 0.01335, 0.01379, 0.01425, 0.01472, 0.01522, 0.01573, 0.01627, 0.01683, 0.01742, + 0.01803, 0.01867, 0.01934, 0.02004, 0.02077, 0.02154, 0.02234, 0.02317, 0.02405, 0.02497, 0.02594, 0.02695, + 0.02801, 0.02913, 0.03030, 0.03153, 0.03282, 0.03419, 0.03561, 0.03712, 0.03871, 0.04037, 0.04213, 0.04398, + 0.04594, 0.04799, 0.05017, 0.05246, 0.05488, 0.05743, 0.06013, 0.06297, 0.06598, 0.06915, 0.07251, 0.07605, + 0.07979, 0.08374, 0.08791, 0.09230, 0.09694, 0.10183, 0.10698, 0.11241, 0.11812, 0.12411, 0.13041, 0.13703, + 0.14395, 0.15119, 0.15877, 0.16667, 0.17490, 0.18347, 0.19237, 0.20159, 0.21114, 0.22100, 0.23117, 0.24164, + 0.25240, 0.26344, 0.27473, 0.28628, 0.29807, 0.31007, 0.32228, 0.33468, 0.34725, 0.35999, 0.37286, 0.38586, + 0.39898, 0.41219, 0.42549, 0.43886, 0.45228, 0.46575, 0.47925, 0.49277, 0.50628, 0.51980, 0.53329, 0.54674, + 0.56016, 0.57350, 0.58677, 0.59996, 0.61304, 0.62600, 0.63883, 0.65152, 0.66403, 0.67638, 0.68853, 0.70048, + 0.71220, 0.72369, 0.73492, 0.74590, 0.75659, 0.76700, 0.77711, 0.78691, 0.79640, 0.80557, 0.81442, 0.82294, + 0.83113, 0.83900, 0.84654, 0.85376, 0.86067, 0.86726, 0.87355, 0.87954, 0.88525, 0.89067, 0.89583, 0.90073, + 0.90537, 0.90979, 0.91398, 0.91794, 0.92170, 0.92527, 0.92865, 0.93185, 0.93489, 0.93776, 0.94049, 0.94307, + 0.94552, 0.94784, 0.95005, 0.95213, 0.95412, 0.95600, 0.95779, 0.95949, 0.96110, 0.96264, 0.96410, 0.96549, + 0.96681, 0.96807, 0.96927, 0.97041, 0.97150, 0.97254, 0.97353, 0.97447, 0.97538, 0.97624, 0.97706, 0.97785, + 0.97860, 0.97933, 0.98002, 0.98068, 0.98131, 0.98192, 0.98250, 0.98306, 0.98359, 0.98411, 0.98460, 0.98507, + 0.98553, 0.98596, 0.98638, 0.98679, 0.98718, 0.98755, 0.98791, 0.98826, 0.98859, 0.98892, 0.98923, 0.98953, + 0.98981, 0.99009, 0.99036, 0.99062, 0.99087, 0.99111, 0.99135, 0.99158, 0.99179, 0.99201, 0.99221, 0.99241, + 0.99260, 0.99279, 0.99296, 0.99314, 0.99331, 0.99347, 0.99363, 0.99378, 0.99393, 0.99408, 0.99422, 0.99435, + 0.99448, 0.99461, 0.99473, 0.99486, 0.99497, 0.99509, 0.99520, 0.99530, 0.99541, 0.99551, 0.99561, 0.99571, + 0.99580, 0.99589, 0.99598, 0.99607, 0.99615, 0.99623, 0.99631, 0.99639, 0.99647, 0.99654, 0.99661, 0.99668, + 0.99675, 0.99682, 0.99688, 0.99694, 0.99701, 0.99707, 0.99713, 0.99718, 0.99724, 0.99729, 0.99735, 0.99740, + 0.99745, 0.99750, 0.99755, 0.99760, 0.99764, 0.99769, 0.99773, 0.99778, 0.99782, 0.99786, 0.99790, 0.99794, + 0.99798, 0.99802, 0.99806, 0.99809, 0.99813, 0.99816, 0.99820, 0.99823, 0.99827, 0.99830, 0.99833, 0.99836, + 0.99839, 0.99842, 0.99845, 0.99848, 0.99850, 0.99853, 0.99856, 0.99859, 0.99861, 0.99864, 0.99866, 0.99869, + 0.99871, 0.99873, 0.99876, 0.99878, 0.99880, 0.99882, 0.99884, 0.99886, 0.99889, 0.99891, 0.99893, 0.99895, + 0.99896, 0.99898, 0.99900, 0.99902, 0.99904, 0.99906, 0.99907, 0.99909, 0.99911, 0.99912, 0.99914, 0.99915, + 0.99917, 0.99919, 0.99920, 0.99922, 0.99923, 0.99924, 0.99926, 0.99927, 0.99929, 0.99930, 0.99931, 0.99933, + 0.99934, 0.99935, 0.99936, 0.99938, 0.99939, 0.99940, 0.99941, 0.99942, 0.99943, 0.99944, 0.99946, 0.99947, + 0.99948, 0.99949, 0.99950, 0.99951, 0.99952, 0.99953, 0.99954, 0.99955, 0.99956, 0.99956, 0.99957, 0.99958, + 0.99959, 0.99960, 0.99961, 0.99962, 0.99963, 0.99963, 0.99964, 0.99965, 0.99966, 0.99967, 0.99967, 0.99968, + 0.99969, 0.99970, 0.99970, 0.99971, 0.99972, 0.99973, 0.99973, 0.99974, 0.99975, 0.99975, 0.99976, 0.99977, + 0.99977, 0.99978, 0.99979, 0.99979, 0.99980, 0.99980, 0.99981, 0.99982, 0.99982, 0.99983, 0.99983, 0.99984, + 0.99984, 0.99985, 0.99985, 0.99986, 0.99986, 0.99987, 0.99988, 0.99988, 0.99989, 0.99989, 0.99990, 0.99990, + 0.99990, 0.99991, 0.99991, 0.99992, 0.99992, 0.99993, 0.99993, 0.99994, 0.99994, 0.99994, 0.99995, 0.99995, + 0.99996, 0.99996, 0.99997, 0.99997, 0.99997, 0.99998, 0.99998, 0.99998, 0.99999, 0.99999, 1.00000, 1.00000 + }; + + for(size_t i = 0; i < 599; ++i) + { + if(XVALUES[i] < randv && XVALUES[i+1] > randv) + { + return ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); + } + } + return 0.0; + } + + /** + * Generate the final energy of a neutron for gold foil analyser at 293K + * with number density of 7.35E19 atoms/cm^2 in double-difference mode. + * @param randv A random number between 0.0 & 1.0, sample from a flat distribution + * @return A value to use for the final energy + */ + double finalEnergyUranium(const double randv) + { + const double ENERGIES[201] = {\ + 5959.0, 5967.7, 5976.4, 5985.1, 5993.8, 6002.5, 6011.2, 6019.9, 6028.6, 6037.3, 6046.0, 6054.8, + 6063.5, 6072.2, 6080.9, 6089.6, 6098.3, 6107.0, 6115.7, 6124.4, 6133.1, 6141.8, 6150.5, 6159.2, + 6167.9, 6176.6, 6185.3, 6194.0, 6202.7, 6211.4, 6220.1, 6228.9, 6237.6, 6246.3, 6255.0, 6263.7, + 6272.4, 6281.1, 6289.8, 6298.5, 6307.2, 6315.9, 6324.6, 6333.3, 6342.0, 6350.7, 6359.4, 6368.1, + 6376.8, 6385.5, 6394.3, 6403.0, 6411.7, 6420.4, 6429.1, 6437.8, 6446.5, 6455.2, 6463.9, 6472.6, + 6481.3, 6490.0, 6498.7, 6507.4, 6516.1, 6524.8, 6533.5, 6542.2, 6550.9, 6559.6, 6568.4, 6577.1, + 6585.8, 6594.5, 6603.2, 6611.9, 6620.6, 6629.3, 6638.0, 6646.7, 6655.4, 6664.1, 6672.8, 6681.5, + 6690.2, 6698.9, 6707.6, 6716.3, 6725.0, 6733.7, 6742.5, 6751.2, 6759.9, 6768.6, 6777.3, 6786.0, + 6794.7, 6803.4, 6812.1, 6820.8, 6829.5, 6838.2, 6846.9, 6855.6, 6864.3, 6873.0, 6881.7, 6890.4, + 6899.1, 6907.8, 6916.5, 6925.3, 6934.0, 6942.7, 6951.4, 6960.1, 6968.8, 6977.5, 6986.2, 6994.9, + 7003.6, 7012.3, 7021.0, 7029.7, 7038.4, 7047.1, 7055.8, 7064.5, 7073.2, 7081.9, 7090.6, 7099.4, + 7108.1, 7116.8, 7125.5, 7134.2, 7142.9, 7151.6, 7160.3, 7169.0, 7177.7, 7186.4, 7195.1, 7203.8, + 7212.5, 7221.2, 7229.9, 7238.6, 7247.3, 7256.0, 7264.8, 7273.5, 7282.2, 7290.9, 7299.6, 7308.3, + 7317.0, 7325.7, 7334.4, 7343.1, 7351.8, 7360.5, 7369.2, 7377.9, 7386.6, 7395.3, 7404.0, 7412.7, + 7421.4, 7430.1, 7438.9, 7447.6, 7456.3, 7465.0, 7473.7, 7482.4, 7491.1, 7499.8, 7508.5, 7517.2, + 7525.9, 7534.6, 7543.3, 7552.0, 7560.7, 7569.4, 7578.1, 7586.8, 7595.5, 7604.2, 7613.0, 7621.7, + 7630.4, 7639.1, 7647.8, 7656.5, 7665.2, 7673.9, 7682.6, 7691.3, 7700.0 + }; + + const double XVALUES[201] = {\ + 0.00000, 0.00000, 0.00000, 0.00020, 0.00030, 0.00040, 0.00050, 0.00060, 0.00070, 0.00080, 0.00090, 0.00110, + 0.00120, 0.00140, 0.00150, 0.00170, 0.00190, 0.00210, 0.00230, 0.00250, 0.00270, 0.00290, 0.00310, 0.00340, + 0.00360, 0.00390, 0.00410, 0.00440, 0.00470, 0.00500, 0.00530, 0.00560, 0.00590, 0.00620, 0.00650, 0.00690, + 0.00720, 0.00760, 0.00800, 0.00840, 0.00880, 0.00920, 0.00960, 0.01010, 0.01050, 0.01100, 0.01150, 0.01210, + 0.01270, 0.01330, 0.01390, 0.01460, 0.01530, 0.01610, 0.01690, 0.01780, 0.01870, 0.01970, 0.02090, 0.02210, + 0.02350, 0.02500, 0.02660, 0.02850, 0.03070, 0.03320, 0.03620, 0.03990, 0.04440, 0.05020, 0.05780, 0.06790, + 0.08120, 0.09880, 0.12150, 0.15020, 0.18520, 0.22640, 0.27340, 0.32510, 0.38050, 0.43830, 0.49720, 0.55580, + 0.61290, 0.66710, 0.71740, 0.76250, 0.80190, 0.83510, 0.86220, 0.88380, 0.90050, 0.91340, 0.92340, 0.93100, + 0.93710, 0.94200, 0.94600, 0.94940, 0.95230, 0.95490, 0.95710, 0.95920, 0.96100, 0.96270, 0.96430, 0.96580, + 0.96710, 0.96840, 0.96950, 0.97060, 0.97170, 0.97270, 0.97360, 0.97450, 0.97540, 0.97620, 0.97700, 0.97770, + 0.97840, 0.97910, 0.97980, 0.98040, 0.98100, 0.98160, 0.98220, 0.98280, 0.98330, 0.98390, 0.98440, 0.98490, + 0.98540, 0.98590, 0.98630, 0.98680, 0.98720, 0.98770, 0.98810, 0.98850, 0.98890, 0.98930, 0.98970, 0.99010, + 0.99050, 0.99090, 0.99130, 0.99160, 0.99200, 0.99230, 0.99270, 0.99300, 0.99330, 0.99360, 0.99400, 0.99430, + 0.99460, 0.99480, 0.99510, 0.99540, 0.99560, 0.99590, 0.99610, 0.99640, 0.99660, 0.99680, 0.99710, 0.99730, + 0.99750, 0.99770, 0.99780, 0.99800, 0.99820, 0.99840, 0.99850, 0.99870, 0.99880, 0.99890, 0.99910, 0.99920, + 0.99930, 0.99940, 0.99950, 0.99960, 0.99960, 0.99970, 0.99980, 0.99980, 0.99990, 0.99990, 0.99990, 1.00000, + 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 + }; + + for(size_t i = 0; i < 299; ++i) + { + if(XVALUES[i] < randv && XVALUES[i+1] > randv) + { + return ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); + } + } + + return 0.0; + } + + } // end anonymous namespace //------------------------------------------------------------------------- @@ -68,7 +337,7 @@ namespace Mantid } //------------------------------------------------------------------------- - // Simulation helpers + // Simulation helper //------------------------------------------------------------------------- /** * Stores counts for each scatter order @@ -79,40 +348,107 @@ namespace Mantid counts(order, std::vector(ntimes)), maxorder(order), weight(0.0), nmscat(0) {} - + //------------------------------------------------------------------------- + // SimulationAggreator + //------------------------------------------------------------------------- /** * Accumulates and averages the results * of each simulation + * @param nruns The number of runs that will be computed */ CalculateMSVesuvio::SimulationAggregator:: - SimulationAggregator(const size_t nruns, - const size_t order, - const size_t ntimes) : - averaged(order, ntimes), - prefactor(1.0/static_cast(nruns)) - {} - - /** Adds a result as part of the average - * @param result A new simulation result + SimulationAggregator(const size_t nruns) + { + results.reserve(nruns); + } + + /** + * @param order The number of requested scatterings + * @param ntimes The number of times on input workspace + * @return A reference to a new Simulation object + */ + CalculateMSVesuvio::Simulation & + CalculateMSVesuvio::SimulationAggregator:: + newSimulation(const size_t order, const size_t ntimes) + { + results.push_back(Simulation(order, ntimes)); + return results.back(); + } + + /** + * @return The mean and standard deviation of the current set of simulations */ - void CalculateMSVesuvio::SimulationAggregator:: - add(const Simulation & result) + CalculateMSVesuvio::SimulationWithErrors + CalculateMSVesuvio::SimulationAggregator::average() const { - // No check is performed whether the number of - // stated runs has been reached or the order is the same - for(size_t i = 0; i < averaged.maxorder; ++i) + const size_t maxorder(results[0].maxorder), ntimes(results[0].counts[0].size()), + nruns(results.size()); + SimulationWithErrors retval(maxorder, ntimes); + + for(size_t i = 0; i < maxorder; ++i) { - auto & avgcounts = averaged.counts[i]; - const auto & rescounts = result.counts[i]; - std::vector::iterator avgIter(avgcounts.begin()); - std::vector::const_iterator resIter(rescounts.begin()); - for(; avgIter != avgcounts.end(); ++avgIter, ++resIter) + auto & orderCounts = retval.sim.counts[i]; + auto & orderErrors = retval.errors[i]; + for(size_t j = 0; j < ntimes; ++j) { - *avgIter += prefactor*(*resIter); + double mean(0.0); + size_t npoints(0); + for(size_t k = 0; k < nruns; ++k) + { + const double val = results[k].counts[i][j]; + if(val > 0.0) + { + mean += val; + npoints +=1; + } + } + const double dblPts = static_cast(npoints); + orderCounts[j] = mean/dblPts; + // error is std dev + double sumsq(0.0); + for(size_t k = 0; k < nruns; ++k) + { + const double val = results[k].counts[i][j]; + if(val > 0.0) + { + const double diff = (val - mean); + sumsq += diff*diff; + } + } + orderErrors[j] = sqrt(sumsq/(dblPts*(dblPts-1))); + } + } + + return retval; + } + //------------------------------------------------------------------------- + // SimulationWithErrors + //------------------------------------------------------------------------- + /** + * Normalise the counts so that the integral over the single-scatter + * events is 1. + */ + void CalculateMSVesuvio::SimulationWithErrors::normalise() + { + const double sumSingle = std::accumulate(sim.counts.front().begin(), + sim.counts.front().end(), 0.0); + const double invSum = 1.0/sumSingle; // multiply is faster + // Divide everything by the sum + const size_t nscatters = sim.counts.size(); + for(size_t i = 0; i < nscatters; ++i) + { + auto & counts = sim.counts[i]; + auto & scerrors = this->errors[i]; + for(auto cit = counts.begin(), eit = scerrors.begin(); cit != counts.end(); + ++cit, ++eit) + { + (*cit) *= invSum; + (*eit) *= invSum; } } } + //------------------------------------------------------------------------- // Algorithm definitions //------------------------------------------------------------------------- @@ -127,7 +463,8 @@ namespace Mantid m_halfSampleHeight(0.0), m_halfSampleWidth(0.0), m_halfSampleThick(0.0), m_maxWidthSampleFrame(0.0), m_goniometer(NULL), m_sampleShape(NULL), m_sampleProps(NULL), - m_tmin(-1.0), m_tmax(-1.0), m_dt(-1.0), + m_detHeight(-1.0), m_detWidth(-1.0), m_detThick(-1.0), + m_tmin(-1.0), m_tmax(-1.0), m_delt(-1.0), m_foilRes(-1.0), m_progress(NULL), m_inputWS() { } @@ -140,31 +477,6 @@ namespace Mantid delete m_sampleProps; } - /// @copydoc Algorithm::name - const std::string CalculateMSVesuvio::name() const - { - return "CalculateMSVesuvio"; - } - - /// @copydoc Algorithm::version - int CalculateMSVesuvio::version() const - { - return 1; - } - - /// @copydoc Algorithm::category - const std::string CalculateMSVesuvio::category() const - { - return "Corrections"; - } - - /// @copydoc Algorithm::summary - const std::string CalculateMSVesuvio::summary() const - { - return "Corrects for the effects of multiple scattering " - "on a flat plate or cylindrical sample."; - } - /** * Initialize the algorithm's properties. */ @@ -191,6 +503,7 @@ namespace Mantid "The density of the sample in gm/cm^3"); auto nonEmptyArray = boost::make_shared>(); + nonEmptyArray->setLengthMin(3); declareProperty(new ArrayProperty("AtomicProperties", nonEmptyArray), "Atomic properties of masses within the sample. " "The expected format is 3 consecutive values per mass: " @@ -315,12 +628,12 @@ namespace Mantid const auto & inX = m_inputWS->readX(0); m_tmin = inX.front(); m_tmax = inX.back(); - m_dt = inX[1] - m_tmin; + m_delt = inX[1] - m_tmin; // -- Sample -- int nmasses = getProperty("NoOfMasses"); std::vector sampleInfo = getProperty("AtomicProperties"); - int nInputAtomProps = static_cast(sampleInfo.size()); + const int nInputAtomProps = static_cast(sampleInfo.size()); const int nExptdAtomProp(3); if(nInputAtomProps != nExptdAtomProp*nmasses) { @@ -329,12 +642,13 @@ namespace Mantid << " values, however, only " << sampleInfo.size() << " have been given."; throw std::invalid_argument(os.str()); } - m_sampleProps = new SampleComptonProperties(nInputAtomProps); + const int natoms = nInputAtomProps/3; + m_sampleProps = new SampleComptonProperties(natoms); m_sampleProps->density = getProperty("SampleDensity"); double totalMass(0.0); m_sampleProps->totalxsec = 0.0; - for(int i = 0; i < nInputAtomProps; ++i) + for(int i = 0; i < natoms; ++i) { auto & comptonAtom = m_sampleProps->atoms[i]; comptonAtom.mass = sampleInfo[nExptdAtomProp*i]; @@ -349,6 +663,45 @@ namespace Mantid } const double numberDensity = m_sampleProps->density*1e6/totalMass; // formula units/m^3 m_sampleProps->mu = numberDensity*m_sampleProps->totalxsec*1e-28; + + // -- Detector geometry -- choose first detector that is not a monitor + Geometry::IDetector_const_sptr detPixel; + for(size_t i = 0; i < m_inputWS->getNumberHistograms(); ++i) + { + try + { + detPixel = m_inputWS->getDetector(i); + } + catch(Exception::NotFoundError &) + { + continue; + } + if(!detPixel->isMonitor()) break; + } + // Bounding box in detector frame + auto pixelShape = detPixel->shape(); + if(!pixelShape) + { + throw std::invalid_argument("Detector pixel has no defined shape!"); + } + Geometry::BoundingBox detBounds = pixelShape->getBoundingBox(); + V3D detBoxWidth = detBounds.width(); + m_detWidth = detBoxWidth[m_acrossIdx]; + m_detHeight = detBoxWidth[m_upIdx]; + m_detThick = detBoxWidth[m_beamIdx]; + + // Foil resolution + auto foil = instrument->getComponentByName("foil-pos0"); + if(!foil) + { + throw std::runtime_error("Workspace has no gold foil component defined."); + } + auto param = m_inputWS->instrumentParameters().get(foil.get(), "hwhm_lorentz"); + if(!param) + { + throw std::runtime_error("Foil component has no hwhm_lorentz parameter defined."); + } + m_foilRes = param->value(); } /** @@ -377,12 +730,40 @@ namespace Mantid respar.dEnGauss = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_gauss"); // Final counts averaged over all simulations - SimulationAggregator avgCounts(NSIMULATIONS, NSCATTERS, m_inputWS->blocksize()); - for(size_t i = 0; i < NSIMULATIONS; ++i) + const size_t nruns(NSIMULATIONS), nscatters(NSCATTERS), nevents(NEVENTS); + SimulationAggregator accumulator(nruns); + for(size_t i = 0; i < nruns; ++i) { - avgCounts.add(simulate(NEVENTS, NSCATTERS, detpar, respar)); + simulate(nevents, nscatters, detpar, respar, + accumulator.newSimulation(nscatters, m_inputWS->blocksize())); } + SimulationWithErrors avgCounts = accumulator.average(); + avgCounts.normalise(); + + // assign to output spectrum + auto & msscatY = multsc.dataY(); + auto & msscatE = multsc.dataE(); + for(size_t i = 0; i < nscatters; ++i) + { + const auto & counts = avgCounts.sim.counts[i]; + // equivalent to msscatY[j] += counts[j] + std::transform(counts.begin(), counts.end(), msscatY.begin(), msscatY.begin(), + std::plus()); + const auto & scerrors = avgCounts.errors[i]; + // sum errors in quadrature + std::transform(scerrors.begin(), scerrors.end(), msscatE.begin(), msscatE.begin(), + VectorHelper::SumGaussError()); + } + // for total scattering add on single-scatter events + auto & totalscY = totalsc.dataY(); + auto & totalscE = totalsc.dataE(); + const auto & counts0 = avgCounts.sim.counts.front(); + std::transform(counts0.begin(), counts0.end(), msscatY.begin(), totalscY.begin(), + std::plus()); + const auto & errors0 = avgCounts.errors.front(); + std::transform(errors0.begin(), errors0.end(), msscatE.begin(), totalscE.begin(), + VectorHelper::SumGaussError()); } /** @@ -392,20 +773,17 @@ namespace Mantid * @param nscatters Maximum order of scattering that should be simulated * @param detpar Detector information describing the final detector position * @param respar Resolution information on the intrument as a whole - * @return A new simulation object storing the calculated number of counts + * @param simulCounts Simulation object used to storing the calculated number of counts */ - CalculateMSVesuvio::Simulation - CalculateMSVesuvio::simulate(const size_t nevents, const size_t nscatters, - const DetectorParams & detpar, - const ResolutionParams &respar) const + void CalculateMSVesuvio::simulate(const size_t nevents, const size_t nscatters, + const DetectorParams & detpar, + const ResolutionParams &respar, + Simulation & simulCounts) const { - Simulation simulCounts(NSCATTERS, m_inputWS->blocksize()); for(size_t i = 0; i < nevents; ++i) { simulCounts.weight += calculateCounts(nscatters, detpar, respar, simulCounts); } - - return simulCounts; } /** @@ -422,7 +800,11 @@ namespace Mantid { double weightSum(0.0); std::vector weights(nscatters, 1.0), // start at 1.0 - tofs(nscatters, 0.0), scAngs(nscatters, 0.0),en0(nscatters, 0.0); + tofs(nscatters, 0.0), + scAngs(nscatters, 0.0), // scattering angles between each order + en1(nscatters, 0.0); + std::vector directions(nscatters), // directions after each scatter + scatterPts(nscatters); // origin of each scatter // Initial TOF based on uncertainty in time measurement on detector @@ -435,21 +817,23 @@ namespace Mantid const double vel2 = sqrt(detpar.efixed/MASS_TO_MEV); const double t2 = detpar.l2/vel2; - en0[0] = generateE0(detpar.l1, t2, weights[0]); - tofs[0] = generateTOF(en0[0], detpar.t0, respar.dl1); // correction for resolution in l1 + en1[0] = generateE0(detpar.l1, t2, weights[0]); + tofs[0] = generateTOF(en1[0], detpar.t0, respar.dl1); // correction for resolution in l1 // Neutron path // Algorithm has initial direction pointing to origin V3D particleDir = V3D() - srcPos; + directions[0] = particleDir; // first scatter - V3D scatterPt = generateScatter(srcPos, particleDir, weights[0]); - double distFromStart = scatterPt.distance(srcPos); + V3D startPos(srcPos); + scatterPts[0] = generateScatter(startPos, particleDir, weights[0]); + double distFromStart = startPos.distance(scatterPts[0]); // Compute TOF for first scatter event - double vel = sqrt(en0[0]/MASS_TO_MEV); + double vel = sqrt(en1[0]/MASS_TO_MEV); tofs[0] += (distFromStart*1e6/vel); - // multiple scatters + // multiple scatter events within sample, i.e not including zeroth for(size_t i = 1; i < nscatters; ++i) { weights[i] = weights[i-1]; @@ -460,13 +844,14 @@ namespace Mantid double randphi = 2.0*M_PI*m_randgen->flat(); V3D oldDir = particleDir; particleDir.spherical_rad(1.0, randth, randphi); + directions[i] = particleDir; scAngs[i-1] = particleDir.angle(oldDir); // Update weight - scatterPt = generateScatter(scatterPt, particleDir, weights[i]); - auto e1range = calculateE1Range(scAngs[i-1], en0[i-1]); - en0[i] = e1range.first + m_randgen->flat()*(e1range.second - e1range.first); - const double d2sig =partialDiffXSec(en0[i-1], en0[i], scAngs[i-1]); + scatterPts[i] = generateScatter(scatterPts[i-1], particleDir, weights[i]); + auto e1range = calculateE1Range(scAngs[i-1], en1[i-1]); + en1[i] = e1range.first + m_randgen->flat()*(e1range.second - e1range.first); + const double d2sig = partialDiffXSec(en1[i-1], en1[i], scAngs[i-1]); double weight = d2sig*4.0*M_PI*(e1range.second - e1range.first)/m_sampleProps->totalxsec; // accumulate total weight simulation.nmscat += 1; @@ -474,6 +859,50 @@ namespace Mantid weights[i] *= weight; // account for this scatter on top of previous // Increment time of flight... + const double distTravelled = scatterPts[i].distance(scatterPts[i-1]); + double vel = sqrt(en1[i]/MASS_TO_MEV); + tofs[i] += (distTravelled*1e6/vel); + } + + // force all orders in to current detector + const auto & inX = m_inputWS->readX(0); + for(size_t i = 0; i < nscatters; ++i) + { + V3D detPos = generateDetectorPos(detpar.l1, detpar.theta, en1[i]); + // transform to sample frame + detPos.rotate(*m_goniometer); + // Distance to exit the sample for this order + Geometry::Track scatterToDet(scatterPts[i], detPos - scatterPts[i]); + if(m_sampleShape->interceptSurface(scatterToDet) == 0) + { + throw std::logic_error("CalculateMSVesuvio::calculateCounts() - " + "Logical error. No intersection with sample, despite track " + "originating from with sample."); + } + const auto & link = scatterToDet.begin(); + double distToExit = link->distInsideObject; + // Weight by probability neutron leaves sample + weights[i] *= exp(-m_sampleProps->mu*distToExit); + + // Weight by cross-section for the final energy + const double efinal = generateE1(detpar.theta, detpar.efixed, m_foilRes); + weights[i] *= partialDiffXSec(en1[i], efinal, scAngs[i])/m_sampleProps->totalxsec; + + // final TOF + double vel = sqrt(efinal/MASS_TO_MEV); + tofs[i] += detpar.t0 + (scatterPts[i].distance(detPos)*1e6)/vel; + + // "Bin" weight into appropriate place + std::vector &counts = simulation.counts[i]; + const double finalTOF = tofs[i]; + auto uppIter = std::upper_bound(inX.begin(), inX.end(), finalTOF); + if(uppIter != inX.begin()) + { + // See which side of line between us and previous value it should fall + auto prevIter = uppIter - 1; + if(finalTOF < *uppIter - 0.5*(*uppIter - *prevIter)) --uppIter; + } + counts[std::distance(inX.begin(), uppIter)] += weights[i]; } return weightSum; @@ -678,5 +1107,54 @@ namespace Mantid return pdcs; } + /** + * Generate a random position within the final detector in the lab frame + * @param l2 The nominal distance from sample to detector + * @param angle The The scattering angle from the sample + * @param energy The final energy of the neutron + * @return A new position in the detector + */ + V3D CalculateMSVesuvio::generateDetectorPos(const double l2, const double angle, const double energy) const + { + const double mu = 7430.0/sqrt(energy); // Inverse attenuation length (m-1) for vesuvio det. + const double ps = 1.0 - exp(-mu*m_detThick); // Probability of detection in path length YD. + + const double width = -0.5*m_detWidth + m_detWidth*m_randgen->flat(); + const double beam = -log(1.0 - m_randgen->flat()*ps)/mu; + const double height = -0.5*m_detHeight + m_detHeight*m_randgen->flat(); + const double widthLab = (l2 + beam)*sin(angle) + width*cos(angle); + const double beamLab = (l2 + beam)*cos(angle) - width*sin(angle); + V3D detPos; + detPos[m_beamIdx] = beamLab; + detPos[m_acrossIdx] = widthLab; + detPos[m_upIdx] = height; + + return detPos; + } + + /** + * Generate the final energy of the analyser + * @param angle Detector angle from sample + * @param e1nom The nominal final energy of the analyzer + * @param e1res The resoltion in energy of the analyser + * @return A value for the final energy of the neutron + */ + double CalculateMSVesuvio::generateE1(const double angle, const double e1nom, + const double e1res) const + { + if(e1res == 0.0) return e1nom; + + const double randv = m_randgen->flat(); + if(e1nom < 5000.0) + { + if(angle > 90.0) return finalEnergyAuDD(randv); + else return finalEnergyAuYap(randv); + } + else + { + return finalEnergyUranium(randv); + } + } + } // namespace Algorithms } // namespace Mantid diff --git a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h index 0d3dfabc2335..bca1678e785d 100644 --- a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h +++ b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h @@ -5,6 +5,7 @@ #include "MantidCurveFitting/CalculateMSVesuvio.h" #include "MantidGeometry/Instrument/Goniometer.h" +#include "MantidGeometry/Objects/ShapeFactory.h" #include "MantidTestHelpers/ComponentCreationHelper.h" #include "MantidTestHelpers/WorkspaceCreationHelper.h" @@ -34,6 +35,8 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite { auto alg = createTestAlgorithm(createFlatPlateSampleWS()); + feenableexcept(FE_INVALID | FE_OVERFLOW); + TS_ASSERT_THROWS_NOTHING(alg->execute()); TS_ASSERT(alg->isExecuted()); } @@ -91,7 +94,6 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite TS_ASSERT_THROWS(alg.setProperty("SampleDensity", 0), std::invalid_argument); } - void test_setting_atomic_properties_not_length_three_times_nmasses_throws_invalid_argument_on_execute() { auto alg = createTestAlgorithm(createFlatPlateSampleWS()); @@ -125,6 +127,13 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite TS_ASSERT_THROWS(alg->execute(), std::invalid_argument); } + void test_input_workspace_with_detector_that_has_no_shape_throws_exception() + { + auto alg = createTestAlgorithm(createFlatPlateSampleWS()); + + TS_ASSERT_THROWS(alg->execute(), std::invalid_argument); + } + private: Mantid::API::IAlgorithm_sptr createTestAlgorithm(const Mantid::API::MatrixWorkspace_sptr & inputWS) @@ -137,7 +146,8 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite alg->setProperty("InputWorkspace", inputWS); alg->setProperty("NoOfMasses", 3); alg->setProperty("SampleDensity", 241.0); - const double sampleProps[9] = {1.007900, 0.9272392, 5.003738, 16.00000, 3.2587662E-02, 13.92299, 27.50000, 4.0172841E-02, 15.07701}; + const double sampleProps[9] = {1.007900, 0.9272392, 5.003738, 16.00000, 3.2587662E-02, 13.92299, + 27.50000, 4.0172841E-02, 15.07701}; alg->setProperty("AtomicProperties", std::vector(sampleProps, sampleProps + 9)); alg->setProperty("BeamUmbraRadius", 1.5); alg->setProperty("BeamPenumbraRadius", 2.5); @@ -148,32 +158,53 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite return alg; } - struct ones - { - double operator()(const double, size_t) { return 1.0; } // don't care about Y values, just use 1.0 everywhere - }; - - Mantid::API::MatrixWorkspace_sptr createFlatPlateSampleWS() + Mantid::API::MatrixWorkspace_sptr createFlatPlateSampleWS(const bool detShape = true) { - auto testWS = createTestWorkspace(); + auto testWS = createTestWorkspace(detShape); // Sample shape - const double height(0.05), width(0.01), thick(0.0025); - auto sampleShape = ComponentCreationHelper::createCuboid(width, height, thick); + const double halfHeight(0.05), halfWidth(0.05), halfThick(0.0025); + std::ostringstream sampleShapeXML; + sampleShapeXML << " " + << " " + << " " + << " " + << " " + << ""; + auto sampleShape = Mantid::Geometry::ShapeFactory().createShape(sampleShapeXML.str()); testWS->mutableSample().setShape(*sampleShape); return testWS; } - Mantid::API::MatrixWorkspace_sptr createTestWorkspace() + Mantid::API::MatrixWorkspace_sptr createTestWorkspace(const bool detShape = true) { using namespace Mantid::Geometry; using namespace Mantid::Kernel; const int nhist(1); const double x0(50.0), x1(562.0), dx(1.0); - const bool singleMassSpec(false), foilChanger(false); - auto ws2d = ComptonProfileTestHelpers::createTestWorkspace(nhist, x0, x1, dx, singleMassSpec, foilChanger); + const bool singleMassSpec(false), foilChanger(true); + auto ws2d = ComptonProfileTestHelpers::createTestWorkspace(nhist, x0, x1, dx, + singleMassSpec, foilChanger); + + if(detShape) + { + // replace instrument with one that has a detector with a shape + const std::string shapeXML = \ + "" + "" + "" + "" + "" + "" + ""; + const auto pos = ws2d->getDetector(0)->getPos(); + auto instrument = ComptonProfileTestHelpers::createTestInstrumentWithFoilChanger(1, pos, shapeXML); + ws2d->setInstrument(instrument); + ComptonProfileTestHelpers::addResolutionParameters(ws2d, 1); + ComptonProfileTestHelpers::addFoilResolution(ws2d, "foil-pos0"); + } return ws2d; } diff --git a/Code/Mantid/Framework/CurveFitting/test/ComptonProfileTestHelpers.h b/Code/Mantid/Framework/CurveFitting/test/ComptonProfileTestHelpers.h index 199fabefdd64..a7b923df3757 100644 --- a/Code/Mantid/Framework/CurveFitting/test/ComptonProfileTestHelpers.h +++ b/Code/Mantid/Framework/CurveFitting/test/ComptonProfileTestHelpers.h @@ -2,6 +2,7 @@ #define COMPTONPROFILETESTHELPERS_H_ #include "MantidGeometry/Instrument/Detector.h" +#include "MantidGeometry/Objects/ShapeFactory.h" #include "MantidKernel/MersenneTwister.h" #include "MantidTestHelpers/ComponentCreationHelper.h" @@ -14,9 +15,12 @@ namespace ComptonProfileTestHelpers static Mantid::API::MatrixWorkspace_sptr createTestWorkspace(const size_t nhist,const double x0, const double x1, const double dx, const bool singleMassSpectrum = false, const bool addFoilChanger = false); - static Mantid::Geometry::Instrument_sptr createTestInstrumentWithFoilChanger(const Mantid::detid_t id,const Mantid::Kernel::V3D &); + static Mantid::Geometry::Instrument_sptr createTestInstrumentWithFoilChanger(const Mantid::detid_t id, + const Mantid::Kernel::V3D &, + const std::string &detShapeXML = ""); static Mantid::Geometry::Instrument_sptr createTestInstrumentWithNoFoilChanger(const Mantid::detid_t id, - const Mantid::Kernel::V3D &); + const Mantid::Kernel::V3D &, + const std::string & detShape = ""); static void addResolutionParameters(const Mantid::API::MatrixWorkspace_sptr & ws, const Mantid::detid_t detID); static void addFoilResolution(const Mantid::API::MatrixWorkspace_sptr & ws, @@ -90,15 +94,19 @@ namespace ComptonProfileTestHelpers return ws2d; } - static Mantid::Geometry::Instrument_sptr createTestInstrumentWithFoilChanger(const Mantid::detid_t id, - const Mantid::Kernel::V3D & detPos) + static Mantid::Geometry::Instrument_sptr + createTestInstrumentWithFoilChanger(const Mantid::detid_t id, + const Mantid::Kernel::V3D & detPos, + const std::string &detShapeXML) { using Mantid::Kernel::V3D; using namespace Mantid::Geometry; - auto inst = createTestInstrumentWithNoFoilChanger(id, detPos); + auto inst = createTestInstrumentWithNoFoilChanger(id, detPos, detShapeXML); // add changer - auto changerShape = ComponentCreationHelper::createCappedCylinder(0.05,0.4,V3D(0.0,-0.2,0.0),V3D(0.0,1,0.0), "cylinder"); + auto changerShape = \ + ComponentCreationHelper::createCappedCylinder(0.05, 0.4, V3D(0.0,-0.2,0.0), + V3D(0.0,1,0.0), "cylinder"); auto *changer = new ObjComponent("foil-changer",changerShape); changer->setPos(V3D(0.0,0.0,0.0)); inst->add(changer); @@ -120,8 +128,10 @@ namespace ComptonProfileTestHelpers return inst; } - static Mantid::Geometry::Instrument_sptr createTestInstrumentWithNoFoilChanger(const Mantid::detid_t id, - const Mantid::Kernel::V3D & detPos) + static Mantid::Geometry::Instrument_sptr + createTestInstrumentWithNoFoilChanger(const Mantid::detid_t id, + const Mantid::Kernel::V3D & detPos, + const std::string &detShapeXML) { using Mantid::Kernel::V3D; using namespace Mantid::Geometry; @@ -140,7 +150,16 @@ namespace ComptonProfileTestHelpers inst->markAsSamplePos(sampleHolder); //Just give it a single detector - auto *det0 = new Detector("det0",id,NULL); + Detector *det0(NULL); + if(!detShapeXML.empty()) + { + auto shape = ShapeFactory().createShape(detShapeXML); + det0 = new Detector("det0", id, shape, NULL); + } + else + { + det0 = new Detector("det0", id, NULL); + } det0->setPos(detPos); inst->add(det0); inst->markAsDetector(det0); From f273d2357428d5b7e219fb873468d3a1c46ef01e Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 11 Sep 2014 09:58:16 +0100 Subject: [PATCH 032/284] Added X min and max values to algorithm Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 127 ++++++++++++------ .../src/IndirectSymmetrise.cpp | 33 +++-- 2 files changed, 109 insertions(+), 51 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index b915fc158f38..44e000f5f4a7 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -1,7 +1,7 @@ from mantid import logger, mtd from mantid.api import PythonAlgorithm, AlgorithmFactory, WorkspaceProperty, PropertyMode from mantid.kernel import Direction, IntArrayProperty, IntArrayMandatoryValidator -from mantid.simpleapi import CreateWorkspace, CopyLogs, CopySample, CopyInstrumentParameters, SaveNexusProcessed, CreateEmptyTableWorkspace +from mantid.simpleapi import CreateWorkspace, CopyLogs, CopySample, CopyInstrumentParameters, SaveNexusProcessed, CreateEmptyTableWorkspace, RenameWorkspace import math import os.path @@ -19,7 +19,12 @@ def summary(self): def PyInit(self): self.declareProperty(WorkspaceProperty('Sample', '', Direction.Input), doc='Sample to run with') - self.declareProperty('XCut', 0.0, doc='X cut off value') + + self.declareProperty(IntArrayProperty(name='SpectraRange'), + doc='Range of spectra to symmetrise (defaults to entire range if not set)') + + self.declareProperty('XMin', 0.0, doc='X value marking lower limit of curve to copy') + self.declareProperty('XMax', 0.0, doc='X value marking upper limit of curve to copy') self.declareProperty('Verbose', defaultValue=False, doc='Switch verbose output Off/On') @@ -28,9 +33,6 @@ def PyInit(self): self.declareProperty('Save', defaultValue=False, doc='Switch saving result to nxs file Off/On') - self.declareProperty(IntArrayProperty(name='SpectraRange'), - doc='Range of spectra to symmetrise (defaults to entire range if not set)') - self.declareProperty(WorkspaceProperty('OutputWorkspace', '', Direction.Output), doc='Name to call the output workspace.') @@ -42,6 +44,7 @@ def PyExec(self): StartTime('Symmetrise') self._setup() + temp_ws_name = '__Symmetrise_temp' # The number of spectra that will actually be changed num_symm_spectra = self._spectra_range[1] - self._spectra_range[0] + 1 @@ -53,42 +56,42 @@ def PyExec(self): sample_array_len = min(len_x, len_y, len_e) - 1 sample_x = mtd[self._sample].readX(0) - delta_x = sample_x[1] - sample_x[0] - - # Find array index of negative XCut - negative_diff = np.absolute(sample_x + self._x_cut) - self._negative_index = np.where(negative_diff < delta_x)[0][-1] - self._check_bounds(self._negative_index, sample_array_len, label='Negative') - - # Find array index of positive XCut - positive_diff = np.absolute(sample_x + sample_x[self._negative_index]) - self._positive_index = np.where(positive_diff < delta_x)[0][-1] - self._check_bounds(self._positive_index, sample_array_len, label='Positive') + self._calculate_array_points(sample_x, sample_array_len) # Calculate number of elements needed for new array (per spectra) - new_array_len = 2 * sample_array_len - (self._positive_index + self._negative_index) + 1 + new_array_len = 2 * sample_array_len - (self._positive_min_index + self._negative_min_index) + 1 if self._verbose: logger.notice('No. points = %d' % sample_array_len) - logger.notice('Negative at i=%d, x=%f' - % (self._negative_index, sample_x[self._negative_index])) - logger.notice('Positive at i=%d, x=%f' - % (self._positive_index, sample_x[self._positive_index])) logger.notice('New array size = %d' % new_array_len) + logger.notice('Negative X min at i=%d, x=%f' + % (self._negative_min_index, sample_x[self._negative_min_index])) + logger.notice('Positive X min at i=%d, x=%f' + % (self._positive_min_index, sample_x[self._positive_min_index])) + + if self._negative_max_index is None: + logger.notice('No negative X max found') + else: + logger.notice('Negative X max at i=%d, x=%f' + % (self._negative_max_index, sample_x[self._negative_max_index])) + + logger.notice('Positive X max at i=%d, x=%f' + % (self._positive_max_index, sample_x[self._positive_max_index])) + x_unit = mtd[self._sample].getXDimension().getUnits() # Create an empty workspace with enough storage for the new data zeros = np.zeros(new_array_len * num_symm_spectra) - CreateWorkspace(OutputWorkspace=self._output_workspace, + CreateWorkspace(OutputWorkspace=temp_ws_name, DataX=zeros, DataY=zeros, DataE=zeros, NSpec=num_symm_spectra, UnitX=x_unit) # Copy logs and properties from sample workspace - CopyLogs(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) - CopyInstrumentParameters(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) - # CopySample(InputWorkspace=self._sample, OutputWorkspace=self._output_workspace) + CopyLogs(InputWorkspace=self._sample, OutputWorkspace=temp_ws_name) + CopyInstrumentParameters(InputWorkspace=self._sample, OutputWorkspace=temp_ws_name) + # CopySample(InputWorkspace=self._sample, OutputWorkspace=temp_ws_name) # For each spectrum copy positive values to the negative output_spectrum_index = 0 @@ -107,27 +110,29 @@ def PyExec(self): e_out = np.zeros(new_array_len) # Left hand side of cut - x_out[:sample_array_len - self._positive_index] = -x_in[sample_array_len:self._positive_index:-1] - y_out[:sample_array_len - self._positive_index] = y_in[sample_array_len:self._positive_index:-1] - e_out[:sample_array_len - self._positive_index] = e_in[sample_array_len:self._positive_index:-1] + x_out[:sample_array_len - self._positive_min_index] = -x_in[sample_array_len:self._positive_min_index:-1] + y_out[:sample_array_len - self._positive_min_index] = y_in[sample_array_len:self._positive_min_index:-1] + e_out[:sample_array_len - self._positive_min_index] = e_in[sample_array_len:self._positive_min_index:-1] # Right hand side of cut - x_out[sample_array_len - self._positive_index:] = x_in[self._negative_index:] - y_out[sample_array_len - self._positive_index:] = y_in[self._negative_index:] - e_out[sample_array_len - self._positive_index:] = e_in[self._negative_index:] + x_out[sample_array_len - self._positive_min_index:] = x_in[self._negative_min_index:] + y_out[sample_array_len - self._positive_min_index:] = y_in[self._negative_min_index:] + e_out[sample_array_len - self._positive_min_index:] = e_in[self._negative_min_index:] # Set output spectrum data - mtd[self._output_workspace].setX(output_spectrum_index, x_out) - mtd[self._output_workspace].setY(output_spectrum_index, y_out) - mtd[self._output_workspace].setE(output_spectrum_index, e_out) + mtd[temp_ws_name].setX(output_spectrum_index, x_out) + mtd[temp_ws_name].setY(output_spectrum_index, y_out) + mtd[temp_ws_name].setE(output_spectrum_index, e_out) # Set output spectrum number - mtd[self._output_workspace].getSpectrum(output_spectrum_index).setSpectrumNo(spectrum_no) + mtd[temp_ws_name].getSpectrum(output_spectrum_index).setSpectrumNo(spectrum_no) output_spectrum_index += 1 logger.information('Symmetrise spectra %d' % spectrum_no) + RenameWorkspace(InputWorkspace=temp_ws_name, OutputWorkspace=self._output_workspace) + if self._save: self._save_output() @@ -153,10 +158,16 @@ def _setup(self): min_spectra_number = mtd[self._sample].getSpectrum(0).getSpectrumNo() max_spectra_number = mtd[self._sample].getSpectrum(num_sample_spectra - 1).getSpectrumNo() - self._x_cut = self.getProperty('XCut').value + self._x_min = math.fabs(self.getProperty('XMin').value) + self._x_max = math.fabs(self.getProperty('XMax').value) + + if self._x_min < 1e-5: + raise ValueError('XMin point is Zero') + if self._x_max < 1e-5: + raise ValueError('XMax point is Zero') - if math.fabs(self._x_cut) < 1e-5: - raise ValueError('XCut point is Zero') + if math.fabs(self._x_max - self._x_min) < 1e-5: + raise ValueError('X range is Zero') self._verbose = self.getProperty('Verbose').value self._plot = self.getProperty('Plot').value @@ -176,6 +187,35 @@ def _setup(self): self._output_workspace = self.getPropertyValue('OutputWorkspace') self._props_output_workspace = self.getPropertyValue('OutputPropertiesTable') + def _calculate_array_points(self, sample_x, sample_array_len): + """ + Finds the points in the array that match the cut points. + """ + delta_x = sample_x[1] - sample_x[0] + + # Find array index of negative XMin + negative_min_diff = np.absolute(sample_x + self._x_min) + self._negative_min_index = np.where(negative_min_diff < delta_x)[0][-1] + self._check_bounds(self._negative_min_index, sample_array_len, label='Negative') + + # Find array index of positive XMin + positive_min_diff = np.absolute(sample_x + sample_x[self._negative_min_index]) + self._positive_min_index = np.where(positive_min_diff < delta_x)[0][-1] + self._check_bounds(self._positive_min_index, sample_array_len, label='Positive') + + # Find array index of positive XMax + positive_max_diff = np.absolute(sample_x - self._x_max) + self._positive_max_index = np.where(positive_max_diff < delta_x)[0][-1] + self._check_bounds(self._positive_max_index, sample_array_len, label='Positive') + + # Find array index of negative XMax + if -self._x_max < sample_x[0]: + self._negative_max_index = None; + else: + negative_max_diff = np.absolute(sample_x + sample_x[self._positive_max_index]) + self._negative_max_index = np.where(negative_max_diff < delta_x)[0][-1] + self._check_bounds(self._negative_max_index, sample_array_len, label='Negative') + def _check_bounds(self, index, num_pts, label=''): """ Check if the index falls within the bounds of the x range. @@ -196,10 +236,15 @@ def _generate_props_table(self): """ props_table = CreateEmptyTableWorkspace(OutputWorkspace=self._props_output_workspace) - props_table.addColumn('int', 'NegativeCutIndex') - props_table.addColumn('int', 'PositiveCutIndex') + props_table.addColumn('int', 'NegativeXMinIndex') + props_table.addColumn('int', 'PositiveXMinIndex') + props_table.addColumn('int', 'NegativeXMaxIndex') + props_table.addColumn('int', 'PositiveXMaxIndex') - props_table.addRow([self._negative_index, self._positive_index]) + if self._negative_max_index is None: + props_table.addRow([self._negative_min_index, self._positive_min_index, -1, self._positive_max_index]) + else: + props_table.addRow([self._negative_min_index, self._positive_min_index, self._negative_max_index, self._positive_max_index]) self.setProperty('OutputPropertiesTable', self._props_output_workspace) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 4f88573c5f21..74f435f26f6c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -36,8 +36,10 @@ namespace CustomInterfaces m_propTrees["SymmPropTree"]->setFactoryForManager(m_dblManager, doubleEditorFactory); // Raw Properties - m_properties["XCut"] = m_dblManager->addProperty("X Cut"); - m_propTrees["SymmPropTree"]->addProperty(m_properties["XCut"]); + m_properties["EMin"] = m_dblManager->addProperty("EMin"); + m_propTrees["SymmPropTree"]->addProperty(m_properties["EMin"]); + m_properties["EMax"] = m_dblManager->addProperty("EMax"); + m_propTrees["SymmPropTree"]->addProperty(m_properties["EMax"]); QtProperty* rawPlotProps = m_grpManager->addProperty("Raw Plot"); m_propTrees["SymmPropTree"]->addProperty(rawPlotProps); @@ -134,7 +136,8 @@ namespace CustomInterfaces connect(m_uiForm.symm_previewButton, SIGNAL(clicked()), this, SLOT(preview())); // Set default XCut value - m_dblManager->setValue(m_properties["XCut"], 0.3); + m_dblManager->setValue(m_properties["EMin"], 0.1); + m_dblManager->setValue(m_properties["EMax"], 0.5); // Set default x axis range std::pair defaultRange(-1.0, 1.0); @@ -159,8 +162,10 @@ namespace CustomInterfaces if(!m_uiForm.symm_dsInput->isValid()) return false; - // Check for a valid XCut value - if(m_dblManager->value(m_properties["XCut"]) <= 0.0) + // EMin and EMax must be positive + if(m_dblManager->value(m_properties["EMin"]) <= 0.0) + return false; + if(m_dblManager->value(m_properties["EMax"]) <= 0.0) return false; return true; @@ -175,12 +180,14 @@ namespace CustomInterfaces bool verbose = m_uiForm.symm_ckVerbose->isChecked(); bool save = m_uiForm.symm_ckSave->isChecked(); - double x_cut = m_dblManager->value(m_properties["XCut"]); + double e_min = m_dblManager->value(m_properties["XEMin"]); + double e_max = m_dblManager->value(m_properties["XEMax"]); IAlgorithm_sptr symmetriseAlg = AlgorithmManager::Instance().create("Symmetrise", -1); symmetriseAlg->initialize(); symmetriseAlg->setProperty("Sample", workspaceName.toStdString()); - symmetriseAlg->setProperty("XCut", x_cut); + symmetriseAlg->setProperty("XMin", e_min); + symmetriseAlg->setProperty("XMax", e_max); symmetriseAlg->setProperty("Plot", plot); symmetriseAlg->setProperty("Verbose", verbose); symmetriseAlg->setProperty("Save", save); @@ -258,7 +265,7 @@ namespace CustomInterfaces */ void IndirectSymmetrise::updateRangeSelectors(QtProperty *prop, double value) { - if(prop == m_properties["XCut"]) + if(prop == m_properties["EMin"]) { m_rangeSelectors["NegativeXCut_Raw"]->setMinimum(-value); m_rangeSelectors["PositiveXCut_Raw"]->setMinimum(value); @@ -266,6 +273,10 @@ namespace CustomInterfaces m_rangeSelectors["NegativeXCut_PV"]->setMinimum(-value); m_rangeSelectors["PositiveXCut_PV"]->setMinimum(value); } + + if(prop == m_properties["EMax"]) + { + } } /** @@ -287,7 +298,8 @@ namespace CustomInterfaces return; bool verbose = m_uiForm.symm_ckVerbose->isChecked(); - double x_cut = m_dblManager->value(m_properties["XCut"]); + double e_min = m_dblManager->value(m_properties["EMin"]); + double e_max = m_dblManager->value(m_properties["EMax"]); long spectrumNumber = static_cast(m_dblManager->value(m_properties["PreviewSpec"])); std::vector spectraRange(2, spectrumNumber); @@ -295,7 +307,8 @@ namespace CustomInterfaces IAlgorithm_sptr symmetriseAlg = AlgorithmManager::Instance().create("Symmetrise", -1); symmetriseAlg->initialize(); symmetriseAlg->setProperty("Sample", workspaceName.toStdString()); - symmetriseAlg->setProperty("XCut", x_cut); + symmetriseAlg->setProperty("XMin", e_min); + symmetriseAlg->setProperty("XMax", e_max); symmetriseAlg->setProperty("Plot", false); symmetriseAlg->setProperty("Verbose", verbose); symmetriseAlg->setProperty("Save", false); From 199578322228d8ba60f369ed2e2f2d16316a7cba Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 11 Sep 2014 10:26:24 +0100 Subject: [PATCH 033/284] Implemented X range selection, updated docs Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 29 ++++++++++++------- .../docs/source/algorithms/Symmetrise-v1.rst | 11 +++++-- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 44e000f5f4a7..3538d9a740b8 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -59,11 +59,15 @@ def PyExec(self): self._calculate_array_points(sample_x, sample_array_len) # Calculate number of elements needed for new array (per spectra) - new_array_len = 2 * sample_array_len - (self._positive_min_index + self._negative_min_index) + 1 + # TODO: This can be simplified a lot + new_array_len = 2 * sample_array_len - (self._positive_min_index + self._negative_min_index) - 2 * (sample_array_len - self._positive_max_index) + 1 + + # Calculate the position in the output array to split between the LHS reflected betwen +XMin and +XMax and + # the LHS copied frim -XMin and +XMax + output_cut_index = sample_array_len - self._positive_min_index - (sample_array_len - self._positive_max_index) if self._verbose: - logger.notice('No. points = %d' % sample_array_len) - logger.notice('New array size = %d' % new_array_len) + logger.notice('Sample array length = %d' % sample_array_len) logger.notice('Negative X min at i=%d, x=%f' % (self._negative_min_index, sample_x[self._negative_min_index])) @@ -79,6 +83,9 @@ def PyExec(self): logger.notice('Positive X max at i=%d, x=%f' % (self._positive_max_index, sample_x[self._positive_max_index])) + logger.notice('New array length = %d' % new_array_len) + logger.notice('Output array LR split index = %d' % output_cut_index) + x_unit = mtd[self._sample].getXDimension().getUnits() # Create an empty workspace with enough storage for the new data @@ -109,15 +116,15 @@ def PyExec(self): y_out = np.zeros(new_array_len) e_out = np.zeros(new_array_len) - # Left hand side of cut - x_out[:sample_array_len - self._positive_min_index] = -x_in[sample_array_len:self._positive_min_index:-1] - y_out[:sample_array_len - self._positive_min_index] = y_in[sample_array_len:self._positive_min_index:-1] - e_out[:sample_array_len - self._positive_min_index] = e_in[sample_array_len:self._positive_min_index:-1] + # Left hand side + x_out[:output_cut_index] = -x_in[self._positive_max_index:self._positive_min_index:-1] + y_out[:output_cut_index] = y_in[self._positive_max_index:self._positive_min_index:-1] + e_out[:output_cut_index] = e_in[self._positive_max_index:self._positive_min_index:-1] - # Right hand side of cut - x_out[sample_array_len - self._positive_min_index:] = x_in[self._negative_min_index:] - y_out[sample_array_len - self._positive_min_index:] = y_in[self._negative_min_index:] - e_out[sample_array_len - self._positive_min_index:] = e_in[self._negative_min_index:] + # Right hand side + x_out[output_cut_index:] = x_in[self._negative_min_index:self._positive_max_index] + y_out[output_cut_index:] = y_in[self._negative_min_index:self._positive_max_index] + e_out[output_cut_index:] = e_in[self._negative_min_index:self._positive_max_index] # Set output spectrum data mtd[temp_ws_name].setX(output_spectrum_index, x_out) diff --git a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst index 3c5704b229f6..9c799dbf8247 100644 --- a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst +++ b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst @@ -10,9 +10,14 @@ Description ----------- Symmetrise takes an asymmetric :math:`S(Q,w)` - i.e. one in which the -moduli of xmin & xmax are different. Typically xmax is > mod(xmin). A -negative value of x is chosen (Xcut) so that the curve for mod(Xcut) to -xmax is reflected and inserted for x less than the Xcut. +moduli of xmin & xmax are different. Typically xmax is > mod(xmin). + +Two values, XMin and XMax, are chosen to specify the section of the positive +side of the curve to be reflected onto the negative side. + +The output curve between negative XMin and XMax is unchnaged from the sample +curve, between negative XMax and negative XMin the curve is reflected from +the sample curve between XMin and XMax. Usage ----- From a3d05d0c3ce74ed7b37f7ddf9c3c6f3f05079fd2 Mon Sep 17 00:00:00 2001 From: John Hill Date: Thu, 11 Sep 2014 12:05:35 +0100 Subject: [PATCH 034/284] Refs #10194 create files --- .../Framework/DataHandling/CMakeLists.txt | 2 + .../inc/MantidDataHandling/SaveNXTomo.h | 104 + .../Framework/DataHandling/src/SaveNXTomo.cpp | 307 +++ .../AutoTestData/UsageData/GEM_Definition.vtp | 2047 +++++++++++++++++ 4 files changed, 2460 insertions(+) create mode 100644 Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h create mode 100644 Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp create mode 100644 Test/AutoTestData/UsageData/GEM_Definition.vtp diff --git a/Code/Mantid/Framework/DataHandling/CMakeLists.txt b/Code/Mantid/Framework/DataHandling/CMakeLists.txt index 3351dfa21f25..22ab0e341303 100644 --- a/Code/Mantid/Framework/DataHandling/CMakeLists.txt +++ b/Code/Mantid/Framework/DataHandling/CMakeLists.txt @@ -127,6 +127,7 @@ set ( SRC_FILES src/SaveNXSPE.cpp src/SaveNexus.cpp src/SaveNexusProcessed.cpp + src/SaveNXTomo.cpp src/SaveParameterFile.cpp src/SavePAR.cpp src/SavePHX.cpp @@ -264,6 +265,7 @@ set ( INC_FILES inc/MantidDataHandling/SaveNXSPE.h inc/MantidDataHandling/SaveNexus.h inc/MantidDataHandling/SaveNexusProcessed.h + inc/MantidDataHandling/SaveNXTomo.h inc/MantidDataHandling/SaveParameterFile.h inc/MantidDataHandling/SavePAR.h inc/MantidDataHandling/SavePHX.h diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h new file mode 100644 index 000000000000..644ca2f8abdf --- /dev/null +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -0,0 +1,104 @@ +#ifndef MANTID_DATAHANDLING_SAVENXTOMO_H_ +#define MANTID_DATAHANDLING_SAVENXTOMO_H_ + +//--------------------------------------------------- +// Includes +//--------------------------------------------------- +//#include "MantidAPI/Algorithm.h" +//#include "MantidNexus/NexusClasses.h" +//#include "MantidAPI/MatrixWorkspace.h" +//#include "MantidAPI/Sample.h" +//#include "MantidDataObjects/Workspace2D.h" +//#include "MantidDataObjects/EventWorkspace.h" +//#include +//#include + +namespace Mantid +{ + namespace DataHandling + { + + /** + * Saves a workspace into a NeXus/HDF5 NXTomo file. + * + * Required properties: + *
    + *
  • InputWorkspace - The workspace to save.
  • + *
  • Filename - The filename for output
  • + *
+ * + * @author John R Hill, RAL + * @date 10/09/2014 + * + * This file is part of Mantid. + * + * Mantid 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. + * + * Mantid 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, see . + * + * File change history is stored at: + * Code Documentation is available at: + * + */ + + class DLLExport SaveNXTomo: public API::Algorithm + { + public: + /// Constructor + SaveNXTomo(); + /// Virtual dtor + virtual ~SaveNXTomo() + { + } + virtual const std::string name() const + { + return "SaveNXTomo"; + } + ///Summary of algorithms purpose + virtual const std::string summary() const {return "Writes a MatrixWorkspace to a file in the NXTomo format.";} + + /// Algorithm's version + virtual int version() const + { + return (1); + } + /// Algorithm's category for identification + virtual const std::string category() const + { + return "DataHandling\\Nexus;DataHandling\\Tomo;Diffraction"; + } + + private: + + /// Initialisation code + void init(); + ///Execution code + void exec(); + + ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change + //size_t nBins; + /// The filename of the output file + //std::string filename; + + // Some constants to be written for masked values. + /// Value for data if pixel is masked + //static const double MASK_FLAG; + /// Value for error if pixel is masked + //static const double MASK_ERROR; + /// file format version + //static const std::string NXSPE_VER; + }; + + } // namespace DataHandling +} // namespace Mantid + +#endif // MANTID_DATAHANDLING_SAVENXTOMO_H_ diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp new file mode 100644 index 000000000000..3a053edfa273 --- /dev/null +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -0,0 +1,307 @@ +#include "MantidDataHandling/SaveNXTomo.h" +#include "MantidAPI/FileProperty.h" +//#include "MantidKernel/ConfigService.h" +#include "MantidKernel/MantidVersion.h" +#include "MantidAPI/WorkspaceValidators.h" +//#include "MantidAPI/WorkspaceOpOverloads.h" +//#include "MantidGeometry/Instrument/Detector.h" +//#include "MantidGeometry/Instrument/ObjComponent.h" +//#include "MantidDataHandling/FindDetectorsPar.h" +// +//#include +//#include +//#include + +namespace Mantid +{ + namespace DataHandling + { + + // Register the algorithm into the algorithm factory + DECLARE_ALGORITHM(SaveNXTomo) + + using namespace Kernel; + using namespace API; + + SaveNXTomo::SaveNXTomo() : API::Algorithm() + { + } + + /** + * Initialise the algorithm + */ + void SaveNXTomo::init() + { + auto wsValidator = boost::make_shared() ; + wsValidator->add(boost::make_shared("DeltaE")); + wsValidator->add(); + wsValidator->add(); + + declareProperty(new WorkspaceProperty ("InputWorkspace", + "", Direction::Input, wsValidator), + "The name of the workspace to save."); + + declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), + "The name of the NXTomo file to write, as a full or relative path"); + } + + /** + * Execute the algorithm + */ + void SaveNXTomo::exec() + { + // Retrieve the input workspace + const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); + + // Do the full check for common binning + if (!WorkspaceHelpers::commonBoundaries(inputWS)) + { + g_log.error("The input workspace must have common bins"); + throw std::invalid_argument("The input workspace must have common bins"); + } + + // Number of spectra + const int nHist = static_cast(inputWS->getNumberHistograms()); + // Number of energy bins + this->nBins = inputWS->blocksize(); + + // Get a pointer to the sample + Geometry::IComponent_const_sptr sample = + inputWS->getInstrument()->getSample(); + + // Retrieve the filename from the properties + this->filename = getPropertyValue("Filename"); + + // Create the file. + ::NeXus::File nxFile(this->filename, NXACC_CREATE5); + + // Make the top level entry (and open it) + nxFile.makeGroup(inputWS->getName(), "NXentry", true); + + // Definition name and version + nxFile.writeData("definition", "NXSPE"); + nxFile.openData("definition"); + nxFile.putAttr("version", NXSPE_VER); + nxFile.closeData(); + + // Program name and version + nxFile.writeData("program_name", "mantid"); + nxFile.openData("program_name"); + nxFile.putAttr("version", Mantid::Kernel::MantidVersion::version()); + nxFile.closeData(); + + // Create NXSPE_info + nxFile.makeGroup("NXSPE_info", "NXcollection", true); + + // Get the value out of the property first + double efixed = getProperty("Efixed"); + if ( isEmpty(efixed) ) efixed = MASK_FLAG; + // Now lets check to see if the workspace nows better. + // TODO: Check that this is the way round we want to do it. + const API::Run & run = inputWS->run(); + if (run.hasProperty("Ei")) + { + Kernel::Property* propEi = run.getProperty("Ei"); + efixed = boost::lexical_cast(propEi->value()); + } + nxFile.writeData("fixed_energy", efixed); + nxFile.openData("fixed_energy"); + nxFile.putAttr("units", "meV"); + nxFile.closeData(); + + double psi = getProperty("Psi"); + if ( isEmpty(psi) ) psi = MASK_FLAG; + nxFile.writeData("psi", psi); + nxFile.openData("psi"); + nxFile.putAttr("units", "degrees"); + nxFile.closeData(); + + bool kikfScaling = getProperty("KiOverKfScaling"); + if (kikfScaling) + { + nxFile.writeData("ki_over_kf_scaling", 1); + } + else + { + nxFile.writeData("ki_over_kf_scaling", 0); + } + + nxFile.closeGroup(); // NXSPE_info + + // NXinstrument + nxFile.makeGroup("instrument", "NXinstrument", true); + // Write the instrument name + nxFile.writeData("name", inputWS->getInstrument()->getName()); + // and the short name + nxFile.openData("name"); + // TODO: Get the instrument short name + nxFile.putAttr("short_name", inputWS->getInstrument()->getName()); + nxFile.closeData(); + + // NXfermi_chopper + nxFile.makeGroup("fermi", "NXfermi_chopper", true); + + nxFile.writeData("energy", efixed); + nxFile.closeGroup(); // NXfermi_chopper + + nxFile.closeGroup(); // NXinstrument + + // NXsample + nxFile.makeGroup("sample", "NXsample", true); + // TODO: Write sample info +// nxFile.writeData("rotation_angle", 0.0); +// nxFile.writeData("seblock", "NONE"); +// nxFile.writeData("temperature", 300.0); + + nxFile.closeGroup(); // NXsample + + // Make the NXdata group + nxFile.makeGroup("data", "NXdata", true); + + // Energy bins + // Get the Energy Axis (X) of the first spectra (they are all the same - checked above) + const MantidVec& X = inputWS->readX(0); + nxFile.writeData("energy", X); + nxFile.openData("energy"); + nxFile.putAttr("units", "meV"); + nxFile.closeData(); + + // let's create some blank arrays in the nexus file + + std::vector array_dims; + array_dims.push_back((int)nHist); + array_dims.push_back((int)nBins); + + nxFile.makeData("data", ::NeXus::FLOAT64, array_dims, false); + nxFile.makeData("error", ::NeXus::FLOAT64, array_dims, false); + + // Add the axes attributes to the data + nxFile.openData("data"); + nxFile.putAttr("signal", 1); + nxFile.putAttr("axes", "polar:energy"); + nxFile.closeData(); + + std::vector slab_start; + std::vector slab_size; + + // What size slabs are we going to write... + slab_size.push_back(1); + slab_size.push_back((int64_t)nBins); + + // And let's start at the beginning + slab_start.push_back(0); + slab_start.push_back(0); + + // define the data and error vectors for masked detectors + std::vector masked_data (nBins, MASK_FLAG); + std::vector masked_error (nBins, MASK_ERROR); + + // Create a progress reporting object + Progress progress(this,0,1,100); + const int progStep = (int)(ceil(nHist/100.0)); + Geometry::IDetector_const_sptr det; + // Loop over spectra + for (int i = 0; i < nHist; i++) + { + try{ // detector exist + det =inputWS->getDetector(i); + // Check that we aren't writing a monitor... + if (!det->isMonitor()) + { + Geometry::IDetector_const_sptr det = inputWS->getDetector(i); + + if (!det->isMasked()) + { + // no masking... + // Open the data + nxFile.openData("data"); + slab_start[0] = i; + nxFile.putSlab(const_cast (inputWS->readY(i)), + slab_start, slab_size); + // Close the data + nxFile.closeData(); + + // Open the error + nxFile.openData("error"); + //MantidVec& tmparr = const_cast(inputWS->dataE(i)); + //nxFile.putSlab((void*)(&(tmparr[0])), slab_start, slab_size); + nxFile.putSlab(const_cast (inputWS->readE(i)), + slab_start, slab_size); + // Close the error + nxFile.closeData(); + } + else + { + // Write a masked value... + // Open the data + nxFile.openData("data"); + slab_start[0] = i; + nxFile.putSlab(masked_data, slab_start, slab_size); + // Close the data + nxFile.closeData(); + + // Open the error + nxFile.openData("error"); + nxFile.putSlab(masked_error, slab_start, slab_size); + // Close the error + nxFile.closeData(); + } + } + }catch(Exception::NotFoundError&) + { + // Catch if no detector. Next line tests whether this happened - test placed + // outside here because Mac Intel compiler doesn't like 'continue' in a catch + // in an openmp block. + } + // If no detector found, skip onto the next spectrum + if ( !det ) continue; + + // make regular progress reports and check for canceling the algorithm + if ( i % progStep == 0 ) + { + progress.report(); + } + } + // execute the ChildAlgorithm to calculate the detector's parameters; + IAlgorithm_sptr spCalcDetPar = this->createChildAlgorithm("FindDetectorsPar", 0, 1, true, 1); + + spCalcDetPar->initialize(); + spCalcDetPar->setPropertyValue("InputWorkspace", inputWS->getName()); + std::string parFileName = this->getPropertyValue("ParFile"); + if(!(parFileName.empty()||parFileName=="not_used.par")){ + spCalcDetPar->setPropertyValue("ParFile",parFileName); + } + spCalcDetPar->execute(); + + // + FindDetectorsPar * pCalcDetPar = dynamic_cast(spCalcDetPar.get()); + if(!pCalcDetPar){ // "can not get pointer to FindDetectorsPar algorithm" + throw(std::bad_cast()); + } + const std::vector & azimuthal = pCalcDetPar->getAzimuthal(); + const std::vector & polar = pCalcDetPar->getPolar(); + const std::vector & azimuthal_width = pCalcDetPar->getAzimWidth(); + const std::vector & polar_width = pCalcDetPar->getPolarWidth(); + const std::vector & secondary_flightpath= pCalcDetPar->getFlightPath(); + + + // Write the Polar (2Theta) angles + nxFile.writeData("polar", polar); + + // Write the Azimuthal (phi) angles + nxFile.writeData("azimuthal", azimuthal); + + // Now the widths... + nxFile.writeData("polar_width", polar_width); + nxFile.writeData("azimuthal_width", azimuthal_width); + + // Secondary flight path + nxFile.writeData("distance", secondary_flightpath); + + nxFile.closeGroup(); // NXdata + + nxFile.closeGroup(); // Top level NXentry + } + + } // namespace DataHandling +} // namespace Mantid diff --git a/Test/AutoTestData/UsageData/GEM_Definition.vtp b/Test/AutoTestData/UsageData/GEM_Definition.vtp new file mode 100644 index 000000000000..d6415ab3b951 --- /dev/null +++ b/Test/AutoTestData/UsageData/GEM_Definition.vtp @@ -0,0 +1,2047 @@ + + + + + -0.0101667 -0.0582343 0 -0.00533706 -0.0595284 0 -0.00533706 -0.0595284 0.001 -0.0101667 -0.0582343 0.001 -0.0101667 -0.0582343 0 -0.00533706 -0.0595284 0 -0.0025 -5.51091e-17 0 -0.00591826 -0.0390708 0 -0.00335619 -0.01961 0 -0.0101667 0.0582343 0 -0.00335619 0.01961 0 -0.00591826 0.0390708 0 -0.00533706 0.0595284 0 0.0025 -5.63338e-17 0 0.00162478 0.0200458 0 -0.000994217 0.0399391 0 -0.000994217 -0.0399391 0 0.00162478 -0.0200458 0 -0.00533706 -0.0595284 0 -0.00533706 -0.0595284 0.001 0.0025 -5.63338e-17 0.001 -0.000994217 -0.0399391 0.001 0.00162478 -0.0200458 0.001 0.0025 -5.63338e-17 0 -0.000994217 -0.0399391 0 0.00162478 -0.0200458 0 -0.0101667 -0.0582343 0.001 -0.00533706 -0.0595284 0.001 -0.0025 -5.51091e-17 0.001 -0.00591826 -0.0390708 0.001 -0.00335619 -0.01961 0.001 -0.0101667 0.0582343 0.001 -0.00335619 0.01961 0.001 -0.00591826 0.0390708 0.001 -0.00533706 0.0595284 0.001 0.0025 -5.63338e-17 0.001 0.00162478 0.0200458 0.001 -0.000994217 0.0399391 0.001 -0.000994217 -0.0399391 0.001 0.00162478 -0.0200458 0.001 -0.0101667 -0.0582343 0 -0.0101667 -0.0582343 0.001 -0.0025 -5.51091e-17 0.001 -0.00591826 -0.0390708 0.001 -0.00335619 -0.01961 0.001 -0.0025 -5.51091e-17 0 -0.00591826 -0.0390708 0 -0.00335619 -0.01961 0 -0.0025 -5.51091e-17 0 -0.0025 -5.51091e-17 0.001 -0.0101667 0.0582343 0.001 -0.00335619 0.01961 0.001 -0.00591826 0.0390708 0.001 -0.0101667 0.0582343 0 -0.00335619 0.01961 0 -0.00591826 0.0390708 0 -0.0101667 0.0582343 0 -0.00533706 0.0595284 0 -0.00533706 0.0595284 0.001 -0.0101667 0.0582343 0.001 0.0025 -5.63338e-17 0 0.0025 -5.63338e-17 0.001 -0.00533706 0.0595284 0.001 0.00162478 0.0200458 0.001 -0.000994217 0.0399391 0.001 -0.00533706 0.0595284 0 0.00162478 0.0200458 0 -0.000994217 0.0399391 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0103371 -0.0595284 0 -0.00550743 -0.0608225 0 -0.00550743 -0.0608225 0.001 -0.0103371 -0.0595284 0.001 -0.0103371 -0.0595284 0 -0.00550743 -0.0608225 0 -0.0025 -5.63338e-17 0 -0.00599422 -0.0399391 0 -0.00337522 -0.0200458 0 -0.0103371 0.0595284 0 -0.00337522 0.0200458 0 -0.00599422 0.0399391 0 -0.00550743 0.0608225 0 0.0025 -5.75584e-17 0 0.00160575 0.0204816 0 -0.00107018 0.0408073 0 -0.00107018 -0.0408073 0 0.00160575 -0.0204816 0 -0.00550743 -0.0608225 0 -0.00550743 -0.0608225 0.001 0.0025 -5.75584e-17 0.001 -0.00107018 -0.0408073 0.001 0.00160575 -0.0204816 0.001 0.0025 -5.75584e-17 0 -0.00107018 -0.0408073 0 0.00160575 -0.0204816 0 -0.0103371 -0.0595284 0.001 -0.00550743 -0.0608225 0.001 -0.0025 -5.63338e-17 0.001 -0.00599422 -0.0399391 0.001 -0.00337522 -0.0200458 0.001 -0.0103371 0.0595284 0.001 -0.00337522 0.0200458 0.001 -0.00599422 0.0399391 0.001 -0.00550743 0.0608225 0.001 0.0025 -5.75584e-17 0.001 0.00160575 0.0204816 0.001 -0.00107018 0.0408073 0.001 -0.00107018 -0.0408073 0.001 0.00160575 -0.0204816 0.001 -0.0103371 -0.0595284 0 -0.0103371 -0.0595284 0.001 -0.0025 -5.63338e-17 0.001 -0.00599422 -0.0399391 0.001 -0.00337522 -0.0200458 0.001 -0.0025 -5.63338e-17 0 -0.00599422 -0.0399391 0 -0.00337522 -0.0200458 0 -0.0025 -5.63338e-17 0 -0.0025 -5.63338e-17 0.001 -0.0103371 0.0595284 0.001 -0.00337522 0.0200458 0.001 -0.00599422 0.0399391 0.001 -0.0103371 0.0595284 0 -0.00337522 0.0200458 0 -0.00599422 0.0399391 0 -0.0103371 0.0595284 0 -0.00550743 0.0608225 0 -0.00550743 0.0608225 0.001 -0.0103371 0.0595284 0.001 0.0025 -5.75584e-17 0 0.0025 -5.75584e-17 0.001 -0.00550743 0.0608225 0.001 0.00160575 0.0204816 0.001 -0.00107018 0.0408073 0.001 -0.00550743 0.0608225 0 0.00160575 0.0204816 0 -0.00107018 0.0408073 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0118602 -0.0710976 0 -0.00703055 -0.0723917 0 -0.00703055 -0.0723917 0.001 -0.0118602 -0.0710976 0.001 -0.0118602 -0.0710976 0 -0.00703055 -0.0723917 0 -0.0025 -6.72821e-17 0 -0.00667331 -0.0477012 0 -0.00354532 -0.0239417 0 -0.0118602 0.0710976 0 -0.00354532 0.0239417 0 -0.00667331 0.0477012 0 -0.00703055 0.0723917 0 0.0025 -6.85067e-17 0 0.00143566 0.0243775 0 -0.00174927 0.0485694 0 -0.00174927 -0.0485694 0 0.00143566 -0.0243775 0 -0.00703055 -0.0723917 0 -0.00703055 -0.0723917 0.001 0.0025 -6.85067e-17 0.001 -0.00174927 -0.0485694 0.001 0.00143566 -0.0243775 0.001 0.0025 -6.85067e-17 0 -0.00174927 -0.0485694 0 0.00143566 -0.0243775 0 -0.0118602 -0.0710976 0.001 -0.00703055 -0.0723917 0.001 -0.0025 -6.72821e-17 0.001 -0.00667331 -0.0477012 0.001 -0.00354532 -0.0239417 0.001 -0.0118602 0.0710976 0.001 -0.00354532 0.0239417 0.001 -0.00667331 0.0477012 0.001 -0.00703055 0.0723917 0.001 0.0025 -6.85067e-17 0.001 0.00143566 0.0243775 0.001 -0.00174927 0.0485694 0.001 -0.00174927 -0.0485694 0.001 0.00143566 -0.0243775 0.001 -0.0118602 -0.0710976 0 -0.0118602 -0.0710976 0.001 -0.0025 -6.72821e-17 0.001 -0.00667331 -0.0477012 0.001 -0.00354532 -0.0239417 0.001 -0.0025 -6.72821e-17 0 -0.00667331 -0.0477012 0 -0.00354532 -0.0239417 0 -0.0025 -6.72821e-17 0 -0.0025 -6.72821e-17 0.001 -0.0118602 0.0710976 0.001 -0.00354532 0.0239417 0.001 -0.00667331 0.0477012 0.001 -0.0118602 0.0710976 0 -0.00354532 0.0239417 0 -0.00667331 0.0477012 0 -0.0118602 0.0710976 0 -0.00703055 0.0723917 0 -0.00703055 0.0723917 0.001 -0.0118602 0.0710976 0.001 0.0025 -6.85067e-17 0 0.0025 -6.85067e-17 0.001 -0.00703055 0.0723917 0.001 0.00143566 0.0243775 0.001 -0.00174927 0.0485694 0.001 -0.00703055 0.0723917 0 0.00143566 0.0243775 0 -0.00174927 0.0485694 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0120305 -0.0723917 0 -0.00720092 -0.0736858 0 -0.00720092 -0.0736858 0.001 -0.0120305 -0.0723917 0.001 -0.0120305 -0.0723917 0 -0.00720092 -0.0736858 0 -0.0025 -6.85067e-17 0 -0.00674927 -0.0485694 0 -0.00356434 -0.0243775 0 -0.0120305 0.0723917 0 -0.00356434 0.0243775 0 -0.00674927 0.0485694 0 -0.00720092 0.0736858 0 0.0025 -6.97314e-17 0 0.00141663 0.0248132 0 -0.00182523 0.0494376 0 -0.00182523 -0.0494376 0 0.00141663 -0.0248132 0 -0.00720092 -0.0736858 0 -0.00720092 -0.0736858 0.001 0.0025 -6.97314e-17 0.001 -0.00182523 -0.0494376 0.001 0.00141663 -0.0248132 0.001 0.0025 -6.97314e-17 0 -0.00182523 -0.0494376 0 0.00141663 -0.0248132 0 -0.0120305 -0.0723917 0.001 -0.00720092 -0.0736858 0.001 -0.0025 -6.85067e-17 0.001 -0.00674927 -0.0485694 0.001 -0.00356434 -0.0243775 0.001 -0.0120305 0.0723917 0.001 -0.00356434 0.0243775 0.001 -0.00674927 0.0485694 0.001 -0.00720092 0.0736858 0.001 0.0025 -6.97314e-17 0.001 0.00141663 0.0248132 0.001 -0.00182523 0.0494376 0.001 -0.00182523 -0.0494376 0.001 0.00141663 -0.0248132 0.001 -0.0120305 -0.0723917 0 -0.0120305 -0.0723917 0.001 -0.0025 -6.85067e-17 0.001 -0.00674927 -0.0485694 0.001 -0.00356434 -0.0243775 0.001 -0.0025 -6.85067e-17 0 -0.00674927 -0.0485694 0 -0.00356434 -0.0243775 0 -0.0025 -6.85067e-17 0 -0.0025 -6.85067e-17 0.001 -0.0120305 0.0723917 0.001 -0.00356434 0.0243775 0.001 -0.00674927 0.0485694 0.001 -0.0120305 0.0723917 0 -0.00356434 0.0243775 0 -0.00674927 0.0485694 0 -0.0120305 0.0723917 0 -0.00720092 0.0736858 0 -0.00720092 0.0736858 0.001 -0.0120305 0.0723917 0.001 0.0025 -6.97314e-17 0 0.0025 -6.97314e-17 0.001 -0.00720092 0.0736858 0.001 0.00141663 0.0248132 0.001 -0.00182523 0.0494376 0.001 -0.00720092 0.0736858 0 0.00141663 0.0248132 0 -0.00182523 0.0494376 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0121975 -0.0736599 0 -0.00736788 -0.074954 0 -0.00736788 -0.074954 0.001 -0.0121975 -0.0736599 0.001 -0.0121975 -0.0736599 0 -0.00736788 -0.074954 0 -0.0025 -6.97069e-17 0 -0.00682371 -0.0494203 0 -0.00358299 -0.0248045 0 -0.0121975 0.0736599 0 -0.00358299 0.0248045 0 -0.00682371 0.0494203 0 -0.00736788 0.074954 0 0.0025 -7.09315e-17 0 0.00139798 0.0252403 0 -0.00189967 0.0502885 0 -0.00189967 -0.0502885 0 0.00139798 -0.0252403 0 -0.00736788 -0.074954 0 -0.00736788 -0.074954 0.001 0.0025 -7.09315e-17 0.001 -0.00189967 -0.0502885 0.001 0.00139798 -0.0252403 0.001 0.0025 -7.09315e-17 0 -0.00189967 -0.0502885 0 0.00139798 -0.0252403 0 -0.0121975 -0.0736599 0.001 -0.00736788 -0.074954 0.001 -0.0025 -6.97069e-17 0.001 -0.00682371 -0.0494203 0.001 -0.00358299 -0.0248045 0.001 -0.0121975 0.0736599 0.001 -0.00358299 0.0248045 0.001 -0.00682371 0.0494203 0.001 -0.00736788 0.074954 0.001 0.0025 -7.09315e-17 0.001 0.00139798 0.0252403 0.001 -0.00189967 0.0502885 0.001 -0.00189967 -0.0502885 0.001 0.00139798 -0.0252403 0.001 -0.0121975 -0.0736599 0 -0.0121975 -0.0736599 0.001 -0.0025 -6.97069e-17 0.001 -0.00682371 -0.0494203 0.001 -0.00358299 -0.0248045 0.001 -0.0025 -6.97069e-17 0 -0.00682371 -0.0494203 0 -0.00358299 -0.0248045 0 -0.0025 -6.97069e-17 0 -0.0025 -6.97069e-17 0.001 -0.0121975 0.0736599 0.001 -0.00358299 0.0248045 0.001 -0.00682371 0.0494203 0.001 -0.0121975 0.0736599 0 -0.00358299 0.0248045 0 -0.00682371 0.0494203 0 -0.0121975 0.0736599 0 -0.00736788 0.074954 0 -0.00736788 0.074954 0.001 -0.0121975 0.0736599 0.001 0.0025 -7.09315e-17 0 0.0025 -7.09315e-17 0.001 -0.00736788 0.074954 0.001 0.00139798 0.0252403 0.001 -0.00189967 0.0502885 0.001 -0.00736788 0.074954 0 0.00139798 0.0252403 0 -0.00189967 0.0502885 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0123679 -0.074954 0 -0.00753825 -0.0762481 0 -0.00753825 -0.0762481 0.001 -0.0123679 -0.074954 0.001 -0.0123679 -0.074954 0 -0.00753825 -0.0762481 0 -0.0025 -7.09315e-17 0 -0.00689967 -0.0502885 0 -0.00360202 -0.0252403 0 -0.0123679 0.074954 0 -0.00360202 0.0252403 0 -0.00689967 0.0502885 0 -0.00753825 0.0762481 0 0.0025 -7.21562e-17 0 0.00137896 0.0256761 0 -0.00197564 0.0511568 0 -0.00197564 -0.0511568 0 0.00137896 -0.0256761 0 -0.00753825 -0.0762481 0 -0.00753825 -0.0762481 0.001 0.0025 -7.21562e-17 0.001 -0.00197564 -0.0511568 0.001 0.00137896 -0.0256761 0.001 0.0025 -7.21562e-17 0 -0.00197564 -0.0511568 0 0.00137896 -0.0256761 0 -0.0123679 -0.074954 0.001 -0.00753825 -0.0762481 0.001 -0.0025 -7.09315e-17 0.001 -0.00689967 -0.0502885 0.001 -0.00360202 -0.0252403 0.001 -0.0123679 0.074954 0.001 -0.00360202 0.0252403 0.001 -0.00689967 0.0502885 0.001 -0.00753825 0.0762481 0.001 0.0025 -7.21562e-17 0.001 0.00137896 0.0256761 0.001 -0.00197564 0.0511568 0.001 -0.00197564 -0.0511568 0.001 0.00137896 -0.0256761 0.001 -0.0123679 -0.074954 0 -0.0123679 -0.074954 0.001 -0.0025 -7.09315e-17 0.001 -0.00689967 -0.0502885 0.001 -0.00360202 -0.0252403 0.001 -0.0025 -7.09315e-17 0 -0.00689967 -0.0502885 0 -0.00360202 -0.0252403 0 -0.0025 -7.09315e-17 0 -0.0025 -7.09315e-17 0.001 -0.0123679 0.074954 0.001 -0.00360202 0.0252403 0.001 -0.00689967 0.0502885 0.001 -0.0123679 0.074954 0 -0.00360202 0.0252403 0 -0.00689967 0.0502885 0 -0.0123679 0.074954 0 -0.00753825 0.0762481 0 -0.00753825 0.0762481 0.001 -0.0123679 0.074954 0.001 0.0025 -7.21562e-17 0 0.0025 -7.21562e-17 0.001 -0.00753825 0.0762481 0.001 0.00137896 0.0256761 0.001 -0.00197564 0.0511568 0.001 -0.00753825 0.0762481 0 0.00137896 0.0256761 0 -0.00197564 0.0511568 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0125383 -0.0762481 0 -0.00770862 -0.0775422 0 -0.00770862 -0.0775422 0.001 -0.0125383 -0.0762481 0.001 -0.0125383 -0.0762481 0 -0.00770862 -0.0775422 0 -0.0025 -7.21562e-17 0 -0.00697564 -0.0511568 0 -0.00362104 -0.0256761 0 -0.0125383 0.0762481 0 -0.00362104 0.0256761 0 -0.00697564 0.0511568 0 -0.00770862 0.0775422 0 0.0025 -7.33808e-17 0 0.00135993 0.0261119 0 -0.0020516 0.052025 0 -0.0020516 -0.052025 0 0.00135993 -0.0261119 0 -0.00770862 -0.0775422 0 -0.00770862 -0.0775422 0.001 0.0025 -7.33808e-17 0.001 -0.0020516 -0.052025 0.001 0.00135993 -0.0261119 0.001 0.0025 -7.33808e-17 0 -0.0020516 -0.052025 0 0.00135993 -0.0261119 0 -0.0125383 -0.0762481 0.001 -0.00770862 -0.0775422 0.001 -0.0025 -7.21562e-17 0.001 -0.00697564 -0.0511568 0.001 -0.00362104 -0.0256761 0.001 -0.0125383 0.0762481 0.001 -0.00362104 0.0256761 0.001 -0.00697564 0.0511568 0.001 -0.00770862 0.0775422 0.001 0.0025 -7.33808e-17 0.001 0.00135993 0.0261119 0.001 -0.0020516 0.052025 0.001 -0.0020516 -0.052025 0.001 0.00135993 -0.0261119 0.001 -0.0125383 -0.0762481 0 -0.0125383 -0.0762481 0.001 -0.0025 -7.21562e-17 0.001 -0.00697564 -0.0511568 0.001 -0.00362104 -0.0256761 0.001 -0.0025 -7.21562e-17 0 -0.00697564 -0.0511568 0 -0.00362104 -0.0256761 0 -0.0025 -7.21562e-17 0 -0.0025 -7.21562e-17 0.001 -0.0125383 0.0762481 0.001 -0.00362104 0.0256761 0.001 -0.00697564 0.0511568 0.001 -0.0125383 0.0762481 0 -0.00362104 0.0256761 0 -0.00697564 0.0511568 0 -0.0125383 0.0762481 0 -0.00770862 0.0775422 0 -0.00770862 0.0775422 0.001 -0.0125383 0.0762481 0.001 0.0025 -7.33808e-17 0 0.0025 -7.33808e-17 0.001 -0.00770862 0.0775422 0.001 0.00135993 0.0261119 0.001 -0.0020516 0.052025 0.001 -0.00770862 0.0775422 0 0.00135993 0.0261119 0 -0.0020516 0.052025 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0127052 -0.0775163 0 -0.00787559 -0.0788104 0 -0.00787559 -0.0788104 0.001 -0.0127052 -0.0775163 0.001 -0.0127052 -0.0775163 0 -0.00787559 -0.0788104 0 -0.0025 -7.33563e-17 0 -0.00705008 -0.0520076 0 -0.00363969 -0.0261031 0 -0.0127052 0.0775163 0 -0.00363969 0.0261031 0 -0.00705008 0.0520076 0 -0.00787559 0.0788104 0 0.0025 -7.4581e-17 0 0.00134129 0.0265389 0 -0.00212604 0.0528759 0 -0.00212604 -0.0528759 0 0.00134129 -0.0265389 0 -0.00787559 -0.0788104 0 -0.00787559 -0.0788104 0.001 0.0025 -7.4581e-17 0.001 -0.00212604 -0.0528759 0.001 0.00134129 -0.0265389 0.001 0.0025 -7.4581e-17 0 -0.00212604 -0.0528759 0 0.00134129 -0.0265389 0 -0.0127052 -0.0775163 0.001 -0.00787559 -0.0788104 0.001 -0.0025 -7.33563e-17 0.001 -0.00705008 -0.0520076 0.001 -0.00363969 -0.0261031 0.001 -0.0127052 0.0775163 0.001 -0.00363969 0.0261031 0.001 -0.00705008 0.0520076 0.001 -0.00787559 0.0788104 0.001 0.0025 -7.4581e-17 0.001 0.00134129 0.0265389 0.001 -0.00212604 0.0528759 0.001 -0.00212604 -0.0528759 0.001 0.00134129 -0.0265389 0.001 -0.0127052 -0.0775163 0 -0.0127052 -0.0775163 0.001 -0.0025 -7.33563e-17 0.001 -0.00705008 -0.0520076 0.001 -0.00363969 -0.0261031 0.001 -0.0025 -7.33563e-17 0 -0.00705008 -0.0520076 0 -0.00363969 -0.0261031 0 -0.0025 -7.33563e-17 0 -0.0025 -7.33563e-17 0.001 -0.0127052 0.0775163 0.001 -0.00363969 0.0261031 0.001 -0.00705008 0.0520076 0.001 -0.0127052 0.0775163 0 -0.00363969 0.0261031 0 -0.00705008 0.0520076 0 -0.0127052 0.0775163 0 -0.00787559 0.0788104 0 -0.00787559 0.0788104 0.001 -0.0127052 0.0775163 0.001 0.0025 -7.4581e-17 0 0.0025 -7.4581e-17 0.001 -0.00787559 0.0788104 0.001 0.00134129 0.0265389 0.001 -0.00212604 0.0528759 0.001 -0.00787559 0.0788104 0 0.00134129 0.0265389 0 -0.00212604 0.0528759 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0128756 -0.0788104 0 -0.00804596 -0.0801045 0 -0.00804596 -0.0801045 0.001 -0.0128756 -0.0788104 0.001 -0.0128756 -0.0788104 0 -0.00804596 -0.0801045 0 -0.0025 -7.4581e-17 0 -0.00712604 -0.0528759 0 -0.00365871 -0.0265389 0 -0.0128756 0.0788104 0 -0.00365871 0.0265389 0 -0.00712604 0.0528759 0 -0.00804596 0.0801045 0 0.0025 -7.58056e-17 0 0.00132226 0.0269747 0 -0.002202 0.0537441 0 -0.002202 -0.0537441 0 0.00132226 -0.0269747 0 -0.00804596 -0.0801045 0 -0.00804596 -0.0801045 0.001 0.0025 -7.58056e-17 0.001 -0.002202 -0.0537441 0.001 0.00132226 -0.0269747 0.001 0.0025 -7.58056e-17 0 -0.002202 -0.0537441 0 0.00132226 -0.0269747 0 -0.0128756 -0.0788104 0.001 -0.00804596 -0.0801045 0.001 -0.0025 -7.4581e-17 0.001 -0.00712604 -0.0528759 0.001 -0.00365871 -0.0265389 0.001 -0.0128756 0.0788104 0.001 -0.00365871 0.0265389 0.001 -0.00712604 0.0528759 0.001 -0.00804596 0.0801045 0.001 0.0025 -7.58056e-17 0.001 0.00132226 0.0269747 0.001 -0.002202 0.0537441 0.001 -0.002202 -0.0537441 0.001 0.00132226 -0.0269747 0.001 -0.0128756 -0.0788104 0 -0.0128756 -0.0788104 0.001 -0.0025 -7.4581e-17 0.001 -0.00712604 -0.0528759 0.001 -0.00365871 -0.0265389 0.001 -0.0025 -7.4581e-17 0 -0.00712604 -0.0528759 0 -0.00365871 -0.0265389 0 -0.0025 -7.4581e-17 0 -0.0025 -7.4581e-17 0.001 -0.0128756 0.0788104 0.001 -0.00365871 0.0265389 0.001 -0.00712604 0.0528759 0.001 -0.0128756 0.0788104 0 -0.00365871 0.0265389 0 -0.00712604 0.0528759 0 -0.0128756 0.0788104 0 -0.00804596 0.0801045 0 -0.00804596 0.0801045 0.001 -0.0128756 0.0788104 0.001 0.0025 -7.58056e-17 0 0.0025 -7.58056e-17 0.001 -0.00804596 0.0801045 0.001 0.00132226 0.0269747 0.001 -0.002202 0.0537441 0.001 -0.00804596 0.0801045 0 0.00132226 0.0269747 0 -0.002202 0.0537441 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0130425 -0.0800786 0 -0.00821292 -0.0813727 0 -0.00821292 -0.0813727 0.001 -0.0130425 -0.0800786 0.001 -0.0130425 -0.0800786 0 -0.00821292 -0.0813727 0 -0.0025 -7.57811e-17 0 -0.00720048 -0.0537267 0 -0.00367736 -0.026966 0 -0.0130425 0.0800786 0 -0.00367736 0.026966 0 -0.00720048 0.0537267 0 -0.00821292 0.0813727 0 0.0025 -7.70058e-17 0 0.00130361 0.0274018 0 -0.00227644 0.054595 0 -0.00227644 -0.054595 0 0.00130361 -0.0274018 0 -0.00821292 -0.0813727 0 -0.00821292 -0.0813727 0.001 0.0025 -7.70058e-17 0.001 -0.00227644 -0.054595 0.001 0.00130361 -0.0274018 0.001 0.0025 -7.70058e-17 0 -0.00227644 -0.054595 0 0.00130361 -0.0274018 0 -0.0130425 -0.0800786 0.001 -0.00821292 -0.0813727 0.001 -0.0025 -7.57811e-17 0.001 -0.00720048 -0.0537267 0.001 -0.00367736 -0.026966 0.001 -0.0130425 0.0800786 0.001 -0.00367736 0.026966 0.001 -0.00720048 0.0537267 0.001 -0.00821292 0.0813727 0.001 0.0025 -7.70058e-17 0.001 0.00130361 0.0274018 0.001 -0.00227644 0.054595 0.001 -0.00227644 -0.054595 0.001 0.00130361 -0.0274018 0.001 -0.0130425 -0.0800786 0 -0.0130425 -0.0800786 0.001 -0.0025 -7.57811e-17 0.001 -0.00720048 -0.0537267 0.001 -0.00367736 -0.026966 0.001 -0.0025 -7.57811e-17 0 -0.00720048 -0.0537267 0 -0.00367736 -0.026966 0 -0.0025 -7.57811e-17 0 -0.0025 -7.57811e-17 0.001 -0.0130425 0.0800786 0.001 -0.00367736 0.026966 0.001 -0.00720048 0.0537267 0.001 -0.0130425 0.0800786 0 -0.00367736 0.026966 0 -0.00720048 0.0537267 0 -0.0130425 0.0800786 0 -0.00821292 0.0813727 0 -0.00821292 0.0813727 0.001 -0.0130425 0.0800786 0.001 0.0025 -7.70058e-17 0 0.0025 -7.70058e-17 0.001 -0.00821292 0.0813727 0.001 0.00130361 0.0274018 0.001 -0.00227644 0.054595 0.001 -0.00821292 0.0813727 0 0.00130361 0.0274018 0 -0.00227644 0.054595 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0132129 -0.0813727 0 -0.00838329 -0.0826668 0 -0.00838329 -0.0826668 0.001 -0.0132129 -0.0813727 0.001 -0.0132129 -0.0813727 0 -0.00838329 -0.0826668 0 -0.0025 -7.70058e-17 0 -0.00727644 -0.054595 0 -0.00369639 -0.0274018 0 -0.0132129 0.0813727 0 -0.00369639 0.0274018 0 -0.00727644 0.054595 0 -0.00838329 0.0826668 0 0.0025 -7.82304e-17 0 0.00128459 0.0278375 0 -0.0023524 0.0554632 0 -0.0023524 -0.0554632 0 0.00128459 -0.0278375 0 -0.00838329 -0.0826668 0 -0.00838329 -0.0826668 0.001 0.0025 -7.82304e-17 0.001 -0.0023524 -0.0554632 0.001 0.00128459 -0.0278375 0.001 0.0025 -7.82304e-17 0 -0.0023524 -0.0554632 0 0.00128459 -0.0278375 0 -0.0132129 -0.0813727 0.001 -0.00838329 -0.0826668 0.001 -0.0025 -7.70058e-17 0.001 -0.00727644 -0.054595 0.001 -0.00369639 -0.0274018 0.001 -0.0132129 0.0813727 0.001 -0.00369639 0.0274018 0.001 -0.00727644 0.054595 0.001 -0.00838329 0.0826668 0.001 0.0025 -7.82304e-17 0.001 0.00128459 0.0278375 0.001 -0.0023524 0.0554632 0.001 -0.0023524 -0.0554632 0.001 0.00128459 -0.0278375 0.001 -0.0132129 -0.0813727 0 -0.0132129 -0.0813727 0.001 -0.0025 -7.70058e-17 0.001 -0.00727644 -0.054595 0.001 -0.00369639 -0.0274018 0.001 -0.0025 -7.70058e-17 0 -0.00727644 -0.054595 0 -0.00369639 -0.0274018 0 -0.0025 -7.70058e-17 0 -0.0025 -7.70058e-17 0.001 -0.0132129 0.0813727 0.001 -0.00369639 0.0274018 0.001 -0.00727644 0.054595 0.001 -0.0132129 0.0813727 0 -0.00369639 0.0274018 0 -0.00727644 0.054595 0 -0.0132129 0.0813727 0 -0.00838329 0.0826668 0 -0.00838329 0.0826668 0.001 -0.0132129 0.0813727 0.001 0.0025 -7.82304e-17 0 0.0025 -7.82304e-17 0.001 -0.00838329 0.0826668 0.001 0.00128459 0.0278375 0.001 -0.0023524 0.0554632 0.001 -0.00838329 0.0826668 0 0.00128459 0.0278375 0 -0.0023524 0.0554632 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0133833 -0.0826668 0 -0.00855366 -0.0839609 0 -0.00855366 -0.0839609 0.001 -0.0133833 -0.0826668 0.001 -0.0133833 -0.0826668 0 -0.00855366 -0.0839609 0 -0.0025 -7.82304e-17 0 -0.0073524 -0.0554632 0 -0.00371541 -0.0278375 0 -0.0133833 0.0826668 0 -0.00371541 0.0278375 0 -0.0073524 0.0554632 0 -0.00855366 0.0839609 0 0.0025 -7.94551e-17 0 0.00126556 0.0282733 0 -0.00242836 0.0563315 0 -0.00242836 -0.0563315 0 0.00126556 -0.0282733 0 -0.00855366 -0.0839609 0 -0.00855366 -0.0839609 0.001 0.0025 -7.94551e-17 0.001 -0.00242836 -0.0563315 0.001 0.00126556 -0.0282733 0.001 0.0025 -7.94551e-17 0 -0.00242836 -0.0563315 0 0.00126556 -0.0282733 0 -0.0133833 -0.0826668 0.001 -0.00855366 -0.0839609 0.001 -0.0025 -7.82304e-17 0.001 -0.0073524 -0.0554632 0.001 -0.00371541 -0.0278375 0.001 -0.0133833 0.0826668 0.001 -0.00371541 0.0278375 0.001 -0.0073524 0.0554632 0.001 -0.00855366 0.0839609 0.001 0.0025 -7.94551e-17 0.001 0.00126556 0.0282733 0.001 -0.00242836 0.0563315 0.001 -0.00242836 -0.0563315 0.001 0.00126556 -0.0282733 0.001 -0.0133833 -0.0826668 0 -0.0133833 -0.0826668 0.001 -0.0025 -7.82304e-17 0.001 -0.0073524 -0.0554632 0.001 -0.00371541 -0.0278375 0.001 -0.0025 -7.82304e-17 0 -0.0073524 -0.0554632 0 -0.00371541 -0.0278375 0 -0.0025 -7.82304e-17 0 -0.0025 -7.82304e-17 0.001 -0.0133833 0.0826668 0.001 -0.00371541 0.0278375 0.001 -0.0073524 0.0554632 0.001 -0.0133833 0.0826668 0 -0.00371541 0.0278375 0 -0.0073524 0.0554632 0 -0.0133833 0.0826668 0 -0.00855366 0.0839609 0 -0.00855366 0.0839609 0.001 -0.0133833 0.0826668 0.001 0.0025 -7.94551e-17 0 0.0025 -7.94551e-17 0.001 -0.00855366 0.0839609 0.001 0.00126556 0.0282733 0.001 -0.00242836 0.0563315 0.001 -0.00855366 0.0839609 0 0.00126556 0.0282733 0 -0.00242836 0.0563315 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.010504 -0.0607966 0 -0.00567439 -0.0620907 0 -0.00567439 -0.0620907 0.001 -0.010504 -0.0607966 0.001 -0.010504 -0.0607966 0 -0.00567439 -0.0620907 0 -0.0025 -5.75339e-17 0 -0.00606866 -0.04079 0 -0.00339387 -0.0204729 0 -0.010504 0.0607966 0 -0.00339387 0.0204729 0 -0.00606866 0.04079 0 -0.00567439 0.0620907 0 0.0025 -5.87586e-17 0 0.00158711 0.0209087 0 -0.00114462 0.0416582 0 -0.00114462 -0.0416582 0 0.00158711 -0.0209087 0 -0.00567439 -0.0620907 0 -0.00567439 -0.0620907 0.001 0.0025 -5.87586e-17 0.001 -0.00114462 -0.0416582 0.001 0.00158711 -0.0209087 0.001 0.0025 -5.87586e-17 0 -0.00114462 -0.0416582 0 0.00158711 -0.0209087 0 -0.010504 -0.0607966 0.001 -0.00567439 -0.0620907 0.001 -0.0025 -5.75339e-17 0.001 -0.00606866 -0.04079 0.001 -0.00339387 -0.0204729 0.001 -0.010504 0.0607966 0.001 -0.00339387 0.0204729 0.001 -0.00606866 0.04079 0.001 -0.00567439 0.0620907 0.001 0.0025 -5.87586e-17 0.001 0.00158711 0.0209087 0.001 -0.00114462 0.0416582 0.001 -0.00114462 -0.0416582 0.001 0.00158711 -0.0209087 0.001 -0.010504 -0.0607966 0 -0.010504 -0.0607966 0.001 -0.0025 -5.75339e-17 0.001 -0.00606866 -0.04079 0.001 -0.00339387 -0.0204729 0.001 -0.0025 -5.75339e-17 0 -0.00606866 -0.04079 0 -0.00339387 -0.0204729 0 -0.0025 -5.75339e-17 0 -0.0025 -5.75339e-17 0.001 -0.010504 0.0607966 0.001 -0.00339387 0.0204729 0.001 -0.00606866 0.04079 0.001 -0.010504 0.0607966 0 -0.00339387 0.0204729 0 -0.00606866 0.04079 0 -0.010504 0.0607966 0 -0.00567439 0.0620907 0 -0.00567439 0.0620907 0.001 -0.010504 0.0607966 0.001 0.0025 -5.87586e-17 0 0.0025 -5.87586e-17 0.001 -0.00567439 0.0620907 0.001 0.00158711 0.0209087 0.001 -0.00114462 0.0416582 0.001 -0.00567439 0.0620907 0 0.00158711 0.0209087 0 -0.00114462 0.0416582 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0135503 -0.083935 0 -0.00872063 -0.0852291 0 -0.00872063 -0.0852291 0.001 -0.0135503 -0.083935 0.001 -0.0135503 -0.083935 0 -0.00872063 -0.0852291 0 -0.0025 -7.94306e-17 0 -0.00742685 -0.0563141 0 -0.00373406 -0.0282646 0 -0.0135503 0.083935 0 -0.00373406 0.0282646 0 -0.00742685 0.0563141 0 -0.00872063 0.0852291 0 0.0025 -8.06552e-17 0 0.00124691 0.0287004 0 -0.00250281 0.0571823 0 -0.00250281 -0.0571823 0 0.00124691 -0.0287004 0 -0.00872063 -0.0852291 0 -0.00872063 -0.0852291 0.001 0.0025 -8.06552e-17 0.001 -0.00250281 -0.0571823 0.001 0.00124691 -0.0287004 0.001 0.0025 -8.06552e-17 0 -0.00250281 -0.0571823 0 0.00124691 -0.0287004 0 -0.0135503 -0.083935 0.001 -0.00872063 -0.0852291 0.001 -0.0025 -7.94306e-17 0.001 -0.00742685 -0.0563141 0.001 -0.00373406 -0.0282646 0.001 -0.0135503 0.083935 0.001 -0.00373406 0.0282646 0.001 -0.00742685 0.0563141 0.001 -0.00872063 0.0852291 0.001 0.0025 -8.06552e-17 0.001 0.00124691 0.0287004 0.001 -0.00250281 0.0571823 0.001 -0.00250281 -0.0571823 0.001 0.00124691 -0.0287004 0.001 -0.0135503 -0.083935 0 -0.0135503 -0.083935 0.001 -0.0025 -7.94306e-17 0.001 -0.00742685 -0.0563141 0.001 -0.00373406 -0.0282646 0.001 -0.0025 -7.94306e-17 0 -0.00742685 -0.0563141 0 -0.00373406 -0.0282646 0 -0.0025 -7.94306e-17 0 -0.0025 -7.94306e-17 0.001 -0.0135503 0.083935 0.001 -0.00373406 0.0282646 0.001 -0.00742685 0.0563141 0.001 -0.0135503 0.083935 0 -0.00373406 0.0282646 0 -0.00742685 0.0563141 0 -0.0135503 0.083935 0 -0.00872063 0.0852291 0 -0.00872063 0.0852291 0.001 -0.0135503 0.083935 0.001 0.0025 -8.06552e-17 0 0.0025 -8.06552e-17 0.001 -0.00872063 0.0852291 0.001 0.00124691 0.0287004 0.001 -0.00250281 0.0571823 0.001 -0.00872063 0.0852291 0 0.00124691 0.0287004 0 -0.00250281 0.0571823 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0137206 -0.0852291 0 -0.008891 -0.0865232 0 -0.008891 -0.0865232 0.001 -0.0137206 -0.0852291 0.001 -0.0137206 -0.0852291 0 -0.008891 -0.0865232 0 -0.0025 -8.06552e-17 0 -0.00750281 -0.0571823 0 -0.00375309 -0.0287004 0 -0.0137206 0.0852291 0 -0.00375309 0.0287004 0 -0.00750281 0.0571823 0 -0.008891 0.0865232 0 0.0025 -8.18799e-17 0 0.00122789 0.0291362 0 -0.00257877 0.0580506 0 -0.00257877 -0.0580506 0 0.00122789 -0.0291362 0 -0.008891 -0.0865232 0 -0.008891 -0.0865232 0.001 0.0025 -8.18799e-17 0.001 -0.00257877 -0.0580506 0.001 0.00122789 -0.0291362 0.001 0.0025 -8.18799e-17 0 -0.00257877 -0.0580506 0 0.00122789 -0.0291362 0 -0.0137206 -0.0852291 0.001 -0.008891 -0.0865232 0.001 -0.0025 -8.06552e-17 0.001 -0.00750281 -0.0571823 0.001 -0.00375309 -0.0287004 0.001 -0.0137206 0.0852291 0.001 -0.00375309 0.0287004 0.001 -0.00750281 0.0571823 0.001 -0.008891 0.0865232 0.001 0.0025 -8.18799e-17 0.001 0.00122789 0.0291362 0.001 -0.00257877 0.0580506 0.001 -0.00257877 -0.0580506 0.001 0.00122789 -0.0291362 0.001 -0.0137206 -0.0852291 0 -0.0137206 -0.0852291 0.001 -0.0025 -8.06552e-17 0.001 -0.00750281 -0.0571823 0.001 -0.00375309 -0.0287004 0.001 -0.0025 -8.06552e-17 0 -0.00750281 -0.0571823 0 -0.00375309 -0.0287004 0 -0.0025 -8.06552e-17 0 -0.0025 -8.06552e-17 0.001 -0.0137206 0.0852291 0.001 -0.00375309 0.0287004 0.001 -0.00750281 0.0571823 0.001 -0.0137206 0.0852291 0 -0.00375309 0.0287004 0 -0.00750281 0.0571823 0 -0.0137206 0.0852291 0 -0.008891 0.0865232 0 -0.008891 0.0865232 0.001 -0.0137206 0.0852291 0.001 0.0025 -8.18799e-17 0 0.0025 -8.18799e-17 0.001 -0.008891 0.0865232 0.001 0.00122789 0.0291362 0.001 -0.00257877 0.0580506 0.001 -0.008891 0.0865232 0 0.00122789 0.0291362 0 -0.00257877 0.0580506 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0138876 -0.0864973 0 -0.00905796 -0.0877914 0 -0.00905796 -0.0877914 0.001 -0.0138876 -0.0864973 0.001 -0.0138876 -0.0864973 0 -0.00905796 -0.0877914 0 -0.0025 -8.18554e-17 0 -0.00757725 -0.0580332 0 -0.00377173 -0.0291274 0 -0.0138876 0.0864973 0 -0.00377173 0.0291274 0 -0.00757725 0.0580332 0 -0.00905796 0.0877914 0 0.0025 -8.308e-17 0 0.00120924 0.0295632 0 -0.00265321 0.0589015 0 -0.00265321 -0.0589015 0 0.00120924 -0.0295632 0 -0.00905796 -0.0877914 0 -0.00905796 -0.0877914 0.001 0.0025 -8.308e-17 0.001 -0.00265321 -0.0589015 0.001 0.00120924 -0.0295632 0.001 0.0025 -8.308e-17 0 -0.00265321 -0.0589015 0 0.00120924 -0.0295632 0 -0.0138876 -0.0864973 0.001 -0.00905796 -0.0877914 0.001 -0.0025 -8.18554e-17 0.001 -0.00757725 -0.0580332 0.001 -0.00377173 -0.0291274 0.001 -0.0138876 0.0864973 0.001 -0.00377173 0.0291274 0.001 -0.00757725 0.0580332 0.001 -0.00905796 0.0877914 0.001 0.0025 -8.308e-17 0.001 0.00120924 0.0295632 0.001 -0.00265321 0.0589015 0.001 -0.00265321 -0.0589015 0.001 0.00120924 -0.0295632 0.001 -0.0138876 -0.0864973 0 -0.0138876 -0.0864973 0.001 -0.0025 -8.18554e-17 0.001 -0.00757725 -0.0580332 0.001 -0.00377173 -0.0291274 0.001 -0.0025 -8.18554e-17 0 -0.00757725 -0.0580332 0 -0.00377173 -0.0291274 0 -0.0025 -8.18554e-17 0 -0.0025 -8.18554e-17 0.001 -0.0138876 0.0864973 0.001 -0.00377173 0.0291274 0.001 -0.00757725 0.0580332 0.001 -0.0138876 0.0864973 0 -0.00377173 0.0291274 0 -0.00757725 0.0580332 0 -0.0138876 0.0864973 0 -0.00905796 0.0877914 0 -0.00905796 0.0877914 0.001 -0.0138876 0.0864973 0.001 0.0025 -8.308e-17 0 0.0025 -8.308e-17 0.001 -0.00905796 0.0877914 0.001 0.00120924 0.0295632 0.001 -0.00265321 0.0589015 0.001 -0.00905796 0.0877914 0 0.00120924 0.0295632 0 -0.00265321 0.0589015 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.014058 -0.0877914 0 -0.00922833 -0.0890855 0 -0.00922833 -0.0890855 0.001 -0.014058 -0.0877914 0.001 -0.014058 -0.0877914 0 -0.00922833 -0.0890855 0 -0.0025 -8.308e-17 0 -0.00765321 -0.0589015 0 -0.00379076 -0.0295632 0 -0.014058 0.0877914 0 -0.00379076 0.0295632 0 -0.00765321 0.0589015 0 -0.00922833 0.0890855 0 0.0025 -8.43047e-17 0 0.00119022 0.029999 0 -0.00272917 0.0597697 0 -0.00272917 -0.0597697 0 0.00119022 -0.029999 0 -0.00922833 -0.0890855 0 -0.00922833 -0.0890855 0.001 0.0025 -8.43047e-17 0.001 -0.00272917 -0.0597697 0.001 0.00119022 -0.029999 0.001 0.0025 -8.43047e-17 0 -0.00272917 -0.0597697 0 0.00119022 -0.029999 0 -0.014058 -0.0877914 0.001 -0.00922833 -0.0890855 0.001 -0.0025 -8.308e-17 0.001 -0.00765321 -0.0589015 0.001 -0.00379076 -0.0295632 0.001 -0.014058 0.0877914 0.001 -0.00379076 0.0295632 0.001 -0.00765321 0.0589015 0.001 -0.00922833 0.0890855 0.001 0.0025 -8.43047e-17 0.001 0.00119022 0.029999 0.001 -0.00272917 0.0597697 0.001 -0.00272917 -0.0597697 0.001 0.00119022 -0.029999 0.001 -0.014058 -0.0877914 0 -0.014058 -0.0877914 0.001 -0.0025 -8.308e-17 0.001 -0.00765321 -0.0589015 0.001 -0.00379076 -0.0295632 0.001 -0.0025 -8.308e-17 0 -0.00765321 -0.0589015 0 -0.00379076 -0.0295632 0 -0.0025 -8.308e-17 0 -0.0025 -8.308e-17 0.001 -0.014058 0.0877914 0.001 -0.00379076 0.0295632 0.001 -0.00765321 0.0589015 0.001 -0.014058 0.0877914 0 -0.00379076 0.0295632 0 -0.00765321 0.0589015 0 -0.014058 0.0877914 0 -0.00922833 0.0890855 0 -0.00922833 0.0890855 0.001 -0.014058 0.0877914 0.001 0.0025 -8.43047e-17 0 0.0025 -8.43047e-17 0.001 -0.00922833 0.0890855 0.001 0.00119022 0.029999 0.001 -0.00272917 0.0597697 0.001 -0.00922833 0.0890855 0 0.00119022 0.029999 0 -0.00272917 0.0597697 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0142249 -0.0890596 0 -0.00939529 -0.0903537 0 -0.00939529 -0.0903537 0.001 -0.0142249 -0.0890596 0.001 -0.0142249 -0.0890596 0 -0.00939529 -0.0903537 0 -0.0025 -8.42802e-17 0 -0.00772765 -0.0597523 0 -0.0038094 -0.0299903 0 -0.0142249 0.0890596 0 -0.0038094 0.0299903 0 -0.00772765 0.0597523 0 -0.00939529 0.0903537 0 0.0025 -8.55048e-17 0 0.00117157 0.0304261 0 -0.00280361 0.0606206 0 -0.00280361 -0.0606206 0 0.00117157 -0.0304261 0 -0.00939529 -0.0903537 0 -0.00939529 -0.0903537 0.001 0.0025 -8.55048e-17 0.001 -0.00280361 -0.0606206 0.001 0.00117157 -0.0304261 0.001 0.0025 -8.55048e-17 0 -0.00280361 -0.0606206 0 0.00117157 -0.0304261 0 -0.0142249 -0.0890596 0.001 -0.00939529 -0.0903537 0.001 -0.0025 -8.42802e-17 0.001 -0.00772765 -0.0597523 0.001 -0.0038094 -0.0299903 0.001 -0.0142249 0.0890596 0.001 -0.0038094 0.0299903 0.001 -0.00772765 0.0597523 0.001 -0.00939529 0.0903537 0.001 0.0025 -8.55048e-17 0.001 0.00117157 0.0304261 0.001 -0.00280361 0.0606206 0.001 -0.00280361 -0.0606206 0.001 0.00117157 -0.0304261 0.001 -0.0142249 -0.0890596 0 -0.0142249 -0.0890596 0.001 -0.0025 -8.42802e-17 0.001 -0.00772765 -0.0597523 0.001 -0.0038094 -0.0299903 0.001 -0.0025 -8.42802e-17 0 -0.00772765 -0.0597523 0 -0.0038094 -0.0299903 0 -0.0025 -8.42802e-17 0 -0.0025 -8.42802e-17 0.001 -0.0142249 0.0890596 0.001 -0.0038094 0.0299903 0.001 -0.00772765 0.0597523 0.001 -0.0142249 0.0890596 0 -0.0038094 0.0299903 0 -0.00772765 0.0597523 0 -0.0142249 0.0890596 0 -0.00939529 0.0903537 0 -0.00939529 0.0903537 0.001 -0.0142249 0.0890596 0.001 0.0025 -8.55048e-17 0 0.0025 -8.55048e-17 0.001 -0.00939529 0.0903537 0.001 0.00117157 0.0304261 0.001 -0.00280361 0.0606206 0.001 -0.00939529 0.0903537 0 0.00117157 0.0304261 0 -0.00280361 0.0606206 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0143953 -0.0903537 0 -0.00956566 -0.0916478 0 -0.00956566 -0.0916478 0.001 -0.0143953 -0.0903537 0.001 -0.0143953 -0.0903537 0 -0.00956566 -0.0916478 0 -0.0025 -8.55048e-17 0 -0.00780361 -0.0606206 0 -0.00382843 -0.0304261 0 -0.0143953 0.0903537 0 -0.00382843 0.0304261 0 -0.00780361 0.0606206 0 -0.00956566 0.0916478 0 0.0025 -8.67295e-17 0 0.00115254 0.0308618 0 -0.00287957 0.0614888 0 -0.00287957 -0.0614888 0 0.00115254 -0.0308618 0 -0.00956566 -0.0916478 0 -0.00956566 -0.0916478 0.001 0.0025 -8.67295e-17 0.001 -0.00287957 -0.0614888 0.001 0.00115254 -0.0308618 0.001 0.0025 -8.67295e-17 0 -0.00287957 -0.0614888 0 0.00115254 -0.0308618 0 -0.0143953 -0.0903537 0.001 -0.00956566 -0.0916478 0.001 -0.0025 -8.55048e-17 0.001 -0.00780361 -0.0606206 0.001 -0.00382843 -0.0304261 0.001 -0.0143953 0.0903537 0.001 -0.00382843 0.0304261 0.001 -0.00780361 0.0606206 0.001 -0.00956566 0.0916478 0.001 0.0025 -8.67295e-17 0.001 0.00115254 0.0308618 0.001 -0.00287957 0.0614888 0.001 -0.00287957 -0.0614888 0.001 0.00115254 -0.0308618 0.001 -0.0143953 -0.0903537 0 -0.0143953 -0.0903537 0.001 -0.0025 -8.55048e-17 0.001 -0.00780361 -0.0606206 0.001 -0.00382843 -0.0304261 0.001 -0.0025 -8.55048e-17 0 -0.00780361 -0.0606206 0 -0.00382843 -0.0304261 0 -0.0025 -8.55048e-17 0 -0.0025 -8.55048e-17 0.001 -0.0143953 0.0903537 0.001 -0.00382843 0.0304261 0.001 -0.00780361 0.0606206 0.001 -0.0143953 0.0903537 0 -0.00382843 0.0304261 0 -0.00780361 0.0606206 0 -0.0143953 0.0903537 0 -0.00956566 0.0916478 0 -0.00956566 0.0916478 0.001 -0.0143953 0.0903537 0.001 0.0025 -8.67295e-17 0 0.0025 -8.67295e-17 0.001 -0.00956566 0.0916478 0.001 0.00115254 0.0308618 0.001 -0.00287957 0.0614888 0.001 -0.00956566 0.0916478 0 0.00115254 0.0308618 0 -0.00287957 0.0614888 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145623 -0.0916219 0 -0.00973263 -0.092916 0 -0.00973263 -0.092916 0.001 -0.0145623 -0.0916219 0.001 -0.0145623 -0.0916219 0 -0.00973263 -0.092916 0 -0.0025 -8.6705e-17 0 -0.00787806 -0.0614715 0 -0.00384708 -0.0308531 0 -0.0145623 0.0916219 0 -0.00384708 0.0308531 0 -0.00787806 0.0614715 0 -0.00973263 0.092916 0 0.0025 -8.79296e-17 0 0.0011339 0.0312889 0 -0.00295402 0.0623397 0 -0.00295402 -0.0623397 0 0.0011339 -0.0312889 0 -0.00973263 -0.092916 0 -0.00973263 -0.092916 0.001 0.0025 -8.79296e-17 0.001 -0.00295402 -0.0623397 0.001 0.0011339 -0.0312889 0.001 0.0025 -8.79296e-17 0 -0.00295402 -0.0623397 0 0.0011339 -0.0312889 0 -0.0145623 -0.0916219 0.001 -0.00973263 -0.092916 0.001 -0.0025 -8.6705e-17 0.001 -0.00787806 -0.0614715 0.001 -0.00384708 -0.0308531 0.001 -0.0145623 0.0916219 0.001 -0.00384708 0.0308531 0.001 -0.00787806 0.0614715 0.001 -0.00973263 0.092916 0.001 0.0025 -8.79296e-17 0.001 0.0011339 0.0312889 0.001 -0.00295402 0.0623397 0.001 -0.00295402 -0.0623397 0.001 0.0011339 -0.0312889 0.001 -0.0145623 -0.0916219 0 -0.0145623 -0.0916219 0.001 -0.0025 -8.6705e-17 0.001 -0.00787806 -0.0614715 0.001 -0.00384708 -0.0308531 0.001 -0.0025 -8.6705e-17 0 -0.00787806 -0.0614715 0 -0.00384708 -0.0308531 0 -0.0025 -8.6705e-17 0 -0.0025 -8.6705e-17 0.001 -0.0145623 0.0916219 0.001 -0.00384708 0.0308531 0.001 -0.00787806 0.0614715 0.001 -0.0145623 0.0916219 0 -0.00384708 0.0308531 0 -0.00787806 0.0614715 0 -0.0145623 0.0916219 0 -0.00973263 0.092916 0 -0.00973263 0.092916 0.001 -0.0145623 0.0916219 0.001 0.0025 -8.79296e-17 0 0.0025 -8.79296e-17 0.001 -0.00973263 0.092916 0.001 0.0011339 0.0312889 0.001 -0.00295402 0.0623397 0.001 -0.00973263 0.092916 0 0.0011339 0.0312889 0 -0.00295402 0.0623397 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0147326 -0.092916 0 -0.009903 -0.0942101 0 -0.009903 -0.0942101 0.001 -0.0147326 -0.092916 0.001 -0.0147326 -0.092916 0 -0.009903 -0.0942101 0 -0.0025 -8.79296e-17 0 -0.00795402 -0.0623397 0 -0.0038661 -0.0312889 0 -0.0147326 0.092916 0 -0.0038661 0.0312889 0 -0.00795402 0.0623397 0 -0.009903 0.0942101 0 0.0025 -8.91543e-17 0 0.00111487 0.0317247 0 -0.00302998 0.0632079 0 -0.00302998 -0.0632079 0 0.00111487 -0.0317247 0 -0.009903 -0.0942101 0 -0.009903 -0.0942101 0.001 0.0025 -8.91543e-17 0.001 -0.00302998 -0.0632079 0.001 0.00111487 -0.0317247 0.001 0.0025 -8.91543e-17 0 -0.00302998 -0.0632079 0 0.00111487 -0.0317247 0 -0.0147326 -0.092916 0.001 -0.009903 -0.0942101 0.001 -0.0025 -8.79296e-17 0.001 -0.00795402 -0.0623397 0.001 -0.0038661 -0.0312889 0.001 -0.0147326 0.092916 0.001 -0.0038661 0.0312889 0.001 -0.00795402 0.0623397 0.001 -0.009903 0.0942101 0.001 0.0025 -8.91543e-17 0.001 0.00111487 0.0317247 0.001 -0.00302998 0.0632079 0.001 -0.00302998 -0.0632079 0.001 0.00111487 -0.0317247 0.001 -0.0147326 -0.092916 0 -0.0147326 -0.092916 0.001 -0.0025 -8.79296e-17 0.001 -0.00795402 -0.0623397 0.001 -0.0038661 -0.0312889 0.001 -0.0025 -8.79296e-17 0 -0.00795402 -0.0623397 0 -0.0038661 -0.0312889 0 -0.0025 -8.79296e-17 0 -0.0025 -8.79296e-17 0.001 -0.0147326 0.092916 0.001 -0.0038661 0.0312889 0.001 -0.00795402 0.0623397 0.001 -0.0147326 0.092916 0 -0.0038661 0.0312889 0 -0.00795402 0.0623397 0 -0.0147326 0.092916 0 -0.009903 0.0942101 0 -0.009903 0.0942101 0.001 -0.0147326 0.092916 0.001 0.0025 -8.91543e-17 0 0.0025 -8.91543e-17 0.001 -0.009903 0.0942101 0.001 0.00111487 0.0317247 0.001 -0.00302998 0.0632079 0.001 -0.009903 0.0942101 0 0.00111487 0.0317247 0 -0.00302998 0.0632079 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0148996 -0.0941843 0 -0.01007 -0.0954783 0 -0.01007 -0.0954783 0.001 -0.0148996 -0.0941843 0.001 -0.0148996 -0.0941843 0 -0.01007 -0.0954783 0 -0.0025 -8.91298e-17 0 -0.00802846 -0.0631906 0 -0.00388475 -0.031716 0 -0.0148996 0.0941843 0 -0.00388475 0.031716 0 -0.00802846 0.0631906 0 -0.01007 0.0954783 0 0.0025 -9.03544e-17 0 0.00109622 0.0321518 0 -0.00310442 0.0640588 0 -0.00310442 -0.0640588 0 0.00109622 -0.0321518 0 -0.01007 -0.0954783 0 -0.01007 -0.0954783 0.001 0.0025 -9.03544e-17 0.001 -0.00310442 -0.0640588 0.001 0.00109622 -0.0321518 0.001 0.0025 -9.03544e-17 0 -0.00310442 -0.0640588 0 0.00109622 -0.0321518 0 -0.0148996 -0.0941843 0.001 -0.01007 -0.0954783 0.001 -0.0025 -8.91298e-17 0.001 -0.00802846 -0.0631906 0.001 -0.00388475 -0.031716 0.001 -0.0148996 0.0941843 0.001 -0.00388475 0.031716 0.001 -0.00802846 0.0631906 0.001 -0.01007 0.0954783 0.001 0.0025 -9.03544e-17 0.001 0.00109622 0.0321518 0.001 -0.00310442 0.0640588 0.001 -0.00310442 -0.0640588 0.001 0.00109622 -0.0321518 0.001 -0.0148996 -0.0941843 0 -0.0148996 -0.0941843 0.001 -0.0025 -8.91298e-17 0.001 -0.00802846 -0.0631906 0.001 -0.00388475 -0.031716 0.001 -0.0025 -8.91298e-17 0 -0.00802846 -0.0631906 0 -0.00388475 -0.031716 0 -0.0025 -8.91298e-17 0 -0.0025 -8.91298e-17 0.001 -0.0148996 0.0941843 0.001 -0.00388475 0.031716 0.001 -0.00802846 0.0631906 0.001 -0.0148996 0.0941843 0 -0.00388475 0.031716 0 -0.00802846 0.0631906 0 -0.0148996 0.0941843 0 -0.01007 0.0954783 0 -0.01007 0.0954783 0.001 -0.0148996 0.0941843 0.001 0.0025 -9.03544e-17 0 0.0025 -9.03544e-17 0.001 -0.01007 0.0954783 0.001 0.00109622 0.0321518 0.001 -0.00310442 0.0640588 0.001 -0.01007 0.0954783 0 0.00109622 0.0321518 0 -0.00310442 0.0640588 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0150666 -0.0954525 0 -0.0102369 -0.0967466 0 -0.0102369 -0.0967466 0.001 -0.0150666 -0.0954525 0.001 -0.0150666 -0.0954525 0 -0.0102369 -0.0967466 0 -0.0025 -9.03299e-17 0 -0.0081029 -0.0640414 0 -0.0039034 -0.032143 0 -0.0150666 0.0954525 0 -0.0039034 0.032143 0 -0.0081029 0.0640414 0 -0.0102369 0.0967466 0 0.0025 -9.15546e-17 0 0.00107758 0.0325788 0 -0.00317886 0.0649097 0 -0.00317886 -0.0649097 0 0.00107758 -0.0325788 0 -0.0102369 -0.0967466 0 -0.0102369 -0.0967466 0.001 0.0025 -9.15546e-17 0.001 -0.00317886 -0.0649097 0.001 0.00107758 -0.0325788 0.001 0.0025 -9.15546e-17 0 -0.00317886 -0.0649097 0 0.00107758 -0.0325788 0 -0.0150666 -0.0954525 0.001 -0.0102369 -0.0967466 0.001 -0.0025 -9.03299e-17 0.001 -0.0081029 -0.0640414 0.001 -0.0039034 -0.032143 0.001 -0.0150666 0.0954525 0.001 -0.0039034 0.032143 0.001 -0.0081029 0.0640414 0.001 -0.0102369 0.0967466 0.001 0.0025 -9.15546e-17 0.001 0.00107758 0.0325788 0.001 -0.00317886 0.0649097 0.001 -0.00317886 -0.0649097 0.001 0.00107758 -0.0325788 0.001 -0.0150666 -0.0954525 0 -0.0150666 -0.0954525 0.001 -0.0025 -9.03299e-17 0.001 -0.0081029 -0.0640414 0.001 -0.0039034 -0.032143 0.001 -0.0025 -9.03299e-17 0 -0.0081029 -0.0640414 0 -0.0039034 -0.032143 0 -0.0025 -9.03299e-17 0 -0.0025 -9.03299e-17 0.001 -0.0150666 0.0954525 0.001 -0.0039034 0.032143 0.001 -0.0081029 0.0640414 0.001 -0.0150666 0.0954525 0 -0.0039034 0.032143 0 -0.0081029 0.0640414 0 -0.0150666 0.0954525 0 -0.0102369 0.0967466 0 -0.0102369 0.0967466 0.001 -0.0150666 0.0954525 0.001 0.0025 -9.15546e-17 0 0.0025 -9.15546e-17 0.001 -0.0102369 0.0967466 0.001 0.00107758 0.0325788 0.001 -0.00317886 0.0649097 0.001 -0.0102369 0.0967466 0 0.00107758 0.0325788 0 -0.00317886 0.0649097 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0106744 -0.0620907 0 -0.00584477 -0.0633848 0 -0.00584477 -0.0633848 0.001 -0.0106744 -0.0620907 0.001 -0.0106744 -0.0620907 0 -0.00584477 -0.0633848 0 -0.0025 -5.87586e-17 0 -0.00614462 -0.0416582 0 -0.00341289 -0.0209087 0 -0.0106744 0.0620907 0 -0.00341289 0.0209087 0 -0.00614462 0.0416582 0 -0.00584477 0.0633848 0 0.0025 -5.99832e-17 0 0.00156808 0.0213444 0 -0.00122058 0.0425264 0 -0.00122058 -0.0425264 0 0.00156808 -0.0213444 0 -0.00584477 -0.0633848 0 -0.00584477 -0.0633848 0.001 0.0025 -5.99832e-17 0.001 -0.00122058 -0.0425264 0.001 0.00156808 -0.0213444 0.001 0.0025 -5.99832e-17 0 -0.00122058 -0.0425264 0 0.00156808 -0.0213444 0 -0.0106744 -0.0620907 0.001 -0.00584477 -0.0633848 0.001 -0.0025 -5.87586e-17 0.001 -0.00614462 -0.0416582 0.001 -0.00341289 -0.0209087 0.001 -0.0106744 0.0620907 0.001 -0.00341289 0.0209087 0.001 -0.00614462 0.0416582 0.001 -0.00584477 0.0633848 0.001 0.0025 -5.99832e-17 0.001 0.00156808 0.0213444 0.001 -0.00122058 0.0425264 0.001 -0.00122058 -0.0425264 0.001 0.00156808 -0.0213444 0.001 -0.0106744 -0.0620907 0 -0.0106744 -0.0620907 0.001 -0.0025 -5.87586e-17 0.001 -0.00614462 -0.0416582 0.001 -0.00341289 -0.0209087 0.001 -0.0025 -5.87586e-17 0 -0.00614462 -0.0416582 0 -0.00341289 -0.0209087 0 -0.0025 -5.87586e-17 0 -0.0025 -5.87586e-17 0.001 -0.0106744 0.0620907 0.001 -0.00341289 0.0209087 0.001 -0.00614462 0.0416582 0.001 -0.0106744 0.0620907 0 -0.00341289 0.0209087 0 -0.00614462 0.0416582 0 -0.0106744 0.0620907 0 -0.00584477 0.0633848 0 -0.00584477 0.0633848 0.001 -0.0106744 0.0620907 0.001 0.0025 -5.99832e-17 0 0.0025 -5.99832e-17 0.001 -0.00584477 0.0633848 0.001 0.00156808 0.0213444 0.001 -0.00122058 0.0425264 0.001 -0.00584477 0.0633848 0 0.00156808 0.0213444 0 -0.00122058 0.0425264 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0152369 -0.0967466 0 -0.0104073 -0.0980407 0 -0.0104073 -0.0980407 0.001 -0.0152369 -0.0967466 0.001 -0.0152369 -0.0967466 0 -0.0104073 -0.0980407 0 -0.0025 -9.15546e-17 0 -0.00817886 -0.0649097 0 -0.00392242 -0.0325788 0 -0.0152369 0.0967466 0 -0.00392242 0.0325788 0 -0.00817886 0.0649097 0 -0.0104073 0.0980407 0 0.0025 -9.27792e-17 0 0.00105855 0.0330146 0 -0.00325482 0.0657779 0 -0.00325482 -0.0657779 0 0.00105855 -0.0330146 0 -0.0104073 -0.0980407 0 -0.0104073 -0.0980407 0.001 0.0025 -9.27792e-17 0.001 -0.00325482 -0.0657779 0.001 0.00105855 -0.0330146 0.001 0.0025 -9.27792e-17 0 -0.00325482 -0.0657779 0 0.00105855 -0.0330146 0 -0.0152369 -0.0967466 0.001 -0.0104073 -0.0980407 0.001 -0.0025 -9.15546e-17 0.001 -0.00817886 -0.0649097 0.001 -0.00392242 -0.0325788 0.001 -0.0152369 0.0967466 0.001 -0.00392242 0.0325788 0.001 -0.00817886 0.0649097 0.001 -0.0104073 0.0980407 0.001 0.0025 -9.27792e-17 0.001 0.00105855 0.0330146 0.001 -0.00325482 0.0657779 0.001 -0.00325482 -0.0657779 0.001 0.00105855 -0.0330146 0.001 -0.0152369 -0.0967466 0 -0.0152369 -0.0967466 0.001 -0.0025 -9.15546e-17 0.001 -0.00817886 -0.0649097 0.001 -0.00392242 -0.0325788 0.001 -0.0025 -9.15546e-17 0 -0.00817886 -0.0649097 0 -0.00392242 -0.0325788 0 -0.0025 -9.15546e-17 0 -0.0025 -9.15546e-17 0.001 -0.0152369 0.0967466 0.001 -0.00392242 0.0325788 0.001 -0.00817886 0.0649097 0.001 -0.0152369 0.0967466 0 -0.00392242 0.0325788 0 -0.00817886 0.0649097 0 -0.0152369 0.0967466 0 -0.0104073 0.0980407 0 -0.0104073 0.0980407 0.001 -0.0152369 0.0967466 0.001 0.0025 -9.27792e-17 0 0.0025 -9.27792e-17 0.001 -0.0104073 0.0980407 0.001 0.00105855 0.0330146 0.001 -0.00325482 0.0657779 0.001 -0.0104073 0.0980407 0 0.00105855 0.0330146 0 -0.00325482 0.0657779 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0154039 -0.0980148 0 -0.0105743 -0.0993089 0 -0.0105743 -0.0993089 0.001 -0.0154039 -0.0980148 0.001 -0.0154039 -0.0980148 0 -0.0105743 -0.0993089 0 -0.0025 -9.27547e-17 0 -0.0082533 -0.0657606 0 -0.00394107 -0.0330059 0 -0.0154039 0.0980148 0 -0.00394107 0.0330059 0 -0.0082533 0.0657606 0 -0.0105743 0.0993089 0 0.0025 -9.39794e-17 0 0.00103991 0.0334417 0 -0.00332927 0.0666288 0 -0.00332927 -0.0666288 0 0.00103991 -0.0334417 0 -0.0105743 -0.0993089 0 -0.0105743 -0.0993089 0.001 0.0025 -9.39794e-17 0.001 -0.00332927 -0.0666288 0.001 0.00103991 -0.0334417 0.001 0.0025 -9.39794e-17 0 -0.00332927 -0.0666288 0 0.00103991 -0.0334417 0 -0.0154039 -0.0980148 0.001 -0.0105743 -0.0993089 0.001 -0.0025 -9.27547e-17 0.001 -0.0082533 -0.0657606 0.001 -0.00394107 -0.0330059 0.001 -0.0154039 0.0980148 0.001 -0.00394107 0.0330059 0.001 -0.0082533 0.0657606 0.001 -0.0105743 0.0993089 0.001 0.0025 -9.39794e-17 0.001 0.00103991 0.0334417 0.001 -0.00332927 0.0666288 0.001 -0.00332927 -0.0666288 0.001 0.00103991 -0.0334417 0.001 -0.0154039 -0.0980148 0 -0.0154039 -0.0980148 0.001 -0.0025 -9.27547e-17 0.001 -0.0082533 -0.0657606 0.001 -0.00394107 -0.0330059 0.001 -0.0025 -9.27547e-17 0 -0.0082533 -0.0657606 0 -0.00394107 -0.0330059 0 -0.0025 -9.27547e-17 0 -0.0025 -9.27547e-17 0.001 -0.0154039 0.0980148 0.001 -0.00394107 0.0330059 0.001 -0.0082533 0.0657606 0.001 -0.0154039 0.0980148 0 -0.00394107 0.0330059 0 -0.0082533 0.0657606 0 -0.0154039 0.0980148 0 -0.0105743 0.0993089 0 -0.0105743 0.0993089 0.001 -0.0154039 0.0980148 0.001 0.0025 -9.39794e-17 0 0.0025 -9.39794e-17 0.001 -0.0105743 0.0993089 0.001 0.00103991 0.0334417 0.001 -0.00332927 0.0666288 0.001 -0.0105743 0.0993089 0 0.00103991 0.0334417 0 -0.00332927 0.0666288 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0155709 -0.099283 0 -0.0107412 -0.100577 0 -0.0107412 -0.100577 0.001 -0.0155709 -0.099283 0.001 -0.0155709 -0.099283 0 -0.0107412 -0.100577 0 -0.0025 -9.39549e-17 0 -0.00832775 -0.0666114 0 -0.00395971 -0.0334329 0 -0.0155709 0.099283 0 -0.00395971 0.0334329 0 -0.00832775 0.0666114 0 -0.0107412 0.100577 0 0.0025 -9.51795e-17 0 0.00102126 0.0338687 0 -0.00340371 0.0674797 0 -0.00340371 -0.0674797 0 0.00102126 -0.0338687 0 -0.0107412 -0.100577 0 -0.0107412 -0.100577 0.001 0.0025 -9.51795e-17 0.001 -0.00340371 -0.0674797 0.001 0.00102126 -0.0338687 0.001 0.0025 -9.51795e-17 0 -0.00340371 -0.0674797 0 0.00102126 -0.0338687 0 -0.0155709 -0.099283 0.001 -0.0107412 -0.100577 0.001 -0.0025 -9.39549e-17 0.001 -0.00832775 -0.0666114 0.001 -0.00395971 -0.0334329 0.001 -0.0155709 0.099283 0.001 -0.00395971 0.0334329 0.001 -0.00832775 0.0666114 0.001 -0.0107412 0.100577 0.001 0.0025 -9.51795e-17 0.001 0.00102126 0.0338687 0.001 -0.00340371 0.0674797 0.001 -0.00340371 -0.0674797 0.001 0.00102126 -0.0338687 0.001 -0.0155709 -0.099283 0 -0.0155709 -0.099283 0.001 -0.0025 -9.39549e-17 0.001 -0.00832775 -0.0666114 0.001 -0.00395971 -0.0334329 0.001 -0.0025 -9.39549e-17 0 -0.00832775 -0.0666114 0 -0.00395971 -0.0334329 0 -0.0025 -9.39549e-17 0 -0.0025 -9.39549e-17 0.001 -0.0155709 0.099283 0.001 -0.00395971 0.0334329 0.001 -0.00832775 0.0666114 0.001 -0.0155709 0.099283 0 -0.00395971 0.0334329 0 -0.00832775 0.0666114 0 -0.0155709 0.099283 0 -0.0107412 0.100577 0 -0.0107412 0.100577 0.001 -0.0155709 0.099283 0.001 0.0025 -9.51795e-17 0 0.0025 -9.51795e-17 0.001 -0.0107412 0.100577 0.001 0.00102126 0.0338687 0.001 -0.00340371 0.0674797 0.001 -0.0107412 0.100577 0 0.00102126 0.0338687 0 -0.00340371 0.0674797 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0157412 -0.100577 0 -0.0109116 -0.101871 0 -0.0109116 -0.101871 0.001 -0.0157412 -0.100577 0.001 -0.0157412 -0.100577 0 -0.0109116 -0.101871 0 -0.0025 -9.51795e-17 0 -0.00840371 -0.0674797 0 -0.00397874 -0.0338687 0 -0.0157412 0.100577 0 -0.00397874 0.0338687 0 -0.00840371 0.0674797 0 -0.0109116 0.101871 0 0.0025 -9.64042e-17 0 0.00100223 0.0343045 0 -0.00347967 0.0683479 0 -0.00347967 -0.0683479 0 0.00100223 -0.0343045 0 -0.0109116 -0.101871 0 -0.0109116 -0.101871 0.001 0.0025 -9.64042e-17 0.001 -0.00347967 -0.0683479 0.001 0.00100223 -0.0343045 0.001 0.0025 -9.64042e-17 0 -0.00347967 -0.0683479 0 0.00100223 -0.0343045 0 -0.0157412 -0.100577 0.001 -0.0109116 -0.101871 0.001 -0.0025 -9.51795e-17 0.001 -0.00840371 -0.0674797 0.001 -0.00397874 -0.0338687 0.001 -0.0157412 0.100577 0.001 -0.00397874 0.0338687 0.001 -0.00840371 0.0674797 0.001 -0.0109116 0.101871 0.001 0.0025 -9.64042e-17 0.001 0.00100223 0.0343045 0.001 -0.00347967 0.0683479 0.001 -0.00347967 -0.0683479 0.001 0.00100223 -0.0343045 0.001 -0.0157412 -0.100577 0 -0.0157412 -0.100577 0.001 -0.0025 -9.51795e-17 0.001 -0.00840371 -0.0674797 0.001 -0.00397874 -0.0338687 0.001 -0.0025 -9.51795e-17 0 -0.00840371 -0.0674797 0 -0.00397874 -0.0338687 0 -0.0025 -9.51795e-17 0 -0.0025 -9.51795e-17 0.001 -0.0157412 0.100577 0.001 -0.00397874 0.0338687 0.001 -0.00840371 0.0674797 0.001 -0.0157412 0.100577 0 -0.00397874 0.0338687 0 -0.00840371 0.0674797 0 -0.0157412 0.100577 0 -0.0109116 0.101871 0 -0.0109116 0.101871 0.001 -0.0157412 0.100577 0.001 0.0025 -9.64042e-17 0 0.0025 -9.64042e-17 0.001 -0.0109116 0.101871 0.001 0.00100223 0.0343045 0.001 -0.00347967 0.0683479 0.001 -0.0109116 0.101871 0 0.00100223 0.0343045 0 -0.00347967 0.0683479 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0159082 -0.101845 0 -0.0110786 -0.103139 0 -0.0110786 -0.103139 0.001 -0.0159082 -0.101845 0.001 -0.0159082 -0.101845 0 -0.0110786 -0.103139 0 -0.0025 -9.63797e-17 0 -0.00847815 -0.0683306 0 -0.00399739 -0.0342958 0 -0.0159082 0.101845 0 -0.00399739 0.0342958 0 -0.00847815 0.0683306 0 -0.0110786 0.103139 0 0.0025 -9.76043e-17 0 0.000983587 0.0347316 0 -0.00355411 0.0691988 0 -0.00355411 -0.0691988 0 0.000983587 -0.0347316 0 -0.0110786 -0.103139 0 -0.0110786 -0.103139 0.001 0.0025 -9.76043e-17 0.001 -0.00355411 -0.0691988 0.001 0.000983587 -0.0347316 0.001 0.0025 -9.76043e-17 0 -0.00355411 -0.0691988 0 0.000983587 -0.0347316 0 -0.0159082 -0.101845 0.001 -0.0110786 -0.103139 0.001 -0.0025 -9.63797e-17 0.001 -0.00847815 -0.0683306 0.001 -0.00399739 -0.0342958 0.001 -0.0159082 0.101845 0.001 -0.00399739 0.0342958 0.001 -0.00847815 0.0683306 0.001 -0.0110786 0.103139 0.001 0.0025 -9.76043e-17 0.001 0.000983587 0.0347316 0.001 -0.00355411 0.0691988 0.001 -0.00355411 -0.0691988 0.001 0.000983587 -0.0347316 0.001 -0.0159082 -0.101845 0 -0.0159082 -0.101845 0.001 -0.0025 -9.63797e-17 0.001 -0.00847815 -0.0683306 0.001 -0.00399739 -0.0342958 0.001 -0.0025 -9.63797e-17 0 -0.00847815 -0.0683306 0 -0.00399739 -0.0342958 0 -0.0025 -9.63797e-17 0 -0.0025 -9.63797e-17 0.001 -0.0159082 0.101845 0.001 -0.00399739 0.0342958 0.001 -0.00847815 0.0683306 0.001 -0.0159082 0.101845 0 -0.00399739 0.0342958 0 -0.00847815 0.0683306 0 -0.0159082 0.101845 0 -0.0110786 0.103139 0 -0.0110786 0.103139 0.001 -0.0159082 0.101845 0.001 0.0025 -9.76043e-17 0 0.0025 -9.76043e-17 0.001 -0.0110786 0.103139 0.001 0.000983587 0.0347316 0.001 -0.00355411 0.0691988 0.001 -0.0110786 0.103139 0 0.000983587 0.0347316 0 -0.00355411 0.0691988 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0160752 -0.103114 0 -0.0112455 -0.104408 0 -0.0112455 -0.104408 0.001 -0.0160752 -0.103114 0.001 -0.0160752 -0.103114 0 -0.0112455 -0.104408 0 -0.0025 -9.75799e-17 0 -0.00855259 -0.0691814 0 -0.00401603 -0.0347228 0 -0.0160752 0.103114 0 -0.00401603 0.0347228 0 -0.00855259 0.0691814 0 -0.0112455 0.104408 0 0.0025 -9.88045e-17 0 0.000964941 0.0351586 0 -0.00362855 0.0700497 0 -0.00362855 -0.0700497 0 0.000964941 -0.0351586 0 -0.0112455 -0.104408 0 -0.0112455 -0.104408 0.001 0.0025 -9.88045e-17 0.001 -0.00362855 -0.0700497 0.001 0.000964941 -0.0351586 0.001 0.0025 -9.88045e-17 0 -0.00362855 -0.0700497 0 0.000964941 -0.0351586 0 -0.0160752 -0.103114 0.001 -0.0112455 -0.104408 0.001 -0.0025 -9.75799e-17 0.001 -0.00855259 -0.0691814 0.001 -0.00401603 -0.0347228 0.001 -0.0160752 0.103114 0.001 -0.00401603 0.0347228 0.001 -0.00855259 0.0691814 0.001 -0.0112455 0.104408 0.001 0.0025 -9.88045e-17 0.001 0.000964941 0.0351586 0.001 -0.00362855 0.0700497 0.001 -0.00362855 -0.0700497 0.001 0.000964941 -0.0351586 0.001 -0.0160752 -0.103114 0 -0.0160752 -0.103114 0.001 -0.0025 -9.75799e-17 0.001 -0.00855259 -0.0691814 0.001 -0.00401603 -0.0347228 0.001 -0.0025 -9.75799e-17 0 -0.00855259 -0.0691814 0 -0.00401603 -0.0347228 0 -0.0025 -9.75799e-17 0 -0.0025 -9.75799e-17 0.001 -0.0160752 0.103114 0.001 -0.00401603 0.0347228 0.001 -0.00855259 0.0691814 0.001 -0.0160752 0.103114 0 -0.00401603 0.0347228 0 -0.00855259 0.0691814 0 -0.0160752 0.103114 0 -0.0112455 0.104408 0 -0.0112455 0.104408 0.001 -0.0160752 0.103114 0.001 0.0025 -9.88045e-17 0 0.0025 -9.88045e-17 0.001 -0.0112455 0.104408 0.001 0.000964941 0.0351586 0.001 -0.00362855 0.0700497 0.001 -0.0112455 0.104408 0 0.000964941 0.0351586 0 -0.00362855 0.0700497 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0162455 -0.104408 0 -0.0114159 -0.105702 0 -0.0114159 -0.105702 0.001 -0.0162455 -0.104408 0.001 -0.0162455 -0.104408 0 -0.0114159 -0.105702 0 -0.0025 -9.88045e-17 0 -0.00862855 -0.0700497 0 -0.00403506 -0.0351586 0 -0.0162455 0.104408 0 -0.00403506 0.0351586 0 -0.00862855 0.0700497 0 -0.0114159 0.105702 0 0.0025 -1.00029e-16 0 0.000945915 0.0355944 0 -0.00370451 0.0709179 0 -0.00370451 -0.0709179 0 0.000945915 -0.0355944 0 -0.0114159 -0.105702 0 -0.0114159 -0.105702 0.001 0.0025 -1.00029e-16 0.001 -0.00370451 -0.0709179 0.001 0.000945915 -0.0355944 0.001 0.0025 -1.00029e-16 0 -0.00370451 -0.0709179 0 0.000945915 -0.0355944 0 -0.0162455 -0.104408 0.001 -0.0114159 -0.105702 0.001 -0.0025 -9.88045e-17 0.001 -0.00862855 -0.0700497 0.001 -0.00403506 -0.0351586 0.001 -0.0162455 0.104408 0.001 -0.00403506 0.0351586 0.001 -0.00862855 0.0700497 0.001 -0.0114159 0.105702 0.001 0.0025 -1.00029e-16 0.001 0.000945915 0.0355944 0.001 -0.00370451 0.0709179 0.001 -0.00370451 -0.0709179 0.001 0.000945915 -0.0355944 0.001 -0.0162455 -0.104408 0 -0.0162455 -0.104408 0.001 -0.0025 -9.88045e-17 0.001 -0.00862855 -0.0700497 0.001 -0.00403506 -0.0351586 0.001 -0.0025 -9.88045e-17 0 -0.00862855 -0.0700497 0 -0.00403506 -0.0351586 0 -0.0025 -9.88045e-17 0 -0.0025 -9.88045e-17 0.001 -0.0162455 0.104408 0.001 -0.00403506 0.0351586 0.001 -0.00862855 0.0700497 0.001 -0.0162455 0.104408 0 -0.00403506 0.0351586 0 -0.00862855 0.0700497 0 -0.0162455 0.104408 0 -0.0114159 0.105702 0 -0.0114159 0.105702 0.001 -0.0162455 0.104408 0.001 0.0025 -1.00029e-16 0 0.0025 -1.00029e-16 0.001 -0.0114159 0.105702 0.001 0.000945915 0.0355944 0.001 -0.00370451 0.0709179 0.001 -0.0114159 0.105702 0 0.000945915 0.0355944 0 -0.00370451 0.0709179 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0164125 -0.105676 0 -0.0115829 -0.10697 0 -0.0115829 -0.10697 0.001 -0.0164125 -0.105676 0.001 -0.0164125 -0.105676 0 -0.0115829 -0.10697 0 -0.0025 -1.00005e-16 0 -0.00870299 -0.0709006 0 -0.0040537 -0.0355857 0 -0.0164125 0.105676 0 -0.0040537 0.0355857 0 -0.00870299 0.0709006 0 -0.0115829 0.10697 0 0.0025 -1.01229e-16 0 0.000927269 0.0360215 0 -0.00377896 0.0717688 0 -0.00377896 -0.0717688 0 0.000927269 -0.0360215 0 -0.0115829 -0.10697 0 -0.0115829 -0.10697 0.001 0.0025 -1.01229e-16 0.001 -0.00377896 -0.0717688 0.001 0.000927269 -0.0360215 0.001 0.0025 -1.01229e-16 0 -0.00377896 -0.0717688 0 0.000927269 -0.0360215 0 -0.0164125 -0.105676 0.001 -0.0115829 -0.10697 0.001 -0.0025 -1.00005e-16 0.001 -0.00870299 -0.0709006 0.001 -0.0040537 -0.0355857 0.001 -0.0164125 0.105676 0.001 -0.0040537 0.0355857 0.001 -0.00870299 0.0709006 0.001 -0.0115829 0.10697 0.001 0.0025 -1.01229e-16 0.001 0.000927269 0.0360215 0.001 -0.00377896 0.0717688 0.001 -0.00377896 -0.0717688 0.001 0.000927269 -0.0360215 0.001 -0.0164125 -0.105676 0 -0.0164125 -0.105676 0.001 -0.0025 -1.00005e-16 0.001 -0.00870299 -0.0709006 0.001 -0.0040537 -0.0355857 0.001 -0.0025 -1.00005e-16 0 -0.00870299 -0.0709006 0 -0.0040537 -0.0355857 0 -0.0025 -1.00005e-16 0 -0.0025 -1.00005e-16 0.001 -0.0164125 0.105676 0.001 -0.0040537 0.0355857 0.001 -0.00870299 0.0709006 0.001 -0.0164125 0.105676 0 -0.0040537 0.0355857 0 -0.00870299 0.0709006 0 -0.0164125 0.105676 0 -0.0115829 0.10697 0 -0.0115829 0.10697 0.001 -0.0164125 0.105676 0.001 0.0025 -1.01229e-16 0 0.0025 -1.01229e-16 0.001 -0.0115829 0.10697 0.001 0.000927269 0.0360215 0.001 -0.00377896 0.0717688 0.001 -0.0115829 0.10697 0 0.000927269 0.0360215 0 -0.00377896 0.0717688 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0165794 -0.106944 0 -0.0117498 -0.108238 0 -0.0117498 -0.108238 0.001 -0.0165794 -0.106944 0.001 -0.0165794 -0.106944 0 -0.0117498 -0.108238 0 -0.0025 -1.01205e-16 0 -0.00877744 -0.0717514 0 -0.00407235 -0.0360128 0 -0.0165794 0.106944 0 -0.00407235 0.0360128 0 -0.00877744 0.0717514 0 -0.0117498 0.108238 0 0.0025 -1.02429e-16 0 0.000908623 0.0364485 0 -0.0038534 0.0726197 0 -0.0038534 -0.0726197 0 0.000908623 -0.0364485 0 -0.0117498 -0.108238 0 -0.0117498 -0.108238 0.001 0.0025 -1.02429e-16 0.001 -0.0038534 -0.0726197 0.001 0.000908623 -0.0364485 0.001 0.0025 -1.02429e-16 0 -0.0038534 -0.0726197 0 0.000908623 -0.0364485 0 -0.0165794 -0.106944 0.001 -0.0117498 -0.108238 0.001 -0.0025 -1.01205e-16 0.001 -0.00877744 -0.0717514 0.001 -0.00407235 -0.0360128 0.001 -0.0165794 0.106944 0.001 -0.00407235 0.0360128 0.001 -0.00877744 0.0717514 0.001 -0.0117498 0.108238 0.001 0.0025 -1.02429e-16 0.001 0.000908623 0.0364485 0.001 -0.0038534 0.0726197 0.001 -0.0038534 -0.0726197 0.001 0.000908623 -0.0364485 0.001 -0.0165794 -0.106944 0 -0.0165794 -0.106944 0.001 -0.0025 -1.01205e-16 0.001 -0.00877744 -0.0717514 0.001 -0.00407235 -0.0360128 0.001 -0.0025 -1.01205e-16 0 -0.00877744 -0.0717514 0 -0.00407235 -0.0360128 0 -0.0025 -1.01205e-16 0 -0.0025 -1.01205e-16 0.001 -0.0165794 0.106944 0.001 -0.00407235 0.0360128 0.001 -0.00877744 0.0717514 0.001 -0.0165794 0.106944 0 -0.00407235 0.0360128 0 -0.00877744 0.0717514 0 -0.0165794 0.106944 0 -0.0117498 0.108238 0 -0.0117498 0.108238 0.001 -0.0165794 0.106944 0.001 0.0025 -1.02429e-16 0 0.0025 -1.02429e-16 0.001 -0.0117498 0.108238 0.001 0.000908623 0.0364485 0.001 -0.0038534 0.0726197 0.001 -0.0117498 0.108238 0 0.000908623 0.0364485 0 -0.0038534 0.0726197 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0167464 -0.108212 0 -0.0119168 -0.109506 0 -0.0119168 -0.109506 0.001 -0.0167464 -0.108212 0.001 -0.0167464 -0.108212 0 -0.0119168 -0.109506 0 -0.0025 -1.02405e-16 0 -0.00885188 -0.0726023 0 -0.004091 -0.0364398 0 -0.0167464 0.108212 0 -0.004091 0.0364398 0 -0.00885188 0.0726023 0 -0.0119168 0.109506 0 0.0025 -1.0363e-16 0 0.000889977 0.0368756 0 -0.00392784 0.0734705 0 -0.00392784 -0.0734705 0 0.000889977 -0.0368756 0 -0.0119168 -0.109506 0 -0.0119168 -0.109506 0.001 0.0025 -1.0363e-16 0.001 -0.00392784 -0.0734705 0.001 0.000889977 -0.0368756 0.001 0.0025 -1.0363e-16 0 -0.00392784 -0.0734705 0 0.000889977 -0.0368756 0 -0.0167464 -0.108212 0.001 -0.0119168 -0.109506 0.001 -0.0025 -1.02405e-16 0.001 -0.00885188 -0.0726023 0.001 -0.004091 -0.0364398 0.001 -0.0167464 0.108212 0.001 -0.004091 0.0364398 0.001 -0.00885188 0.0726023 0.001 -0.0119168 0.109506 0.001 0.0025 -1.0363e-16 0.001 0.000889977 0.0368756 0.001 -0.00392784 0.0734705 0.001 -0.00392784 -0.0734705 0.001 0.000889977 -0.0368756 0.001 -0.0167464 -0.108212 0 -0.0167464 -0.108212 0.001 -0.0025 -1.02405e-16 0.001 -0.00885188 -0.0726023 0.001 -0.004091 -0.0364398 0.001 -0.0025 -1.02405e-16 0 -0.00885188 -0.0726023 0 -0.004091 -0.0364398 0 -0.0025 -1.02405e-16 0 -0.0025 -1.02405e-16 0.001 -0.0167464 0.108212 0.001 -0.004091 0.0364398 0.001 -0.00885188 0.0726023 0.001 -0.0167464 0.108212 0 -0.004091 0.0364398 0 -0.00885188 0.0726023 0 -0.0167464 0.108212 0 -0.0119168 0.109506 0 -0.0119168 0.109506 0.001 -0.0167464 0.108212 0.001 0.0025 -1.0363e-16 0 0.0025 -1.0363e-16 0.001 -0.0119168 0.109506 0.001 0.000889977 0.0368756 0.001 -0.00392784 0.0734705 0.001 -0.0119168 0.109506 0 0.000889977 0.0368756 0 -0.00392784 0.0734705 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0108448 -0.0633848 0 -0.00601514 -0.0646789 0 -0.00601514 -0.0646789 0.001 -0.0108448 -0.0633848 0.001 -0.0108448 -0.0633848 0 -0.00601514 -0.0646789 0 -0.0025 -5.99832e-17 0 -0.00622058 -0.0425264 0 -0.00343192 -0.0213444 0 -0.0108448 0.0633848 0 -0.00343192 0.0213444 0 -0.00622058 0.0425264 0 -0.00601514 0.0646789 0 0.0025 -6.12078e-17 0 0.00154906 0.0217802 0 -0.00129654 0.0433947 0 -0.00129654 -0.0433947 0 0.00154906 -0.0217802 0 -0.00601514 -0.0646789 0 -0.00601514 -0.0646789 0.001 0.0025 -6.12078e-17 0.001 -0.00129654 -0.0433947 0.001 0.00154906 -0.0217802 0.001 0.0025 -6.12078e-17 0 -0.00129654 -0.0433947 0 0.00154906 -0.0217802 0 -0.0108448 -0.0633848 0.001 -0.00601514 -0.0646789 0.001 -0.0025 -5.99832e-17 0.001 -0.00622058 -0.0425264 0.001 -0.00343192 -0.0213444 0.001 -0.0108448 0.0633848 0.001 -0.00343192 0.0213444 0.001 -0.00622058 0.0425264 0.001 -0.00601514 0.0646789 0.001 0.0025 -6.12078e-17 0.001 0.00154906 0.0217802 0.001 -0.00129654 0.0433947 0.001 -0.00129654 -0.0433947 0.001 0.00154906 -0.0217802 0.001 -0.0108448 -0.0633848 0 -0.0108448 -0.0633848 0.001 -0.0025 -5.99832e-17 0.001 -0.00622058 -0.0425264 0.001 -0.00343192 -0.0213444 0.001 -0.0025 -5.99832e-17 0 -0.00622058 -0.0425264 0 -0.00343192 -0.0213444 0 -0.0025 -5.99832e-17 0 -0.0025 -5.99832e-17 0.001 -0.0108448 0.0633848 0.001 -0.00343192 0.0213444 0.001 -0.00622058 0.0425264 0.001 -0.0108448 0.0633848 0 -0.00343192 0.0213444 0 -0.00622058 0.0425264 0 -0.0108448 0.0633848 0 -0.00601514 0.0646789 0 -0.00601514 0.0646789 0.001 -0.0108448 0.0633848 0.001 0.0025 -6.12078e-17 0 0.0025 -6.12078e-17 0.001 -0.00601514 0.0646789 0.001 0.00154906 0.0217802 0.001 -0.00129654 0.0433947 0.001 -0.00601514 0.0646789 0 0.00154906 0.0217802 0 -0.00129654 0.0433947 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0169168 -0.109506 0 -0.0120872 -0.1108 0 -0.0120872 -0.1108 0.001 -0.0169168 -0.109506 0.001 -0.0169168 -0.109506 0 -0.0120872 -0.1108 0 -0.0025 -1.0363e-16 0 -0.00892784 -0.0734705 0 -0.00411002 -0.0368756 0 -0.0169168 0.109506 0 -0.00411002 0.0368756 0 -0.00892784 0.0734705 0 -0.0120872 0.1108 0 0.0025 -1.04854e-16 0 0.00087095 0.0373114 0 -0.0040038 0.0743388 0 -0.0040038 -0.0743388 0 0.00087095 -0.0373114 0 -0.0120872 -0.1108 0 -0.0120872 -0.1108 0.001 0.0025 -1.04854e-16 0.001 -0.0040038 -0.0743388 0.001 0.00087095 -0.0373114 0.001 0.0025 -1.04854e-16 0 -0.0040038 -0.0743388 0 0.00087095 -0.0373114 0 -0.0169168 -0.109506 0.001 -0.0120872 -0.1108 0.001 -0.0025 -1.0363e-16 0.001 -0.00892784 -0.0734705 0.001 -0.00411002 -0.0368756 0.001 -0.0169168 0.109506 0.001 -0.00411002 0.0368756 0.001 -0.00892784 0.0734705 0.001 -0.0120872 0.1108 0.001 0.0025 -1.04854e-16 0.001 0.00087095 0.0373114 0.001 -0.0040038 0.0743388 0.001 -0.0040038 -0.0743388 0.001 0.00087095 -0.0373114 0.001 -0.0169168 -0.109506 0 -0.0169168 -0.109506 0.001 -0.0025 -1.0363e-16 0.001 -0.00892784 -0.0734705 0.001 -0.00411002 -0.0368756 0.001 -0.0025 -1.0363e-16 0 -0.00892784 -0.0734705 0 -0.00411002 -0.0368756 0 -0.0025 -1.0363e-16 0 -0.0025 -1.0363e-16 0.001 -0.0169168 0.109506 0.001 -0.00411002 0.0368756 0.001 -0.00892784 0.0734705 0.001 -0.0169168 0.109506 0 -0.00411002 0.0368756 0 -0.00892784 0.0734705 0 -0.0169168 0.109506 0 -0.0120872 0.1108 0 -0.0120872 0.1108 0.001 -0.0169168 0.109506 0.001 0.0025 -1.04854e-16 0 0.0025 -1.04854e-16 0.001 -0.0120872 0.1108 0.001 0.00087095 0.0373114 0.001 -0.0040038 0.0743388 0.001 -0.0120872 0.1108 0 0.00087095 0.0373114 0 -0.0040038 0.0743388 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0170837 -0.110775 0 -0.0122541 -0.112069 0 -0.0122541 -0.112069 0.001 -0.0170837 -0.110775 0.001 -0.0170837 -0.110775 0 -0.0122541 -0.112069 0 -0.0025 -1.0483e-16 0 -0.00900228 -0.0743214 0 -0.00412867 -0.0373027 0 -0.0170837 0.110775 0 -0.00412867 0.0373027 0 -0.00900228 0.0743214 0 -0.0122541 0.112069 0 0.0025 -1.06054e-16 0 0.000852304 0.0377384 0 -0.00407824 0.0751897 0 -0.00407824 -0.0751897 0 0.000852304 -0.0377384 0 -0.0122541 -0.112069 0 -0.0122541 -0.112069 0.001 0.0025 -1.06054e-16 0.001 -0.00407824 -0.0751897 0.001 0.000852304 -0.0377384 0.001 0.0025 -1.06054e-16 0 -0.00407824 -0.0751897 0 0.000852304 -0.0377384 0 -0.0170837 -0.110775 0.001 -0.0122541 -0.112069 0.001 -0.0025 -1.0483e-16 0.001 -0.00900228 -0.0743214 0.001 -0.00412867 -0.0373027 0.001 -0.0170837 0.110775 0.001 -0.00412867 0.0373027 0.001 -0.00900228 0.0743214 0.001 -0.0122541 0.112069 0.001 0.0025 -1.06054e-16 0.001 0.000852304 0.0377384 0.001 -0.00407824 0.0751897 0.001 -0.00407824 -0.0751897 0.001 0.000852304 -0.0377384 0.001 -0.0170837 -0.110775 0 -0.0170837 -0.110775 0.001 -0.0025 -1.0483e-16 0.001 -0.00900228 -0.0743214 0.001 -0.00412867 -0.0373027 0.001 -0.0025 -1.0483e-16 0 -0.00900228 -0.0743214 0 -0.00412867 -0.0373027 0 -0.0025 -1.0483e-16 0 -0.0025 -1.0483e-16 0.001 -0.0170837 0.110775 0.001 -0.00412867 0.0373027 0.001 -0.00900228 0.0743214 0.001 -0.0170837 0.110775 0 -0.00412867 0.0373027 0 -0.00900228 0.0743214 0 -0.0170837 0.110775 0 -0.0122541 0.112069 0 -0.0122541 0.112069 0.001 -0.0170837 0.110775 0.001 0.0025 -1.06054e-16 0 0.0025 -1.06054e-16 0.001 -0.0122541 0.112069 0.001 0.000852304 0.0377384 0.001 -0.00407824 0.0751897 0.001 -0.0122541 0.112069 0 0.000852304 0.0377384 0 -0.00407824 0.0751897 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0172507 -0.112043 0 -0.0124211 -0.113337 0 -0.0124211 -0.113337 0.001 -0.0172507 -0.112043 0.001 -0.0172507 -0.112043 0 -0.0124211 -0.113337 0 -0.0025 -1.0603e-16 0 -0.00907672 -0.0751723 0 -0.00414732 -0.0377297 0 -0.0172507 0.112043 0 -0.00414732 0.0377297 0 -0.00907672 0.0751723 0 -0.0124211 0.113337 0 0.0025 -1.07255e-16 0 0.000833658 0.0381655 0 -0.00415268 0.0760405 0 -0.00415268 -0.0760405 0 0.000833658 -0.0381655 0 -0.0124211 -0.113337 0 -0.0124211 -0.113337 0.001 0.0025 -1.07255e-16 0.001 -0.00415268 -0.0760405 0.001 0.000833658 -0.0381655 0.001 0.0025 -1.07255e-16 0 -0.00415268 -0.0760405 0 0.000833658 -0.0381655 0 -0.0172507 -0.112043 0.001 -0.0124211 -0.113337 0.001 -0.0025 -1.0603e-16 0.001 -0.00907672 -0.0751723 0.001 -0.00414732 -0.0377297 0.001 -0.0172507 0.112043 0.001 -0.00414732 0.0377297 0.001 -0.00907672 0.0751723 0.001 -0.0124211 0.113337 0.001 0.0025 -1.07255e-16 0.001 0.000833658 0.0381655 0.001 -0.00415268 0.0760405 0.001 -0.00415268 -0.0760405 0.001 0.000833658 -0.0381655 0.001 -0.0172507 -0.112043 0 -0.0172507 -0.112043 0.001 -0.0025 -1.0603e-16 0.001 -0.00907672 -0.0751723 0.001 -0.00414732 -0.0377297 0.001 -0.0025 -1.0603e-16 0 -0.00907672 -0.0751723 0 -0.00414732 -0.0377297 0 -0.0025 -1.0603e-16 0 -0.0025 -1.0603e-16 0.001 -0.0172507 0.112043 0.001 -0.00414732 0.0377297 0.001 -0.00907672 0.0751723 0.001 -0.0172507 0.112043 0 -0.00414732 0.0377297 0 -0.00907672 0.0751723 0 -0.0172507 0.112043 0 -0.0124211 0.113337 0 -0.0124211 0.113337 0.001 -0.0172507 0.112043 0.001 0.0025 -1.07255e-16 0 0.0025 -1.07255e-16 0.001 -0.0124211 0.113337 0.001 0.000833658 0.0381655 0.001 -0.00415268 0.0760405 0.001 -0.0124211 0.113337 0 0.000833658 0.0381655 0 -0.00415268 0.0760405 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0174177 -0.113311 0 -0.012588 -0.114605 0 -0.012588 -0.114605 0.001 -0.0174177 -0.113311 0.001 -0.0174177 -0.113311 0 -0.012588 -0.114605 0 -0.0025 -1.0723e-16 0 -0.00915117 -0.0760232 0 -0.00416596 -0.0381568 0 -0.0174177 0.113311 0 -0.00416596 0.0381568 0 -0.00915117 0.0760232 0 -0.012588 0.114605 0 0.0025 -1.08455e-16 0 0.000815012 0.0385926 0 -0.00422713 0.0768914 0 -0.00422713 -0.0768914 0 0.000815012 -0.0385926 0 -0.012588 -0.114605 0 -0.012588 -0.114605 0.001 0.0025 -1.08455e-16 0.001 -0.00422713 -0.0768914 0.001 0.000815012 -0.0385926 0.001 0.0025 -1.08455e-16 0 -0.00422713 -0.0768914 0 0.000815012 -0.0385926 0 -0.0174177 -0.113311 0.001 -0.012588 -0.114605 0.001 -0.0025 -1.0723e-16 0.001 -0.00915117 -0.0760232 0.001 -0.00416596 -0.0381568 0.001 -0.0174177 0.113311 0.001 -0.00416596 0.0381568 0.001 -0.00915117 0.0760232 0.001 -0.012588 0.114605 0.001 0.0025 -1.08455e-16 0.001 0.000815012 0.0385926 0.001 -0.00422713 0.0768914 0.001 -0.00422713 -0.0768914 0.001 0.000815012 -0.0385926 0.001 -0.0174177 -0.113311 0 -0.0174177 -0.113311 0.001 -0.0025 -1.0723e-16 0.001 -0.00915117 -0.0760232 0.001 -0.00416596 -0.0381568 0.001 -0.0025 -1.0723e-16 0 -0.00915117 -0.0760232 0 -0.00416596 -0.0381568 0 -0.0025 -1.0723e-16 0 -0.0025 -1.0723e-16 0.001 -0.0174177 0.113311 0.001 -0.00416596 0.0381568 0.001 -0.00915117 0.0760232 0.001 -0.0174177 0.113311 0 -0.00416596 0.0381568 0 -0.00915117 0.0760232 0 -0.0174177 0.113311 0 -0.012588 0.114605 0 -0.012588 0.114605 0.001 -0.0174177 0.113311 0.001 0.0025 -1.08455e-16 0 0.0025 -1.08455e-16 0.001 -0.012588 0.114605 0.001 0.000815012 0.0385926 0.001 -0.00422713 0.0768914 0.001 -0.012588 0.114605 0 0.000815012 0.0385926 0 -0.00422713 0.0768914 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0175846 -0.114579 0 -0.012755 -0.115873 0 -0.012755 -0.115873 0.001 -0.0175846 -0.114579 0.001 -0.0175846 -0.114579 0 -0.012755 -0.115873 0 -0.0025 -1.0843e-16 0 -0.00922561 -0.076874 0 -0.00418461 -0.0385838 0 -0.0175846 0.114579 0 -0.00418461 0.0385838 0 -0.00922561 0.076874 0 -0.012755 0.115873 0 0.0025 -1.09655e-16 0 0.000796366 0.0390196 0 -0.00430157 0.0777423 0 -0.00430157 -0.0777423 0 0.000796366 -0.0390196 0 -0.012755 -0.115873 0 -0.012755 -0.115873 0.001 0.0025 -1.09655e-16 0.001 -0.00430157 -0.0777423 0.001 0.000796366 -0.0390196 0.001 0.0025 -1.09655e-16 0 -0.00430157 -0.0777423 0 0.000796366 -0.0390196 0 -0.0175846 -0.114579 0.001 -0.012755 -0.115873 0.001 -0.0025 -1.0843e-16 0.001 -0.00922561 -0.076874 0.001 -0.00418461 -0.0385838 0.001 -0.0175846 0.114579 0.001 -0.00418461 0.0385838 0.001 -0.00922561 0.076874 0.001 -0.012755 0.115873 0.001 0.0025 -1.09655e-16 0.001 0.000796366 0.0390196 0.001 -0.00430157 0.0777423 0.001 -0.00430157 -0.0777423 0.001 0.000796366 -0.0390196 0.001 -0.0175846 -0.114579 0 -0.0175846 -0.114579 0.001 -0.0025 -1.0843e-16 0.001 -0.00922561 -0.076874 0.001 -0.00418461 -0.0385838 0.001 -0.0025 -1.0843e-16 0 -0.00922561 -0.076874 0 -0.00418461 -0.0385838 0 -0.0025 -1.0843e-16 0 -0.0025 -1.0843e-16 0.001 -0.0175846 0.114579 0.001 -0.00418461 0.0385838 0.001 -0.00922561 0.076874 0.001 -0.0175846 0.114579 0 -0.00418461 0.0385838 0 -0.00922561 0.076874 0 -0.0175846 0.114579 0 -0.012755 0.115873 0 -0.012755 0.115873 0.001 -0.0175846 0.114579 0.001 0.0025 -1.09655e-16 0 0.0025 -1.09655e-16 0.001 -0.012755 0.115873 0.001 0.000796366 0.0390196 0.001 -0.00430157 0.0777423 0.001 -0.012755 0.115873 0 0.000796366 0.0390196 0 -0.00430157 0.0777423 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0177516 -0.115847 0 -0.012922 -0.117141 0 -0.012922 -0.117141 0.001 -0.0177516 -0.115847 0.001 -0.0177516 -0.115847 0 -0.012922 -0.117141 0 -0.0025 -1.0963e-16 0 -0.00930005 -0.0777249 0 -0.00420325 -0.0390109 0 -0.0177516 0.115847 0 -0.00420325 0.0390109 0 -0.00930005 0.0777249 0 -0.012922 0.117141 0 0.0025 -1.10855e-16 0 0.00077772 0.0394467 0 -0.00437601 0.0785932 0 -0.00437601 -0.0785932 0 0.00077772 -0.0394467 0 -0.012922 -0.117141 0 -0.012922 -0.117141 0.001 0.0025 -1.10855e-16 0.001 -0.00437601 -0.0785932 0.001 0.00077772 -0.0394467 0.001 0.0025 -1.10855e-16 0 -0.00437601 -0.0785932 0 0.00077772 -0.0394467 0 -0.0177516 -0.115847 0.001 -0.012922 -0.117141 0.001 -0.0025 -1.0963e-16 0.001 -0.00930005 -0.0777249 0.001 -0.00420325 -0.0390109 0.001 -0.0177516 0.115847 0.001 -0.00420325 0.0390109 0.001 -0.00930005 0.0777249 0.001 -0.012922 0.117141 0.001 0.0025 -1.10855e-16 0.001 0.00077772 0.0394467 0.001 -0.00437601 0.0785932 0.001 -0.00437601 -0.0785932 0.001 0.00077772 -0.0394467 0.001 -0.0177516 -0.115847 0 -0.0177516 -0.115847 0.001 -0.0025 -1.0963e-16 0.001 -0.00930005 -0.0777249 0.001 -0.00420325 -0.0390109 0.001 -0.0025 -1.0963e-16 0 -0.00930005 -0.0777249 0 -0.00420325 -0.0390109 0 -0.0025 -1.0963e-16 0 -0.0025 -1.0963e-16 0.001 -0.0177516 0.115847 0.001 -0.00420325 0.0390109 0.001 -0.00930005 0.0777249 0.001 -0.0177516 0.115847 0 -0.00420325 0.0390109 0 -0.00930005 0.0777249 0 -0.0177516 0.115847 0 -0.012922 0.117141 0 -0.012922 0.117141 0.001 -0.0177516 0.115847 0.001 0.0025 -1.10855e-16 0 0.0025 -1.10855e-16 0.001 -0.012922 0.117141 0.001 0.00077772 0.0394467 0.001 -0.00437601 0.0785932 0.001 -0.012922 0.117141 0 0.00077772 0.0394467 0 -0.00437601 0.0785932 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179186 -0.117116 0 -0.0130889 -0.11841 0 -0.0130889 -0.11841 0.001 -0.0179186 -0.117116 0.001 -0.0179186 -0.117116 0 -0.0130889 -0.11841 0 -0.0025 -1.10831e-16 0 -0.00937449 -0.0785758 0 -0.0042219 -0.039438 0 -0.0179186 0.117116 0 -0.0042219 0.039438 0 -0.00937449 0.0785758 0 -0.0130889 0.11841 0 0.0025 -1.12055e-16 0 0.000759074 0.0398738 0 -0.00445045 0.079444 0 -0.00445045 -0.079444 0 0.000759074 -0.0398738 0 -0.0130889 -0.11841 0 -0.0130889 -0.11841 0.001 0.0025 -1.12055e-16 0.001 -0.00445045 -0.079444 0.001 0.000759074 -0.0398738 0.001 0.0025 -1.12055e-16 0 -0.00445045 -0.079444 0 0.000759074 -0.0398738 0 -0.0179186 -0.117116 0.001 -0.0130889 -0.11841 0.001 -0.0025 -1.10831e-16 0.001 -0.00937449 -0.0785758 0.001 -0.0042219 -0.039438 0.001 -0.0179186 0.117116 0.001 -0.0042219 0.039438 0.001 -0.00937449 0.0785758 0.001 -0.0130889 0.11841 0.001 0.0025 -1.12055e-16 0.001 0.000759074 0.0398738 0.001 -0.00445045 0.079444 0.001 -0.00445045 -0.079444 0.001 0.000759074 -0.0398738 0.001 -0.0179186 -0.117116 0 -0.0179186 -0.117116 0.001 -0.0025 -1.10831e-16 0.001 -0.00937449 -0.0785758 0.001 -0.0042219 -0.039438 0.001 -0.0025 -1.10831e-16 0 -0.00937449 -0.0785758 0 -0.0042219 -0.039438 0 -0.0025 -1.10831e-16 0 -0.0025 -1.10831e-16 0.001 -0.0179186 0.117116 0.001 -0.0042219 0.039438 0.001 -0.00937449 0.0785758 0.001 -0.0179186 0.117116 0 -0.0042219 0.039438 0 -0.00937449 0.0785758 0 -0.0179186 0.117116 0 -0.0130889 0.11841 0 -0.0130889 0.11841 0.001 -0.0179186 0.117116 0.001 0.0025 -1.12055e-16 0 0.0025 -1.12055e-16 0.001 -0.0130889 0.11841 0.001 0.000759074 0.0398738 0.001 -0.00445045 0.079444 0.001 -0.0130889 0.11841 0 0.000759074 0.0398738 0 -0.00445045 0.079444 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0180889 -0.11841 0 -0.0132593 -0.119704 0 -0.0132593 -0.119704 0.001 -0.0180889 -0.11841 0.001 -0.0180889 -0.11841 0 -0.0132593 -0.119704 0 -0.0025 -1.12055e-16 0 -0.00945045 -0.079444 0 -0.00424093 -0.0398738 0 -0.0180889 0.11841 0 -0.00424093 0.0398738 0 -0.00945045 0.079444 0 -0.0132593 0.119704 0 0.0025 -1.1328e-16 0 0.000740048 0.0403095 0 -0.00452641 0.0803123 0 -0.00452641 -0.0803123 0 0.000740048 -0.0403095 0 -0.0132593 -0.119704 0 -0.0132593 -0.119704 0.001 0.0025 -1.1328e-16 0.001 -0.00452641 -0.0803123 0.001 0.000740048 -0.0403095 0.001 0.0025 -1.1328e-16 0 -0.00452641 -0.0803123 0 0.000740048 -0.0403095 0 -0.0180889 -0.11841 0.001 -0.0132593 -0.119704 0.001 -0.0025 -1.12055e-16 0.001 -0.00945045 -0.079444 0.001 -0.00424093 -0.0398738 0.001 -0.0180889 0.11841 0.001 -0.00424093 0.0398738 0.001 -0.00945045 0.079444 0.001 -0.0132593 0.119704 0.001 0.0025 -1.1328e-16 0.001 0.000740048 0.0403095 0.001 -0.00452641 0.0803123 0.001 -0.00452641 -0.0803123 0.001 0.000740048 -0.0403095 0.001 -0.0180889 -0.11841 0 -0.0180889 -0.11841 0.001 -0.0025 -1.12055e-16 0.001 -0.00945045 -0.079444 0.001 -0.00424093 -0.0398738 0.001 -0.0025 -1.12055e-16 0 -0.00945045 -0.079444 0 -0.00424093 -0.0398738 0 -0.0025 -1.12055e-16 0 -0.0025 -1.12055e-16 0.001 -0.0180889 0.11841 0.001 -0.00424093 0.0398738 0.001 -0.00945045 0.079444 0.001 -0.0180889 0.11841 0 -0.00424093 0.0398738 0 -0.00945045 0.079444 0 -0.0180889 0.11841 0 -0.0132593 0.119704 0 -0.0132593 0.119704 0.001 -0.0180889 0.11841 0.001 0.0025 -1.1328e-16 0 0.0025 -1.1328e-16 0.001 -0.0132593 0.119704 0.001 0.000740048 0.0403095 0.001 -0.00452641 0.0803123 0.001 -0.0132593 0.119704 0 0.000740048 0.0403095 0 -0.00452641 0.0803123 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0182559 -0.119678 0 -0.0134263 -0.120972 0 -0.0134263 -0.120972 0.001 -0.0182559 -0.119678 0.001 -0.0182559 -0.119678 0 -0.0134263 -0.120972 0 -0.0025 -1.13255e-16 0 -0.0095249 -0.0802949 0 -0.00425957 -0.0403008 0 -0.0182559 0.119678 0 -0.00425957 0.0403008 0 -0.0095249 0.0802949 0 -0.0134263 0.120972 0 0.0025 -1.1448e-16 0 0.000721402 0.0407366 0 -0.00460086 0.0811632 0 -0.00460086 -0.0811632 0 0.000721402 -0.0407366 0 -0.0134263 -0.120972 0 -0.0134263 -0.120972 0.001 0.0025 -1.1448e-16 0.001 -0.00460086 -0.0811632 0.001 0.000721402 -0.0407366 0.001 0.0025 -1.1448e-16 0 -0.00460086 -0.0811632 0 0.000721402 -0.0407366 0 -0.0182559 -0.119678 0.001 -0.0134263 -0.120972 0.001 -0.0025 -1.13255e-16 0.001 -0.0095249 -0.0802949 0.001 -0.00425957 -0.0403008 0.001 -0.0182559 0.119678 0.001 -0.00425957 0.0403008 0.001 -0.0095249 0.0802949 0.001 -0.0134263 0.120972 0.001 0.0025 -1.1448e-16 0.001 0.000721402 0.0407366 0.001 -0.00460086 0.0811632 0.001 -0.00460086 -0.0811632 0.001 0.000721402 -0.0407366 0.001 -0.0182559 -0.119678 0 -0.0182559 -0.119678 0.001 -0.0025 -1.13255e-16 0.001 -0.0095249 -0.0802949 0.001 -0.00425957 -0.0403008 0.001 -0.0025 -1.13255e-16 0 -0.0095249 -0.0802949 0 -0.00425957 -0.0403008 0 -0.0025 -1.13255e-16 0 -0.0025 -1.13255e-16 0.001 -0.0182559 0.119678 0.001 -0.00425957 0.0403008 0.001 -0.0095249 0.0802949 0.001 -0.0182559 0.119678 0 -0.00425957 0.0403008 0 -0.0095249 0.0802949 0 -0.0182559 0.119678 0 -0.0134263 0.120972 0 -0.0134263 0.120972 0.001 -0.0182559 0.119678 0.001 0.0025 -1.1448e-16 0 0.0025 -1.1448e-16 0.001 -0.0134263 0.120972 0.001 0.000721402 0.0407366 0.001 -0.00460086 0.0811632 0.001 -0.0134263 0.120972 0 0.000721402 0.0407366 0 -0.00460086 0.0811632 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0184229 -0.120946 0 -0.0135932 -0.12224 0 -0.0135932 -0.12224 0.001 -0.0184229 -0.120946 0.001 -0.0184229 -0.120946 0 -0.0135932 -0.12224 0 -0.0025 -1.14455e-16 0 -0.00959934 -0.0811458 0 -0.00427822 -0.0407279 0 -0.0184229 0.120946 0 -0.00427822 0.0407279 0 -0.00959934 0.0811458 0 -0.0135932 0.12224 0 0.0025 -1.1568e-16 0 0.000702756 0.0411637 0 -0.0046753 0.082014 0 -0.0046753 -0.082014 0 0.000702756 -0.0411637 0 -0.0135932 -0.12224 0 -0.0135932 -0.12224 0.001 0.0025 -1.1568e-16 0.001 -0.0046753 -0.082014 0.001 0.000702756 -0.0411637 0.001 0.0025 -1.1568e-16 0 -0.0046753 -0.082014 0 0.000702756 -0.0411637 0 -0.0184229 -0.120946 0.001 -0.0135932 -0.12224 0.001 -0.0025 -1.14455e-16 0.001 -0.00959934 -0.0811458 0.001 -0.00427822 -0.0407279 0.001 -0.0184229 0.120946 0.001 -0.00427822 0.0407279 0.001 -0.00959934 0.0811458 0.001 -0.0135932 0.12224 0.001 0.0025 -1.1568e-16 0.001 0.000702756 0.0411637 0.001 -0.0046753 0.082014 0.001 -0.0046753 -0.082014 0.001 0.000702756 -0.0411637 0.001 -0.0184229 -0.120946 0 -0.0184229 -0.120946 0.001 -0.0025 -1.14455e-16 0.001 -0.00959934 -0.0811458 0.001 -0.00427822 -0.0407279 0.001 -0.0025 -1.14455e-16 0 -0.00959934 -0.0811458 0 -0.00427822 -0.0407279 0 -0.0025 -1.14455e-16 0 -0.0025 -1.14455e-16 0.001 -0.0184229 0.120946 0.001 -0.00427822 0.0407279 0.001 -0.00959934 0.0811458 0.001 -0.0184229 0.120946 0 -0.00427822 0.0407279 0 -0.00959934 0.0811458 0 -0.0184229 0.120946 0 -0.0135932 0.12224 0 -0.0135932 0.12224 0.001 -0.0184229 0.120946 0.001 0.0025 -1.1568e-16 0 0.0025 -1.1568e-16 0.001 -0.0135932 0.12224 0.001 0.000702756 0.0411637 0.001 -0.0046753 0.082014 0.001 -0.0135932 0.12224 0 0.000702756 0.0411637 0 -0.0046753 0.082014 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0110151 -0.0646789 0 -0.00618551 -0.065973 0 -0.00618551 -0.065973 0.001 -0.0110151 -0.0646789 0.001 -0.0110151 -0.0646789 0 -0.00618551 -0.065973 0 -0.0025 -6.12078e-17 0 -0.00629654 -0.0433947 0 -0.00345094 -0.0217802 0 -0.0110151 0.0646789 0 -0.00345094 0.0217802 0 -0.00629654 0.0433947 0 -0.00618551 0.065973 0 0.0025 -6.24325e-17 0 0.00153003 0.022216 0 -0.0013725 0.0442629 0 -0.0013725 -0.0442629 0 0.00153003 -0.022216 0 -0.00618551 -0.065973 0 -0.00618551 -0.065973 0.001 0.0025 -6.24325e-17 0.001 -0.0013725 -0.0442629 0.001 0.00153003 -0.022216 0.001 0.0025 -6.24325e-17 0 -0.0013725 -0.0442629 0 0.00153003 -0.022216 0 -0.0110151 -0.0646789 0.001 -0.00618551 -0.065973 0.001 -0.0025 -6.12078e-17 0.001 -0.00629654 -0.0433947 0.001 -0.00345094 -0.0217802 0.001 -0.0110151 0.0646789 0.001 -0.00345094 0.0217802 0.001 -0.00629654 0.0433947 0.001 -0.00618551 0.065973 0.001 0.0025 -6.24325e-17 0.001 0.00153003 0.022216 0.001 -0.0013725 0.0442629 0.001 -0.0013725 -0.0442629 0.001 0.00153003 -0.022216 0.001 -0.0110151 -0.0646789 0 -0.0110151 -0.0646789 0.001 -0.0025 -6.12078e-17 0.001 -0.00629654 -0.0433947 0.001 -0.00345094 -0.0217802 0.001 -0.0025 -6.12078e-17 0 -0.00629654 -0.0433947 0 -0.00345094 -0.0217802 0 -0.0025 -6.12078e-17 0 -0.0025 -6.12078e-17 0.001 -0.0110151 0.0646789 0.001 -0.00345094 0.0217802 0.001 -0.00629654 0.0433947 0.001 -0.0110151 0.0646789 0 -0.00345094 0.0217802 0 -0.00629654 0.0433947 0 -0.0110151 0.0646789 0 -0.00618551 0.065973 0 -0.00618551 0.065973 0.001 -0.0110151 0.0646789 0.001 0.0025 -6.24325e-17 0 0.0025 -6.24325e-17 0.001 -0.00618551 0.065973 0.001 0.00153003 0.022216 0.001 -0.0013725 0.0442629 0.001 -0.00618551 0.065973 0 0.00153003 0.022216 0 -0.0013725 0.0442629 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0185898 -0.122214 0 -0.0137602 -0.123508 0 -0.0137602 -0.123508 0.001 -0.0185898 -0.122214 0.001 -0.0185898 -0.122214 0 -0.0137602 -0.123508 0 -0.0025 -1.15656e-16 0 -0.00967378 -0.0819967 0 -0.00429686 -0.0411549 0 -0.0185898 0.122214 0 -0.00429686 0.0411549 0 -0.00967378 0.0819967 0 -0.0137602 0.123508 0 0.0025 -1.1688e-16 0 0.00068411 0.0415907 0 -0.00474974 0.0828649 0 -0.00474974 -0.0828649 0 0.00068411 -0.0415907 0 -0.0137602 -0.123508 0 -0.0137602 -0.123508 0.001 0.0025 -1.1688e-16 0.001 -0.00474974 -0.0828649 0.001 0.00068411 -0.0415907 0.001 0.0025 -1.1688e-16 0 -0.00474974 -0.0828649 0 0.00068411 -0.0415907 0 -0.0185898 -0.122214 0.001 -0.0137602 -0.123508 0.001 -0.0025 -1.15656e-16 0.001 -0.00967378 -0.0819967 0.001 -0.00429686 -0.0411549 0.001 -0.0185898 0.122214 0.001 -0.00429686 0.0411549 0.001 -0.00967378 0.0819967 0.001 -0.0137602 0.123508 0.001 0.0025 -1.1688e-16 0.001 0.00068411 0.0415907 0.001 -0.00474974 0.0828649 0.001 -0.00474974 -0.0828649 0.001 0.00068411 -0.0415907 0.001 -0.0185898 -0.122214 0 -0.0185898 -0.122214 0.001 -0.0025 -1.15656e-16 0.001 -0.00967378 -0.0819967 0.001 -0.00429686 -0.0411549 0.001 -0.0025 -1.15656e-16 0 -0.00967378 -0.0819967 0 -0.00429686 -0.0411549 0 -0.0025 -1.15656e-16 0 -0.0025 -1.15656e-16 0.001 -0.0185898 0.122214 0.001 -0.00429686 0.0411549 0.001 -0.00967378 0.0819967 0.001 -0.0185898 0.122214 0 -0.00429686 0.0411549 0 -0.00967378 0.0819967 0 -0.0185898 0.122214 0 -0.0137602 0.123508 0 -0.0137602 0.123508 0.001 -0.0185898 0.122214 0.001 0.0025 -1.1688e-16 0 0.0025 -1.1688e-16 0.001 -0.0137602 0.123508 0.001 0.00068411 0.0415907 0.001 -0.00474974 0.0828649 0.001 -0.0137602 0.123508 0 0.00068411 0.0415907 0 -0.00474974 0.0828649 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0187568 -0.123483 0 -0.0139272 -0.124777 0 -0.0139272 -0.124777 0.001 -0.0187568 -0.123483 0.001 -0.0187568 -0.123483 0 -0.0139272 -0.124777 0 -0.0025 -1.16856e-16 0 -0.00974822 -0.0828475 0 -0.00431551 -0.041582 0 -0.0187568 0.123483 0 -0.00431551 0.041582 0 -0.00974822 0.0828475 0 -0.0139272 0.124777 0 0.0025 -1.1808e-16 0 0.000665464 0.0420178 0 -0.00482418 0.0837158 0 -0.00482418 -0.0837158 0 0.000665464 -0.0420178 0 -0.0139272 -0.124777 0 -0.0139272 -0.124777 0.001 0.0025 -1.1808e-16 0.001 -0.00482418 -0.0837158 0.001 0.000665464 -0.0420178 0.001 0.0025 -1.1808e-16 0 -0.00482418 -0.0837158 0 0.000665464 -0.0420178 0 -0.0187568 -0.123483 0.001 -0.0139272 -0.124777 0.001 -0.0025 -1.16856e-16 0.001 -0.00974822 -0.0828475 0.001 -0.00431551 -0.041582 0.001 -0.0187568 0.123483 0.001 -0.00431551 0.041582 0.001 -0.00974822 0.0828475 0.001 -0.0139272 0.124777 0.001 0.0025 -1.1808e-16 0.001 0.000665464 0.0420178 0.001 -0.00482418 0.0837158 0.001 -0.00482418 -0.0837158 0.001 0.000665464 -0.0420178 0.001 -0.0187568 -0.123483 0 -0.0187568 -0.123483 0.001 -0.0025 -1.16856e-16 0.001 -0.00974822 -0.0828475 0.001 -0.00431551 -0.041582 0.001 -0.0025 -1.16856e-16 0 -0.00974822 -0.0828475 0 -0.00431551 -0.041582 0 -0.0025 -1.16856e-16 0 -0.0025 -1.16856e-16 0.001 -0.0187568 0.123483 0.001 -0.00431551 0.041582 0.001 -0.00974822 0.0828475 0.001 -0.0187568 0.123483 0 -0.00431551 0.041582 0 -0.00974822 0.0828475 0 -0.0187568 0.123483 0 -0.0139272 0.124777 0 -0.0139272 0.124777 0.001 -0.0187568 0.123483 0.001 0.0025 -1.1808e-16 0 0.0025 -1.1808e-16 0.001 -0.0139272 0.124777 0.001 0.000665464 0.0420178 0.001 -0.00482418 0.0837158 0.001 -0.0139272 0.124777 0 0.000665464 0.0420178 0 -0.00482418 0.0837158 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0189238 -0.124751 0 -0.0140941 -0.126045 0 -0.0140941 -0.126045 0.001 -0.0189238 -0.124751 0.001 -0.0189238 -0.124751 0 -0.0140941 -0.126045 0 -0.0025 -1.18056e-16 0 -0.00982266 -0.0836984 0 -0.00433416 -0.0420091 0 -0.0189238 0.124751 0 -0.00433416 0.0420091 0 -0.00982266 0.0836984 0 -0.0140941 0.126045 0 0.0025 -1.19281e-16 0 0.000646818 0.0424448 0 -0.00489862 0.0845667 0 -0.00489862 -0.0845667 0 0.000646818 -0.0424448 0 -0.0140941 -0.126045 0 -0.0140941 -0.126045 0.001 0.0025 -1.19281e-16 0.001 -0.00489862 -0.0845667 0.001 0.000646818 -0.0424448 0.001 0.0025 -1.19281e-16 0 -0.00489862 -0.0845667 0 0.000646818 -0.0424448 0 -0.0189238 -0.124751 0.001 -0.0140941 -0.126045 0.001 -0.0025 -1.18056e-16 0.001 -0.00982266 -0.0836984 0.001 -0.00433416 -0.0420091 0.001 -0.0189238 0.124751 0.001 -0.00433416 0.0420091 0.001 -0.00982266 0.0836984 0.001 -0.0140941 0.126045 0.001 0.0025 -1.19281e-16 0.001 0.000646818 0.0424448 0.001 -0.00489862 0.0845667 0.001 -0.00489862 -0.0845667 0.001 0.000646818 -0.0424448 0.001 -0.0189238 -0.124751 0 -0.0189238 -0.124751 0.001 -0.0025 -1.18056e-16 0.001 -0.00982266 -0.0836984 0.001 -0.00433416 -0.0420091 0.001 -0.0025 -1.18056e-16 0 -0.00982266 -0.0836984 0 -0.00433416 -0.0420091 0 -0.0025 -1.18056e-16 0 -0.0025 -1.18056e-16 0.001 -0.0189238 0.124751 0.001 -0.00433416 0.0420091 0.001 -0.00982266 0.0836984 0.001 -0.0189238 0.124751 0 -0.00433416 0.0420091 0 -0.00982266 0.0836984 0 -0.0189238 0.124751 0 -0.0140941 0.126045 0 -0.0140941 0.126045 0.001 -0.0189238 0.124751 0.001 0.0025 -1.19281e-16 0 0.0025 -1.19281e-16 0.001 -0.0140941 0.126045 0.001 0.000646818 0.0424448 0.001 -0.00489862 0.0845667 0.001 -0.0140941 0.126045 0 0.000646818 0.0424448 0 -0.00489862 0.0845667 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0190907 -0.126019 0 -0.0142611 -0.127313 0 -0.0142611 -0.127313 0.001 -0.0190907 -0.126019 0.001 -0.0190907 -0.126019 0 -0.0142611 -0.127313 0 -0.0025 -1.19256e-16 0 -0.00989711 -0.0845493 0 -0.0043528 -0.0424361 0 -0.0190907 0.126019 0 -0.0043528 0.0424361 0 -0.00989711 0.0845493 0 -0.0142611 0.127313 0 0.0025 -1.20481e-16 0 0.000628172 0.0428719 0 -0.00497307 0.0854175 0 -0.00497307 -0.0854175 0 0.000628172 -0.0428719 0 -0.0142611 -0.127313 0 -0.0142611 -0.127313 0.001 0.0025 -1.20481e-16 0.001 -0.00497307 -0.0854175 0.001 0.000628172 -0.0428719 0.001 0.0025 -1.20481e-16 0 -0.00497307 -0.0854175 0 0.000628172 -0.0428719 0 -0.0190907 -0.126019 0.001 -0.0142611 -0.127313 0.001 -0.0025 -1.19256e-16 0.001 -0.00989711 -0.0845493 0.001 -0.0043528 -0.0424361 0.001 -0.0190907 0.126019 0.001 -0.0043528 0.0424361 0.001 -0.00989711 0.0845493 0.001 -0.0142611 0.127313 0.001 0.0025 -1.20481e-16 0.001 0.000628172 0.0428719 0.001 -0.00497307 0.0854175 0.001 -0.00497307 -0.0854175 0.001 0.000628172 -0.0428719 0.001 -0.0190907 -0.126019 0 -0.0190907 -0.126019 0.001 -0.0025 -1.19256e-16 0.001 -0.00989711 -0.0845493 0.001 -0.0043528 -0.0424361 0.001 -0.0025 -1.19256e-16 0 -0.00989711 -0.0845493 0 -0.0043528 -0.0424361 0 -0.0025 -1.19256e-16 0 -0.0025 -1.19256e-16 0.001 -0.0190907 0.126019 0.001 -0.0043528 0.0424361 0.001 -0.00989711 0.0845493 0.001 -0.0190907 0.126019 0 -0.0043528 0.0424361 0 -0.00989711 0.0845493 0 -0.0190907 0.126019 0 -0.0142611 0.127313 0 -0.0142611 0.127313 0.001 -0.0190907 0.126019 0.001 0.0025 -1.20481e-16 0 0.0025 -1.20481e-16 0.001 -0.0142611 0.127313 0.001 0.000628172 0.0428719 0.001 -0.00497307 0.0854175 0.001 -0.0142611 0.127313 0 0.000628172 0.0428719 0 -0.00497307 0.0854175 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0192543 -0.127261 0 -0.0144246 -0.128555 0 -0.0144246 -0.128555 0.001 -0.0192543 -0.127261 0.001 -0.0192543 -0.127261 0 -0.0144246 -0.128555 0 -0.0025 -1.20432e-16 0 -0.00997003 -0.0853828 0 -0.00437107 -0.0428545 0 -0.0192543 0.127261 0 -0.00437107 0.0428545 0 -0.00997003 0.0853828 0 -0.0144246 0.128555 0 0.0025 -1.21656e-16 0 0.000609907 0.0432903 0 -0.00504599 0.086251 0 -0.00504599 -0.086251 0 0.000609907 -0.0432903 0 -0.0144246 -0.128555 0 -0.0144246 -0.128555 0.001 0.0025 -1.21656e-16 0.001 -0.00504599 -0.086251 0.001 0.000609907 -0.0432903 0.001 0.0025 -1.21656e-16 0 -0.00504599 -0.086251 0 0.000609907 -0.0432903 0 -0.0192543 -0.127261 0.001 -0.0144246 -0.128555 0.001 -0.0025 -1.20432e-16 0.001 -0.00997003 -0.0853828 0.001 -0.00437107 -0.0428545 0.001 -0.0192543 0.127261 0.001 -0.00437107 0.0428545 0.001 -0.00997003 0.0853828 0.001 -0.0144246 0.128555 0.001 0.0025 -1.21656e-16 0.001 0.000609907 0.0432903 0.001 -0.00504599 0.086251 0.001 -0.00504599 -0.086251 0.001 0.000609907 -0.0432903 0.001 -0.0192543 -0.127261 0 -0.0192543 -0.127261 0.001 -0.0025 -1.20432e-16 0.001 -0.00997003 -0.0853828 0.001 -0.00437107 -0.0428545 0.001 -0.0025 -1.20432e-16 0 -0.00997003 -0.0853828 0 -0.00437107 -0.0428545 0 -0.0025 -1.20432e-16 0 -0.0025 -1.20432e-16 0.001 -0.0192543 0.127261 0.001 -0.00437107 0.0428545 0.001 -0.00997003 0.0853828 0.001 -0.0192543 0.127261 0 -0.00437107 0.0428545 0 -0.00997003 0.0853828 0 -0.0192543 0.127261 0 -0.0144246 0.128555 0 -0.0144246 0.128555 0.001 -0.0192543 0.127261 0.001 0.0025 -1.21656e-16 0 0.0025 -1.21656e-16 0.001 -0.0144246 0.128555 0.001 0.000609907 0.0432903 0.001 -0.00504599 0.086251 0.001 -0.0144246 0.128555 0 0.000609907 0.0432903 0 -0.00504599 0.086251 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0194212 -0.12853 0 -0.0145916 -0.129824 0 -0.0145916 -0.129824 0.001 -0.0194212 -0.12853 0.001 -0.0194212 -0.12853 0 -0.0145916 -0.129824 0 -0.0025 -1.21632e-16 0 -0.0100445 -0.0862337 0 -0.00438971 -0.0432815 0 -0.0194212 0.12853 0 -0.00438971 0.0432815 0 -0.0100445 0.0862337 0 -0.0145916 0.129824 0 0.0025 -1.22857e-16 0 0.000591261 0.0437173 0 -0.00512043 0.0871019 0 -0.00512043 -0.0871019 0 0.000591261 -0.0437173 0 -0.0145916 -0.129824 0 -0.0145916 -0.129824 0.001 0.0025 -1.22857e-16 0.001 -0.00512043 -0.0871019 0.001 0.000591261 -0.0437173 0.001 0.0025 -1.22857e-16 0 -0.00512043 -0.0871019 0 0.000591261 -0.0437173 0 -0.0194212 -0.12853 0.001 -0.0145916 -0.129824 0.001 -0.0025 -1.21632e-16 0.001 -0.0100445 -0.0862337 0.001 -0.00438971 -0.0432815 0.001 -0.0194212 0.12853 0.001 -0.00438971 0.0432815 0.001 -0.0100445 0.0862337 0.001 -0.0145916 0.129824 0.001 0.0025 -1.22857e-16 0.001 0.000591261 0.0437173 0.001 -0.00512043 0.0871019 0.001 -0.00512043 -0.0871019 0.001 0.000591261 -0.0437173 0.001 -0.0194212 -0.12853 0 -0.0194212 -0.12853 0.001 -0.0025 -1.21632e-16 0.001 -0.0100445 -0.0862337 0.001 -0.00438971 -0.0432815 0.001 -0.0025 -1.21632e-16 0 -0.0100445 -0.0862337 0 -0.00438971 -0.0432815 0 -0.0025 -1.21632e-16 0 -0.0025 -1.21632e-16 0.001 -0.0194212 0.12853 0.001 -0.00438971 0.0432815 0.001 -0.0100445 0.0862337 0.001 -0.0194212 0.12853 0 -0.00438971 0.0432815 0 -0.0100445 0.0862337 0 -0.0194212 0.12853 0 -0.0145916 0.129824 0 -0.0145916 0.129824 0.001 -0.0194212 0.12853 0.001 0.0025 -1.22857e-16 0 0.0025 -1.22857e-16 0.001 -0.0145916 0.129824 0.001 0.000591261 0.0437173 0.001 -0.00512043 0.0871019 0.001 -0.0145916 0.129824 0 0.000591261 0.0437173 0 -0.00512043 0.0871019 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0195882 -0.129798 0 -0.0147586 -0.131092 0 -0.0147586 -0.131092 0.001 -0.0195882 -0.129798 0.001 -0.0195882 -0.129798 0 -0.0147586 -0.131092 0 -0.0025 -1.22832e-16 0 -0.0101189 -0.0870846 0 -0.00440836 -0.0437086 0 -0.0195882 0.129798 0 -0.00440836 0.0437086 0 -0.0101189 0.0870846 0 -0.0147586 0.131092 0 0.0025 -1.24057e-16 0 0.000572615 0.0441444 0 -0.00519487 0.0879528 0 -0.00519487 -0.0879528 0 0.000572615 -0.0441444 0 -0.0147586 -0.131092 0 -0.0147586 -0.131092 0.001 0.0025 -1.24057e-16 0.001 -0.00519487 -0.0879528 0.001 0.000572615 -0.0441444 0.001 0.0025 -1.24057e-16 0 -0.00519487 -0.0879528 0 0.000572615 -0.0441444 0 -0.0195882 -0.129798 0.001 -0.0147586 -0.131092 0.001 -0.0025 -1.22832e-16 0.001 -0.0101189 -0.0870846 0.001 -0.00440836 -0.0437086 0.001 -0.0195882 0.129798 0.001 -0.00440836 0.0437086 0.001 -0.0101189 0.0870846 0.001 -0.0147586 0.131092 0.001 0.0025 -1.24057e-16 0.001 0.000572615 0.0441444 0.001 -0.00519487 0.0879528 0.001 -0.00519487 -0.0879528 0.001 0.000572615 -0.0441444 0.001 -0.0195882 -0.129798 0 -0.0195882 -0.129798 0.001 -0.0025 -1.22832e-16 0.001 -0.0101189 -0.0870846 0.001 -0.00440836 -0.0437086 0.001 -0.0025 -1.22832e-16 0 -0.0101189 -0.0870846 0 -0.00440836 -0.0437086 0 -0.0025 -1.22832e-16 0 -0.0025 -1.22832e-16 0.001 -0.0195882 0.129798 0.001 -0.00440836 0.0437086 0.001 -0.0101189 0.0870846 0.001 -0.0195882 0.129798 0 -0.00440836 0.0437086 0 -0.0101189 0.0870846 0 -0.0195882 0.129798 0 -0.0147586 0.131092 0 -0.0147586 0.131092 0.001 -0.0195882 0.129798 0.001 0.0025 -1.24057e-16 0 0.0025 -1.24057e-16 0.001 -0.0147586 0.131092 0.001 0.000572615 0.0441444 0.001 -0.00519487 0.0879528 0.001 -0.0147586 0.131092 0 0.000572615 0.0441444 0 -0.00519487 0.0879528 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0197552 -0.131066 0 -0.0149255 -0.13236 0 -0.0149255 -0.13236 0.001 -0.0197552 -0.131066 0.001 -0.0197552 -0.131066 0 -0.0149255 -0.13236 0 -0.0025 -1.24032e-16 0 -0.0101934 -0.0879354 0 -0.004427 -0.0441357 0 -0.0197552 0.131066 0 -0.004427 0.0441357 0 -0.0101934 0.0879354 0 -0.0149255 0.13236 0 0.0025 -1.25257e-16 0 0.000553969 0.0445714 0 -0.00526932 0.0888037 0 -0.00526932 -0.0888037 0 0.000553969 -0.0445714 0 -0.0149255 -0.13236 0 -0.0149255 -0.13236 0.001 0.0025 -1.25257e-16 0.001 -0.00526932 -0.0888037 0.001 0.000553969 -0.0445714 0.001 0.0025 -1.25257e-16 0 -0.00526932 -0.0888037 0 0.000553969 -0.0445714 0 -0.0197552 -0.131066 0.001 -0.0149255 -0.13236 0.001 -0.0025 -1.24032e-16 0.001 -0.0101934 -0.0879354 0.001 -0.004427 -0.0441357 0.001 -0.0197552 0.131066 0.001 -0.004427 0.0441357 0.001 -0.0101934 0.0879354 0.001 -0.0149255 0.13236 0.001 0.0025 -1.25257e-16 0.001 0.000553969 0.0445714 0.001 -0.00526932 0.0888037 0.001 -0.00526932 -0.0888037 0.001 0.000553969 -0.0445714 0.001 -0.0197552 -0.131066 0 -0.0197552 -0.131066 0.001 -0.0025 -1.24032e-16 0.001 -0.0101934 -0.0879354 0.001 -0.004427 -0.0441357 0.001 -0.0025 -1.24032e-16 0 -0.0101934 -0.0879354 0 -0.004427 -0.0441357 0 -0.0025 -1.24032e-16 0 -0.0025 -1.24032e-16 0.001 -0.0197552 0.131066 0.001 -0.004427 0.0441357 0.001 -0.0101934 0.0879354 0.001 -0.0197552 0.131066 0 -0.004427 0.0441357 0 -0.0101934 0.0879354 0 -0.0197552 0.131066 0 -0.0149255 0.13236 0 -0.0149255 0.13236 0.001 -0.0197552 0.131066 0.001 0.0025 -1.25257e-16 0 0.0025 -1.25257e-16 0.001 -0.0149255 0.13236 0.001 0.000553969 0.0445714 0.001 -0.00526932 0.0888037 0.001 -0.0149255 0.13236 0 0.000553969 0.0445714 0 -0.00526932 0.0888037 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0199221 -0.132334 0 -0.0150925 -0.133628 0 -0.0150925 -0.133628 0.001 -0.0199221 -0.132334 0.001 -0.0199221 -0.132334 0 -0.0150925 -0.133628 0 -0.0025 -1.25232e-16 0 -0.0102678 -0.0887863 0 -0.00444565 -0.0445627 0 -0.0199221 0.132334 0 -0.00444565 0.0445627 0 -0.0102678 0.0887863 0 -0.0150925 0.133628 0 0.0025 -1.26457e-16 0 0.000535323 0.0449985 0 -0.00534376 0.0896546 0 -0.00534376 -0.0896546 0 0.000535323 -0.0449985 0 -0.0150925 -0.133628 0 -0.0150925 -0.133628 0.001 0.0025 -1.26457e-16 0.001 -0.00534376 -0.0896546 0.001 0.000535323 -0.0449985 0.001 0.0025 -1.26457e-16 0 -0.00534376 -0.0896546 0 0.000535323 -0.0449985 0 -0.0199221 -0.132334 0.001 -0.0150925 -0.133628 0.001 -0.0025 -1.25232e-16 0.001 -0.0102678 -0.0887863 0.001 -0.00444565 -0.0445627 0.001 -0.0199221 0.132334 0.001 -0.00444565 0.0445627 0.001 -0.0102678 0.0887863 0.001 -0.0150925 0.133628 0.001 0.0025 -1.26457e-16 0.001 0.000535323 0.0449985 0.001 -0.00534376 0.0896546 0.001 -0.00534376 -0.0896546 0.001 0.000535323 -0.0449985 0.001 -0.0199221 -0.132334 0 -0.0199221 -0.132334 0.001 -0.0025 -1.25232e-16 0.001 -0.0102678 -0.0887863 0.001 -0.00444565 -0.0445627 0.001 -0.0025 -1.25232e-16 0 -0.0102678 -0.0887863 0 -0.00444565 -0.0445627 0 -0.0025 -1.25232e-16 0 -0.0025 -1.25232e-16 0.001 -0.0199221 0.132334 0.001 -0.00444565 0.0445627 0.001 -0.0102678 0.0887863 0.001 -0.0199221 0.132334 0 -0.00444565 0.0445627 0 -0.0102678 0.0887863 0 -0.0199221 0.132334 0 -0.0150925 0.133628 0 -0.0150925 0.133628 0.001 -0.0199221 0.132334 0.001 0.0025 -1.26457e-16 0 0.0025 -1.26457e-16 0.001 -0.0150925 0.133628 0.001 0.000535323 0.0449985 0.001 -0.00534376 0.0896546 0.001 -0.0150925 0.133628 0 0.000535323 0.0449985 0 -0.00534376 0.0896546 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0200891 -0.133602 0 -0.0152595 -0.134896 0 -0.0152595 -0.134896 0.001 -0.0200891 -0.133602 0.001 -0.0200891 -0.133602 0 -0.0152595 -0.134896 0 -0.0025 -1.26433e-16 0 -0.0103422 -0.0896372 0 -0.0044643 -0.0449898 0 -0.0200891 0.133602 0 -0.0044643 0.0449898 0 -0.0103422 0.0896372 0 -0.0152595 0.134896 0 0.0025 -1.27657e-16 0 0.000516677 0.0454256 0 -0.0054182 0.0905054 0 -0.0054182 -0.0905054 0 0.000516677 -0.0454256 0 -0.0152595 -0.134896 0 -0.0152595 -0.134896 0.001 0.0025 -1.27657e-16 0.001 -0.0054182 -0.0905054 0.001 0.000516677 -0.0454256 0.001 0.0025 -1.27657e-16 0 -0.0054182 -0.0905054 0 0.000516677 -0.0454256 0 -0.0200891 -0.133602 0.001 -0.0152595 -0.134896 0.001 -0.0025 -1.26433e-16 0.001 -0.0103422 -0.0896372 0.001 -0.0044643 -0.0449898 0.001 -0.0200891 0.133602 0.001 -0.0044643 0.0449898 0.001 -0.0103422 0.0896372 0.001 -0.0152595 0.134896 0.001 0.0025 -1.27657e-16 0.001 0.000516677 0.0454256 0.001 -0.0054182 0.0905054 0.001 -0.0054182 -0.0905054 0.001 0.000516677 -0.0454256 0.001 -0.0200891 -0.133602 0 -0.0200891 -0.133602 0.001 -0.0025 -1.26433e-16 0.001 -0.0103422 -0.0896372 0.001 -0.0044643 -0.0449898 0.001 -0.0025 -1.26433e-16 0 -0.0103422 -0.0896372 0 -0.0044643 -0.0449898 0 -0.0025 -1.26433e-16 0 -0.0025 -1.26433e-16 0.001 -0.0200891 0.133602 0.001 -0.0044643 0.0449898 0.001 -0.0103422 0.0896372 0.001 -0.0200891 0.133602 0 -0.0044643 0.0449898 0 -0.0103422 0.0896372 0 -0.0200891 0.133602 0 -0.0152595 0.134896 0 -0.0152595 0.134896 0.001 -0.0200891 0.133602 0.001 0.0025 -1.27657e-16 0 0.0025 -1.27657e-16 0.001 -0.0152595 0.134896 0.001 0.000516677 0.0454256 0.001 -0.0054182 0.0905054 0.001 -0.0152595 0.134896 0 0.000516677 0.0454256 0 -0.0054182 0.0905054 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0111821 -0.0659471 0 -0.00635247 -0.0672412 0 -0.00635247 -0.0672412 0.001 -0.0111821 -0.0659471 0.001 -0.0111821 -0.0659471 0 -0.00635247 -0.0672412 0 -0.0025 -6.2408e-17 0 -0.00637098 -0.0442456 0 -0.00346959 -0.0222073 0 -0.0111821 0.0659471 0 -0.00346959 0.0222073 0 -0.00637098 0.0442456 0 -0.00635247 0.0672412 0 0.0025 -6.36326e-17 0 0.00151138 0.0226431 0 -0.00144695 0.0451138 0 -0.00144695 -0.0451138 0 0.00151138 -0.0226431 0 -0.00635247 -0.0672412 0 -0.00635247 -0.0672412 0.001 0.0025 -6.36326e-17 0.001 -0.00144695 -0.0451138 0.001 0.00151138 -0.0226431 0.001 0.0025 -6.36326e-17 0 -0.00144695 -0.0451138 0 0.00151138 -0.0226431 0 -0.0111821 -0.0659471 0.001 -0.00635247 -0.0672412 0.001 -0.0025 -6.2408e-17 0.001 -0.00637098 -0.0442456 0.001 -0.00346959 -0.0222073 0.001 -0.0111821 0.0659471 0.001 -0.00346959 0.0222073 0.001 -0.00637098 0.0442456 0.001 -0.00635247 0.0672412 0.001 0.0025 -6.36326e-17 0.001 0.00151138 0.0226431 0.001 -0.00144695 0.0451138 0.001 -0.00144695 -0.0451138 0.001 0.00151138 -0.0226431 0.001 -0.0111821 -0.0659471 0 -0.0111821 -0.0659471 0.001 -0.0025 -6.2408e-17 0.001 -0.00637098 -0.0442456 0.001 -0.00346959 -0.0222073 0.001 -0.0025 -6.2408e-17 0 -0.00637098 -0.0442456 0 -0.00346959 -0.0222073 0 -0.0025 -6.2408e-17 0 -0.0025 -6.2408e-17 0.001 -0.0111821 0.0659471 0.001 -0.00346959 0.0222073 0.001 -0.00637098 0.0442456 0.001 -0.0111821 0.0659471 0 -0.00346959 0.0222073 0 -0.00637098 0.0442456 0 -0.0111821 0.0659471 0 -0.00635247 0.0672412 0 -0.00635247 0.0672412 0.001 -0.0111821 0.0659471 0.001 0.0025 -6.36326e-17 0 0.0025 -6.36326e-17 0.001 -0.00635247 0.0672412 0.001 0.00151138 0.0226431 0.001 -0.00144695 0.0451138 0.001 -0.00635247 0.0672412 0 0.00151138 0.0226431 0 -0.00144695 0.0451138 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0113525 -0.0672412 0 -0.00652284 -0.0685353 0 -0.00652284 -0.0685353 0.001 -0.0113525 -0.0672412 0.001 -0.0113525 -0.0672412 0 -0.00652284 -0.0685353 0 -0.0025 -6.36326e-17 0 -0.00644695 -0.0451138 0 -0.00348862 -0.0226431 0 -0.0113525 0.0672412 0 -0.00348862 0.0226431 0 -0.00644695 0.0451138 0 -0.00652284 0.0685353 0 0.0025 -6.48573e-17 0 0.00149236 0.0230788 0 -0.00152291 0.045982 0 -0.00152291 -0.045982 0 0.00149236 -0.0230788 0 -0.00652284 -0.0685353 0 -0.00652284 -0.0685353 0.001 0.0025 -6.48573e-17 0.001 -0.00152291 -0.045982 0.001 0.00149236 -0.0230788 0.001 0.0025 -6.48573e-17 0 -0.00152291 -0.045982 0 0.00149236 -0.0230788 0 -0.0113525 -0.0672412 0.001 -0.00652284 -0.0685353 0.001 -0.0025 -6.36326e-17 0.001 -0.00644695 -0.0451138 0.001 -0.00348862 -0.0226431 0.001 -0.0113525 0.0672412 0.001 -0.00348862 0.0226431 0.001 -0.00644695 0.0451138 0.001 -0.00652284 0.0685353 0.001 0.0025 -6.48573e-17 0.001 0.00149236 0.0230788 0.001 -0.00152291 0.045982 0.001 -0.00152291 -0.045982 0.001 0.00149236 -0.0230788 0.001 -0.0113525 -0.0672412 0 -0.0113525 -0.0672412 0.001 -0.0025 -6.36326e-17 0.001 -0.00644695 -0.0451138 0.001 -0.00348862 -0.0226431 0.001 -0.0025 -6.36326e-17 0 -0.00644695 -0.0451138 0 -0.00348862 -0.0226431 0 -0.0025 -6.36326e-17 0 -0.0025 -6.36326e-17 0.001 -0.0113525 0.0672412 0.001 -0.00348862 0.0226431 0.001 -0.00644695 0.0451138 0.001 -0.0113525 0.0672412 0 -0.00348862 0.0226431 0 -0.00644695 0.0451138 0 -0.0113525 0.0672412 0 -0.00652284 0.0685353 0 -0.00652284 0.0685353 0.001 -0.0113525 0.0672412 0.001 0.0025 -6.48573e-17 0 0.0025 -6.48573e-17 0.001 -0.00652284 0.0685353 0.001 0.00149236 0.0230788 0.001 -0.00152291 0.045982 0.001 -0.00652284 0.0685353 0 0.00149236 0.0230788 0 -0.00152291 0.045982 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0115228 -0.0685353 0 -0.00669321 -0.0698294 0 -0.00669321 -0.0698294 0.001 -0.0115228 -0.0685353 0.001 -0.0115228 -0.0685353 0 -0.00669321 -0.0698294 0 -0.0025 -6.48573e-17 0 -0.00652291 -0.045982 0 -0.00350764 -0.0230788 0 -0.0115228 0.0685353 0 -0.00350764 0.0230788 0 -0.00652291 0.045982 0 -0.00669321 0.0698294 0 0.0025 -6.60819e-17 0 0.00147333 0.0235146 0 -0.00159887 0.0468503 0 -0.00159887 -0.0468503 0 0.00147333 -0.0235146 0 -0.00669321 -0.0698294 0 -0.00669321 -0.0698294 0.001 0.0025 -6.60819e-17 0.001 -0.00159887 -0.0468503 0.001 0.00147333 -0.0235146 0.001 0.0025 -6.60819e-17 0 -0.00159887 -0.0468503 0 0.00147333 -0.0235146 0 -0.0115228 -0.0685353 0.001 -0.00669321 -0.0698294 0.001 -0.0025 -6.48573e-17 0.001 -0.00652291 -0.045982 0.001 -0.00350764 -0.0230788 0.001 -0.0115228 0.0685353 0.001 -0.00350764 0.0230788 0.001 -0.00652291 0.045982 0.001 -0.00669321 0.0698294 0.001 0.0025 -6.60819e-17 0.001 0.00147333 0.0235146 0.001 -0.00159887 0.0468503 0.001 -0.00159887 -0.0468503 0.001 0.00147333 -0.0235146 0.001 -0.0115228 -0.0685353 0 -0.0115228 -0.0685353 0.001 -0.0025 -6.48573e-17 0.001 -0.00652291 -0.045982 0.001 -0.00350764 -0.0230788 0.001 -0.0025 -6.48573e-17 0 -0.00652291 -0.045982 0 -0.00350764 -0.0230788 0 -0.0025 -6.48573e-17 0 -0.0025 -6.48573e-17 0.001 -0.0115228 0.0685353 0.001 -0.00350764 0.0230788 0.001 -0.00652291 0.045982 0.001 -0.0115228 0.0685353 0 -0.00350764 0.0230788 0 -0.00652291 0.045982 0 -0.0115228 0.0685353 0 -0.00669321 0.0698294 0 -0.00669321 0.0698294 0.001 -0.0115228 0.0685353 0.001 0.0025 -6.60819e-17 0 0.0025 -6.60819e-17 0.001 -0.00669321 0.0698294 0.001 0.00147333 0.0235146 0.001 -0.00159887 0.0468503 0.001 -0.00669321 0.0698294 0 0.00147333 0.0235146 0 -0.00159887 0.0468503 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0116898 -0.0698035 0 -0.00686018 -0.0710976 0 -0.00686018 -0.0710976 0.001 -0.0116898 -0.0698035 0.001 -0.0116898 -0.0698035 0 -0.00686018 -0.0710976 0 -0.0025 -6.60574e-17 0 -0.00659735 -0.0468329 0 -0.00352629 -0.0235059 0 -0.0116898 0.0698035 0 -0.00352629 0.0235059 0 -0.00659735 0.0468329 0 -0.00686018 0.0710976 0 0.0025 -6.72821e-17 0 0.00145468 0.0239417 0 -0.00167331 0.0477012 0 -0.00167331 -0.0477012 0 0.00145468 -0.0239417 0 -0.00686018 -0.0710976 0 -0.00686018 -0.0710976 0.001 0.0025 -6.72821e-17 0.001 -0.00167331 -0.0477012 0.001 0.00145468 -0.0239417 0.001 0.0025 -6.72821e-17 0 -0.00167331 -0.0477012 0 0.00145468 -0.0239417 0 -0.0116898 -0.0698035 0.001 -0.00686018 -0.0710976 0.001 -0.0025 -6.60574e-17 0.001 -0.00659735 -0.0468329 0.001 -0.00352629 -0.0235059 0.001 -0.0116898 0.0698035 0.001 -0.00352629 0.0235059 0.001 -0.00659735 0.0468329 0.001 -0.00686018 0.0710976 0.001 0.0025 -6.72821e-17 0.001 0.00145468 0.0239417 0.001 -0.00167331 0.0477012 0.001 -0.00167331 -0.0477012 0.001 0.00145468 -0.0239417 0.001 -0.0116898 -0.0698035 0 -0.0116898 -0.0698035 0.001 -0.0025 -6.60574e-17 0.001 -0.00659735 -0.0468329 0.001 -0.00352629 -0.0235059 0.001 -0.0025 -6.60574e-17 0 -0.00659735 -0.0468329 0 -0.00352629 -0.0235059 0 -0.0025 -6.60574e-17 0 -0.0025 -6.60574e-17 0.001 -0.0116898 0.0698035 0.001 -0.00352629 0.0235059 0.001 -0.00659735 0.0468329 0.001 -0.0116898 0.0698035 0 -0.00352629 0.0235059 0 -0.00659735 0.0468329 0 -0.0116898 0.0698035 0 -0.00686018 0.0710976 0 -0.00686018 0.0710976 0.001 -0.0116898 0.0698035 0.001 0.0025 -6.72821e-17 0 0.0025 -6.72821e-17 0.001 -0.00686018 0.0710976 0.001 0.00145468 0.0239417 0.001 -0.00167331 0.0477012 0.001 -0.00686018 0.0710976 0 0.00145468 0.0239417 0 -0.00167331 0.0477012 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0126711 -0.0772575 0 -0.00784151 -0.0785516 0 -0.00784151 -0.0785516 0.001 -0.0126711 -0.0772575 0.001 -0.0126711 -0.0772575 0 -0.00784151 -0.0785516 0 -0.0025 -7.31114e-17 0 -0.00703489 -0.051834 0 -0.00363588 -0.026016 0 -0.0126711 0.0772575 0 -0.00363588 0.026016 0 -0.00703489 0.051834 0 -0.00784151 0.0785516 0 0.0025 -7.43361e-17 0 0.00134509 0.0264518 0 -0.00211085 0.0527022 0 -0.00211085 -0.0527022 0 0.00134509 -0.0264518 0 -0.00784151 -0.0785516 0 -0.00784151 -0.0785516 0.001 0.0025 -7.43361e-17 0.001 -0.00211085 -0.0527022 0.001 0.00134509 -0.0264518 0.001 0.0025 -7.43361e-17 0 -0.00211085 -0.0527022 0 0.00134509 -0.0264518 0 -0.0126711 -0.0772575 0.001 -0.00784151 -0.0785516 0.001 -0.0025 -7.31114e-17 0.001 -0.00703489 -0.051834 0.001 -0.00363588 -0.026016 0.001 -0.0126711 0.0772575 0.001 -0.00363588 0.026016 0.001 -0.00703489 0.051834 0.001 -0.00784151 0.0785516 0.001 0.0025 -7.43361e-17 0.001 0.00134509 0.0264518 0.001 -0.00211085 0.0527022 0.001 -0.00211085 -0.0527022 0.001 0.00134509 -0.0264518 0.001 -0.0126711 -0.0772575 0 -0.0126711 -0.0772575 0.001 -0.0025 -7.31114e-17 0.001 -0.00703489 -0.051834 0.001 -0.00363588 -0.026016 0.001 -0.0025 -7.31114e-17 0 -0.00703489 -0.051834 0 -0.00363588 -0.026016 0 -0.0025 -7.31114e-17 0 -0.0025 -7.31114e-17 0.001 -0.0126711 0.0772575 0.001 -0.00363588 0.026016 0.001 -0.00703489 0.051834 0.001 -0.0126711 0.0772575 0 -0.00363588 0.026016 0 -0.00703489 0.051834 0 -0.0126711 0.0772575 0 -0.00784151 0.0785516 0 -0.00784151 0.0785516 0.001 -0.0126711 0.0772575 0.001 0.0025 -7.43361e-17 0 0.0025 -7.43361e-17 0.001 -0.00784151 0.0785516 0.001 0.00134509 0.0264518 0.001 -0.00211085 0.0527022 0.001 -0.00784151 0.0785516 0 0.00134509 0.0264518 0 -0.00211085 0.0527022 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0128722 -0.0787845 0 -0.00804255 -0.0800786 0 -0.00804255 -0.0800786 0.001 -0.0128722 -0.0787845 0.001 -0.0128722 -0.0787845 0 -0.00804255 -0.0800786 0 -0.0025 -7.45565e-17 0 -0.00712452 -0.0528585 0 -0.00365833 -0.0265302 0 -0.0128722 0.0787845 0 -0.00365833 0.0265302 0 -0.00712452 0.0528585 0 -0.00804255 0.0800786 0 0.0025 -7.57811e-17 0 0.00132264 0.026966 0 -0.00220048 0.0537267 0 -0.00220048 -0.0537267 0 0.00132264 -0.026966 0 -0.00804255 -0.0800786 0 -0.00804255 -0.0800786 0.001 0.0025 -7.57811e-17 0.001 -0.00220048 -0.0537267 0.001 0.00132264 -0.026966 0.001 0.0025 -7.57811e-17 0 -0.00220048 -0.0537267 0 0.00132264 -0.026966 0 -0.0128722 -0.0787845 0.001 -0.00804255 -0.0800786 0.001 -0.0025 -7.45565e-17 0.001 -0.00712452 -0.0528585 0.001 -0.00365833 -0.0265302 0.001 -0.0128722 0.0787845 0.001 -0.00365833 0.0265302 0.001 -0.00712452 0.0528585 0.001 -0.00804255 0.0800786 0.001 0.0025 -7.57811e-17 0.001 0.00132264 0.026966 0.001 -0.00220048 0.0537267 0.001 -0.00220048 -0.0537267 0.001 0.00132264 -0.026966 0.001 -0.0128722 -0.0787845 0 -0.0128722 -0.0787845 0.001 -0.0025 -7.45565e-17 0.001 -0.00712452 -0.0528585 0.001 -0.00365833 -0.0265302 0.001 -0.0025 -7.45565e-17 0 -0.00712452 -0.0528585 0 -0.00365833 -0.0265302 0 -0.0025 -7.45565e-17 0 -0.0025 -7.45565e-17 0.001 -0.0128722 0.0787845 0.001 -0.00365833 0.0265302 0.001 -0.00712452 0.0528585 0.001 -0.0128722 0.0787845 0 -0.00365833 0.0265302 0 -0.00712452 0.0528585 0 -0.0128722 0.0787845 0 -0.00804255 0.0800786 0 -0.00804255 0.0800786 0.001 -0.0128722 0.0787845 0.001 0.0025 -7.57811e-17 0 0.0025 -7.57811e-17 0.001 -0.00804255 0.0800786 0.001 0.00132264 0.026966 0.001 -0.00220048 0.0537267 0.001 -0.00804255 0.0800786 0 0.00132264 0.026966 0 -0.00220048 0.0537267 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0143544 -0.0900431 0 -0.00952478 -0.0913372 0 -0.00952478 -0.0913372 0.001 -0.0143544 -0.0900431 0.001 -0.0143544 -0.0900431 0 -0.00952478 -0.0913372 0 -0.0025 -8.52109e-17 0 -0.00778538 -0.0604122 0 -0.00382386 -0.0303215 0 -0.0143544 0.0900431 0 -0.00382386 0.0303215 0 -0.00778538 0.0604122 0 -0.00952478 0.0913372 0 0.0025 -8.64356e-17 0 0.00115711 0.0307573 0 -0.00286134 0.0612804 0 -0.00286134 -0.0612804 0 0.00115711 -0.0307573 0 -0.00952478 -0.0913372 0 -0.00952478 -0.0913372 0.001 0.0025 -8.64356e-17 0.001 -0.00286134 -0.0612804 0.001 0.00115711 -0.0307573 0.001 0.0025 -8.64356e-17 0 -0.00286134 -0.0612804 0 0.00115711 -0.0307573 0 -0.0143544 -0.0900431 0.001 -0.00952478 -0.0913372 0.001 -0.0025 -8.52109e-17 0.001 -0.00778538 -0.0604122 0.001 -0.00382386 -0.0303215 0.001 -0.0143544 0.0900431 0.001 -0.00382386 0.0303215 0.001 -0.00778538 0.0604122 0.001 -0.00952478 0.0913372 0.001 0.0025 -8.64356e-17 0.001 0.00115711 0.0307573 0.001 -0.00286134 0.0612804 0.001 -0.00286134 -0.0612804 0.001 0.00115711 -0.0307573 0.001 -0.0143544 -0.0900431 0 -0.0143544 -0.0900431 0.001 -0.0025 -8.52109e-17 0.001 -0.00778538 -0.0604122 0.001 -0.00382386 -0.0303215 0.001 -0.0025 -8.52109e-17 0 -0.00778538 -0.0604122 0 -0.00382386 -0.0303215 0 -0.0025 -8.52109e-17 0 -0.0025 -8.52109e-17 0.001 -0.0143544 0.0900431 0.001 -0.00382386 0.0303215 0.001 -0.00778538 0.0604122 0.001 -0.0143544 0.0900431 0 -0.00382386 0.0303215 0 -0.00778538 0.0604122 0 -0.0143544 0.0900431 0 -0.00952478 0.0913372 0 -0.00952478 0.0913372 0.001 -0.0143544 0.0900431 0.001 0.0025 -8.64356e-17 0 0.0025 -8.64356e-17 0.001 -0.00952478 0.0913372 0.001 0.00115711 0.0307573 0.001 -0.00286134 0.0612804 0.001 -0.00952478 0.0913372 0 0.00115711 0.0307573 0 -0.00286134 0.0612804 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145589 -0.0915961 0 -0.00972922 -0.0928902 0 -0.00972922 -0.0928902 0.001 -0.0145589 -0.0915961 0.001 -0.0145589 -0.0915961 0 -0.00972922 -0.0928902 0 -0.0025 -8.66805e-17 0 -0.00787654 -0.0614541 0 -0.0038467 -0.0308444 0 -0.0145589 0.0915961 0 -0.0038467 0.0308444 0 -0.00787654 0.0614541 0 -0.00972922 0.0928902 0 0.0025 -8.79051e-17 0 0.00113428 0.0312802 0 -0.0029525 0.0623223 0 -0.0029525 -0.0623223 0 0.00113428 -0.0312802 0 -0.00972922 -0.0928902 0 -0.00972922 -0.0928902 0.001 0.0025 -8.79051e-17 0.001 -0.0029525 -0.0623223 0.001 0.00113428 -0.0312802 0.001 0.0025 -8.79051e-17 0 -0.0029525 -0.0623223 0 0.00113428 -0.0312802 0 -0.0145589 -0.0915961 0.001 -0.00972922 -0.0928902 0.001 -0.0025 -8.66805e-17 0.001 -0.00787654 -0.0614541 0.001 -0.0038467 -0.0308444 0.001 -0.0145589 0.0915961 0.001 -0.0038467 0.0308444 0.001 -0.00787654 0.0614541 0.001 -0.00972922 0.0928902 0.001 0.0025 -8.79051e-17 0.001 0.00113428 0.0312802 0.001 -0.0029525 0.0623223 0.001 -0.0029525 -0.0623223 0.001 0.00113428 -0.0312802 0.001 -0.0145589 -0.0915961 0 -0.0145589 -0.0915961 0.001 -0.0025 -8.66805e-17 0.001 -0.00787654 -0.0614541 0.001 -0.0038467 -0.0308444 0.001 -0.0025 -8.66805e-17 0 -0.00787654 -0.0614541 0 -0.0038467 -0.0308444 0 -0.0025 -8.66805e-17 0 -0.0025 -8.66805e-17 0.001 -0.0145589 0.0915961 0.001 -0.0038467 0.0308444 0.001 -0.00787654 0.0614541 0.001 -0.0145589 0.0915961 0 -0.0038467 0.0308444 0 -0.00787654 0.0614541 0 -0.0145589 0.0915961 0 -0.00972922 0.0928902 0 -0.00972922 0.0928902 0.001 -0.0145589 0.0915961 0.001 0.0025 -8.79051e-17 0 0.0025 -8.79051e-17 0.001 -0.00972922 0.0928902 0.001 0.00113428 0.0312802 0.001 -0.0029525 0.0623223 0.001 -0.00972922 0.0928902 0 0.00113428 0.0312802 0 -0.0029525 0.0623223 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0146883 -0.0925796 0 -0.0098587 -0.0938737 0 -0.0098587 -0.0938737 0.001 -0.0146883 -0.0925796 0.001 -0.0146883 -0.0925796 0 -0.0098587 -0.0938737 0 -0.0025 -8.76112e-17 0 -0.00793427 -0.062114 0 -0.00386116 -0.0311756 0 -0.0146883 0.0925796 0 -0.00386116 0.0311756 0 -0.00793427 0.062114 0 -0.0098587 0.0938737 0 0.0025 -8.88359e-17 0 0.00111982 0.0316114 0 -0.00301023 0.0629822 0 -0.00301023 -0.0629822 0 0.00111982 -0.0316114 0 -0.0098587 -0.0938737 0 -0.0098587 -0.0938737 0.001 0.0025 -8.88359e-17 0.001 -0.00301023 -0.0629822 0.001 0.00111982 -0.0316114 0.001 0.0025 -8.88359e-17 0 -0.00301023 -0.0629822 0 0.00111982 -0.0316114 0 -0.0146883 -0.0925796 0.001 -0.0098587 -0.0938737 0.001 -0.0025 -8.76112e-17 0.001 -0.00793427 -0.062114 0.001 -0.00386116 -0.0311756 0.001 -0.0146883 0.0925796 0.001 -0.00386116 0.0311756 0.001 -0.00793427 0.062114 0.001 -0.0098587 0.0938737 0.001 0.0025 -8.88359e-17 0.001 0.00111982 0.0316114 0.001 -0.00301023 0.0629822 0.001 -0.00301023 -0.0629822 0.001 0.00111982 -0.0316114 0.001 -0.0146883 -0.0925796 0 -0.0146883 -0.0925796 0.001 -0.0025 -8.76112e-17 0.001 -0.00793427 -0.062114 0.001 -0.00386116 -0.0311756 0.001 -0.0025 -8.76112e-17 0 -0.00793427 -0.062114 0 -0.00386116 -0.0311756 0 -0.0025 -8.76112e-17 0 -0.0025 -8.76112e-17 0.001 -0.0146883 0.0925796 0.001 -0.00386116 0.0311756 0.001 -0.00793427 0.062114 0.001 -0.0146883 0.0925796 0 -0.00386116 0.0311756 0 -0.00793427 0.062114 0 -0.0146883 0.0925796 0 -0.0098587 0.0938737 0 -0.0098587 0.0938737 0.001 -0.0146883 0.0925796 0.001 0.0025 -8.88359e-17 0 0.0025 -8.88359e-17 0.001 -0.0098587 0.0938737 0.001 0.00111982 0.0316114 0.001 -0.00301023 0.0629822 0.001 -0.0098587 0.0938737 0 0.00111982 0.0316114 0 -0.00301023 0.0629822 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0148962 -0.0941584 0 -0.0100666 -0.0954525 0 -0.0100666 -0.0954525 0.001 -0.0148962 -0.0941584 0.001 -0.0148962 -0.0941584 0 -0.0100666 -0.0954525 0 -0.0025 -8.91053e-17 0 -0.00802694 -0.0631732 0 -0.00388437 -0.0317073 0 -0.0148962 0.0941584 0 -0.00388437 0.0317073 0 -0.00802694 0.0631732 0 -0.0100666 0.0954525 0 0.0025 -9.03299e-17 0 0.0010966 0.032143 0 -0.0031029 0.0640414 0 -0.0031029 -0.0640414 0 0.0010966 -0.032143 0 -0.0100666 -0.0954525 0 -0.0100666 -0.0954525 0.001 0.0025 -9.03299e-17 0.001 -0.0031029 -0.0640414 0.001 0.0010966 -0.032143 0.001 0.0025 -9.03299e-17 0 -0.0031029 -0.0640414 0 0.0010966 -0.032143 0 -0.0148962 -0.0941584 0.001 -0.0100666 -0.0954525 0.001 -0.0025 -8.91053e-17 0.001 -0.00802694 -0.0631732 0.001 -0.00388437 -0.0317073 0.001 -0.0148962 0.0941584 0.001 -0.00388437 0.0317073 0.001 -0.00802694 0.0631732 0.001 -0.0100666 0.0954525 0.001 0.0025 -9.03299e-17 0.001 0.0010966 0.032143 0.001 -0.0031029 0.0640414 0.001 -0.0031029 -0.0640414 0.001 0.0010966 -0.032143 0.001 -0.0148962 -0.0941584 0 -0.0148962 -0.0941584 0.001 -0.0025 -8.91053e-17 0.001 -0.00802694 -0.0631732 0.001 -0.00388437 -0.0317073 0.001 -0.0025 -8.91053e-17 0 -0.00802694 -0.0631732 0 -0.00388437 -0.0317073 0 -0.0025 -8.91053e-17 0 -0.0025 -8.91053e-17 0.001 -0.0148962 0.0941584 0.001 -0.00388437 0.0317073 0.001 -0.00802694 0.0631732 0.001 -0.0148962 0.0941584 0 -0.00388437 0.0317073 0 -0.00802694 0.0631732 0 -0.0148962 0.0941584 0 -0.0100666 0.0954525 0 -0.0100666 0.0954525 0.001 -0.0148962 0.0941584 0.001 0.0025 -9.03299e-17 0 0.0025 -9.03299e-17 0.001 -0.0100666 0.0954525 0.001 0.0010966 0.032143 0.001 -0.0031029 0.0640414 0.001 -0.0100666 0.0954525 0 0.0010966 0.032143 0 -0.0031029 0.0640414 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0150257 -0.0951419 0 -0.010196 -0.096436 0 -0.010196 -0.096436 0.001 -0.0150257 -0.0951419 0.001 -0.0150257 -0.0951419 0 -0.010196 -0.096436 0 -0.0025 -9.0036e-17 0 -0.00808467 -0.0638331 0 -0.00389883 -0.0320385 0 -0.0150257 0.0951419 0 -0.00389883 0.0320385 0 -0.00808467 0.0638331 0 -0.010196 0.096436 0 0.0025 -9.12607e-17 0 0.00108214 0.0324742 0 -0.00316063 0.0647013 0 -0.00316063 -0.0647013 0 0.00108214 -0.0324742 0 -0.010196 -0.096436 0 -0.010196 -0.096436 0.001 0.0025 -9.12607e-17 0.001 -0.00316063 -0.0647013 0.001 0.00108214 -0.0324742 0.001 0.0025 -9.12607e-17 0 -0.00316063 -0.0647013 0 0.00108214 -0.0324742 0 -0.0150257 -0.0951419 0.001 -0.010196 -0.096436 0.001 -0.0025 -9.0036e-17 0.001 -0.00808467 -0.0638331 0.001 -0.00389883 -0.0320385 0.001 -0.0150257 0.0951419 0.001 -0.00389883 0.0320385 0.001 -0.00808467 0.0638331 0.001 -0.010196 0.096436 0.001 0.0025 -9.12607e-17 0.001 0.00108214 0.0324742 0.001 -0.00316063 0.0647013 0.001 -0.00316063 -0.0647013 0.001 0.00108214 -0.0324742 0.001 -0.0150257 -0.0951419 0 -0.0150257 -0.0951419 0.001 -0.0025 -9.0036e-17 0.001 -0.00808467 -0.0638331 0.001 -0.00389883 -0.0320385 0.001 -0.0025 -9.0036e-17 0 -0.00808467 -0.0638331 0 -0.00389883 -0.0320385 0 -0.0025 -9.0036e-17 0 -0.0025 -9.0036e-17 0.001 -0.0150257 0.0951419 0.001 -0.00389883 0.0320385 0.001 -0.00808467 0.0638331 0.001 -0.0150257 0.0951419 0 -0.00389883 0.0320385 0 -0.00808467 0.0638331 0 -0.0150257 0.0951419 0 -0.010196 0.096436 0 -0.010196 0.096436 0.001 -0.0150257 0.0951419 0.001 0.0025 -9.12607e-17 0 0.0025 -9.12607e-17 0.001 -0.010196 0.096436 0.001 0.00108214 0.0324742 0.001 -0.00316063 0.0647013 0.001 -0.010196 0.096436 0 0.00108214 0.0324742 0 -0.00316063 0.0647013 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0152335 -0.0967207 0 -0.0104039 -0.0980148 0 -0.0104039 -0.0980148 0.001 -0.0152335 -0.0967207 0.001 -0.0152335 -0.0967207 0 -0.0104039 -0.0980148 0 -0.0025 -9.15301e-17 0 -0.00817734 -0.0648923 0 -0.00392204 -0.0325701 0 -0.0152335 0.0967207 0 -0.00392204 0.0325701 0 -0.00817734 0.0648923 0 -0.0104039 0.0980148 0 0.0025 -9.27547e-17 0 0.00105893 0.0330059 0 -0.0032533 0.0657606 0 -0.0032533 -0.0657606 0 0.00105893 -0.0330059 0 -0.0104039 -0.0980148 0 -0.0104039 -0.0980148 0.001 0.0025 -9.27547e-17 0.001 -0.0032533 -0.0657606 0.001 0.00105893 -0.0330059 0.001 0.0025 -9.27547e-17 0 -0.0032533 -0.0657606 0 0.00105893 -0.0330059 0 -0.0152335 -0.0967207 0.001 -0.0104039 -0.0980148 0.001 -0.0025 -9.15301e-17 0.001 -0.00817734 -0.0648923 0.001 -0.00392204 -0.0325701 0.001 -0.0152335 0.0967207 0.001 -0.00392204 0.0325701 0.001 -0.00817734 0.0648923 0.001 -0.0104039 0.0980148 0.001 0.0025 -9.27547e-17 0.001 0.00105893 0.0330059 0.001 -0.0032533 0.0657606 0.001 -0.0032533 -0.0657606 0.001 0.00105893 -0.0330059 0.001 -0.0152335 -0.0967207 0 -0.0152335 -0.0967207 0.001 -0.0025 -9.15301e-17 0.001 -0.00817734 -0.0648923 0.001 -0.00392204 -0.0325701 0.001 -0.0025 -9.15301e-17 0 -0.00817734 -0.0648923 0 -0.00392204 -0.0325701 0 -0.0025 -9.15301e-17 0 -0.0025 -9.15301e-17 0.001 -0.0152335 0.0967207 0.001 -0.00392204 0.0325701 0.001 -0.00817734 0.0648923 0.001 -0.0152335 0.0967207 0 -0.00392204 0.0325701 0 -0.00817734 0.0648923 0 -0.0152335 0.0967207 0 -0.0104039 0.0980148 0 -0.0104039 0.0980148 0.001 -0.0152335 0.0967207 0.001 0.0025 -9.27547e-17 0 0.0025 -9.27547e-17 0.001 -0.0104039 0.0980148 0.001 0.00105893 0.0330059 0.001 -0.0032533 0.0657606 0.001 -0.0104039 0.0980148 0 0.00105893 0.0330059 0 -0.0032533 0.0657606 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0153596 -0.0976783 0 -0.01053 -0.0989724 0 -0.01053 -0.0989724 0.001 -0.0153596 -0.0976783 0.001 -0.0153596 -0.0976783 0 -0.01053 -0.0989724 0 -0.0025 -9.24363e-17 0 -0.00823355 -0.0655348 0 -0.00393612 -0.0328926 0 -0.0153596 0.0976783 0 -0.00393612 0.0328926 0 -0.00823355 0.0655348 0 -0.01053 0.0989724 0 0.0025 -9.3661e-17 0 0.00104485 0.0333284 0 -0.00330952 0.0664031 0 -0.00330952 -0.0664031 0 0.00104485 -0.0333284 0 -0.01053 -0.0989724 0 -0.01053 -0.0989724 0.001 0.0025 -9.3661e-17 0.001 -0.00330952 -0.0664031 0.001 0.00104485 -0.0333284 0.001 0.0025 -9.3661e-17 0 -0.00330952 -0.0664031 0 0.00104485 -0.0333284 0 -0.0153596 -0.0976783 0.001 -0.01053 -0.0989724 0.001 -0.0025 -9.24363e-17 0.001 -0.00823355 -0.0655348 0.001 -0.00393612 -0.0328926 0.001 -0.0153596 0.0976783 0.001 -0.00393612 0.0328926 0.001 -0.00823355 0.0655348 0.001 -0.01053 0.0989724 0.001 0.0025 -9.3661e-17 0.001 0.00104485 0.0333284 0.001 -0.00330952 0.0664031 0.001 -0.00330952 -0.0664031 0.001 0.00104485 -0.0333284 0.001 -0.0153596 -0.0976783 0 -0.0153596 -0.0976783 0.001 -0.0025 -9.24363e-17 0.001 -0.00823355 -0.0655348 0.001 -0.00393612 -0.0328926 0.001 -0.0025 -9.24363e-17 0 -0.00823355 -0.0655348 0 -0.00393612 -0.0328926 0 -0.0025 -9.24363e-17 0 -0.0025 -9.24363e-17 0.001 -0.0153596 0.0976783 0.001 -0.00393612 0.0328926 0.001 -0.00823355 0.0655348 0.001 -0.0153596 0.0976783 0 -0.00393612 0.0328926 0 -0.00823355 0.0655348 0 -0.0153596 0.0976783 0 -0.01053 0.0989724 0 -0.01053 0.0989724 0.001 -0.0153596 0.0976783 0.001 0.0025 -9.3661e-17 0 0.0025 -9.3661e-17 0.001 -0.01053 0.0989724 0.001 0.00104485 0.0333284 0.001 -0.00330952 0.0664031 0.001 -0.01053 0.0989724 0 0.00104485 0.0333284 0 -0.00330952 0.0664031 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0155709 -0.099283 0 -0.0107412 -0.100577 0 -0.0107412 -0.100577 0.001 -0.0155709 -0.099283 0.001 -0.0155709 -0.099283 0 -0.0107412 -0.100577 0 -0.0025 -9.39549e-17 0 -0.00832775 -0.0666114 0 -0.00395971 -0.0334329 0 -0.0155709 0.099283 0 -0.00395971 0.0334329 0 -0.00832775 0.0666114 0 -0.0107412 0.100577 0 0.0025 -9.51795e-17 0 0.00102126 0.0338687 0 -0.00340371 0.0674797 0 -0.00340371 -0.0674797 0 0.00102126 -0.0338687 0 -0.0107412 -0.100577 0 -0.0107412 -0.100577 0.001 0.0025 -9.51795e-17 0.001 -0.00340371 -0.0674797 0.001 0.00102126 -0.0338687 0.001 0.0025 -9.51795e-17 0 -0.00340371 -0.0674797 0 0.00102126 -0.0338687 0 -0.0155709 -0.099283 0.001 -0.0107412 -0.100577 0.001 -0.0025 -9.39549e-17 0.001 -0.00832775 -0.0666114 0.001 -0.00395971 -0.0334329 0.001 -0.0155709 0.099283 0.001 -0.00395971 0.0334329 0.001 -0.00832775 0.0666114 0.001 -0.0107412 0.100577 0.001 0.0025 -9.51795e-17 0.001 0.00102126 0.0338687 0.001 -0.00340371 0.0674797 0.001 -0.00340371 -0.0674797 0.001 0.00102126 -0.0338687 0.001 -0.0155709 -0.099283 0 -0.0155709 -0.099283 0.001 -0.0025 -9.39549e-17 0.001 -0.00832775 -0.0666114 0.001 -0.00395971 -0.0334329 0.001 -0.0025 -9.39549e-17 0 -0.00832775 -0.0666114 0 -0.00395971 -0.0334329 0 -0.0025 -9.39549e-17 0 -0.0025 -9.39549e-17 0.001 -0.0155709 0.099283 0.001 -0.00395971 0.0334329 0.001 -0.00832775 0.0666114 0.001 -0.0155709 0.099283 0 -0.00395971 0.0334329 0 -0.00832775 0.0666114 0 -0.0155709 0.099283 0 -0.0107412 0.100577 0 -0.0107412 0.100577 0.001 -0.0155709 0.099283 0.001 0.0025 -9.51795e-17 0 0.0025 -9.51795e-17 0.001 -0.0107412 0.100577 0.001 0.00102126 0.0338687 0.001 -0.00340371 0.0674797 0.001 -0.0107412 0.100577 0 0.00102126 0.0338687 0 -0.00340371 0.0674797 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0156935 -0.100215 0 -0.0108639 -0.101509 0 -0.0108639 -0.101509 0.001 -0.0156935 -0.100215 0.001 -0.0156935 -0.100215 0 -0.0108639 -0.101509 0 -0.0025 -9.48366e-17 0 -0.00838244 -0.0672366 0 -0.00397341 -0.0337467 0 -0.0156935 0.100215 0 -0.00397341 0.0337467 0 -0.00838244 0.0672366 0 -0.0108639 0.101509 0 0.0025 -9.60613e-17 0 0.00100756 0.0341825 0 -0.0034584 0.0681048 0 -0.0034584 -0.0681048 0 0.00100756 -0.0341825 0 -0.0108639 -0.101509 0 -0.0108639 -0.101509 0.001 0.0025 -9.60613e-17 0.001 -0.0034584 -0.0681048 0.001 0.00100756 -0.0341825 0.001 0.0025 -9.60613e-17 0 -0.0034584 -0.0681048 0 0.00100756 -0.0341825 0 -0.0156935 -0.100215 0.001 -0.0108639 -0.101509 0.001 -0.0025 -9.48366e-17 0.001 -0.00838244 -0.0672366 0.001 -0.00397341 -0.0337467 0.001 -0.0156935 0.100215 0.001 -0.00397341 0.0337467 0.001 -0.00838244 0.0672366 0.001 -0.0108639 0.101509 0.001 0.0025 -9.60613e-17 0.001 0.00100756 0.0341825 0.001 -0.0034584 0.0681048 0.001 -0.0034584 -0.0681048 0.001 0.00100756 -0.0341825 0.001 -0.0156935 -0.100215 0 -0.0156935 -0.100215 0.001 -0.0025 -9.48366e-17 0.001 -0.00838244 -0.0672366 0.001 -0.00397341 -0.0337467 0.001 -0.0025 -9.48366e-17 0 -0.00838244 -0.0672366 0 -0.00397341 -0.0337467 0 -0.0025 -9.48366e-17 0 -0.0025 -9.48366e-17 0.001 -0.0156935 0.100215 0.001 -0.00397341 0.0337467 0.001 -0.00838244 0.0672366 0.001 -0.0156935 0.100215 0 -0.00397341 0.0337467 0 -0.00838244 0.0672366 0 -0.0156935 0.100215 0 -0.0108639 0.101509 0 -0.0108639 0.101509 0.001 -0.0156935 0.100215 0.001 0.0025 -9.60613e-17 0 0.0025 -9.60613e-17 0.001 -0.0108639 0.101509 0.001 0.00100756 0.0341825 0.001 -0.0034584 0.0681048 0.001 -0.0108639 0.101509 0 0.00100756 0.0341825 0 -0.0034584 0.0681048 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0159048 -0.101819 0 -0.0110752 -0.103114 0 -0.0110752 -0.103114 0.001 -0.0159048 -0.101819 0.001 -0.0159048 -0.101819 0 -0.0110752 -0.103114 0 -0.0025 -9.63552e-17 0 -0.00847663 -0.0683132 0 -0.00399701 -0.0342871 0 -0.0159048 0.101819 0 -0.00399701 0.0342871 0 -0.00847663 0.0683132 0 -0.0110752 0.103114 0 0.0025 -9.75799e-17 0 0.000983968 0.0347228 0 -0.00355259 0.0691814 0 -0.00355259 -0.0691814 0 0.000983968 -0.0347228 0 -0.0110752 -0.103114 0 -0.0110752 -0.103114 0.001 0.0025 -9.75799e-17 0.001 -0.00355259 -0.0691814 0.001 0.000983968 -0.0347228 0.001 0.0025 -9.75799e-17 0 -0.00355259 -0.0691814 0 0.000983968 -0.0347228 0 -0.0159048 -0.101819 0.001 -0.0110752 -0.103114 0.001 -0.0025 -9.63552e-17 0.001 -0.00847663 -0.0683132 0.001 -0.00399701 -0.0342871 0.001 -0.0159048 0.101819 0.001 -0.00399701 0.0342871 0.001 -0.00847663 0.0683132 0.001 -0.0110752 0.103114 0.001 0.0025 -9.75799e-17 0.001 0.000983968 0.0347228 0.001 -0.00355259 0.0691814 0.001 -0.00355259 -0.0691814 0.001 0.000983968 -0.0347228 0.001 -0.0159048 -0.101819 0 -0.0159048 -0.101819 0.001 -0.0025 -9.63552e-17 0.001 -0.00847663 -0.0683132 0.001 -0.00399701 -0.0342871 0.001 -0.0025 -9.63552e-17 0 -0.00847663 -0.0683132 0 -0.00399701 -0.0342871 0 -0.0025 -9.63552e-17 0 -0.0025 -9.63552e-17 0.001 -0.0159048 0.101819 0.001 -0.00399701 0.0342871 0.001 -0.00847663 0.0683132 0.001 -0.0159048 0.101819 0 -0.00399701 0.0342871 0 -0.00847663 0.0683132 0 -0.0159048 0.101819 0 -0.0110752 0.103114 0 -0.0110752 0.103114 0.001 -0.0159048 0.101819 0.001 0.0025 -9.75799e-17 0 0.0025 -9.75799e-17 0.001 -0.0110752 0.103114 0.001 0.000983968 0.0347228 0.001 -0.00355259 0.0691814 0.001 -0.0110752 0.103114 0 0.000983968 0.0347228 0 -0.00355259 0.0691814 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0130085 -0.0798198 0 -0.00817885 -0.0811139 0 -0.00817885 -0.0811139 0.001 -0.0130085 -0.0798198 0.001 -0.0130085 -0.0798198 0 -0.00817885 -0.0811139 0 -0.0025 -7.55362e-17 0 -0.00718529 -0.0535531 0 -0.00367356 -0.0268788 0 -0.0130085 0.0798198 0 -0.00367356 0.0268788 0 -0.00718529 0.0535531 0 -0.00817885 0.0811139 0 0.0025 -7.67609e-17 0 0.00130742 0.0273146 0 -0.00226125 0.0544213 0 -0.00226125 -0.0544213 0 0.00130742 -0.0273146 0 -0.00817885 -0.0811139 0 -0.00817885 -0.0811139 0.001 0.0025 -7.67609e-17 0.001 -0.00226125 -0.0544213 0.001 0.00130742 -0.0273146 0.001 0.0025 -7.67609e-17 0 -0.00226125 -0.0544213 0 0.00130742 -0.0273146 0 -0.0130085 -0.0798198 0.001 -0.00817885 -0.0811139 0.001 -0.0025 -7.55362e-17 0.001 -0.00718529 -0.0535531 0.001 -0.00367356 -0.0268788 0.001 -0.0130085 0.0798198 0.001 -0.00367356 0.0268788 0.001 -0.00718529 0.0535531 0.001 -0.00817885 0.0811139 0.001 0.0025 -7.67609e-17 0.001 0.00130742 0.0273146 0.001 -0.00226125 0.0544213 0.001 -0.00226125 -0.0544213 0.001 0.00130742 -0.0273146 0.001 -0.0130085 -0.0798198 0 -0.0130085 -0.0798198 0.001 -0.0025 -7.55362e-17 0.001 -0.00718529 -0.0535531 0.001 -0.00367356 -0.0268788 0.001 -0.0025 -7.55362e-17 0 -0.00718529 -0.0535531 0 -0.00367356 -0.0268788 0 -0.0025 -7.55362e-17 0 -0.0025 -7.55362e-17 0.001 -0.0130085 0.0798198 0.001 -0.00367356 0.0268788 0.001 -0.00718529 0.0535531 0.001 -0.0130085 0.0798198 0 -0.00367356 0.0268788 0 -0.00718529 0.0535531 0 -0.0130085 0.0798198 0 -0.00817885 0.0811139 0 -0.00817885 0.0811139 0.001 -0.0130085 0.0798198 0.001 0.0025 -7.67609e-17 0 0.0025 -7.67609e-17 0.001 -0.00817885 0.0811139 0.001 0.00130742 0.0273146 0.001 -0.00226125 0.0544213 0.001 -0.00817885 0.0811139 0 0.00130742 0.0273146 0 -0.00226125 0.0544213 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0160309 -0.102777 0 -0.0112012 -0.104071 0 -0.0112012 -0.104071 0.001 -0.0160309 -0.102777 0.001 -0.0160309 -0.102777 0 -0.0112012 -0.104071 0 -0.0025 -9.72614e-17 0 -0.00853284 -0.0689557 0 -0.00401109 -0.0346095 0 -0.0160309 0.102777 0 -0.00401109 0.0346095 0 -0.00853284 0.0689557 0 -0.0112012 0.104071 0 0.0025 -9.84861e-17 0 0.000969888 0.0350453 0 -0.0036088 0.0698239 0 -0.0036088 -0.0698239 0 0.000969888 -0.0350453 0 -0.0112012 -0.104071 0 -0.0112012 -0.104071 0.001 0.0025 -9.84861e-17 0.001 -0.0036088 -0.0698239 0.001 0.000969888 -0.0350453 0.001 0.0025 -9.84861e-17 0 -0.0036088 -0.0698239 0 0.000969888 -0.0350453 0 -0.0160309 -0.102777 0.001 -0.0112012 -0.104071 0.001 -0.0025 -9.72614e-17 0.001 -0.00853284 -0.0689557 0.001 -0.00401109 -0.0346095 0.001 -0.0160309 0.102777 0.001 -0.00401109 0.0346095 0.001 -0.00853284 0.0689557 0.001 -0.0112012 0.104071 0.001 0.0025 -9.84861e-17 0.001 0.000969888 0.0350453 0.001 -0.0036088 0.0698239 0.001 -0.0036088 -0.0698239 0.001 0.000969888 -0.0350453 0.001 -0.0160309 -0.102777 0 -0.0160309 -0.102777 0.001 -0.0025 -9.72614e-17 0.001 -0.00853284 -0.0689557 0.001 -0.00401109 -0.0346095 0.001 -0.0025 -9.72614e-17 0 -0.00853284 -0.0689557 0 -0.00401109 -0.0346095 0 -0.0025 -9.72614e-17 0 -0.0025 -9.72614e-17 0.001 -0.0160309 0.102777 0.001 -0.00401109 0.0346095 0.001 -0.00853284 0.0689557 0.001 -0.0160309 0.102777 0 -0.00401109 0.0346095 0 -0.00853284 0.0689557 0 -0.0160309 0.102777 0 -0.0112012 0.104071 0 -0.0112012 0.104071 0.001 -0.0160309 0.102777 0.001 0.0025 -9.84861e-17 0 0.0025 -9.84861e-17 0.001 -0.0112012 0.104071 0.001 0.000969888 0.0350453 0.001 -0.0036088 0.0698239 0.001 -0.0112012 0.104071 0 0.000969888 0.0350453 0 -0.0036088 0.0698239 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0162421 -0.104382 0 -0.0114125 -0.105676 0 -0.0114125 -0.105676 0.001 -0.0162421 -0.104382 0.001 -0.0162421 -0.104382 0 -0.0114125 -0.105676 0 -0.0025 -9.878e-17 0 -0.00862703 -0.0700323 0 -0.00403468 -0.0351499 0 -0.0162421 0.104382 0 -0.00403468 0.0351499 0 -0.00862703 0.0700323 0 -0.0114125 0.105676 0 0.0025 -1.00005e-16 0 0.000946295 0.0355857 0 -0.00370299 0.0709006 0 -0.00370299 -0.0709006 0 0.000946295 -0.0355857 0 -0.0114125 -0.105676 0 -0.0114125 -0.105676 0.001 0.0025 -1.00005e-16 0.001 -0.00370299 -0.0709006 0.001 0.000946295 -0.0355857 0.001 0.0025 -1.00005e-16 0 -0.00370299 -0.0709006 0 0.000946295 -0.0355857 0 -0.0162421 -0.104382 0.001 -0.0114125 -0.105676 0.001 -0.0025 -9.878e-17 0.001 -0.00862703 -0.0700323 0.001 -0.00403468 -0.0351499 0.001 -0.0162421 0.104382 0.001 -0.00403468 0.0351499 0.001 -0.00862703 0.0700323 0.001 -0.0114125 0.105676 0.001 0.0025 -1.00005e-16 0.001 0.000946295 0.0355857 0.001 -0.00370299 0.0709006 0.001 -0.00370299 -0.0709006 0.001 0.000946295 -0.0355857 0.001 -0.0162421 -0.104382 0 -0.0162421 -0.104382 0.001 -0.0025 -9.878e-17 0.001 -0.00862703 -0.0700323 0.001 -0.00403468 -0.0351499 0.001 -0.0025 -9.878e-17 0 -0.00862703 -0.0700323 0 -0.00403468 -0.0351499 0 -0.0025 -9.878e-17 0 -0.0025 -9.878e-17 0.001 -0.0162421 0.104382 0.001 -0.00403468 0.0351499 0.001 -0.00862703 0.0700323 0.001 -0.0162421 0.104382 0 -0.00403468 0.0351499 0 -0.00862703 0.0700323 0 -0.0162421 0.104382 0 -0.0114125 0.105676 0 -0.0114125 0.105676 0.001 -0.0162421 0.104382 0.001 0.0025 -1.00005e-16 0 0.0025 -1.00005e-16 0.001 -0.0114125 0.105676 0.001 0.000946295 0.0355857 0.001 -0.00370299 0.0709006 0.001 -0.0114125 0.105676 0 0.000946295 0.0355857 0 -0.00370299 0.0709006 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0163648 -0.105313 0 -0.0115352 -0.106608 0 -0.0115352 -0.106608 0.001 -0.0163648 -0.105313 0.001 -0.0163648 -0.105313 0 -0.0115352 -0.106608 0 -0.0025 -9.96618e-17 0 -0.00868173 -0.0706574 0 -0.00404838 -0.0354637 0 -0.0163648 0.105313 0 -0.00404838 0.0354637 0 -0.00868173 0.0706574 0 -0.0115352 0.106608 0 0.0025 -1.00886e-16 0 0.000932596 0.0358995 0 -0.00375769 0.0715257 0 -0.00375769 -0.0715257 0 0.000932596 -0.0358995 0 -0.0115352 -0.106608 0 -0.0115352 -0.106608 0.001 0.0025 -1.00886e-16 0.001 -0.00375769 -0.0715257 0.001 0.000932596 -0.0358995 0.001 0.0025 -1.00886e-16 0 -0.00375769 -0.0715257 0 0.000932596 -0.0358995 0 -0.0163648 -0.105313 0.001 -0.0115352 -0.106608 0.001 -0.0025 -9.96618e-17 0.001 -0.00868173 -0.0706574 0.001 -0.00404838 -0.0354637 0.001 -0.0163648 0.105313 0.001 -0.00404838 0.0354637 0.001 -0.00868173 0.0706574 0.001 -0.0115352 0.106608 0.001 0.0025 -1.00886e-16 0.001 0.000932596 0.0358995 0.001 -0.00375769 0.0715257 0.001 -0.00375769 -0.0715257 0.001 0.000932596 -0.0358995 0.001 -0.0163648 -0.105313 0 -0.0163648 -0.105313 0.001 -0.0025 -9.96618e-17 0.001 -0.00868173 -0.0706574 0.001 -0.00404838 -0.0354637 0.001 -0.0025 -9.96618e-17 0 -0.00868173 -0.0706574 0 -0.00404838 -0.0354637 0 -0.0025 -9.96618e-17 0 -0.0025 -9.96618e-17 0.001 -0.0163648 0.105313 0.001 -0.00404838 0.0354637 0.001 -0.00868173 0.0706574 0.001 -0.0163648 0.105313 0 -0.00404838 0.0354637 0 -0.00868173 0.0706574 0 -0.0163648 0.105313 0 -0.0115352 0.106608 0 -0.0115352 0.106608 0.001 -0.0163648 0.105313 0.001 0.0025 -1.00886e-16 0 0.0025 -1.00886e-16 0.001 -0.0115352 0.106608 0.001 0.000932596 0.0358995 0.001 -0.00375769 0.0715257 0.001 -0.0115352 0.106608 0 0.000932596 0.0358995 0 -0.00375769 0.0715257 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.016576 -0.106918 0 -0.0117464 -0.108212 0 -0.0117464 -0.108212 0.001 -0.016576 -0.106918 0.001 -0.016576 -0.106918 0 -0.0117464 -0.108212 0 -0.0025 -1.0118e-16 0 -0.00877592 -0.0717341 0 -0.00407197 -0.036004 0 -0.016576 0.106918 0 -0.00407197 0.036004 0 -0.00877592 0.0717341 0 -0.0117464 0.108212 0 0.0025 -1.02405e-16 0 0.000909003 0.0364398 0 -0.00385188 0.0726023 0 -0.00385188 -0.0726023 0 0.000909003 -0.0364398 0 -0.0117464 -0.108212 0 -0.0117464 -0.108212 0.001 0.0025 -1.02405e-16 0.001 -0.00385188 -0.0726023 0.001 0.000909003 -0.0364398 0.001 0.0025 -1.02405e-16 0 -0.00385188 -0.0726023 0 0.000909003 -0.0364398 0 -0.016576 -0.106918 0.001 -0.0117464 -0.108212 0.001 -0.0025 -1.0118e-16 0.001 -0.00877592 -0.0717341 0.001 -0.00407197 -0.036004 0.001 -0.016576 0.106918 0.001 -0.00407197 0.036004 0.001 -0.00877592 0.0717341 0.001 -0.0117464 0.108212 0.001 0.0025 -1.02405e-16 0.001 0.000909003 0.0364398 0.001 -0.00385188 0.0726023 0.001 -0.00385188 -0.0726023 0.001 0.000909003 -0.0364398 0.001 -0.016576 -0.106918 0 -0.016576 -0.106918 0.001 -0.0025 -1.0118e-16 0.001 -0.00877592 -0.0717341 0.001 -0.00407197 -0.036004 0.001 -0.0025 -1.0118e-16 0 -0.00877592 -0.0717341 0 -0.00407197 -0.036004 0 -0.0025 -1.0118e-16 0 -0.0025 -1.0118e-16 0.001 -0.016576 0.106918 0.001 -0.00407197 0.036004 0.001 -0.00877592 0.0717341 0.001 -0.016576 0.106918 0 -0.00407197 0.036004 0 -0.00877592 0.0717341 0 -0.016576 0.106918 0 -0.0117464 0.108212 0 -0.0117464 0.108212 0.001 -0.016576 0.106918 0.001 0.0025 -1.02405e-16 0 0.0025 -1.02405e-16 0.001 -0.0117464 0.108212 0.001 0.000909003 0.0364398 0.001 -0.00385188 0.0726023 0.001 -0.0117464 0.108212 0 0.000909003 0.0364398 0 -0.00385188 0.0726023 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0166987 -0.10785 0 -0.0118691 -0.109144 0 -0.0118691 -0.109144 0.001 -0.0166987 -0.10785 0.001 -0.0166987 -0.10785 0 -0.0118691 -0.109144 0 -0.0025 -1.02062e-16 0 -0.00883061 -0.0723592 0 -0.00408567 -0.0363178 0 -0.0166987 0.10785 0 -0.00408567 0.0363178 0 -0.00883061 0.0723592 0 -0.0118691 0.109144 0 0.0025 -1.03287e-16 0 0.000895304 0.0367536 0 -0.00390657 0.0732274 0 -0.00390657 -0.0732274 0 0.000895304 -0.0367536 0 -0.0118691 -0.109144 0 -0.0118691 -0.109144 0.001 0.0025 -1.03287e-16 0.001 -0.00390657 -0.0732274 0.001 0.000895304 -0.0367536 0.001 0.0025 -1.03287e-16 0 -0.00390657 -0.0732274 0 0.000895304 -0.0367536 0 -0.0166987 -0.10785 0.001 -0.0118691 -0.109144 0.001 -0.0025 -1.02062e-16 0.001 -0.00883061 -0.0723592 0.001 -0.00408567 -0.0363178 0.001 -0.0166987 0.10785 0.001 -0.00408567 0.0363178 0.001 -0.00883061 0.0723592 0.001 -0.0118691 0.109144 0.001 0.0025 -1.03287e-16 0.001 0.000895304 0.0367536 0.001 -0.00390657 0.0732274 0.001 -0.00390657 -0.0732274 0.001 0.000895304 -0.0367536 0.001 -0.0166987 -0.10785 0 -0.0166987 -0.10785 0.001 -0.0025 -1.02062e-16 0.001 -0.00883061 -0.0723592 0.001 -0.00408567 -0.0363178 0.001 -0.0025 -1.02062e-16 0 -0.00883061 -0.0723592 0 -0.00408567 -0.0363178 0 -0.0025 -1.02062e-16 0 -0.0025 -1.02062e-16 0.001 -0.0166987 0.10785 0.001 -0.00408567 0.0363178 0.001 -0.00883061 0.0723592 0.001 -0.0166987 0.10785 0 -0.00408567 0.0363178 0 -0.00883061 0.0723592 0 -0.0166987 0.10785 0 -0.0118691 0.109144 0 -0.0118691 0.109144 0.001 -0.0166987 0.10785 0.001 0.0025 -1.03287e-16 0 0.0025 -1.03287e-16 0.001 -0.0118691 0.109144 0.001 0.000895304 0.0367536 0.001 -0.00390657 0.0732274 0.001 -0.0118691 0.109144 0 0.000895304 0.0367536 0 -0.00390657 0.0732274 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0169134 -0.10948 0 -0.0120837 -0.110775 0 -0.0120837 -0.110775 0.001 -0.0169134 -0.10948 0.001 -0.0169134 -0.10948 0 -0.0120837 -0.110775 0 -0.0025 -1.03605e-16 0 -0.00892632 -0.0734532 0 -0.00410964 -0.0368669 0 -0.0169134 0.10948 0 -0.00410964 0.0368669 0 -0.00892632 0.0734532 0 -0.0120837 0.110775 0 0.0025 -1.0483e-16 0 0.000871331 0.0373027 0 -0.00400228 0.0743214 0 -0.00400228 -0.0743214 0 0.000871331 -0.0373027 0 -0.0120837 -0.110775 0 -0.0120837 -0.110775 0.001 0.0025 -1.0483e-16 0.001 -0.00400228 -0.0743214 0.001 0.000871331 -0.0373027 0.001 0.0025 -1.0483e-16 0 -0.00400228 -0.0743214 0 0.000871331 -0.0373027 0 -0.0169134 -0.10948 0.001 -0.0120837 -0.110775 0.001 -0.0025 -1.03605e-16 0.001 -0.00892632 -0.0734532 0.001 -0.00410964 -0.0368669 0.001 -0.0169134 0.10948 0.001 -0.00410964 0.0368669 0.001 -0.00892632 0.0734532 0.001 -0.0120837 0.110775 0.001 0.0025 -1.0483e-16 0.001 0.000871331 0.0373027 0.001 -0.00400228 0.0743214 0.001 -0.00400228 -0.0743214 0.001 0.000871331 -0.0373027 0.001 -0.0169134 -0.10948 0 -0.0169134 -0.10948 0.001 -0.0025 -1.03605e-16 0.001 -0.00892632 -0.0734532 0.001 -0.00410964 -0.0368669 0.001 -0.0025 -1.03605e-16 0 -0.00892632 -0.0734532 0 -0.00410964 -0.0368669 0 -0.0025 -1.03605e-16 0 -0.0025 -1.03605e-16 0.001 -0.0169134 0.10948 0.001 -0.00410964 0.0368669 0.001 -0.00892632 0.0734532 0.001 -0.0169134 0.10948 0 -0.00410964 0.0368669 0 -0.00892632 0.0734532 0 -0.0169134 0.10948 0 -0.0120837 0.110775 0 -0.0120837 0.110775 0.001 -0.0169134 0.10948 0.001 0.0025 -1.0483e-16 0 0.0025 -1.0483e-16 0.001 -0.0120837 0.110775 0.001 0.000871331 0.0373027 0.001 -0.00400228 0.0743214 0.001 -0.0120837 0.110775 0 0.000871331 0.0373027 0 -0.00400228 0.0743214 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0170326 -0.110386 0 -0.012203 -0.11168 0 -0.012203 -0.11168 0.001 -0.0170326 -0.110386 0.001 -0.0170326 -0.110386 0 -0.012203 -0.11168 0 -0.0025 -1.04462e-16 0 -0.00897949 -0.0740609 0 -0.00412296 -0.0371719 0 -0.0170326 0.110386 0 -0.00412296 0.0371719 0 -0.00897949 0.0740609 0 -0.012203 0.11168 0 0.0025 -1.05687e-16 0 0.000858012 0.0376077 0 -0.00405545 0.0749292 0 -0.00405545 -0.0749292 0 0.000858012 -0.0376077 0 -0.012203 -0.11168 0 -0.012203 -0.11168 0.001 0.0025 -1.05687e-16 0.001 -0.00405545 -0.0749292 0.001 0.000858012 -0.0376077 0.001 0.0025 -1.05687e-16 0 -0.00405545 -0.0749292 0 0.000858012 -0.0376077 0 -0.0170326 -0.110386 0.001 -0.012203 -0.11168 0.001 -0.0025 -1.04462e-16 0.001 -0.00897949 -0.0740609 0.001 -0.00412296 -0.0371719 0.001 -0.0170326 0.110386 0.001 -0.00412296 0.0371719 0.001 -0.00897949 0.0740609 0.001 -0.012203 0.11168 0.001 0.0025 -1.05687e-16 0.001 0.000858012 0.0376077 0.001 -0.00405545 0.0749292 0.001 -0.00405545 -0.0749292 0.001 0.000858012 -0.0376077 0.001 -0.0170326 -0.110386 0 -0.0170326 -0.110386 0.001 -0.0025 -1.04462e-16 0.001 -0.00897949 -0.0740609 0.001 -0.00412296 -0.0371719 0.001 -0.0025 -1.04462e-16 0 -0.00897949 -0.0740609 0 -0.00412296 -0.0371719 0 -0.0025 -1.04462e-16 0 -0.0025 -1.04462e-16 0.001 -0.0170326 0.110386 0.001 -0.00412296 0.0371719 0.001 -0.00897949 0.0740609 0.001 -0.0170326 0.110386 0 -0.00412296 0.0371719 0 -0.00897949 0.0740609 0 -0.0170326 0.110386 0 -0.012203 0.11168 0 -0.012203 0.11168 0.001 -0.0170326 0.110386 0.001 0.0025 -1.05687e-16 0 0.0025 -1.05687e-16 0.001 -0.012203 0.11168 0.001 0.000858012 0.0376077 0.001 -0.00405545 0.0749292 0.001 -0.012203 0.11168 0 0.000858012 0.0376077 0 -0.00405545 0.0749292 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0172473 -0.112017 0 -0.0124177 -0.113311 0 -0.0124177 -0.113311 0.001 -0.0172473 -0.112017 0.001 -0.0172473 -0.112017 0 -0.0124177 -0.113311 0 -0.0025 -1.06005e-16 0 -0.0090752 -0.0751549 0 -0.00414693 -0.037721 0 -0.0172473 0.112017 0 -0.00414693 0.037721 0 -0.0090752 0.0751549 0 -0.0124177 0.113311 0 0.0025 -1.0723e-16 0 0.000834039 0.0381568 0 -0.00415117 0.0760232 0 -0.00415117 -0.0760232 0 0.000834039 -0.0381568 0 -0.0124177 -0.113311 0 -0.0124177 -0.113311 0.001 0.0025 -1.0723e-16 0.001 -0.00415117 -0.0760232 0.001 0.000834039 -0.0381568 0.001 0.0025 -1.0723e-16 0 -0.00415117 -0.0760232 0 0.000834039 -0.0381568 0 -0.0172473 -0.112017 0.001 -0.0124177 -0.113311 0.001 -0.0025 -1.06005e-16 0.001 -0.0090752 -0.0751549 0.001 -0.00414693 -0.037721 0.001 -0.0172473 0.112017 0.001 -0.00414693 0.037721 0.001 -0.0090752 0.0751549 0.001 -0.0124177 0.113311 0.001 0.0025 -1.0723e-16 0.001 0.000834039 0.0381568 0.001 -0.00415117 0.0760232 0.001 -0.00415117 -0.0760232 0.001 0.000834039 -0.0381568 0.001 -0.0172473 -0.112017 0 -0.0172473 -0.112017 0.001 -0.0025 -1.06005e-16 0.001 -0.0090752 -0.0751549 0.001 -0.00414693 -0.037721 0.001 -0.0025 -1.06005e-16 0 -0.0090752 -0.0751549 0 -0.00414693 -0.037721 0 -0.0025 -1.06005e-16 0 -0.0025 -1.06005e-16 0.001 -0.0172473 0.112017 0.001 -0.00414693 0.037721 0.001 -0.0090752 0.0751549 0.001 -0.0172473 0.112017 0 -0.00414693 0.037721 0 -0.0090752 0.0751549 0 -0.0172473 0.112017 0 -0.0124177 0.113311 0 -0.0124177 0.113311 0.001 -0.0172473 0.112017 0.001 0.0025 -1.0723e-16 0 0.0025 -1.0723e-16 0.001 -0.0124177 0.113311 0.001 0.000834039 0.0381568 0.001 -0.00415117 0.0760232 0.001 -0.0124177 0.113311 0 0.000834039 0.0381568 0 -0.00415117 0.0760232 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0173666 -0.112923 0 -0.0125369 -0.114217 0 -0.0125369 -0.114217 0.001 -0.0173666 -0.112923 0.001 -0.0173666 -0.112923 0 -0.0125369 -0.114217 0 -0.0025 -1.06863e-16 0 -0.00912838 -0.0757627 0 -0.00416025 -0.0380261 0 -0.0173666 0.112923 0 -0.00416025 0.0380261 0 -0.00912838 0.0757627 0 -0.0125369 0.114217 0 0.0025 -1.08087e-16 0 0.00082072 0.0384618 0 -0.00420434 0.0766309 0 -0.00420434 -0.0766309 0 0.00082072 -0.0384618 0 -0.0125369 -0.114217 0 -0.0125369 -0.114217 0.001 0.0025 -1.08087e-16 0.001 -0.00420434 -0.0766309 0.001 0.00082072 -0.0384618 0.001 0.0025 -1.08087e-16 0 -0.00420434 -0.0766309 0 0.00082072 -0.0384618 0 -0.0173666 -0.112923 0.001 -0.0125369 -0.114217 0.001 -0.0025 -1.06863e-16 0.001 -0.00912838 -0.0757627 0.001 -0.00416025 -0.0380261 0.001 -0.0173666 0.112923 0.001 -0.00416025 0.0380261 0.001 -0.00912838 0.0757627 0.001 -0.0125369 0.114217 0.001 0.0025 -1.08087e-16 0.001 0.00082072 0.0384618 0.001 -0.00420434 0.0766309 0.001 -0.00420434 -0.0766309 0.001 0.00082072 -0.0384618 0.001 -0.0173666 -0.112923 0 -0.0173666 -0.112923 0.001 -0.0025 -1.06863e-16 0.001 -0.00912838 -0.0757627 0.001 -0.00416025 -0.0380261 0.001 -0.0025 -1.06863e-16 0 -0.00912838 -0.0757627 0 -0.00416025 -0.0380261 0 -0.0025 -1.06863e-16 0 -0.0025 -1.06863e-16 0.001 -0.0173666 0.112923 0.001 -0.00416025 0.0380261 0.001 -0.00912838 0.0757627 0.001 -0.0173666 0.112923 0 -0.00416025 0.0380261 0 -0.00912838 0.0757627 0 -0.0173666 0.112923 0 -0.0125369 0.114217 0 -0.0125369 0.114217 0.001 -0.0173666 0.112923 0.001 0.0025 -1.08087e-16 0 0.0025 -1.08087e-16 0.001 -0.0125369 0.114217 0.001 0.00082072 0.0384618 0.001 -0.00420434 0.0766309 0.001 -0.0125369 0.114217 0 0.00082072 0.0384618 0 -0.00420434 0.0766309 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0175812 -0.114553 0 -0.0127516 -0.115847 0 -0.0127516 -0.115847 0.001 -0.0175812 -0.114553 0.001 -0.0175812 -0.114553 0 -0.0127516 -0.115847 0 -0.0025 -1.08406e-16 0 -0.00922409 -0.0768567 0 -0.00418423 -0.0385751 0 -0.0175812 0.114553 0 -0.00418423 0.0385751 0 -0.00922409 0.0768567 0 -0.0127516 0.115847 0 0.0025 -1.0963e-16 0 0.000796747 0.0390109 0 -0.00430005 0.0777249 0 -0.00430005 -0.0777249 0 0.000796747 -0.0390109 0 -0.0127516 -0.115847 0 -0.0127516 -0.115847 0.001 0.0025 -1.0963e-16 0.001 -0.00430005 -0.0777249 0.001 0.000796747 -0.0390109 0.001 0.0025 -1.0963e-16 0 -0.00430005 -0.0777249 0 0.000796747 -0.0390109 0 -0.0175812 -0.114553 0.001 -0.0127516 -0.115847 0.001 -0.0025 -1.08406e-16 0.001 -0.00922409 -0.0768567 0.001 -0.00418423 -0.0385751 0.001 -0.0175812 0.114553 0.001 -0.00418423 0.0385751 0.001 -0.00922409 0.0768567 0.001 -0.0127516 0.115847 0.001 0.0025 -1.0963e-16 0.001 0.000796747 0.0390109 0.001 -0.00430005 0.0777249 0.001 -0.00430005 -0.0777249 0.001 0.000796747 -0.0390109 0.001 -0.0175812 -0.114553 0 -0.0175812 -0.114553 0.001 -0.0025 -1.08406e-16 0.001 -0.00922409 -0.0768567 0.001 -0.00418423 -0.0385751 0.001 -0.0025 -1.08406e-16 0 -0.00922409 -0.0768567 0 -0.00418423 -0.0385751 0 -0.0025 -1.08406e-16 0 -0.0025 -1.08406e-16 0.001 -0.0175812 0.114553 0.001 -0.00418423 0.0385751 0.001 -0.00922409 0.0768567 0.001 -0.0175812 0.114553 0 -0.00418423 0.0385751 0 -0.00922409 0.0768567 0 -0.0175812 0.114553 0 -0.0127516 0.115847 0 -0.0127516 0.115847 0.001 -0.0175812 0.114553 0.001 0.0025 -1.0963e-16 0 0.0025 -1.0963e-16 0.001 -0.0127516 0.115847 0.001 0.000796747 0.0390109 0.001 -0.00430005 0.0777249 0.001 -0.0127516 0.115847 0 0.000796747 0.0390109 0 -0.00430005 0.0777249 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0132095 -0.0813468 0 -0.00837988 -0.0826409 0 -0.00837988 -0.0826409 0.001 -0.0132095 -0.0813468 0.001 -0.0132095 -0.0813468 0 -0.00837988 -0.0826409 0 -0.0025 -7.69813e-17 0 -0.00727492 -0.0545776 0 -0.00369601 -0.027393 0 -0.0132095 0.0813468 0 -0.00369601 0.027393 0 -0.00727492 0.0545776 0 -0.00837988 0.0826409 0 0.0025 -7.82059e-17 0 0.00128497 0.0278288 0 -0.00235088 0.0554459 0 -0.00235088 -0.0554459 0 0.00128497 -0.0278288 0 -0.00837988 -0.0826409 0 -0.00837988 -0.0826409 0.001 0.0025 -7.82059e-17 0.001 -0.00235088 -0.0554459 0.001 0.00128497 -0.0278288 0.001 0.0025 -7.82059e-17 0 -0.00235088 -0.0554459 0 0.00128497 -0.0278288 0 -0.0132095 -0.0813468 0.001 -0.00837988 -0.0826409 0.001 -0.0025 -7.69813e-17 0.001 -0.00727492 -0.0545776 0.001 -0.00369601 -0.027393 0.001 -0.0132095 0.0813468 0.001 -0.00369601 0.027393 0.001 -0.00727492 0.0545776 0.001 -0.00837988 0.0826409 0.001 0.0025 -7.82059e-17 0.001 0.00128497 0.0278288 0.001 -0.00235088 0.0554459 0.001 -0.00235088 -0.0554459 0.001 0.00128497 -0.0278288 0.001 -0.0132095 -0.0813468 0 -0.0132095 -0.0813468 0.001 -0.0025 -7.69813e-17 0.001 -0.00727492 -0.0545776 0.001 -0.00369601 -0.027393 0.001 -0.0025 -7.69813e-17 0 -0.00727492 -0.0545776 0 -0.00369601 -0.027393 0 -0.0025 -7.69813e-17 0 -0.0025 -7.69813e-17 0.001 -0.0132095 0.0813468 0.001 -0.00369601 0.027393 0.001 -0.00727492 0.0545776 0.001 -0.0132095 0.0813468 0 -0.00369601 0.027393 0 -0.00727492 0.0545776 0 -0.0132095 0.0813468 0 -0.00837988 0.0826409 0 -0.00837988 0.0826409 0.001 -0.0132095 0.0813468 0.001 0.0025 -7.82059e-17 0 0.0025 -7.82059e-17 0.001 -0.00837988 0.0826409 0.001 0.00128497 0.0278288 0.001 -0.00235088 0.0554459 0.001 -0.00837988 0.0826409 0 0.00128497 0.0278288 0 -0.00235088 0.0554459 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0177005 -0.115459 0 -0.0128709 -0.116753 0 -0.0128709 -0.116753 0.001 -0.0177005 -0.115459 0.001 -0.0177005 -0.115459 0 -0.0128709 -0.116753 0 -0.0025 -1.09263e-16 0 -0.00927726 -0.0774645 0 -0.00419755 -0.0388802 0 -0.0177005 0.115459 0 -0.00419755 0.0388802 0 -0.00927726 0.0774645 0 -0.0128709 0.116753 0 0.0025 -1.10488e-16 0 0.000783428 0.039316 0 -0.00435322 0.0783327 0 -0.00435322 -0.0783327 0 0.000783428 -0.039316 0 -0.0128709 -0.116753 0 -0.0128709 -0.116753 0.001 0.0025 -1.10488e-16 0.001 -0.00435322 -0.0783327 0.001 0.000783428 -0.039316 0.001 0.0025 -1.10488e-16 0 -0.00435322 -0.0783327 0 0.000783428 -0.039316 0 -0.0177005 -0.115459 0.001 -0.0128709 -0.116753 0.001 -0.0025 -1.09263e-16 0.001 -0.00927726 -0.0774645 0.001 -0.00419755 -0.0388802 0.001 -0.0177005 0.115459 0.001 -0.00419755 0.0388802 0.001 -0.00927726 0.0774645 0.001 -0.0128709 0.116753 0.001 0.0025 -1.10488e-16 0.001 0.000783428 0.039316 0.001 -0.00435322 0.0783327 0.001 -0.00435322 -0.0783327 0.001 0.000783428 -0.039316 0.001 -0.0177005 -0.115459 0 -0.0177005 -0.115459 0.001 -0.0025 -1.09263e-16 0.001 -0.00927726 -0.0774645 0.001 -0.00419755 -0.0388802 0.001 -0.0025 -1.09263e-16 0 -0.00927726 -0.0774645 0 -0.00419755 -0.0388802 0 -0.0025 -1.09263e-16 0 -0.0025 -1.09263e-16 0.001 -0.0177005 0.115459 0.001 -0.00419755 0.0388802 0.001 -0.00927726 0.0774645 0.001 -0.0177005 0.115459 0 -0.00419755 0.0388802 0 -0.00927726 0.0774645 0 -0.0177005 0.115459 0 -0.0128709 0.116753 0 -0.0128709 0.116753 0.001 -0.0177005 0.115459 0.001 0.0025 -1.10488e-16 0 0.0025 -1.10488e-16 0.001 -0.0128709 0.116753 0.001 0.000783428 0.039316 0.001 -0.00435322 0.0783327 0.001 -0.0128709 0.116753 0 0.000783428 0.039316 0 -0.00435322 0.0783327 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179186 -0.117116 0 -0.0130889 -0.11841 0 -0.0130889 -0.11841 0.001 -0.0179186 -0.117116 0.001 -0.0179186 -0.117116 0 -0.0130889 -0.11841 0 -0.0025 -1.10831e-16 0 -0.00937449 -0.0785758 0 -0.0042219 -0.039438 0 -0.0179186 0.117116 0 -0.0042219 0.039438 0 -0.00937449 0.0785758 0 -0.0130889 0.11841 0 0.0025 -1.12055e-16 0 0.000759074 0.0398738 0 -0.00445045 0.079444 0 -0.00445045 -0.079444 0 0.000759074 -0.0398738 0 -0.0130889 -0.11841 0 -0.0130889 -0.11841 0.001 0.0025 -1.12055e-16 0.001 -0.00445045 -0.079444 0.001 0.000759074 -0.0398738 0.001 0.0025 -1.12055e-16 0 -0.00445045 -0.079444 0 0.000759074 -0.0398738 0 -0.0179186 -0.117116 0.001 -0.0130889 -0.11841 0.001 -0.0025 -1.10831e-16 0.001 -0.00937449 -0.0785758 0.001 -0.0042219 -0.039438 0.001 -0.0179186 0.117116 0.001 -0.0042219 0.039438 0.001 -0.00937449 0.0785758 0.001 -0.0130889 0.11841 0.001 0.0025 -1.12055e-16 0.001 0.000759074 0.0398738 0.001 -0.00445045 0.079444 0.001 -0.00445045 -0.079444 0.001 0.000759074 -0.0398738 0.001 -0.0179186 -0.117116 0 -0.0179186 -0.117116 0.001 -0.0025 -1.10831e-16 0.001 -0.00937449 -0.0785758 0.001 -0.0042219 -0.039438 0.001 -0.0025 -1.10831e-16 0 -0.00937449 -0.0785758 0 -0.0042219 -0.039438 0 -0.0025 -1.10831e-16 0 -0.0025 -1.10831e-16 0.001 -0.0179186 0.117116 0.001 -0.0042219 0.039438 0.001 -0.00937449 0.0785758 0.001 -0.0179186 0.117116 0 -0.0042219 0.039438 0 -0.00937449 0.0785758 0 -0.0179186 0.117116 0 -0.0130889 0.11841 0 -0.0130889 0.11841 0.001 -0.0179186 0.117116 0.001 0.0025 -1.12055e-16 0 0.0025 -1.12055e-16 0.001 -0.0130889 0.11841 0.001 0.000759074 0.0398738 0.001 -0.00445045 0.079444 0.001 -0.0130889 0.11841 0 0.000759074 0.0398738 0 -0.00445045 0.079444 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0180344 -0.117996 0 -0.0132048 -0.11929 0 -0.0132048 -0.11929 0.001 -0.0180344 -0.117996 0.001 -0.0180344 -0.117996 0 -0.0132048 -0.11929 0 -0.0025 -1.11663e-16 0 -0.00942615 -0.0791662 0 -0.00423484 -0.0397343 0 -0.0180344 0.117996 0 -0.00423484 0.0397343 0 -0.00942615 0.0791662 0 -0.0132048 0.11929 0 0.0025 -1.12888e-16 0 0.000746136 0.0401701 0 -0.00450211 0.0800344 0 -0.00450211 -0.0800344 0 0.000746136 -0.0401701 0 -0.0132048 -0.11929 0 -0.0132048 -0.11929 0.001 0.0025 -1.12888e-16 0.001 -0.00450211 -0.0800344 0.001 0.000746136 -0.0401701 0.001 0.0025 -1.12888e-16 0 -0.00450211 -0.0800344 0 0.000746136 -0.0401701 0 -0.0180344 -0.117996 0.001 -0.0132048 -0.11929 0.001 -0.0025 -1.11663e-16 0.001 -0.00942615 -0.0791662 0.001 -0.00423484 -0.0397343 0.001 -0.0180344 0.117996 0.001 -0.00423484 0.0397343 0.001 -0.00942615 0.0791662 0.001 -0.0132048 0.11929 0.001 0.0025 -1.12888e-16 0.001 0.000746136 0.0401701 0.001 -0.00450211 0.0800344 0.001 -0.00450211 -0.0800344 0.001 0.000746136 -0.0401701 0.001 -0.0180344 -0.117996 0 -0.0180344 -0.117996 0.001 -0.0025 -1.11663e-16 0.001 -0.00942615 -0.0791662 0.001 -0.00423484 -0.0397343 0.001 -0.0025 -1.11663e-16 0 -0.00942615 -0.0791662 0 -0.00423484 -0.0397343 0 -0.0025 -1.11663e-16 0 -0.0025 -1.11663e-16 0.001 -0.0180344 0.117996 0.001 -0.00423484 0.0397343 0.001 -0.00942615 0.0791662 0.001 -0.0180344 0.117996 0 -0.00423484 0.0397343 0 -0.00942615 0.0791662 0 -0.0180344 0.117996 0 -0.0132048 0.11929 0 -0.0132048 0.11929 0.001 -0.0180344 0.117996 0.001 0.0025 -1.12888e-16 0 0.0025 -1.12888e-16 0.001 -0.0132048 0.11929 0.001 0.000746136 0.0401701 0.001 -0.00450211 0.0800344 0.001 -0.0132048 0.11929 0 0.000746136 0.0401701 0 -0.00450211 0.0800344 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0182525 -0.119652 0 -0.0134229 -0.120946 0 -0.0134229 -0.120946 0.001 -0.0182525 -0.119652 0.001 -0.0182525 -0.119652 0 -0.0134229 -0.120946 0 -0.0025 -1.13231e-16 0 -0.00952338 -0.0802776 0 -0.00425919 -0.0402921 0 -0.0182525 0.119652 0 -0.00425919 0.0402921 0 -0.00952338 0.0802776 0 -0.0134229 0.120946 0 0.0025 -1.14455e-16 0 0.000721782 0.0407279 0 -0.00459934 0.0811458 0 -0.00459934 -0.0811458 0 0.000721782 -0.0407279 0 -0.0134229 -0.120946 0 -0.0134229 -0.120946 0.001 0.0025 -1.14455e-16 0.001 -0.00459934 -0.0811458 0.001 0.000721782 -0.0407279 0.001 0.0025 -1.14455e-16 0 -0.00459934 -0.0811458 0 0.000721782 -0.0407279 0 -0.0182525 -0.119652 0.001 -0.0134229 -0.120946 0.001 -0.0025 -1.13231e-16 0.001 -0.00952338 -0.0802776 0.001 -0.00425919 -0.0402921 0.001 -0.0182525 0.119652 0.001 -0.00425919 0.0402921 0.001 -0.00952338 0.0802776 0.001 -0.0134229 0.120946 0.001 0.0025 -1.14455e-16 0.001 0.000721782 0.0407279 0.001 -0.00459934 0.0811458 0.001 -0.00459934 -0.0811458 0.001 0.000721782 -0.0407279 0.001 -0.0182525 -0.119652 0 -0.0182525 -0.119652 0.001 -0.0025 -1.13231e-16 0.001 -0.00952338 -0.0802776 0.001 -0.00425919 -0.0402921 0.001 -0.0025 -1.13231e-16 0 -0.00952338 -0.0802776 0 -0.00425919 -0.0402921 0 -0.0025 -1.13231e-16 0 -0.0025 -1.13231e-16 0.001 -0.0182525 0.119652 0.001 -0.00425919 0.0402921 0.001 -0.00952338 0.0802776 0.001 -0.0182525 0.119652 0 -0.00425919 0.0402921 0 -0.00952338 0.0802776 0 -0.0182525 0.119652 0 -0.0134229 0.120946 0 -0.0134229 0.120946 0.001 -0.0182525 0.119652 0.001 0.0025 -1.14455e-16 0 0.0025 -1.14455e-16 0.001 -0.0134229 0.120946 0.001 0.000721782 0.0407279 0.001 -0.00459934 0.0811458 0.001 -0.0134229 0.120946 0 0.000721782 0.0407279 0 -0.00459934 0.0811458 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0183649 -0.120506 0 -0.0135353 -0.1218 0 -0.0135353 -0.1218 0.001 -0.0183649 -0.120506 0.001 -0.0183649 -0.120506 0 -0.0135353 -0.1218 0 -0.0025 -1.14039e-16 0 -0.00957351 -0.0808506 0 -0.00427175 -0.0405797 0 -0.0183649 0.120506 0 -0.00427175 0.0405797 0 -0.00957351 0.0808506 0 -0.0135353 0.1218 0 0.0025 -1.15264e-16 0 0.000709225 0.0410155 0 -0.00464947 0.0817188 0 -0.00464947 -0.0817188 0 0.000709225 -0.0410155 0 -0.0135353 -0.1218 0 -0.0135353 -0.1218 0.001 0.0025 -1.15264e-16 0.001 -0.00464947 -0.0817188 0.001 0.000709225 -0.0410155 0.001 0.0025 -1.15264e-16 0 -0.00464947 -0.0817188 0 0.000709225 -0.0410155 0 -0.0183649 -0.120506 0.001 -0.0135353 -0.1218 0.001 -0.0025 -1.14039e-16 0.001 -0.00957351 -0.0808506 0.001 -0.00427175 -0.0405797 0.001 -0.0183649 0.120506 0.001 -0.00427175 0.0405797 0.001 -0.00957351 0.0808506 0.001 -0.0135353 0.1218 0.001 0.0025 -1.15264e-16 0.001 0.000709225 0.0410155 0.001 -0.00464947 0.0817188 0.001 -0.00464947 -0.0817188 0.001 0.000709225 -0.0410155 0.001 -0.0183649 -0.120506 0 -0.0183649 -0.120506 0.001 -0.0025 -1.14039e-16 0.001 -0.00957351 -0.0808506 0.001 -0.00427175 -0.0405797 0.001 -0.0025 -1.14039e-16 0 -0.00957351 -0.0808506 0 -0.00427175 -0.0405797 0 -0.0025 -1.14039e-16 0 -0.0025 -1.14039e-16 0.001 -0.0183649 0.120506 0.001 -0.00427175 0.0405797 0.001 -0.00957351 0.0808506 0.001 -0.0183649 0.120506 0 -0.00427175 0.0405797 0 -0.00957351 0.0808506 0 -0.0183649 0.120506 0 -0.0135353 0.1218 0 -0.0135353 0.1218 0.001 -0.0183649 0.120506 0.001 0.0025 -1.15264e-16 0 0.0025 -1.15264e-16 0.001 -0.0135353 0.1218 0.001 0.000709225 0.0410155 0.001 -0.00464947 0.0817188 0.001 -0.0135353 0.1218 0 0.000709225 0.0410155 0 -0.00464947 0.0817188 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0185864 -0.122188 0 -0.0137568 -0.123483 0 -0.0137568 -0.123483 0.001 -0.0185864 -0.122188 0.001 -0.0185864 -0.122188 0 -0.0137568 -0.123483 0 -0.0025 -1.15631e-16 0 -0.00967226 -0.0819793 0 -0.00429648 -0.0411462 0 -0.0185864 0.122188 0 -0.00429648 0.0411462 0 -0.00967226 0.0819793 0 -0.0137568 0.123483 0 0.0025 -1.16856e-16 0 0.00068449 0.041582 0 -0.00474822 0.0828475 0 -0.00474822 -0.0828475 0 0.00068449 -0.041582 0 -0.0137568 -0.123483 0 -0.0137568 -0.123483 0.001 0.0025 -1.16856e-16 0.001 -0.00474822 -0.0828475 0.001 0.00068449 -0.041582 0.001 0.0025 -1.16856e-16 0 -0.00474822 -0.0828475 0 0.00068449 -0.041582 0 -0.0185864 -0.122188 0.001 -0.0137568 -0.123483 0.001 -0.0025 -1.15631e-16 0.001 -0.00967226 -0.0819793 0.001 -0.00429648 -0.0411462 0.001 -0.0185864 0.122188 0.001 -0.00429648 0.0411462 0.001 -0.00967226 0.0819793 0.001 -0.0137568 0.123483 0.001 0.0025 -1.16856e-16 0.001 0.00068449 0.041582 0.001 -0.00474822 0.0828475 0.001 -0.00474822 -0.0828475 0.001 0.00068449 -0.041582 0.001 -0.0185864 -0.122188 0 -0.0185864 -0.122188 0.001 -0.0025 -1.15631e-16 0.001 -0.00967226 -0.0819793 0.001 -0.00429648 -0.0411462 0.001 -0.0025 -1.15631e-16 0 -0.00967226 -0.0819793 0 -0.00429648 -0.0411462 0 -0.0025 -1.15631e-16 0 -0.0025 -1.15631e-16 0.001 -0.0185864 0.122188 0.001 -0.00429648 0.0411462 0.001 -0.00967226 0.0819793 0.001 -0.0185864 0.122188 0 -0.00429648 0.0411462 0 -0.00967226 0.0819793 0 -0.0185864 0.122188 0 -0.0137568 0.123483 0 -0.0137568 0.123483 0.001 -0.0185864 0.122188 0.001 0.0025 -1.16856e-16 0 0.0025 -1.16856e-16 0.001 -0.0137568 0.123483 0.001 0.00068449 0.041582 0.001 -0.00474822 0.0828475 0.001 -0.0137568 0.123483 0 0.00068449 0.041582 0 -0.00474822 0.0828475 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0186989 -0.123043 0 -0.0138692 -0.124337 0 -0.0138692 -0.124337 0.001 -0.0186989 -0.123043 0.001 -0.0186989 -0.123043 0 -0.0138692 -0.124337 0 -0.0025 -1.16439e-16 0 -0.00972239 -0.0825523 0 -0.00430904 -0.0414338 0 -0.0186989 0.123043 0 -0.00430904 0.0414338 0 -0.00972239 0.0825523 0 -0.0138692 0.124337 0 0.0025 -1.17664e-16 0 0.000671933 0.0418696 0 -0.00479836 0.0834206 0 -0.00479836 -0.0834206 0 0.000671933 -0.0418696 0 -0.0138692 -0.124337 0 -0.0138692 -0.124337 0.001 0.0025 -1.17664e-16 0.001 -0.00479836 -0.0834206 0.001 0.000671933 -0.0418696 0.001 0.0025 -1.17664e-16 0 -0.00479836 -0.0834206 0 0.000671933 -0.0418696 0 -0.0186989 -0.123043 0.001 -0.0138692 -0.124337 0.001 -0.0025 -1.16439e-16 0.001 -0.00972239 -0.0825523 0.001 -0.00430904 -0.0414338 0.001 -0.0186989 0.123043 0.001 -0.00430904 0.0414338 0.001 -0.00972239 0.0825523 0.001 -0.0138692 0.124337 0.001 0.0025 -1.17664e-16 0.001 0.000671933 0.0418696 0.001 -0.00479836 0.0834206 0.001 -0.00479836 -0.0834206 0.001 0.000671933 -0.0418696 0.001 -0.0186989 -0.123043 0 -0.0186989 -0.123043 0.001 -0.0025 -1.16439e-16 0.001 -0.00972239 -0.0825523 0.001 -0.00430904 -0.0414338 0.001 -0.0025 -1.16439e-16 0 -0.00972239 -0.0825523 0 -0.00430904 -0.0414338 0 -0.0025 -1.16439e-16 0 -0.0025 -1.16439e-16 0.001 -0.0186989 0.123043 0.001 -0.00430904 0.0414338 0.001 -0.00972239 0.0825523 0.001 -0.0186989 0.123043 0 -0.00430904 0.0414338 0 -0.00972239 0.0825523 0 -0.0186989 0.123043 0 -0.0138692 0.124337 0 -0.0138692 0.124337 0.001 -0.0186989 0.123043 0.001 0.0025 -1.17664e-16 0 0.0025 -1.17664e-16 0.001 -0.0138692 0.124337 0.001 0.000671933 0.0418696 0.001 -0.00479836 0.0834206 0.001 -0.0138692 0.124337 0 0.000671933 0.0418696 0 -0.00479836 0.0834206 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0189203 -0.124725 0 -0.0140907 -0.126019 0 -0.0140907 -0.126019 0.001 -0.0189203 -0.124725 0.001 -0.0189203 -0.124725 0 -0.0140907 -0.126019 0 -0.0025 -1.18031e-16 0 -0.00982114 -0.0836811 0 -0.00433377 -0.0420004 0 -0.0189203 0.124725 0 -0.00433377 0.0420004 0 -0.00982114 0.0836811 0 -0.0140907 0.126019 0 0.0025 -1.19256e-16 0 0.000647199 0.0424361 0 -0.00489711 0.0845493 0 -0.00489711 -0.0845493 0 0.000647199 -0.0424361 0 -0.0140907 -0.126019 0 -0.0140907 -0.126019 0.001 0.0025 -1.19256e-16 0.001 -0.00489711 -0.0845493 0.001 0.000647199 -0.0424361 0.001 0.0025 -1.19256e-16 0 -0.00489711 -0.0845493 0 0.000647199 -0.0424361 0 -0.0189203 -0.124725 0.001 -0.0140907 -0.126019 0.001 -0.0025 -1.18031e-16 0.001 -0.00982114 -0.0836811 0.001 -0.00433377 -0.0420004 0.001 -0.0189203 0.124725 0.001 -0.00433377 0.0420004 0.001 -0.00982114 0.0836811 0.001 -0.0140907 0.126019 0.001 0.0025 -1.19256e-16 0.001 0.000647199 0.0424361 0.001 -0.00489711 0.0845493 0.001 -0.00489711 -0.0845493 0.001 0.000647199 -0.0424361 0.001 -0.0189203 -0.124725 0 -0.0189203 -0.124725 0.001 -0.0025 -1.18031e-16 0.001 -0.00982114 -0.0836811 0.001 -0.00433377 -0.0420004 0.001 -0.0025 -1.18031e-16 0 -0.00982114 -0.0836811 0 -0.00433377 -0.0420004 0 -0.0025 -1.18031e-16 0 -0.0025 -1.18031e-16 0.001 -0.0189203 0.124725 0.001 -0.00433377 0.0420004 0.001 -0.00982114 0.0836811 0.001 -0.0189203 0.124725 0 -0.00433377 0.0420004 0 -0.00982114 0.0836811 0 -0.0189203 0.124725 0 -0.0140907 0.126019 0 -0.0140907 0.126019 0.001 -0.0189203 0.124725 0.001 0.0025 -1.19256e-16 0 0.0025 -1.19256e-16 0.001 -0.0140907 0.126019 0.001 0.000647199 0.0424361 0.001 -0.00489711 0.0845493 0.001 -0.0140907 0.126019 0 0.000647199 0.0424361 0 -0.00489711 0.0845493 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0190328 -0.125579 0 -0.0142032 -0.126873 0 -0.0142032 -0.126873 0.001 -0.0190328 -0.125579 0.001 -0.0190328 -0.125579 0 -0.0142032 -0.126873 0 -0.0025 -1.1884e-16 0 -0.00987128 -0.0842541 0 -0.00434633 -0.042288 0 -0.0190328 0.125579 0 -0.00434633 0.042288 0 -0.00987128 0.0842541 0 -0.0142032 0.126873 0 0.0025 -1.20064e-16 0 0.000634641 0.0427237 0 -0.00494724 0.0851223 0 -0.00494724 -0.0851223 0 0.000634641 -0.0427237 0 -0.0142032 -0.126873 0 -0.0142032 -0.126873 0.001 0.0025 -1.20064e-16 0.001 -0.00494724 -0.0851223 0.001 0.000634641 -0.0427237 0.001 0.0025 -1.20064e-16 0 -0.00494724 -0.0851223 0 0.000634641 -0.0427237 0 -0.0190328 -0.125579 0.001 -0.0142032 -0.126873 0.001 -0.0025 -1.1884e-16 0.001 -0.00987128 -0.0842541 0.001 -0.00434633 -0.042288 0.001 -0.0190328 0.125579 0.001 -0.00434633 0.042288 0.001 -0.00987128 0.0842541 0.001 -0.0142032 0.126873 0.001 0.0025 -1.20064e-16 0.001 0.000634641 0.0427237 0.001 -0.00494724 0.0851223 0.001 -0.00494724 -0.0851223 0.001 0.000634641 -0.0427237 0.001 -0.0190328 -0.125579 0 -0.0190328 -0.125579 0.001 -0.0025 -1.1884e-16 0.001 -0.00987128 -0.0842541 0.001 -0.00434633 -0.042288 0.001 -0.0025 -1.1884e-16 0 -0.00987128 -0.0842541 0 -0.00434633 -0.042288 0 -0.0025 -1.1884e-16 0 -0.0025 -1.1884e-16 0.001 -0.0190328 0.125579 0.001 -0.00434633 0.042288 0.001 -0.00987128 0.0842541 0.001 -0.0190328 0.125579 0 -0.00434633 0.042288 0 -0.00987128 0.0842541 0 -0.0190328 0.125579 0 -0.0142032 0.126873 0 -0.0142032 0.126873 0.001 -0.0190328 0.125579 0.001 0.0025 -1.20064e-16 0 0.0025 -1.20064e-16 0.001 -0.0142032 0.126873 0.001 0.000634641 0.0427237 0.001 -0.00494724 0.0851223 0.001 -0.0142032 0.126873 0 0.000634641 0.0427237 0 -0.00494724 0.0851223 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0192543 -0.127261 0 -0.0144246 -0.128555 0 -0.0144246 -0.128555 0.001 -0.0192543 -0.127261 0.001 -0.0192543 -0.127261 0 -0.0144246 -0.128555 0 -0.0025 -1.20432e-16 0 -0.00997003 -0.0853828 0 -0.00437107 -0.0428545 0 -0.0192543 0.127261 0 -0.00437107 0.0428545 0 -0.00997003 0.0853828 0 -0.0144246 0.128555 0 0.0025 -1.21656e-16 0 0.000609907 0.0432903 0 -0.00504599 0.086251 0 -0.00504599 -0.086251 0 0.000609907 -0.0432903 0 -0.0144246 -0.128555 0 -0.0144246 -0.128555 0.001 0.0025 -1.21656e-16 0.001 -0.00504599 -0.086251 0.001 0.000609907 -0.0432903 0.001 0.0025 -1.21656e-16 0 -0.00504599 -0.086251 0 0.000609907 -0.0432903 0 -0.0192543 -0.127261 0.001 -0.0144246 -0.128555 0.001 -0.0025 -1.20432e-16 0.001 -0.00997003 -0.0853828 0.001 -0.00437107 -0.0428545 0.001 -0.0192543 0.127261 0.001 -0.00437107 0.0428545 0.001 -0.00997003 0.0853828 0.001 -0.0144246 0.128555 0.001 0.0025 -1.21656e-16 0.001 0.000609907 0.0432903 0.001 -0.00504599 0.086251 0.001 -0.00504599 -0.086251 0.001 0.000609907 -0.0432903 0.001 -0.0192543 -0.127261 0 -0.0192543 -0.127261 0.001 -0.0025 -1.20432e-16 0.001 -0.00997003 -0.0853828 0.001 -0.00437107 -0.0428545 0.001 -0.0025 -1.20432e-16 0 -0.00997003 -0.0853828 0 -0.00437107 -0.0428545 0 -0.0025 -1.20432e-16 0 -0.0025 -1.20432e-16 0.001 -0.0192543 0.127261 0.001 -0.00437107 0.0428545 0.001 -0.00997003 0.0853828 0.001 -0.0192543 0.127261 0 -0.00437107 0.0428545 0 -0.00997003 0.0853828 0 -0.0192543 0.127261 0 -0.0144246 0.128555 0 -0.0144246 0.128555 0.001 -0.0192543 0.127261 0.001 0.0025 -1.21656e-16 0 0.0025 -1.21656e-16 0.001 -0.0144246 0.128555 0.001 0.000609907 0.0432903 0.001 -0.00504599 0.086251 0.001 -0.0144246 0.128555 0 0.000609907 0.0432903 0 -0.00504599 0.086251 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0133458 -0.0823821 0 -0.00851618 -0.0836762 0 -0.00851618 -0.0836762 0.001 -0.0133458 -0.0823821 0.001 -0.0133458 -0.0823821 0 -0.00851618 -0.0836762 0 -0.0025 -7.7961e-17 0 -0.00733569 -0.0552722 0 -0.00371123 -0.0277417 0 -0.0133458 0.0823821 0 -0.00371123 0.0277417 0 -0.00733569 0.0552722 0 -0.00851618 0.0836762 0 0.0025 -7.91857e-17 0 0.00126975 0.0281775 0 -0.00241165 0.0561405 0 -0.00241165 -0.0561405 0 0.00126975 -0.0281775 0 -0.00851618 -0.0836762 0 -0.00851618 -0.0836762 0.001 0.0025 -7.91857e-17 0.001 -0.00241165 -0.0561405 0.001 0.00126975 -0.0281775 0.001 0.0025 -7.91857e-17 0 -0.00241165 -0.0561405 0 0.00126975 -0.0281775 0 -0.0133458 -0.0823821 0.001 -0.00851618 -0.0836762 0.001 -0.0025 -7.7961e-17 0.001 -0.00733569 -0.0552722 0.001 -0.00371123 -0.0277417 0.001 -0.0133458 0.0823821 0.001 -0.00371123 0.0277417 0.001 -0.00733569 0.0552722 0.001 -0.00851618 0.0836762 0.001 0.0025 -7.91857e-17 0.001 0.00126975 0.0281775 0.001 -0.00241165 0.0561405 0.001 -0.00241165 -0.0561405 0.001 0.00126975 -0.0281775 0.001 -0.0133458 -0.0823821 0 -0.0133458 -0.0823821 0.001 -0.0025 -7.7961e-17 0.001 -0.00733569 -0.0552722 0.001 -0.00371123 -0.0277417 0.001 -0.0025 -7.7961e-17 0 -0.00733569 -0.0552722 0 -0.00371123 -0.0277417 0 -0.0025 -7.7961e-17 0 -0.0025 -7.7961e-17 0.001 -0.0133458 0.0823821 0.001 -0.00371123 0.0277417 0.001 -0.00733569 0.0552722 0.001 -0.0133458 0.0823821 0 -0.00371123 0.0277417 0 -0.00733569 0.0552722 0 -0.0133458 0.0823821 0 -0.00851618 0.0836762 0 -0.00851618 0.0836762 0.001 -0.0133458 0.0823821 0.001 0.0025 -7.91857e-17 0 0.0025 -7.91857e-17 0.001 -0.00851618 0.0836762 0.001 0.00126975 0.0281775 0.001 -0.00241165 0.0561405 0.001 -0.00851618 0.0836762 0 0.00126975 0.0281775 0 -0.00241165 0.0561405 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0193633 -0.12809 0 -0.0145337 -0.129384 0 -0.0145337 -0.129384 0.001 -0.0193633 -0.12809 0.001 -0.0193633 -0.12809 0 -0.0145337 -0.129384 0 -0.0025 -1.21216e-16 0 -0.0100186 -0.0859385 0 -0.00438324 -0.0431334 0 -0.0193633 0.12809 0 -0.00438324 0.0431334 0 -0.0100186 0.0859385 0 -0.0145337 0.129384 0 0.0025 -1.2244e-16 0 0.00059773 0.0435692 0 -0.0050946 0.0868067 0 -0.0050946 -0.0868067 0 0.00059773 -0.0435692 0 -0.0145337 -0.129384 0 -0.0145337 -0.129384 0.001 0.0025 -1.2244e-16 0.001 -0.0050946 -0.0868067 0.001 0.00059773 -0.0435692 0.001 0.0025 -1.2244e-16 0 -0.0050946 -0.0868067 0 0.00059773 -0.0435692 0 -0.0193633 -0.12809 0.001 -0.0145337 -0.129384 0.001 -0.0025 -1.21216e-16 0.001 -0.0100186 -0.0859385 0.001 -0.00438324 -0.0431334 0.001 -0.0193633 0.12809 0.001 -0.00438324 0.0431334 0.001 -0.0100186 0.0859385 0.001 -0.0145337 0.129384 0.001 0.0025 -1.2244e-16 0.001 0.00059773 0.0435692 0.001 -0.0050946 0.0868067 0.001 -0.0050946 -0.0868067 0.001 0.00059773 -0.0435692 0.001 -0.0193633 -0.12809 0 -0.0193633 -0.12809 0.001 -0.0025 -1.21216e-16 0.001 -0.0100186 -0.0859385 0.001 -0.00438324 -0.0431334 0.001 -0.0025 -1.21216e-16 0 -0.0100186 -0.0859385 0 -0.00438324 -0.0431334 0 -0.0025 -1.21216e-16 0 -0.0025 -1.21216e-16 0.001 -0.0193633 0.12809 0.001 -0.00438324 0.0431334 0.001 -0.0100186 0.0859385 0.001 -0.0193633 0.12809 0 -0.00438324 0.0431334 0 -0.0100186 0.0859385 0 -0.0193633 0.12809 0 -0.0145337 0.129384 0 -0.0145337 0.129384 0.001 -0.0193633 0.12809 0.001 0.0025 -1.2244e-16 0 0.0025 -1.2244e-16 0.001 -0.0145337 0.129384 0.001 0.00059773 0.0435692 0.001 -0.0050946 0.0868067 0.001 -0.0145337 0.129384 0 0.00059773 0.0435692 0 -0.0050946 0.0868067 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0195848 -0.129772 0 -0.0147552 -0.131066 0 -0.0147552 -0.131066 0.001 -0.0195848 -0.129772 0.001 -0.0195848 -0.129772 0 -0.0147552 -0.131066 0 -0.0025 -1.22808e-16 0 -0.0101174 -0.0870672 0 -0.00440798 -0.0436999 0 -0.0195848 0.129772 0 -0.00440798 0.0436999 0 -0.0101174 0.0870672 0 -0.0147552 0.131066 0 0.0025 -1.24032e-16 0 0.000572995 0.0441357 0 -0.00519335 0.0879354 0 -0.00519335 -0.0879354 0 0.000572995 -0.0441357 0 -0.0147552 -0.131066 0 -0.0147552 -0.131066 0.001 0.0025 -1.24032e-16 0.001 -0.00519335 -0.0879354 0.001 0.000572995 -0.0441357 0.001 0.0025 -1.24032e-16 0 -0.00519335 -0.0879354 0 0.000572995 -0.0441357 0 -0.0195848 -0.129772 0.001 -0.0147552 -0.131066 0.001 -0.0025 -1.22808e-16 0.001 -0.0101174 -0.0870672 0.001 -0.00440798 -0.0436999 0.001 -0.0195848 0.129772 0.001 -0.00440798 0.0436999 0.001 -0.0101174 0.0870672 0.001 -0.0147552 0.131066 0.001 0.0025 -1.24032e-16 0.001 0.000572995 0.0441357 0.001 -0.00519335 0.0879354 0.001 -0.00519335 -0.0879354 0.001 0.000572995 -0.0441357 0.001 -0.0195848 -0.129772 0 -0.0195848 -0.129772 0.001 -0.0025 -1.22808e-16 0.001 -0.0101174 -0.0870672 0.001 -0.00440798 -0.0436999 0.001 -0.0025 -1.22808e-16 0 -0.0101174 -0.0870672 0 -0.00440798 -0.0436999 0 -0.0025 -1.22808e-16 0 -0.0025 -1.22808e-16 0.001 -0.0195848 0.129772 0.001 -0.00440798 0.0436999 0.001 -0.0101174 0.0870672 0.001 -0.0195848 0.129772 0 -0.00440798 0.0436999 0 -0.0101174 0.0870672 0 -0.0195848 0.129772 0 -0.0147552 0.131066 0 -0.0147552 0.131066 0.001 -0.0195848 0.129772 0.001 0.0025 -1.24032e-16 0 0.0025 -1.24032e-16 0.001 -0.0147552 0.131066 0.001 0.000572995 0.0441357 0.001 -0.00519335 0.0879354 0.001 -0.0147552 0.131066 0 0.000572995 0.0441357 0 -0.00519335 0.0879354 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0196972 -0.130626 0 -0.0148676 -0.13192 0 -0.0148676 -0.13192 0.001 -0.0196972 -0.130626 0.001 -0.0196972 -0.130626 0 -0.0148676 -0.13192 0 -0.0025 -1.23616e-16 0 -0.0101675 -0.0876402 0 -0.00442054 -0.0439875 0 -0.0196972 0.130626 0 -0.00442054 0.0439875 0 -0.0101675 0.0876402 0 -0.0148676 0.13192 0 0.0025 -1.2484e-16 0 0.000560438 0.0444233 0 -0.00524349 0.0885085 0 -0.00524349 -0.0885085 0 0.000560438 -0.0444233 0 -0.0148676 -0.13192 0 -0.0148676 -0.13192 0.001 0.0025 -1.2484e-16 0.001 -0.00524349 -0.0885085 0.001 0.000560438 -0.0444233 0.001 0.0025 -1.2484e-16 0 -0.00524349 -0.0885085 0 0.000560438 -0.0444233 0 -0.0196972 -0.130626 0.001 -0.0148676 -0.13192 0.001 -0.0025 -1.23616e-16 0.001 -0.0101675 -0.0876402 0.001 -0.00442054 -0.0439875 0.001 -0.0196972 0.130626 0.001 -0.00442054 0.0439875 0.001 -0.0101675 0.0876402 0.001 -0.0148676 0.13192 0.001 0.0025 -1.2484e-16 0.001 0.000560438 0.0444233 0.001 -0.00524349 0.0885085 0.001 -0.00524349 -0.0885085 0.001 0.000560438 -0.0444233 0.001 -0.0196972 -0.130626 0 -0.0196972 -0.130626 0.001 -0.0025 -1.23616e-16 0.001 -0.0101675 -0.0876402 0.001 -0.00442054 -0.0439875 0.001 -0.0025 -1.23616e-16 0 -0.0101675 -0.0876402 0 -0.00442054 -0.0439875 0 -0.0025 -1.23616e-16 0 -0.0025 -1.23616e-16 0.001 -0.0196972 0.130626 0.001 -0.00442054 0.0439875 0.001 -0.0101675 0.0876402 0.001 -0.0196972 0.130626 0 -0.00442054 0.0439875 0 -0.0101675 0.0876402 0 -0.0196972 0.130626 0 -0.0148676 0.13192 0 -0.0148676 0.13192 0.001 -0.0196972 0.130626 0.001 0.0025 -1.2484e-16 0 0.0025 -1.2484e-16 0.001 -0.0148676 0.13192 0.001 0.000560438 0.0444233 0.001 -0.00524349 0.0885085 0.001 -0.0148676 0.13192 0 0.000560438 0.0444233 0 -0.00524349 0.0885085 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0199187 -0.132308 0 -0.0150891 -0.133602 0 -0.0150891 -0.133602 0.001 -0.0199187 -0.132308 0.001 -0.0199187 -0.132308 0 -0.0150891 -0.133602 0 -0.0025 -1.25208e-16 0 -0.0102663 -0.0887689 0 -0.00444527 -0.044554 0 -0.0199187 0.132308 0 -0.00444527 0.044554 0 -0.0102663 0.0887689 0 -0.0150891 0.133602 0 0.0025 -1.26433e-16 0 0.000535703 0.0449898 0 -0.00534224 0.0896372 0 -0.00534224 -0.0896372 0 0.000535703 -0.0449898 0 -0.0150891 -0.133602 0 -0.0150891 -0.133602 0.001 0.0025 -1.26433e-16 0.001 -0.00534224 -0.0896372 0.001 0.000535703 -0.0449898 0.001 0.0025 -1.26433e-16 0 -0.00534224 -0.0896372 0 0.000535703 -0.0449898 0 -0.0199187 -0.132308 0.001 -0.0150891 -0.133602 0.001 -0.0025 -1.25208e-16 0.001 -0.0102663 -0.0887689 0.001 -0.00444527 -0.044554 0.001 -0.0199187 0.132308 0.001 -0.00444527 0.044554 0.001 -0.0102663 0.0887689 0.001 -0.0150891 0.133602 0.001 0.0025 -1.26433e-16 0.001 0.000535703 0.0449898 0.001 -0.00534224 0.0896372 0.001 -0.00534224 -0.0896372 0.001 0.000535703 -0.0449898 0.001 -0.0199187 -0.132308 0 -0.0199187 -0.132308 0.001 -0.0025 -1.25208e-16 0.001 -0.0102663 -0.0887689 0.001 -0.00444527 -0.044554 0.001 -0.0025 -1.25208e-16 0 -0.0102663 -0.0887689 0 -0.00444527 -0.044554 0 -0.0025 -1.25208e-16 0 -0.0025 -1.25208e-16 0.001 -0.0199187 0.132308 0.001 -0.00444527 0.044554 0.001 -0.0102663 0.0887689 0.001 -0.0199187 0.132308 0 -0.00444527 0.044554 0 -0.0102663 0.0887689 0 -0.0199187 0.132308 0 -0.0150891 0.133602 0 -0.0150891 0.133602 0.001 -0.0199187 0.132308 0.001 0.0025 -1.26433e-16 0 0.0025 -1.26433e-16 0.001 -0.0150891 0.133602 0.001 0.000535703 0.0449898 0.001 -0.00534224 0.0896372 0.001 -0.0150891 0.133602 0 0.000535703 0.0449898 0 -0.00534224 0.0896372 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0200278 -0.133137 0 -0.0151981 -0.134431 0 -0.0151981 -0.134431 0.001 -0.0200278 -0.133137 0.001 -0.0200278 -0.133137 0 -0.0151981 -0.134431 0 -0.0025 -1.25992e-16 0 -0.0103149 -0.0893246 0 -0.00445745 -0.0448329 0 -0.0200278 0.133137 0 -0.00445745 0.0448329 0 -0.0103149 0.0893246 0 -0.0151981 0.134431 0 0.0025 -1.27216e-16 0 0.000523526 0.0452687 0 -0.00539085 0.0901929 0 -0.00539085 -0.0901929 0 0.000523526 -0.0452687 0 -0.0151981 -0.134431 0 -0.0151981 -0.134431 0.001 0.0025 -1.27216e-16 0.001 -0.00539085 -0.0901929 0.001 0.000523526 -0.0452687 0.001 0.0025 -1.27216e-16 0 -0.00539085 -0.0901929 0 0.000523526 -0.0452687 0 -0.0200278 -0.133137 0.001 -0.0151981 -0.134431 0.001 -0.0025 -1.25992e-16 0.001 -0.0103149 -0.0893246 0.001 -0.00445745 -0.0448329 0.001 -0.0200278 0.133137 0.001 -0.00445745 0.0448329 0.001 -0.0103149 0.0893246 0.001 -0.0151981 0.134431 0.001 0.0025 -1.27216e-16 0.001 0.000523526 0.0452687 0.001 -0.00539085 0.0901929 0.001 -0.00539085 -0.0901929 0.001 0.000523526 -0.0452687 0.001 -0.0200278 -0.133137 0 -0.0200278 -0.133137 0.001 -0.0025 -1.25992e-16 0.001 -0.0103149 -0.0893246 0.001 -0.00445745 -0.0448329 0.001 -0.0025 -1.25992e-16 0 -0.0103149 -0.0893246 0 -0.00445745 -0.0448329 0 -0.0025 -1.25992e-16 0 -0.0025 -1.25992e-16 0.001 -0.0200278 0.133137 0.001 -0.00445745 0.0448329 0.001 -0.0103149 0.0893246 0.001 -0.0200278 0.133137 0 -0.00445745 0.0448329 0 -0.0103149 0.0893246 0 -0.0200278 0.133137 0 -0.0151981 0.134431 0 -0.0151981 0.134431 0.001 -0.0200278 0.133137 0.001 0.0025 -1.27216e-16 0 0.0025 -1.27216e-16 0.001 -0.0151981 0.134431 0.001 0.000523526 0.0452687 0.001 -0.00539085 0.0901929 0.001 -0.0151981 0.134431 0 0.000523526 0.0452687 0 -0.00539085 0.0901929 0 + + + 2 0 3 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0135503 -0.083935 0 -0.00872063 -0.0852291 0 -0.00872063 -0.0852291 0.001 -0.0135503 -0.083935 0.001 -0.0135503 -0.083935 0 -0.00872063 -0.0852291 0 -0.0025 -7.94306e-17 0 -0.00742685 -0.0563141 0 -0.00373406 -0.0282646 0 -0.0135503 0.083935 0 -0.00373406 0.0282646 0 -0.00742685 0.0563141 0 -0.00872063 0.0852291 0 0.0025 -8.06552e-17 0 0.00124691 0.0287004 0 -0.00250281 0.0571823 0 -0.00250281 -0.0571823 0 0.00124691 -0.0287004 0 -0.00872063 -0.0852291 0 -0.00872063 -0.0852291 0.001 0.0025 -8.06552e-17 0.001 -0.00250281 -0.0571823 0.001 0.00124691 -0.0287004 0.001 0.0025 -8.06552e-17 0 -0.00250281 -0.0571823 0 0.00124691 -0.0287004 0 -0.0135503 -0.083935 0.001 -0.00872063 -0.0852291 0.001 -0.0025 -7.94306e-17 0.001 -0.00742685 -0.0563141 0.001 -0.00373406 -0.0282646 0.001 -0.0135503 0.083935 0.001 -0.00373406 0.0282646 0.001 -0.00742685 0.0563141 0.001 -0.00872063 0.0852291 0.001 0.0025 -8.06552e-17 0.001 0.00124691 0.0287004 0.001 -0.00250281 0.0571823 0.001 -0.00250281 -0.0571823 0.001 0.00124691 -0.0287004 0.001 -0.0135503 -0.083935 0 -0.0135503 -0.083935 0.001 -0.0025 -7.94306e-17 0.001 -0.00742685 -0.0563141 0.001 -0.00373406 -0.0282646 0.001 -0.0025 -7.94306e-17 0 -0.00742685 -0.0563141 0 -0.00373406 -0.0282646 0 -0.0025 -7.94306e-17 0 -0.0025 -7.94306e-17 0.001 -0.0135503 0.083935 0.001 -0.00373406 0.0282646 0.001 -0.00742685 0.0563141 0.001 -0.0135503 0.083935 0 -0.00373406 0.0282646 0 -0.00742685 0.0563141 0 -0.0135503 0.083935 0 -0.00872063 0.0852291 0 -0.00872063 0.0852291 0.001 -0.0135503 0.083935 0.001 0.0025 -8.06552e-17 0 0.0025 -8.06552e-17 0.001 -0.00872063 0.0852291 0.001 0.00124691 0.0287004 0.001 -0.00250281 0.0571823 0.001 -0.00872063 0.0852291 0 0.00124691 0.0287004 0 -0.00250281 0.0571823 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0136797 -0.0849185 0 -0.00885011 -0.0862126 0 -0.00885011 -0.0862126 0.001 -0.0136797 -0.0849185 0.001 -0.0136797 -0.0849185 0 -0.00885011 -0.0862126 0 -0.0025 -8.03613e-17 0 -0.00748458 -0.056974 0 -0.00374852 -0.0285958 0 -0.0136797 0.0849185 0 -0.00374852 0.0285958 0 -0.00748458 0.056974 0 -0.00885011 0.0862126 0 0.0025 -8.1586e-17 0 0.00123245 0.0290316 0 -0.00256054 0.0578422 0 -0.00256054 -0.0578422 0 0.00123245 -0.0290316 0 -0.00885011 -0.0862126 0 -0.00885011 -0.0862126 0.001 0.0025 -8.1586e-17 0.001 -0.00256054 -0.0578422 0.001 0.00123245 -0.0290316 0.001 0.0025 -8.1586e-17 0 -0.00256054 -0.0578422 0 0.00123245 -0.0290316 0 -0.0136797 -0.0849185 0.001 -0.00885011 -0.0862126 0.001 -0.0025 -8.03613e-17 0.001 -0.00748458 -0.056974 0.001 -0.00374852 -0.0285958 0.001 -0.0136797 0.0849185 0.001 -0.00374852 0.0285958 0.001 -0.00748458 0.056974 0.001 -0.00885011 0.0862126 0.001 0.0025 -8.1586e-17 0.001 0.00123245 0.0290316 0.001 -0.00256054 0.0578422 0.001 -0.00256054 -0.0578422 0.001 0.00123245 -0.0290316 0.001 -0.0136797 -0.0849185 0 -0.0136797 -0.0849185 0.001 -0.0025 -8.03613e-17 0.001 -0.00748458 -0.056974 0.001 -0.00374852 -0.0285958 0.001 -0.0025 -8.03613e-17 0 -0.00748458 -0.056974 0 -0.00374852 -0.0285958 0 -0.0025 -8.03613e-17 0 -0.0025 -8.03613e-17 0.001 -0.0136797 0.0849185 0.001 -0.00374852 0.0285958 0.001 -0.00748458 0.056974 0.001 -0.0136797 0.0849185 0 -0.00374852 0.0285958 0 -0.00748458 0.056974 0 -0.0136797 0.0849185 0 -0.00885011 0.0862126 0 -0.00885011 0.0862126 0.001 -0.0136797 0.0849185 0.001 0.0025 -8.1586e-17 0 0.0025 -8.1586e-17 0.001 -0.00885011 0.0862126 0.001 0.00123245 0.0290316 0.001 -0.00256054 0.0578422 0.001 -0.00885011 0.0862126 0 0.00123245 0.0290316 0 -0.00256054 0.0578422 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0138876 -0.0864973 0 -0.00905796 -0.0877914 0 -0.00905796 -0.0877914 0.001 -0.0138876 -0.0864973 0.001 -0.0138876 -0.0864973 0 -0.00905796 -0.0877914 0 -0.0025 -8.18554e-17 0 -0.00757725 -0.0580332 0 -0.00377173 -0.0291274 0 -0.0138876 0.0864973 0 -0.00377173 0.0291274 0 -0.00757725 0.0580332 0 -0.00905796 0.0877914 0 0.0025 -8.308e-17 0 0.00120924 0.0295632 0 -0.00265321 0.0589015 0 -0.00265321 -0.0589015 0 0.00120924 -0.0295632 0 -0.00905796 -0.0877914 0 -0.00905796 -0.0877914 0.001 0.0025 -8.308e-17 0.001 -0.00265321 -0.0589015 0.001 0.00120924 -0.0295632 0.001 0.0025 -8.308e-17 0 -0.00265321 -0.0589015 0 0.00120924 -0.0295632 0 -0.0138876 -0.0864973 0.001 -0.00905796 -0.0877914 0.001 -0.0025 -8.18554e-17 0.001 -0.00757725 -0.0580332 0.001 -0.00377173 -0.0291274 0.001 -0.0138876 0.0864973 0.001 -0.00377173 0.0291274 0.001 -0.00757725 0.0580332 0.001 -0.00905796 0.0877914 0.001 0.0025 -8.308e-17 0.001 0.00120924 0.0295632 0.001 -0.00265321 0.0589015 0.001 -0.00265321 -0.0589015 0.001 0.00120924 -0.0295632 0.001 -0.0138876 -0.0864973 0 -0.0138876 -0.0864973 0.001 -0.0025 -8.18554e-17 0.001 -0.00757725 -0.0580332 0.001 -0.00377173 -0.0291274 0.001 -0.0025 -8.18554e-17 0 -0.00757725 -0.0580332 0 -0.00377173 -0.0291274 0 -0.0025 -8.18554e-17 0 -0.0025 -8.18554e-17 0.001 -0.0138876 0.0864973 0.001 -0.00377173 0.0291274 0.001 -0.00757725 0.0580332 0.001 -0.0138876 0.0864973 0 -0.00377173 0.0291274 0 -0.00757725 0.0580332 0 -0.0138876 0.0864973 0 -0.00905796 0.0877914 0 -0.00905796 0.0877914 0.001 -0.0138876 0.0864973 0.001 0.0025 -8.308e-17 0 0.0025 -8.308e-17 0.001 -0.00905796 0.0877914 0.001 0.00120924 0.0295632 0.001 -0.00265321 0.0589015 0.001 -0.00905796 0.0877914 0 0.00120924 0.0295632 0 -0.00265321 0.0589015 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0140171 -0.0874808 0 -0.00918744 -0.0887749 0 -0.00918744 -0.0887749 0.001 -0.0140171 -0.0874808 0.001 -0.0140171 -0.0874808 0 -0.00918744 -0.0887749 0 -0.0025 -8.27861e-17 0 -0.00763498 -0.0586931 0 -0.00378619 -0.0294586 0 -0.0140171 0.0874808 0 -0.00378619 0.0294586 0 -0.00763498 0.0586931 0 -0.00918744 0.0887749 0 0.0025 -8.40108e-17 0 0.00119478 0.0298944 0 -0.00271094 0.0595613 0 -0.00271094 -0.0595613 0 0.00119478 -0.0298944 0 -0.00918744 -0.0887749 0 -0.00918744 -0.0887749 0.001 0.0025 -8.40108e-17 0.001 -0.00271094 -0.0595613 0.001 0.00119478 -0.0298944 0.001 0.0025 -8.40108e-17 0 -0.00271094 -0.0595613 0 0.00119478 -0.0298944 0 -0.0140171 -0.0874808 0.001 -0.00918744 -0.0887749 0.001 -0.0025 -8.27861e-17 0.001 -0.00763498 -0.0586931 0.001 -0.00378619 -0.0294586 0.001 -0.0140171 0.0874808 0.001 -0.00378619 0.0294586 0.001 -0.00763498 0.0586931 0.001 -0.00918744 0.0887749 0.001 0.0025 -8.40108e-17 0.001 0.00119478 0.0298944 0.001 -0.00271094 0.0595613 0.001 -0.00271094 -0.0595613 0.001 0.00119478 -0.0298944 0.001 -0.0140171 -0.0874808 0 -0.0140171 -0.0874808 0.001 -0.0025 -8.27861e-17 0.001 -0.00763498 -0.0586931 0.001 -0.00378619 -0.0294586 0.001 -0.0025 -8.27861e-17 0 -0.00763498 -0.0586931 0 -0.00378619 -0.0294586 0 -0.0025 -8.27861e-17 0 -0.0025 -8.27861e-17 0.001 -0.0140171 0.0874808 0.001 -0.00378619 0.0294586 0.001 -0.00763498 0.0586931 0.001 -0.0140171 0.0874808 0 -0.00378619 0.0294586 0 -0.00763498 0.0586931 0 -0.0140171 0.0874808 0 -0.00918744 0.0887749 0 -0.00918744 0.0887749 0.001 -0.0140171 0.0874808 0.001 0.0025 -8.40108e-17 0 0.0025 -8.40108e-17 0.001 -0.00918744 0.0887749 0.001 0.00119478 0.0298944 0.001 -0.00271094 0.0595613 0.001 -0.00918744 0.0887749 0 0.00119478 0.0298944 0 -0.00271094 0.0595613 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0142249 -0.0890596 0 -0.00939529 -0.0903537 0 -0.00939529 -0.0903537 0.001 -0.0142249 -0.0890596 0.001 -0.0142249 -0.0890596 0 -0.00939529 -0.0903537 0 -0.0025 -8.42802e-17 0 -0.00772765 -0.0597523 0 -0.0038094 -0.0299903 0 -0.0142249 0.0890596 0 -0.0038094 0.0299903 0 -0.00772765 0.0597523 0 -0.00939529 0.0903537 0 0.0025 -8.55048e-17 0 0.00117157 0.0304261 0 -0.00280361 0.0606206 0 -0.00280361 -0.0606206 0 0.00117157 -0.0304261 0 -0.00939529 -0.0903537 0 -0.00939529 -0.0903537 0.001 0.0025 -8.55048e-17 0.001 -0.00280361 -0.0606206 0.001 0.00117157 -0.0304261 0.001 0.0025 -8.55048e-17 0 -0.00280361 -0.0606206 0 0.00117157 -0.0304261 0 -0.0142249 -0.0890596 0.001 -0.00939529 -0.0903537 0.001 -0.0025 -8.42802e-17 0.001 -0.00772765 -0.0597523 0.001 -0.0038094 -0.0299903 0.001 -0.0142249 0.0890596 0.001 -0.0038094 0.0299903 0.001 -0.00772765 0.0597523 0.001 -0.00939529 0.0903537 0.001 0.0025 -8.55048e-17 0.001 0.00117157 0.0304261 0.001 -0.00280361 0.0606206 0.001 -0.00280361 -0.0606206 0.001 0.00117157 -0.0304261 0.001 -0.0142249 -0.0890596 0 -0.0142249 -0.0890596 0.001 -0.0025 -8.42802e-17 0.001 -0.00772765 -0.0597523 0.001 -0.0038094 -0.0299903 0.001 -0.0025 -8.42802e-17 0 -0.00772765 -0.0597523 0 -0.0038094 -0.0299903 0 -0.0025 -8.42802e-17 0 -0.0025 -8.42802e-17 0.001 -0.0142249 0.0890596 0.001 -0.0038094 0.0299903 0.001 -0.00772765 0.0597523 0.001 -0.0142249 0.0890596 0 -0.0038094 0.0299903 0 -0.00772765 0.0597523 0 -0.0142249 0.0890596 0 -0.00939529 0.0903537 0 -0.00939529 0.0903537 0.001 -0.0142249 0.0890596 0.001 0.0025 -8.55048e-17 0 0.0025 -8.55048e-17 0.001 -0.00939529 0.0903537 0.001 0.00117157 0.0304261 0.001 -0.00280361 0.0606206 0.001 -0.00939529 0.0903537 0 0.00117157 0.0304261 0 -0.00280361 0.0606206 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00689528 -0.0390311 0 -0.00202051 -0.0401431 0 -0.00202051 -0.0401431 0.01 -0.00689528 -0.0390311 0.01 -0.00689528 -0.0390311 0 -0.00202051 -0.0401431 0 -0.0025 -4.29851e-17 0 -0.00445802 -0.0261425 0 -0.00299019 -0.0131079 0 -0.00689528 0.0390311 0 -0.00299019 0.0131079 0 -0.00445802 0.0261425 0 -0.00202051 0.0401431 0 0.0025 -4.42097e-17 0 0.00199585 0.0134813 0 0.000486199 0.0268873 0 0.000486199 -0.0268873 0 0.00199585 -0.0134813 0 -0.00202051 -0.0401431 0 -0.00202051 -0.0401431 0.01 0.0025 -4.42097e-17 0.01 0.000486199 -0.0268873 0.01 0.00199585 -0.0134813 0.01 0.0025 -4.42097e-17 0 0.000486199 -0.0268873 0 0.00199585 -0.0134813 0 -0.00689528 -0.0390311 0.01 -0.00202051 -0.0401431 0.01 -0.0025 -4.29851e-17 0.01 -0.00445802 -0.0261425 0.01 -0.00299019 -0.0131079 0.01 -0.00689528 0.0390311 0.01 -0.00299019 0.0131079 0.01 -0.00445802 0.0261425 0.01 -0.00202051 0.0401431 0.01 0.0025 -4.42097e-17 0.01 0.00199585 0.0134813 0.01 0.000486199 0.0268873 0.01 0.000486199 -0.0268873 0.01 0.00199585 -0.0134813 0.01 -0.00689528 -0.0390311 0 -0.00689528 -0.0390311 0.01 -0.0025 -4.29851e-17 0.01 -0.00445802 -0.0261425 0.01 -0.00299019 -0.0131079 0.01 -0.0025 -4.29851e-17 0 -0.00445802 -0.0261425 0 -0.00299019 -0.0131079 0 -0.0025 -4.29851e-17 0 -0.0025 -4.29851e-17 0.01 -0.00689528 0.0390311 0.01 -0.00299019 0.0131079 0.01 -0.00445802 0.0261425 0.01 -0.00689528 0.0390311 0 -0.00299019 0.0131079 0 -0.00445802 0.0261425 0 -0.00689528 0.0390311 0 -0.00202051 0.0401431 0 -0.00202051 0.0401431 0.01 -0.00689528 0.0390311 0.01 0.0025 -4.42097e-17 0 0.0025 -4.42097e-17 0.01 -0.00202051 0.0401431 0.01 0.00199585 0.0134813 0.01 0.000486199 0.0268873 0.01 -0.00202051 0.0401431 0 0.00199585 0.0134813 0 0.000486199 0.0268873 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00697292 -0.0397205 0 -0.00209814 -0.0408325 0 -0.00209814 -0.0408325 0.01 -0.00697292 -0.0397205 0.01 -0.00697292 -0.0397205 0 -0.00209814 -0.0408325 0 -0.0025 -4.37444e-17 0 -0.0044926 -0.0266043 0 -0.00299885 -0.0133394 0 -0.00697292 0.0397205 0 -0.00299885 0.0133394 0 -0.0044926 0.0266043 0 -0.00209814 0.0408325 0 0.0025 -4.4969e-17 0 0.00198719 0.0137128 0 0.000451613 0.0273491 0 0.000451613 -0.0273491 0 0.00198719 -0.0137128 0 -0.00209814 -0.0408325 0 -0.00209814 -0.0408325 0.01 0.0025 -4.4969e-17 0.01 0.000451613 -0.0273491 0.01 0.00198719 -0.0137128 0.01 0.0025 -4.4969e-17 0 0.000451613 -0.0273491 0 0.00198719 -0.0137128 0 -0.00697292 -0.0397205 0.01 -0.00209814 -0.0408325 0.01 -0.0025 -4.37444e-17 0.01 -0.0044926 -0.0266043 0.01 -0.00299885 -0.0133394 0.01 -0.00697292 0.0397205 0.01 -0.00299885 0.0133394 0.01 -0.0044926 0.0266043 0.01 -0.00209814 0.0408325 0.01 0.0025 -4.4969e-17 0.01 0.00198719 0.0137128 0.01 0.000451613 0.0273491 0.01 0.000451613 -0.0273491 0.01 0.00198719 -0.0137128 0.01 -0.00697292 -0.0397205 0 -0.00697292 -0.0397205 0.01 -0.0025 -4.37444e-17 0.01 -0.0044926 -0.0266043 0.01 -0.00299885 -0.0133394 0.01 -0.0025 -4.37444e-17 0 -0.0044926 -0.0266043 0 -0.00299885 -0.0133394 0 -0.0025 -4.37444e-17 0 -0.0025 -4.37444e-17 0.01 -0.00697292 0.0397205 0.01 -0.00299885 0.0133394 0.01 -0.0044926 0.0266043 0.01 -0.00697292 0.0397205 0 -0.00299885 0.0133394 0 -0.0044926 0.0266043 0 -0.00697292 0.0397205 0 -0.00209814 0.0408325 0 -0.00209814 0.0408325 0.01 -0.00697292 0.0397205 0.01 0.0025 -4.4969e-17 0 0.0025 -4.4969e-17 0.01 -0.00209814 0.0408325 0.01 0.00198719 0.0137128 0.01 0.000451613 0.0273491 0.01 -0.00209814 0.0408325 0 0.00198719 0.0137128 0 0.000451613 0.0273491 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00811745 -0.0498842 0 -0.00324267 -0.0509962 0 -0.00324267 -0.0509962 0.01 -0.00811745 -0.0498842 0.01 -0.00811745 -0.0498842 0 -0.00324267 -0.0509962 0 -0.0025 -5.49377e-17 0 -0.00500247 -0.0334117 0 -0.00312649 -0.0167527 0 -0.00811745 0.0498842 0 -0.00312649 0.0167527 0 -0.00500247 0.0334117 0 -0.00324267 0.0509962 0 0.0025 -5.61623e-17 0 0.00185954 0.0171261 0 -5.8252e-05 0.0341565 0 -5.8252e-05 -0.0341565 0 0.00185954 -0.0171261 0 -0.00324267 -0.0509962 0 -0.00324267 -0.0509962 0.01 0.0025 -5.61623e-17 0.01 -5.8252e-05 -0.0341565 0.01 0.00185954 -0.0171261 0.01 0.0025 -5.61623e-17 0 -5.8252e-05 -0.0341565 0 0.00185954 -0.0171261 0 -0.00811745 -0.0498842 0.01 -0.00324267 -0.0509962 0.01 -0.0025 -5.49377e-17 0.01 -0.00500247 -0.0334117 0.01 -0.00312649 -0.0167527 0.01 -0.00811745 0.0498842 0.01 -0.00312649 0.0167527 0.01 -0.00500247 0.0334117 0.01 -0.00324267 0.0509962 0.01 0.0025 -5.61623e-17 0.01 0.00185954 0.0171261 0.01 -5.8252e-05 0.0341565 0.01 -5.8252e-05 -0.0341565 0.01 0.00185954 -0.0171261 0.01 -0.00811745 -0.0498842 0 -0.00811745 -0.0498842 0.01 -0.0025 -5.49377e-17 0.01 -0.00500247 -0.0334117 0.01 -0.00312649 -0.0167527 0.01 -0.0025 -5.49377e-17 0 -0.00500247 -0.0334117 0 -0.00312649 -0.0167527 0 -0.0025 -5.49377e-17 0 -0.0025 -5.49377e-17 0.01 -0.00811745 0.0498842 0.01 -0.00312649 0.0167527 0.01 -0.00500247 0.0334117 0.01 -0.00811745 0.0498842 0 -0.00312649 0.0167527 0 -0.00500247 0.0334117 0 -0.00811745 0.0498842 0 -0.00324267 0.0509962 0 -0.00324267 0.0509962 0.01 -0.00811745 0.0498842 0.01 0.0025 -5.61623e-17 0 0.0025 -5.61623e-17 0.01 -0.00324267 0.0509962 0.01 0.00185954 0.0171261 0.01 -5.8252e-05 0.0341565 0.01 -0.00324267 0.0509962 0 0.00185954 0.0171261 0 -5.8252e-05 0.0341565 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00819759 -0.0505959 0 -0.00332281 -0.0517079 0 -0.00332281 -0.0517079 0.01 -0.00819759 -0.0505959 0.01 -0.00819759 -0.0505959 0 -0.00332281 -0.0517079 0 -0.0025 -5.57214e-17 0 -0.00503817 -0.0338884 0 -0.00313543 -0.0169917 0 -0.00819759 0.0505959 0 -0.00313543 0.0169917 0 -0.00503817 0.0338884 0 -0.00332281 0.0517079 0 0.0025 -5.69461e-17 0 0.0018506 0.0173651 0 -9.39537e-05 0.0346332 0 -9.39537e-05 -0.0346332 0 0.0018506 -0.0173651 0 -0.00332281 -0.0517079 0 -0.00332281 -0.0517079 0.01 0.0025 -5.69461e-17 0.01 -9.39537e-05 -0.0346332 0.01 0.0018506 -0.0173651 0.01 0.0025 -5.69461e-17 0 -9.39537e-05 -0.0346332 0 0.0018506 -0.0173651 0 -0.00819759 -0.0505959 0.01 -0.00332281 -0.0517079 0.01 -0.0025 -5.57214e-17 0.01 -0.00503817 -0.0338884 0.01 -0.00313543 -0.0169917 0.01 -0.00819759 0.0505959 0.01 -0.00313543 0.0169917 0.01 -0.00503817 0.0338884 0.01 -0.00332281 0.0517079 0.01 0.0025 -5.69461e-17 0.01 0.0018506 0.0173651 0.01 -9.39537e-05 0.0346332 0.01 -9.39537e-05 -0.0346332 0.01 0.0018506 -0.0173651 0.01 -0.00819759 -0.0505959 0 -0.00819759 -0.0505959 0.01 -0.0025 -5.57214e-17 0.01 -0.00503817 -0.0338884 0.01 -0.00313543 -0.0169917 0.01 -0.0025 -5.57214e-17 0 -0.00503817 -0.0338884 0 -0.00313543 -0.0169917 0 -0.0025 -5.57214e-17 0 -0.0025 -5.57214e-17 0.01 -0.00819759 0.0505959 0.01 -0.00313543 0.0169917 0.01 -0.00503817 0.0338884 0.01 -0.00819759 0.0505959 0 -0.00313543 0.0169917 0 -0.00503817 0.0338884 0 -0.00819759 0.0505959 0 -0.00332281 0.0517079 0 -0.00332281 0.0517079 0.01 -0.00819759 0.0505959 0.01 0.0025 -5.69461e-17 0 0.0025 -5.69461e-17 0.01 -0.00332281 0.0517079 0.01 0.0018506 0.0173651 0.01 -9.39537e-05 0.0346332 0.01 -0.00332281 0.0517079 0 0.0018506 0.0173651 0 -9.39537e-05 0.0346332 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00836038 -0.0520415 0 -0.0034856 -0.0531535 0 -0.0034856 -0.0531535 0.01 -0.00836038 -0.0520415 0.01 -0.00836038 -0.0520415 0 -0.0034856 -0.0531535 0 -0.0025 -5.73135e-17 0 -0.00511069 -0.0348567 0 -0.00315358 -0.0174771 0 -0.00836038 0.0520415 0 -0.00315358 0.0174771 0 -0.00511069 0.0348567 0 -0.0034856 0.0531535 0 0.0025 -5.85381e-17 0 0.00183245 0.0178506 0 -0.000166473 0.0356015 0 -0.000166473 -0.0356015 0 0.00183245 -0.0178506 0 -0.0034856 -0.0531535 0 -0.0034856 -0.0531535 0.01 0.0025 -5.85381e-17 0.01 -0.000166473 -0.0356015 0.01 0.00183245 -0.0178506 0.01 0.0025 -5.85381e-17 0 -0.000166473 -0.0356015 0 0.00183245 -0.0178506 0 -0.00836038 -0.0520415 0.01 -0.0034856 -0.0531535 0.01 -0.0025 -5.73135e-17 0.01 -0.00511069 -0.0348567 0.01 -0.00315358 -0.0174771 0.01 -0.00836038 0.0520415 0.01 -0.00315358 0.0174771 0.01 -0.00511069 0.0348567 0.01 -0.0034856 0.0531535 0.01 0.0025 -5.85381e-17 0.01 0.00183245 0.0178506 0.01 -0.000166473 0.0356015 0.01 -0.000166473 -0.0356015 0.01 0.00183245 -0.0178506 0.01 -0.00836038 -0.0520415 0 -0.00836038 -0.0520415 0.01 -0.0025 -5.73135e-17 0.01 -0.00511069 -0.0348567 0.01 -0.00315358 -0.0174771 0.01 -0.0025 -5.73135e-17 0 -0.00511069 -0.0348567 0 -0.00315358 -0.0174771 0 -0.0025 -5.73135e-17 0 -0.0025 -5.73135e-17 0.01 -0.00836038 0.0520415 0.01 -0.00315358 0.0174771 0.01 -0.00511069 0.0348567 0.01 -0.00836038 0.0520415 0 -0.00315358 0.0174771 0 -0.00511069 0.0348567 0 -0.00836038 0.0520415 0 -0.0034856 0.0531535 0 -0.0034856 0.0531535 0.01 -0.00836038 0.0520415 0.01 0.0025 -5.85381e-17 0 0.0025 -5.85381e-17 0.01 -0.0034856 0.0531535 0.01 0.00183245 0.0178506 0.01 -0.000166473 0.0356015 0.01 -0.0034856 0.0531535 0 0.00183245 0.0178506 0 -0.000166473 0.0356015 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00844303 -0.0527754 0 -0.00356825 -0.0538874 0 -0.00356825 -0.0538874 0.01 -0.00844303 -0.0527754 0.01 -0.00844303 -0.0527754 0 -0.00356825 -0.0538874 0 -0.0025 -5.81217e-17 0 -0.00514751 -0.0353482 0 -0.0031628 -0.0177236 0 -0.00844303 0.0527754 0 -0.0031628 0.0177236 0 -0.00514751 0.0353482 0 -0.00356825 0.0538874 0 0.0025 -5.93464e-17 0 0.00182323 0.0180971 0 -0.00020329 0.036093 0 -0.00020329 -0.036093 0 0.00182323 -0.0180971 0 -0.00356825 -0.0538874 0 -0.00356825 -0.0538874 0.01 0.0025 -5.93464e-17 0.01 -0.00020329 -0.036093 0.01 0.00182323 -0.0180971 0.01 0.0025 -5.93464e-17 0 -0.00020329 -0.036093 0 0.00182323 -0.0180971 0 -0.00844303 -0.0527754 0.01 -0.00356825 -0.0538874 0.01 -0.0025 -5.81217e-17 0.01 -0.00514751 -0.0353482 0.01 -0.0031628 -0.0177236 0.01 -0.00844303 0.0527754 0.01 -0.0031628 0.0177236 0.01 -0.00514751 0.0353482 0.01 -0.00356825 0.0538874 0.01 0.0025 -5.93464e-17 0.01 0.00182323 0.0180971 0.01 -0.00020329 0.036093 0.01 -0.00020329 -0.036093 0.01 0.00182323 -0.0180971 0.01 -0.00844303 -0.0527754 0 -0.00844303 -0.0527754 0.01 -0.0025 -5.81217e-17 0.01 -0.00514751 -0.0353482 0.01 -0.0031628 -0.0177236 0.01 -0.0025 -5.81217e-17 0 -0.00514751 -0.0353482 0 -0.0031628 -0.0177236 0 -0.0025 -5.81217e-17 0 -0.0025 -5.81217e-17 0.01 -0.00844303 0.0527754 0.01 -0.0031628 0.0177236 0.01 -0.00514751 0.0353482 0.01 -0.00844303 0.0527754 0 -0.0031628 0.0177236 0 -0.00514751 0.0353482 0 -0.00844303 0.0527754 0 -0.00356825 0.0538874 0 -0.00356825 0.0538874 0.01 -0.00844303 0.0527754 0.01 0.0025 -5.93464e-17 0 0.0025 -5.93464e-17 0.01 -0.00356825 0.0538874 0.01 0.00182323 0.0180971 0.01 -0.00020329 0.036093 0.01 -0.00356825 0.0538874 0 0.00182323 0.0180971 0 -0.00020329 0.036093 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00860581 -0.054221 0 -0.00373104 -0.055333 0 -0.00373104 -0.055333 0.01 -0.00860581 -0.054221 0.01 -0.00860581 -0.054221 0 -0.00373104 -0.055333 0 -0.0025 -5.97138e-17 0 -0.00522003 -0.0363165 0 -0.00318096 -0.0182091 0 -0.00860581 0.054221 0 -0.00318096 0.0182091 0 -0.00522003 0.0363165 0 -0.00373104 0.055333 0 0.0025 -6.09384e-17 0 0.00180508 0.0185825 0 -0.000275809 0.0370613 0 -0.000275809 -0.0370613 0 0.00180508 -0.0185825 0 -0.00373104 -0.055333 0 -0.00373104 -0.055333 0.01 0.0025 -6.09384e-17 0.01 -0.000275809 -0.0370613 0.01 0.00180508 -0.0185825 0.01 0.0025 -6.09384e-17 0 -0.000275809 -0.0370613 0 0.00180508 -0.0185825 0 -0.00860581 -0.054221 0.01 -0.00373104 -0.055333 0.01 -0.0025 -5.97138e-17 0.01 -0.00522003 -0.0363165 0.01 -0.00318096 -0.0182091 0.01 -0.00860581 0.054221 0.01 -0.00318096 0.0182091 0.01 -0.00522003 0.0363165 0.01 -0.00373104 0.055333 0.01 0.0025 -6.09384e-17 0.01 0.00180508 0.0185825 0.01 -0.000275809 0.0370613 0.01 -0.000275809 -0.0370613 0.01 0.00180508 -0.0185825 0.01 -0.00860581 -0.054221 0 -0.00860581 -0.054221 0.01 -0.0025 -5.97138e-17 0.01 -0.00522003 -0.0363165 0.01 -0.00318096 -0.0182091 0.01 -0.0025 -5.97138e-17 0 -0.00522003 -0.0363165 0 -0.00318096 -0.0182091 0 -0.0025 -5.97138e-17 0 -0.0025 -5.97138e-17 0.01 -0.00860581 0.054221 0.01 -0.00318096 0.0182091 0.01 -0.00522003 0.0363165 0.01 -0.00860581 0.054221 0 -0.00318096 0.0182091 0 -0.00522003 0.0363165 0 -0.00860581 0.054221 0 -0.00373104 0.055333 0 -0.00373104 0.055333 0.01 -0.00860581 0.054221 0.01 0.0025 -6.09384e-17 0 0.0025 -6.09384e-17 0.01 -0.00373104 0.055333 0.01 0.00180508 0.0185825 0.01 -0.000275809 0.0370613 0.01 -0.00373104 0.055333 0 0.00180508 0.0185825 0 -0.000275809 0.0370613 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00868596 -0.0549326 0 -0.00381118 -0.0560446 0 -0.00381118 -0.0560446 0.01 -0.00868596 -0.0549326 0.01 -0.00868596 -0.0549326 0 -0.00381118 -0.0560446 0 -0.0025 -6.04976e-17 0 -0.00525573 -0.0367931 0 -0.0031899 -0.0184481 0 -0.00868596 0.0549326 0 -0.0031899 0.0184481 0 -0.00525573 0.0367931 0 -0.00381118 0.0560446 0 0.0025 -6.17222e-17 0 0.00179614 0.0188215 0 -0.000311511 0.0375379 0 -0.000311511 -0.0375379 0 0.00179614 -0.0188215 0 -0.00381118 -0.0560446 0 -0.00381118 -0.0560446 0.01 0.0025 -6.17222e-17 0.01 -0.000311511 -0.0375379 0.01 0.00179614 -0.0188215 0.01 0.0025 -6.17222e-17 0 -0.000311511 -0.0375379 0 0.00179614 -0.0188215 0 -0.00868596 -0.0549326 0.01 -0.00381118 -0.0560446 0.01 -0.0025 -6.04976e-17 0.01 -0.00525573 -0.0367931 0.01 -0.0031899 -0.0184481 0.01 -0.00868596 0.0549326 0.01 -0.0031899 0.0184481 0.01 -0.00525573 0.0367931 0.01 -0.00381118 0.0560446 0.01 0.0025 -6.17222e-17 0.01 0.00179614 0.0188215 0.01 -0.000311511 0.0375379 0.01 -0.000311511 -0.0375379 0.01 0.00179614 -0.0188215 0.01 -0.00868596 -0.0549326 0 -0.00868596 -0.0549326 0.01 -0.0025 -6.04976e-17 0.01 -0.00525573 -0.0367931 0.01 -0.0031899 -0.0184481 0.01 -0.0025 -6.04976e-17 0 -0.00525573 -0.0367931 0 -0.0031899 -0.0184481 0 -0.0025 -6.04976e-17 0 -0.0025 -6.04976e-17 0.01 -0.00868596 0.0549326 0.01 -0.0031899 0.0184481 0.01 -0.00525573 0.0367931 0.01 -0.00868596 0.0549326 0 -0.0031899 0.0184481 0 -0.00525573 0.0367931 0 -0.00868596 0.0549326 0 -0.00381118 0.0560446 0 -0.00381118 0.0560446 0.01 -0.00868596 0.0549326 0.01 0.0025 -6.17222e-17 0 0.0025 -6.17222e-17 0.01 -0.00381118 0.0560446 0.01 0.00179614 0.0188215 0.01 -0.000311511 0.0375379 0.01 -0.00381118 0.0560446 0 0.00179614 0.0188215 0 -0.000311511 0.0375379 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00885125 -0.0564005 0 -0.00397647 -0.0575125 0 -0.00397647 -0.0575125 0.01 -0.00885125 -0.0564005 0.01 -0.00885125 -0.0564005 0 -0.00397647 -0.0575125 0 -0.0025 -6.21141e-17 0 -0.00532936 -0.0377763 0 -0.00320833 -0.018941 0 -0.00885125 0.0564005 0 -0.00320833 0.018941 0 -0.00532936 0.0377763 0 -0.00397647 0.0575125 0 0.0025 -6.33387e-17 0 0.0017777 0.0193145 0 -0.000385146 0.0385211 0 -0.000385146 -0.0385211 0 0.0017777 -0.0193145 0 -0.00397647 -0.0575125 0 -0.00397647 -0.0575125 0.01 0.0025 -6.33387e-17 0.01 -0.000385146 -0.0385211 0.01 0.0017777 -0.0193145 0.01 0.0025 -6.33387e-17 0 -0.000385146 -0.0385211 0 0.0017777 -0.0193145 0 -0.00885125 -0.0564005 0.01 -0.00397647 -0.0575125 0.01 -0.0025 -6.21141e-17 0.01 -0.00532936 -0.0377763 0.01 -0.00320833 -0.018941 0.01 -0.00885125 0.0564005 0.01 -0.00320833 0.018941 0.01 -0.00532936 0.0377763 0.01 -0.00397647 0.0575125 0.01 0.0025 -6.33387e-17 0.01 0.0017777 0.0193145 0.01 -0.000385146 0.0385211 0.01 -0.000385146 -0.0385211 0.01 0.0017777 -0.0193145 0.01 -0.00885125 -0.0564005 0 -0.00885125 -0.0564005 0.01 -0.0025 -6.21141e-17 0.01 -0.00532936 -0.0377763 0.01 -0.00320833 -0.018941 0.01 -0.0025 -6.21141e-17 0 -0.00532936 -0.0377763 0 -0.00320833 -0.018941 0 -0.0025 -6.21141e-17 0 -0.0025 -6.21141e-17 0.01 -0.00885125 0.0564005 0.01 -0.00320833 0.018941 0.01 -0.00532936 0.0377763 0.01 -0.00885125 0.0564005 0 -0.00320833 0.018941 0 -0.00532936 0.0377763 0 -0.00885125 0.0564005 0 -0.00397647 0.0575125 0 -0.00397647 0.0575125 0.01 -0.00885125 0.0564005 0.01 0.0025 -6.33387e-17 0 0.0025 -6.33387e-17 0.01 -0.00397647 0.0575125 0.01 0.0017777 0.0193145 0.01 -0.000385146 0.0385211 0.01 -0.00397647 0.0575125 0 0.0017777 0.0193145 0 -0.000385146 0.0385211 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00893139 -0.0571122 0 -0.00405661 -0.0582242 0 -0.00405661 -0.0582242 0.01 -0.00893139 -0.0571122 0.01 -0.00893139 -0.0571122 0 -0.00405661 -0.0582242 0 -0.0025 -6.28979e-17 0 -0.00536506 -0.0382529 0 -0.00321727 -0.01918 0 -0.00893139 0.0571122 0 -0.00321727 0.01918 0 -0.00536506 0.0382529 0 -0.00405661 0.0582242 0 0.0025 -6.41225e-17 0 0.00176877 0.0195535 0 -0.000420848 0.0389977 0 -0.000420848 -0.0389977 0 0.00176877 -0.0195535 0 -0.00405661 -0.0582242 0 -0.00405661 -0.0582242 0.01 0.0025 -6.41225e-17 0.01 -0.000420848 -0.0389977 0.01 0.00176877 -0.0195535 0.01 0.0025 -6.41225e-17 0 -0.000420848 -0.0389977 0 0.00176877 -0.0195535 0 -0.00893139 -0.0571122 0.01 -0.00405661 -0.0582242 0.01 -0.0025 -6.28979e-17 0.01 -0.00536506 -0.0382529 0.01 -0.00321727 -0.01918 0.01 -0.00893139 0.0571122 0.01 -0.00321727 0.01918 0.01 -0.00536506 0.0382529 0.01 -0.00405661 0.0582242 0.01 0.0025 -6.41225e-17 0.01 0.00176877 0.0195535 0.01 -0.000420848 0.0389977 0.01 -0.000420848 -0.0389977 0.01 0.00176877 -0.0195535 0.01 -0.00893139 -0.0571122 0 -0.00893139 -0.0571122 0.01 -0.0025 -6.28979e-17 0.01 -0.00536506 -0.0382529 0.01 -0.00321727 -0.01918 0.01 -0.0025 -6.28979e-17 0 -0.00536506 -0.0382529 0 -0.00321727 -0.01918 0 -0.0025 -6.28979e-17 0 -0.0025 -6.28979e-17 0.01 -0.00893139 0.0571122 0.01 -0.00321727 0.01918 0.01 -0.00536506 0.0382529 0.01 -0.00893139 0.0571122 0 -0.00321727 0.01918 0 -0.00536506 0.0382529 0 -0.00893139 0.0571122 0 -0.00405661 0.0582242 0 -0.00405661 0.0582242 0.01 -0.00893139 0.0571122 0.01 0.0025 -6.41225e-17 0 0.0025 -6.41225e-17 0.01 -0.00405661 0.0582242 0.01 0.00176877 0.0195535 0.01 -0.000420848 0.0389977 0.01 -0.00405661 0.0582242 0 0.00176877 0.0195535 0 -0.000420848 0.0389977 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00909418 -0.0585578 0 -0.0042194 -0.0596698 0 -0.0042194 -0.0596698 0.01 -0.00909418 -0.0585578 0.01 -0.00909418 -0.0585578 0 -0.0042194 -0.0596698 0 -0.0025 -6.44899e-17 0 -0.00543758 -0.0392212 0 -0.00323542 -0.0196655 0 -0.00909418 0.0585578 0 -0.00323542 0.0196655 0 -0.00543758 0.0392212 0 -0.0042194 0.0596698 0 0.0025 -6.57145e-17 0 0.00175061 0.020039 0 -0.000493367 0.039966 0 -0.000493367 -0.039966 0 0.00175061 -0.020039 0 -0.0042194 -0.0596698 0 -0.0042194 -0.0596698 0.01 0.0025 -6.57145e-17 0.01 -0.000493367 -0.039966 0.01 0.00175061 -0.020039 0.01 0.0025 -6.57145e-17 0 -0.000493367 -0.039966 0 0.00175061 -0.020039 0 -0.00909418 -0.0585578 0.01 -0.0042194 -0.0596698 0.01 -0.0025 -6.44899e-17 0.01 -0.00543758 -0.0392212 0.01 -0.00323542 -0.0196655 0.01 -0.00909418 0.0585578 0.01 -0.00323542 0.0196655 0.01 -0.00543758 0.0392212 0.01 -0.0042194 0.0596698 0.01 0.0025 -6.57145e-17 0.01 0.00175061 0.020039 0.01 -0.000493367 0.039966 0.01 -0.000493367 -0.039966 0.01 0.00175061 -0.020039 0.01 -0.00909418 -0.0585578 0 -0.00909418 -0.0585578 0.01 -0.0025 -6.44899e-17 0.01 -0.00543758 -0.0392212 0.01 -0.00323542 -0.0196655 0.01 -0.0025 -6.44899e-17 0 -0.00543758 -0.0392212 0 -0.00323542 -0.0196655 0 -0.0025 -6.44899e-17 0 -0.0025 -6.44899e-17 0.01 -0.00909418 0.0585578 0.01 -0.00323542 0.0196655 0.01 -0.00543758 0.0392212 0.01 -0.00909418 0.0585578 0 -0.00323542 0.0196655 0 -0.00543758 0.0392212 0 -0.00909418 0.0585578 0 -0.0042194 0.0596698 0 -0.0042194 0.0596698 0.01 -0.00909418 0.0585578 0.01 0.0025 -6.57145e-17 0 0.0025 -6.57145e-17 0.01 -0.0042194 0.0596698 0.01 0.00175061 0.020039 0.01 -0.000493367 0.039966 0.01 -0.0042194 0.0596698 0 0.00175061 0.020039 0 -0.000493367 0.039966 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00917432 -0.0592694 0 -0.00429954 -0.0603814 0 -0.00429954 -0.0603814 0.01 -0.00917432 -0.0592694 0.01 -0.00917432 -0.0592694 0 -0.00429954 -0.0603814 0 -0.0025 -6.52737e-17 0 -0.00547328 -0.0396979 0 -0.00324436 -0.0199045 0 -0.00917432 0.0592694 0 -0.00324436 0.0199045 0 -0.00547328 0.0396979 0 -0.00429954 0.0603814 0 0.0025 -6.64983e-17 0 0.00174167 0.020278 0 -0.000529069 0.0404427 0 -0.000529069 -0.0404427 0 0.00174167 -0.020278 0 -0.00429954 -0.0603814 0 -0.00429954 -0.0603814 0.01 0.0025 -6.64983e-17 0.01 -0.000529069 -0.0404427 0.01 0.00174167 -0.020278 0.01 0.0025 -6.64983e-17 0 -0.000529069 -0.0404427 0 0.00174167 -0.020278 0 -0.00917432 -0.0592694 0.01 -0.00429954 -0.0603814 0.01 -0.0025 -6.52737e-17 0.01 -0.00547328 -0.0396979 0.01 -0.00324436 -0.0199045 0.01 -0.00917432 0.0592694 0.01 -0.00324436 0.0199045 0.01 -0.00547328 0.0396979 0.01 -0.00429954 0.0603814 0.01 0.0025 -6.64983e-17 0.01 0.00174167 0.020278 0.01 -0.000529069 0.0404427 0.01 -0.000529069 -0.0404427 0.01 0.00174167 -0.020278 0.01 -0.00917432 -0.0592694 0 -0.00917432 -0.0592694 0.01 -0.0025 -6.52737e-17 0.01 -0.00547328 -0.0396979 0.01 -0.00324436 -0.0199045 0.01 -0.0025 -6.52737e-17 0 -0.00547328 -0.0396979 0 -0.00324436 -0.0199045 0 -0.0025 -6.52737e-17 0 -0.0025 -6.52737e-17 0.01 -0.00917432 0.0592694 0.01 -0.00324436 0.0199045 0.01 -0.00547328 0.0396979 0.01 -0.00917432 0.0592694 0 -0.00324436 0.0199045 0 -0.00547328 0.0396979 0 -0.00917432 0.0592694 0 -0.00429954 0.0603814 0 -0.00429954 0.0603814 0.01 -0.00917432 0.0592694 0.01 0.0025 -6.64983e-17 0 0.0025 -6.64983e-17 0.01 -0.00429954 0.0603814 0.01 0.00174167 0.020278 0.01 -0.000529069 0.0404427 0.01 -0.00429954 0.0603814 0 0.00174167 0.020278 0 -0.000529069 0.0404427 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00713821 -0.0411884 0 -0.00226344 -0.0423004 0 -0.00226344 -0.0423004 0.01 -0.00713821 -0.0411884 0.01 -0.00713821 -0.0411884 0 -0.00226344 -0.0423004 0 -0.0025 -4.53609e-17 0 -0.00456624 -0.0275874 0 -0.00301728 -0.0138323 0 -0.00713821 0.0411884 0 -0.00301728 0.0138323 0 -0.00456624 0.0275874 0 -0.00226344 0.0423004 0 0.0025 -4.65856e-17 0 0.00196875 0.0142058 0 0.000377979 0.0283322 0 0.000377979 -0.0283322 0 0.00196875 -0.0142058 0 -0.00226344 -0.0423004 0 -0.00226344 -0.0423004 0.01 0.0025 -4.65856e-17 0.01 0.000377979 -0.0283322 0.01 0.00196875 -0.0142058 0.01 0.0025 -4.65856e-17 0 0.000377979 -0.0283322 0 0.00196875 -0.0142058 0 -0.00713821 -0.0411884 0.01 -0.00226344 -0.0423004 0.01 -0.0025 -4.53609e-17 0.01 -0.00456624 -0.0275874 0.01 -0.00301728 -0.0138323 0.01 -0.00713821 0.0411884 0.01 -0.00301728 0.0138323 0.01 -0.00456624 0.0275874 0.01 -0.00226344 0.0423004 0.01 0.0025 -4.65856e-17 0.01 0.00196875 0.0142058 0.01 0.000377979 0.0283322 0.01 0.000377979 -0.0283322 0.01 0.00196875 -0.0142058 0.01 -0.00713821 -0.0411884 0 -0.00713821 -0.0411884 0.01 -0.0025 -4.53609e-17 0.01 -0.00456624 -0.0275874 0.01 -0.00301728 -0.0138323 0.01 -0.0025 -4.53609e-17 0 -0.00456624 -0.0275874 0 -0.00301728 -0.0138323 0 -0.0025 -4.53609e-17 0 -0.0025 -4.53609e-17 0.01 -0.00713821 0.0411884 0.01 -0.00301728 0.0138323 0.01 -0.00456624 0.0275874 0.01 -0.00713821 0.0411884 0 -0.00301728 0.0138323 0 -0.00456624 0.0275874 0 -0.00713821 0.0411884 0 -0.00226344 0.0423004 0 -0.00226344 0.0423004 0.01 -0.00713821 0.0411884 0.01 0.0025 -4.65856e-17 0 0.0025 -4.65856e-17 0.01 -0.00226344 0.0423004 0.01 0.00196875 0.0142058 0.01 0.000377979 0.0283322 0.01 -0.00226344 0.0423004 0 0.00196875 0.0142058 0 0.000377979 0.0283322 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00721836 -0.0419 0 -0.00234358 -0.043012 0 -0.00234358 -0.043012 0.01 -0.00721836 -0.0419 0.01 -0.00721836 -0.0419 0 -0.00234358 -0.043012 0 -0.0025 -4.61447e-17 0 -0.00460194 -0.0280641 0 -0.00302622 -0.0140713 0 -0.00721836 0.0419 0 -0.00302622 0.0140713 0 -0.00460194 0.0280641 0 -0.00234358 0.043012 0 0.0025 -4.73693e-17 0 0.00195981 0.0144448 0 0.000342277 0.0288089 0 0.000342277 -0.0288089 0 0.00195981 -0.0144448 0 -0.00234358 -0.043012 0 -0.00234358 -0.043012 0.01 0.0025 -4.73693e-17 0.01 0.000342277 -0.0288089 0.01 0.00195981 -0.0144448 0.01 0.0025 -4.73693e-17 0 0.000342277 -0.0288089 0 0.00195981 -0.0144448 0 -0.00721836 -0.0419 0.01 -0.00234358 -0.043012 0.01 -0.0025 -4.61447e-17 0.01 -0.00460194 -0.0280641 0.01 -0.00302622 -0.0140713 0.01 -0.00721836 0.0419 0.01 -0.00302622 0.0140713 0.01 -0.00460194 0.0280641 0.01 -0.00234358 0.043012 0.01 0.0025 -4.73693e-17 0.01 0.00195981 0.0144448 0.01 0.000342277 0.0288089 0.01 0.000342277 -0.0288089 0.01 0.00195981 -0.0144448 0.01 -0.00721836 -0.0419 0 -0.00721836 -0.0419 0.01 -0.0025 -4.61447e-17 0.01 -0.00460194 -0.0280641 0.01 -0.00302622 -0.0140713 0.01 -0.0025 -4.61447e-17 0 -0.00460194 -0.0280641 0 -0.00302622 -0.0140713 0 -0.0025 -4.61447e-17 0 -0.0025 -4.61447e-17 0.01 -0.00721836 0.0419 0.01 -0.00302622 0.0140713 0.01 -0.00460194 0.0280641 0.01 -0.00721836 0.0419 0 -0.00302622 0.0140713 0 -0.00460194 0.0280641 0 -0.00721836 0.0419 0 -0.00234358 0.043012 0 -0.00234358 0.043012 0.01 -0.00721836 0.0419 0.01 0.0025 -4.73693e-17 0 0.0025 -4.73693e-17 0.01 -0.00234358 0.043012 0.01 0.00195981 0.0144448 0.01 0.000342277 0.0288089 0.01 -0.00234358 0.043012 0 0.00195981 0.0144448 0 0.000342277 0.0288089 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00738365 -0.0433679 0 -0.00250887 -0.0444799 0 -0.00250887 -0.0444799 0.01 -0.00738365 -0.0433679 0.01 -0.00738365 -0.0433679 0 -0.00250887 -0.0444799 0 -0.0025 -4.77612e-17 0 -0.00467557 -0.0290472 0 -0.00304465 -0.0145643 0 -0.00738365 0.0433679 0 -0.00304465 0.0145643 0 -0.00467557 0.0290472 0 -0.00250887 0.0444799 0 0.0025 -4.89859e-17 0 0.00194138 0.0149377 0 0.000268642 0.029792 0 0.000268642 -0.029792 0 0.00194138 -0.0149377 0 -0.00250887 -0.0444799 0 -0.00250887 -0.0444799 0.01 0.0025 -4.89859e-17 0.01 0.000268642 -0.029792 0.01 0.00194138 -0.0149377 0.01 0.0025 -4.89859e-17 0 0.000268642 -0.029792 0 0.00194138 -0.0149377 0 -0.00738365 -0.0433679 0.01 -0.00250887 -0.0444799 0.01 -0.0025 -4.77612e-17 0.01 -0.00467557 -0.0290472 0.01 -0.00304465 -0.0145643 0.01 -0.00738365 0.0433679 0.01 -0.00304465 0.0145643 0.01 -0.00467557 0.0290472 0.01 -0.00250887 0.0444799 0.01 0.0025 -4.89859e-17 0.01 0.00194138 0.0149377 0.01 0.000268642 0.029792 0.01 0.000268642 -0.029792 0.01 0.00194138 -0.0149377 0.01 -0.00738365 -0.0433679 0 -0.00738365 -0.0433679 0.01 -0.0025 -4.77612e-17 0.01 -0.00467557 -0.0290472 0.01 -0.00304465 -0.0145643 0.01 -0.0025 -4.77612e-17 0 -0.00467557 -0.0290472 0 -0.00304465 -0.0145643 0 -0.0025 -4.77612e-17 0 -0.0025 -4.77612e-17 0.01 -0.00738365 0.0433679 0.01 -0.00304465 0.0145643 0.01 -0.00467557 0.0290472 0.01 -0.00738365 0.0433679 0 -0.00304465 0.0145643 0 -0.00467557 0.0290472 0 -0.00738365 0.0433679 0 -0.00250887 0.0444799 0 -0.00250887 0.0444799 0.01 -0.00738365 0.0433679 0.01 0.0025 -4.89859e-17 0 0.0025 -4.89859e-17 0.01 -0.00250887 0.0444799 0.01 0.00194138 0.0149377 0.01 0.000268642 0.029792 0.01 -0.00250887 0.0444799 0 0.00194138 0.0149377 0 0.000268642 0.029792 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00746379 -0.0440796 0 -0.00258901 -0.0451916 0 -0.00258901 -0.0451916 0.01 -0.00746379 -0.0440796 0.01 -0.00746379 -0.0440796 0 -0.00258901 -0.0451916 0 -0.0025 -4.8545e-17 0 -0.00471128 -0.0295239 0 -0.00305359 -0.0148033 0 -0.00746379 0.0440796 0 -0.00305359 0.0148033 0 -0.00471128 0.0295239 0 -0.00258901 0.0451916 0 0.0025 -4.97696e-17 0 0.00193244 0.0151767 0 0.00023294 0.0302687 0 0.00023294 -0.0302687 0 0.00193244 -0.0151767 0 -0.00258901 -0.0451916 0 -0.00258901 -0.0451916 0.01 0.0025 -4.97696e-17 0.01 0.00023294 -0.0302687 0.01 0.00193244 -0.0151767 0.01 0.0025 -4.97696e-17 0 0.00023294 -0.0302687 0 0.00193244 -0.0151767 0 -0.00746379 -0.0440796 0.01 -0.00258901 -0.0451916 0.01 -0.0025 -4.8545e-17 0.01 -0.00471128 -0.0295239 0.01 -0.00305359 -0.0148033 0.01 -0.00746379 0.0440796 0.01 -0.00305359 0.0148033 0.01 -0.00471128 0.0295239 0.01 -0.00258901 0.0451916 0.01 0.0025 -4.97696e-17 0.01 0.00193244 0.0151767 0.01 0.00023294 0.0302687 0.01 0.00023294 -0.0302687 0.01 0.00193244 -0.0151767 0.01 -0.00746379 -0.0440796 0 -0.00746379 -0.0440796 0.01 -0.0025 -4.8545e-17 0.01 -0.00471128 -0.0295239 0.01 -0.00305359 -0.0148033 0.01 -0.0025 -4.8545e-17 0 -0.00471128 -0.0295239 0 -0.00305359 -0.0148033 0 -0.0025 -4.8545e-17 0 -0.0025 -4.8545e-17 0.01 -0.00746379 0.0440796 0.01 -0.00305359 0.0148033 0.01 -0.00471128 0.0295239 0.01 -0.00746379 0.0440796 0 -0.00305359 0.0148033 0 -0.00471128 0.0295239 0 -0.00746379 0.0440796 0 -0.00258901 0.0451916 0 -0.00258901 0.0451916 0.01 -0.00746379 0.0440796 0.01 0.0025 -4.97696e-17 0 0.0025 -4.97696e-17 0.01 -0.00258901 0.0451916 0.01 0.00193244 0.0151767 0.01 0.00023294 0.0302687 0.01 -0.00258901 0.0451916 0 0.00193244 0.0151767 0 0.00023294 0.0302687 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00762658 -0.0455252 0 -0.0027518 -0.0466372 0 -0.0027518 -0.0466372 0.01 -0.00762658 -0.0455252 0.01 -0.00762658 -0.0455252 0 -0.0027518 -0.0466372 0 -0.0025 -5.0137e-17 0 -0.00478379 -0.0304921 0 -0.00307175 -0.0152888 0 -0.00762658 0.0455252 0 -0.00307175 0.0152888 0 -0.00478379 0.0304921 0 -0.0027518 0.0466372 0 0.0025 -5.13617e-17 0 0.00191429 0.0156622 0 0.000160421 0.0312369 0 0.000160421 -0.0312369 0 0.00191429 -0.0156622 0 -0.0027518 -0.0466372 0 -0.0027518 -0.0466372 0.01 0.0025 -5.13617e-17 0.01 0.000160421 -0.0312369 0.01 0.00191429 -0.0156622 0.01 0.0025 -5.13617e-17 0 0.000160421 -0.0312369 0 0.00191429 -0.0156622 0 -0.00762658 -0.0455252 0.01 -0.0027518 -0.0466372 0.01 -0.0025 -5.0137e-17 0.01 -0.00478379 -0.0304921 0.01 -0.00307175 -0.0152888 0.01 -0.00762658 0.0455252 0.01 -0.00307175 0.0152888 0.01 -0.00478379 0.0304921 0.01 -0.0027518 0.0466372 0.01 0.0025 -5.13617e-17 0.01 0.00191429 0.0156622 0.01 0.000160421 0.0312369 0.01 0.000160421 -0.0312369 0.01 0.00191429 -0.0156622 0.01 -0.00762658 -0.0455252 0 -0.00762658 -0.0455252 0.01 -0.0025 -5.0137e-17 0.01 -0.00478379 -0.0304921 0.01 -0.00307175 -0.0152888 0.01 -0.0025 -5.0137e-17 0 -0.00478379 -0.0304921 0 -0.00307175 -0.0152888 0 -0.0025 -5.0137e-17 0 -0.0025 -5.0137e-17 0.01 -0.00762658 0.0455252 0.01 -0.00307175 0.0152888 0.01 -0.00478379 0.0304921 0.01 -0.00762658 0.0455252 0 -0.00307175 0.0152888 0 -0.00478379 0.0304921 0 -0.00762658 0.0455252 0 -0.0027518 0.0466372 0 -0.0027518 0.0466372 0.01 -0.00762658 0.0455252 0.01 0.0025 -5.13617e-17 0 0.0025 -5.13617e-17 0.01 -0.0027518 0.0466372 0.01 0.00191429 0.0156622 0.01 0.000160421 0.0312369 0.01 -0.0027518 0.0466372 0 0.00191429 0.0156622 0 0.000160421 0.0312369 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00770923 -0.0462591 0 -0.00283445 -0.0473711 0 -0.00283445 -0.0473711 0.01 -0.00770923 -0.0462591 0.01 -0.00770923 -0.0462591 0 -0.00283445 -0.0473711 0 -0.0025 -5.09453e-17 0 -0.00482061 -0.0309837 0 -0.00308096 -0.0155352 0 -0.00770923 0.0462591 0 -0.00308096 0.0155352 0 -0.00482061 0.0309837 0 -0.00283445 0.0473711 0 0.0025 -5.217e-17 0 0.00190507 0.0159087 0 0.000123604 0.0317285 0 0.000123604 -0.0317285 0 0.00190507 -0.0159087 0 -0.00283445 -0.0473711 0 -0.00283445 -0.0473711 0.01 0.0025 -5.217e-17 0.01 0.000123604 -0.0317285 0.01 0.00190507 -0.0159087 0.01 0.0025 -5.217e-17 0 0.000123604 -0.0317285 0 0.00190507 -0.0159087 0 -0.00770923 -0.0462591 0.01 -0.00283445 -0.0473711 0.01 -0.0025 -5.09453e-17 0.01 -0.00482061 -0.0309837 0.01 -0.00308096 -0.0155352 0.01 -0.00770923 0.0462591 0.01 -0.00308096 0.0155352 0.01 -0.00482061 0.0309837 0.01 -0.00283445 0.0473711 0.01 0.0025 -5.217e-17 0.01 0.00190507 0.0159087 0.01 0.000123604 0.0317285 0.01 0.000123604 -0.0317285 0.01 0.00190507 -0.0159087 0.01 -0.00770923 -0.0462591 0 -0.00770923 -0.0462591 0.01 -0.0025 -5.09453e-17 0.01 -0.00482061 -0.0309837 0.01 -0.00308096 -0.0155352 0.01 -0.0025 -5.09453e-17 0 -0.00482061 -0.0309837 0 -0.00308096 -0.0155352 0 -0.0025 -5.09453e-17 0 -0.0025 -5.09453e-17 0.01 -0.00770923 0.0462591 0.01 -0.00308096 0.0155352 0.01 -0.00482061 0.0309837 0.01 -0.00770923 0.0462591 0 -0.00308096 0.0155352 0 -0.00482061 0.0309837 0 -0.00770923 0.0462591 0 -0.00283445 0.0473711 0 -0.00283445 0.0473711 0.01 -0.00770923 0.0462591 0.01 0.0025 -5.217e-17 0 0.0025 -5.217e-17 0.01 -0.00283445 0.0473711 0.01 0.00190507 0.0159087 0.01 0.000123604 0.0317285 0.01 -0.00283445 0.0473711 0 0.00190507 0.0159087 0 0.000123604 0.0317285 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00787201 -0.0477047 0 -0.00299724 -0.0488167 0 -0.00299724 -0.0488167 0.01 -0.00787201 -0.0477047 0.01 -0.00787201 -0.0477047 0 -0.00299724 -0.0488167 0 -0.0025 -5.25373e-17 0 -0.00489313 -0.0319519 0 -0.00309912 -0.0160207 0 -0.00787201 0.0477047 0 -0.00309912 0.0160207 0 -0.00489313 0.0319519 0 -0.00299724 0.0488167 0 0.0025 -5.3762e-17 0 0.00188691 0.0163942 0 5.10846e-05 0.0326967 0 5.10846e-05 -0.0326967 0 0.00188691 -0.0163942 0 -0.00299724 -0.0488167 0 -0.00299724 -0.0488167 0.01 0.0025 -5.3762e-17 0.01 5.10846e-05 -0.0326967 0.01 0.00188691 -0.0163942 0.01 0.0025 -5.3762e-17 0 5.10846e-05 -0.0326967 0 0.00188691 -0.0163942 0 -0.00787201 -0.0477047 0.01 -0.00299724 -0.0488167 0.01 -0.0025 -5.25373e-17 0.01 -0.00489313 -0.0319519 0.01 -0.00309912 -0.0160207 0.01 -0.00787201 0.0477047 0.01 -0.00309912 0.0160207 0.01 -0.00489313 0.0319519 0.01 -0.00299724 0.0488167 0.01 0.0025 -5.3762e-17 0.01 0.00188691 0.0163942 0.01 5.10846e-05 0.0326967 0.01 5.10846e-05 -0.0326967 0.01 0.00188691 -0.0163942 0.01 -0.00787201 -0.0477047 0 -0.00787201 -0.0477047 0.01 -0.0025 -5.25373e-17 0.01 -0.00489313 -0.0319519 0.01 -0.00309912 -0.0160207 0.01 -0.0025 -5.25373e-17 0 -0.00489313 -0.0319519 0 -0.00309912 -0.0160207 0 -0.0025 -5.25373e-17 0 -0.0025 -5.25373e-17 0.01 -0.00787201 0.0477047 0.01 -0.00309912 0.0160207 0.01 -0.00489313 0.0319519 0.01 -0.00787201 0.0477047 0 -0.00309912 0.0160207 0 -0.00489313 0.0319519 0 -0.00787201 0.0477047 0 -0.00299724 0.0488167 0 -0.00299724 0.0488167 0.01 -0.00787201 0.0477047 0.01 0.0025 -5.3762e-17 0 0.0025 -5.3762e-17 0.01 -0.00299724 0.0488167 0.01 0.00188691 0.0163942 0.01 5.10846e-05 0.0326967 0.01 -0.00299724 0.0488167 0 0.00188691 0.0163942 0 5.10846e-05 0.0326967 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00795216 -0.0484163 0 -0.00307738 -0.0495283 0 -0.00307738 -0.0495283 0.01 -0.00795216 -0.0484163 0.01 -0.00795216 -0.0484163 0 -0.00307738 -0.0495283 0 -0.0025 -5.33211e-17 0 -0.00492883 -0.0324286 0 -0.00310806 -0.0162597 0 -0.00795216 0.0484163 0 -0.00310806 0.0162597 0 -0.00492883 0.0324286 0 -0.00307738 0.0495283 0 0.0025 -5.45458e-17 0 0.00187798 0.0166332 0 1.53828e-05 0.0331734 0 1.53828e-05 -0.0331734 0 0.00187798 -0.0166332 0 -0.00307738 -0.0495283 0 -0.00307738 -0.0495283 0.01 0.0025 -5.45458e-17 0.01 1.53828e-05 -0.0331734 0.01 0.00187798 -0.0166332 0.01 0.0025 -5.45458e-17 0 1.53828e-05 -0.0331734 0 0.00187798 -0.0166332 0 -0.00795216 -0.0484163 0.01 -0.00307738 -0.0495283 0.01 -0.0025 -5.33211e-17 0.01 -0.00492883 -0.0324286 0.01 -0.00310806 -0.0162597 0.01 -0.00795216 0.0484163 0.01 -0.00310806 0.0162597 0.01 -0.00492883 0.0324286 0.01 -0.00307738 0.0495283 0.01 0.0025 -5.45458e-17 0.01 0.00187798 0.0166332 0.01 1.53828e-05 0.0331734 0.01 1.53828e-05 -0.0331734 0.01 0.00187798 -0.0166332 0.01 -0.00795216 -0.0484163 0 -0.00795216 -0.0484163 0.01 -0.0025 -5.33211e-17 0.01 -0.00492883 -0.0324286 0.01 -0.00310806 -0.0162597 0.01 -0.0025 -5.33211e-17 0 -0.00492883 -0.0324286 0 -0.00310806 -0.0162597 0 -0.0025 -5.33211e-17 0 -0.0025 -5.33211e-17 0.01 -0.00795216 0.0484163 0.01 -0.00310806 0.0162597 0.01 -0.00492883 0.0324286 0.01 -0.00795216 0.0484163 0 -0.00310806 0.0162597 0 -0.00492883 0.0324286 0 -0.00795216 0.0484163 0 -0.00307738 0.0495283 0 -0.00307738 0.0495283 0.01 -0.00795216 0.0484163 0.01 0.0025 -5.45458e-17 0 0.0025 -5.45458e-17 0.01 -0.00307738 0.0495283 0.01 0.00187798 0.0166332 0.01 1.53828e-05 0.0331734 0.01 -0.00307738 0.0495283 0 0.00187798 0.0166332 0 1.53828e-05 0.0331734 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0103489 -0.0697 0 -0.00547412 -0.070812 0 -0.00547412 -0.070812 0.01 -0.0103489 -0.0697 0.01 -0.0103489 -0.0697 0 -0.00547412 -0.070812 0 -0.0025 -7.67609e-17 0 -0.00599654 -0.0466841 0 -0.00337536 -0.0234074 0 -0.0103489 0.0697 0 -0.00337536 0.0234074 0 -0.00599654 0.0466841 0 -0.00547412 0.070812 0 0.0025 -7.79855e-17 0 0.00161068 0.0237809 0 -0.00105232 0.0474289 0 -0.00105232 -0.0474289 0 0.00161068 -0.0237809 0 -0.00547412 -0.070812 0 -0.00547412 -0.070812 0.01 0.0025 -7.79855e-17 0.01 -0.00105232 -0.0474289 0.01 0.00161068 -0.0237809 0.01 0.0025 -7.79855e-17 0 -0.00105232 -0.0474289 0 0.00161068 -0.0237809 0 -0.0103489 -0.0697 0.01 -0.00547412 -0.070812 0.01 -0.0025 -7.67609e-17 0.01 -0.00599654 -0.0466841 0.01 -0.00337536 -0.0234074 0.01 -0.0103489 0.0697 0.01 -0.00337536 0.0234074 0.01 -0.00599654 0.0466841 0.01 -0.00547412 0.070812 0.01 0.0025 -7.79855e-17 0.01 0.00161068 0.0237809 0.01 -0.00105232 0.0474289 0.01 -0.00105232 -0.0474289 0.01 0.00161068 -0.0237809 0.01 -0.0103489 -0.0697 0 -0.0103489 -0.0697 0.01 -0.0025 -7.67609e-17 0.01 -0.00599654 -0.0466841 0.01 -0.00337536 -0.0234074 0.01 -0.0025 -7.67609e-17 0 -0.00599654 -0.0466841 0 -0.00337536 -0.0234074 0 -0.0025 -7.67609e-17 0 -0.0025 -7.67609e-17 0.01 -0.0103489 0.0697 0.01 -0.00337536 0.0234074 0.01 -0.00599654 0.0466841 0.01 -0.0103489 0.0697 0 -0.00337536 0.0234074 0 -0.00599654 0.0466841 0 -0.0103489 0.0697 0 -0.00547412 0.070812 0 -0.00547412 0.070812 0.01 -0.0103489 0.0697 0.01 0.0025 -7.79855e-17 0 0.0025 -7.79855e-17 0.01 -0.00547412 0.070812 0.01 0.00161068 0.0237809 0.01 -0.00105232 0.0474289 0.01 -0.00547412 0.070812 0 0.00161068 0.0237809 0 -0.00105232 0.0474289 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0104065 -0.0702115 0 -0.00553172 -0.0713235 0 -0.00553172 -0.0713235 0.01 -0.0104065 -0.0702115 0.01 -0.0104065 -0.0702115 0 -0.00553172 -0.0713235 0 -0.0025 -7.73242e-17 0 -0.0060222 -0.0470267 0 -0.00338178 -0.0235792 0 -0.0104065 0.0702115 0 -0.00338178 0.0235792 0 -0.0060222 0.0470267 0 -0.00553172 0.0713235 0 0.0025 -7.85488e-17 0 0.00160425 0.0239527 0 -0.00107798 0.0477715 0 -0.00107798 -0.0477715 0 0.00160425 -0.0239527 0 -0.00553172 -0.0713235 0 -0.00553172 -0.0713235 0.01 0.0025 -7.85488e-17 0.01 -0.00107798 -0.0477715 0.01 0.00160425 -0.0239527 0.01 0.0025 -7.85488e-17 0 -0.00107798 -0.0477715 0 0.00160425 -0.0239527 0 -0.0104065 -0.0702115 0.01 -0.00553172 -0.0713235 0.01 -0.0025 -7.73242e-17 0.01 -0.0060222 -0.0470267 0.01 -0.00338178 -0.0235792 0.01 -0.0104065 0.0702115 0.01 -0.00338178 0.0235792 0.01 -0.0060222 0.0470267 0.01 -0.00553172 0.0713235 0.01 0.0025 -7.85488e-17 0.01 0.00160425 0.0239527 0.01 -0.00107798 0.0477715 0.01 -0.00107798 -0.0477715 0.01 0.00160425 -0.0239527 0.01 -0.0104065 -0.0702115 0 -0.0104065 -0.0702115 0.01 -0.0025 -7.73242e-17 0.01 -0.0060222 -0.0470267 0.01 -0.00338178 -0.0235792 0.01 -0.0025 -7.73242e-17 0 -0.0060222 -0.0470267 0 -0.00338178 -0.0235792 0 -0.0025 -7.73242e-17 0 -0.0025 -7.73242e-17 0.01 -0.0104065 0.0702115 0.01 -0.00338178 0.0235792 0.01 -0.0060222 0.0470267 0.01 -0.0104065 0.0702115 0 -0.00338178 0.0235792 0 -0.0060222 0.0470267 0 -0.0104065 0.0702115 0 -0.00553172 0.0713235 0 -0.00553172 0.0713235 0.01 -0.0104065 0.0702115 0.01 0.0025 -7.85488e-17 0 0.0025 -7.85488e-17 0.01 -0.00553172 0.0713235 0.01 0.00160425 0.0239527 0.01 -0.00107798 0.0477715 0.01 -0.00553172 0.0713235 0 0.00160425 0.0239527 0 -0.00107798 0.0477715 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.011536 -0.0802417 0 -0.00666122 -0.0813537 0 -0.00666122 -0.0813537 0.01 -0.011536 -0.0802417 0.01 -0.011536 -0.0802417 0 -0.00666122 -0.0813537 0 -0.0025 -8.83705e-17 0 -0.00652537 -0.0537448 0 -0.00350775 -0.0269477 0 -0.011536 0.0802417 0 -0.00350775 0.0269477 0 -0.00652537 0.0537448 0 -0.00666122 0.0813537 0 0.0025 -8.95952e-17 0 0.00147828 0.0273211 0 -0.00158115 0.0544896 0 -0.00158115 -0.0544896 0 0.00147828 -0.0273211 0 -0.00666122 -0.0813537 0 -0.00666122 -0.0813537 0.01 0.0025 -8.95952e-17 0.01 -0.00158115 -0.0544896 0.01 0.00147828 -0.0273211 0.01 0.0025 -8.95952e-17 0 -0.00158115 -0.0544896 0 0.00147828 -0.0273211 0 -0.011536 -0.0802417 0.01 -0.00666122 -0.0813537 0.01 -0.0025 -8.83705e-17 0.01 -0.00652537 -0.0537448 0.01 -0.00350775 -0.0269477 0.01 -0.011536 0.0802417 0.01 -0.00350775 0.0269477 0.01 -0.00652537 0.0537448 0.01 -0.00666122 0.0813537 0.01 0.0025 -8.95952e-17 0.01 0.00147828 0.0273211 0.01 -0.00158115 0.0544896 0.01 -0.00158115 -0.0544896 0.01 0.00147828 -0.0273211 0.01 -0.011536 -0.0802417 0 -0.011536 -0.0802417 0.01 -0.0025 -8.83705e-17 0.01 -0.00652537 -0.0537448 0.01 -0.00350775 -0.0269477 0.01 -0.0025 -8.83705e-17 0 -0.00652537 -0.0537448 0 -0.00350775 -0.0269477 0 -0.0025 -8.83705e-17 0 -0.0025 -8.83705e-17 0.01 -0.011536 0.0802417 0.01 -0.00350775 0.0269477 0.01 -0.00652537 0.0537448 0.01 -0.011536 0.0802417 0 -0.00350775 0.0269477 0 -0.00652537 0.0537448 0 -0.011536 0.0802417 0 -0.00666122 0.0813537 0 -0.00666122 0.0813537 0.01 -0.011536 0.0802417 0.01 0.0025 -8.95952e-17 0 0.0025 -8.95952e-17 0.01 -0.00666122 0.0813537 0.01 0.00147828 0.0273211 0.01 -0.00158115 0.0544896 0.01 -0.00666122 0.0813537 0 0.00147828 0.0273211 0 -0.00158115 0.0544896 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0115936 -0.0807532 0 -0.00671883 -0.0818652 0 -0.00671883 -0.0818652 0.01 -0.0115936 -0.0807532 0.01 -0.0115936 -0.0807532 0 -0.00671883 -0.0818652 0 -0.0025 -8.89339e-17 0 -0.00655103 -0.0540874 0 -0.00351417 -0.0271195 0 -0.0115936 0.0807532 0 -0.00351417 0.0271195 0 -0.00655103 0.0540874 0 -0.00671883 0.0818652 0 0.0025 -9.01585e-17 0 0.00147186 0.0274929 0 -0.00160681 0.0548322 0 -0.00160681 -0.0548322 0 0.00147186 -0.0274929 0 -0.00671883 -0.0818652 0 -0.00671883 -0.0818652 0.01 0.0025 -9.01585e-17 0.01 -0.00160681 -0.0548322 0.01 0.00147186 -0.0274929 0.01 0.0025 -9.01585e-17 0 -0.00160681 -0.0548322 0 0.00147186 -0.0274929 0 -0.0115936 -0.0807532 0.01 -0.00671883 -0.0818652 0.01 -0.0025 -8.89339e-17 0.01 -0.00655103 -0.0540874 0.01 -0.00351417 -0.0271195 0.01 -0.0115936 0.0807532 0.01 -0.00351417 0.0271195 0.01 -0.00655103 0.0540874 0.01 -0.00671883 0.0818652 0.01 0.0025 -9.01585e-17 0.01 0.00147186 0.0274929 0.01 -0.00160681 0.0548322 0.01 -0.00160681 -0.0548322 0.01 0.00147186 -0.0274929 0.01 -0.0115936 -0.0807532 0 -0.0115936 -0.0807532 0.01 -0.0025 -8.89339e-17 0.01 -0.00655103 -0.0540874 0.01 -0.00351417 -0.0271195 0.01 -0.0025 -8.89339e-17 0 -0.00655103 -0.0540874 0 -0.00351417 -0.0271195 0 -0.0025 -8.89339e-17 0 -0.0025 -8.89339e-17 0.01 -0.0115936 0.0807532 0.01 -0.00351417 0.0271195 0.01 -0.00655103 0.0540874 0.01 -0.0115936 0.0807532 0 -0.00351417 0.0271195 0 -0.00655103 0.0540874 0 -0.0115936 0.0807532 0 -0.00671883 0.0818652 0 -0.00671883 0.0818652 0.01 -0.0115936 0.0807532 0.01 0.0025 -9.01585e-17 0 0.0025 -9.01585e-17 0.01 -0.00671883 0.0818652 0.01 0.00147186 0.0274929 0.01 -0.00160681 0.0548322 0.01 -0.00671883 0.0818652 0 0.00147186 0.0274929 0 -0.00160681 0.0548322 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0117739 -0.0823545 0 -0.00689915 -0.0834665 0 -0.00689915 -0.0834665 0.01 -0.0117739 -0.0823545 0.01 -0.0117739 -0.0823545 0 -0.00689915 -0.0834665 0 -0.0025 -9.06973e-17 0 -0.00663136 -0.0551599 0 -0.00353428 -0.0276572 0 -0.0117739 0.0823545 0 -0.00353428 0.0276572 0 -0.00663136 0.0551599 0 -0.00689915 0.0834665 0 0.0025 -9.1922e-17 0 0.00145175 0.0280307 0 -0.00168714 0.0559047 0 -0.00168714 -0.0559047 0 0.00145175 -0.0280307 0 -0.00689915 -0.0834665 0 -0.00689915 -0.0834665 0.01 0.0025 -9.1922e-17 0.01 -0.00168714 -0.0559047 0.01 0.00145175 -0.0280307 0.01 0.0025 -9.1922e-17 0 -0.00168714 -0.0559047 0 0.00145175 -0.0280307 0 -0.0117739 -0.0823545 0.01 -0.00689915 -0.0834665 0.01 -0.0025 -9.06973e-17 0.01 -0.00663136 -0.0551599 0.01 -0.00353428 -0.0276572 0.01 -0.0117739 0.0823545 0.01 -0.00353428 0.0276572 0.01 -0.00663136 0.0551599 0.01 -0.00689915 0.0834665 0.01 0.0025 -9.1922e-17 0.01 0.00145175 0.0280307 0.01 -0.00168714 0.0559047 0.01 -0.00168714 -0.0559047 0.01 0.00145175 -0.0280307 0.01 -0.0117739 -0.0823545 0 -0.0117739 -0.0823545 0.01 -0.0025 -9.06973e-17 0.01 -0.00663136 -0.0551599 0.01 -0.00353428 -0.0276572 0.01 -0.0025 -9.06973e-17 0 -0.00663136 -0.0551599 0 -0.00353428 -0.0276572 0 -0.0025 -9.06973e-17 0 -0.0025 -9.06973e-17 0.01 -0.0117739 0.0823545 0.01 -0.00353428 0.0276572 0.01 -0.00663136 0.0551599 0.01 -0.0117739 0.0823545 0 -0.00353428 0.0276572 0 -0.00663136 0.0551599 0 -0.0117739 0.0823545 0 -0.00689915 0.0834665 0 -0.00689915 0.0834665 0.01 -0.0117739 0.0823545 0.01 0.0025 -9.1922e-17 0 0.0025 -9.1922e-17 0.01 -0.00689915 0.0834665 0.01 0.00145175 0.0280307 0.01 -0.00168714 0.0559047 0.01 -0.00689915 0.0834665 0 0.00145175 0.0280307 0 -0.00168714 0.0559047 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0118315 -0.082866 0 -0.00695675 -0.083978 0 -0.00695675 -0.083978 0.01 -0.0118315 -0.082866 0.01 -0.0118315 -0.082866 0 -0.00695675 -0.083978 0 -0.0025 -9.12607e-17 0 -0.00665702 -0.0555025 0 -0.00354071 -0.027829 0 -0.0118315 0.082866 0 -0.00354071 0.027829 0 -0.00665702 0.0555025 0 -0.00695675 0.083978 0 0.0025 -9.24853e-17 0 0.00144533 0.0282024 0 -0.0017128 0.0562473 0 -0.0017128 -0.0562473 0 0.00144533 -0.0282024 0 -0.00695675 -0.083978 0 -0.00695675 -0.083978 0.01 0.0025 -9.24853e-17 0.01 -0.0017128 -0.0562473 0.01 0.00144533 -0.0282024 0.01 0.0025 -9.24853e-17 0 -0.0017128 -0.0562473 0 0.00144533 -0.0282024 0 -0.0118315 -0.082866 0.01 -0.00695675 -0.083978 0.01 -0.0025 -9.12607e-17 0.01 -0.00665702 -0.0555025 0.01 -0.00354071 -0.027829 0.01 -0.0118315 0.082866 0.01 -0.00354071 0.027829 0.01 -0.00665702 0.0555025 0.01 -0.00695675 0.083978 0.01 0.0025 -9.24853e-17 0.01 0.00144533 0.0282024 0.01 -0.0017128 0.0562473 0.01 -0.0017128 -0.0562473 0.01 0.00144533 -0.0282024 0.01 -0.0118315 -0.082866 0 -0.0118315 -0.082866 0.01 -0.0025 -9.12607e-17 0.01 -0.00665702 -0.0555025 0.01 -0.00354071 -0.027829 0.01 -0.0025 -9.12607e-17 0 -0.00665702 -0.0555025 0 -0.00354071 -0.027829 0 -0.0025 -9.12607e-17 0 -0.0025 -9.12607e-17 0.01 -0.0118315 0.082866 0.01 -0.00354071 0.027829 0.01 -0.00665702 0.0555025 0.01 -0.0118315 0.082866 0 -0.00354071 0.027829 0 -0.00665702 0.0555025 0 -0.0118315 0.082866 0 -0.00695675 0.083978 0 -0.00695675 0.083978 0.01 -0.0118315 0.082866 0.01 0.0025 -9.24853e-17 0 0.0025 -9.24853e-17 0.01 -0.00695675 0.083978 0.01 0.00144533 0.0282024 0.01 -0.0017128 0.0562473 0.01 -0.00695675 0.083978 0 0.00144533 0.0282024 0 -0.0017128 0.0562473 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0120118 -0.0844673 0 -0.00713707 -0.0855793 0 -0.00713707 -0.0855793 0.01 -0.0120118 -0.0844673 0.01 -0.0120118 -0.0844673 0 -0.00713707 -0.0855793 0 -0.0025 -9.30242e-17 0 -0.00673735 -0.056575 0 -0.00356082 -0.0283668 0 -0.0120118 0.0844673 0 -0.00356082 0.0283668 0 -0.00673735 0.056575 0 -0.00713707 0.0855793 0 0.0025 -9.42488e-17 0 0.00142522 0.0287402 0 -0.00179313 0.0573198 0 -0.00179313 -0.0573198 0 0.00142522 -0.0287402 0 -0.00713707 -0.0855793 0 -0.00713707 -0.0855793 0.01 0.0025 -9.42488e-17 0.01 -0.00179313 -0.0573198 0.01 0.00142522 -0.0287402 0.01 0.0025 -9.42488e-17 0 -0.00179313 -0.0573198 0 0.00142522 -0.0287402 0 -0.0120118 -0.0844673 0.01 -0.00713707 -0.0855793 0.01 -0.0025 -9.30242e-17 0.01 -0.00673735 -0.056575 0.01 -0.00356082 -0.0283668 0.01 -0.0120118 0.0844673 0.01 -0.00356082 0.0283668 0.01 -0.00673735 0.056575 0.01 -0.00713707 0.0855793 0.01 0.0025 -9.42488e-17 0.01 0.00142522 0.0287402 0.01 -0.00179313 0.0573198 0.01 -0.00179313 -0.0573198 0.01 0.00142522 -0.0287402 0.01 -0.0120118 -0.0844673 0 -0.0120118 -0.0844673 0.01 -0.0025 -9.30242e-17 0.01 -0.00673735 -0.056575 0.01 -0.00356082 -0.0283668 0.01 -0.0025 -9.30242e-17 0 -0.00673735 -0.056575 0 -0.00356082 -0.0283668 0 -0.0025 -9.30242e-17 0 -0.0025 -9.30242e-17 0.01 -0.0120118 0.0844673 0.01 -0.00356082 0.0283668 0.01 -0.00673735 0.056575 0.01 -0.0120118 0.0844673 0 -0.00356082 0.0283668 0 -0.00673735 0.056575 0 -0.0120118 0.0844673 0 -0.00713707 0.0855793 0 -0.00713707 0.0855793 0.01 -0.0120118 0.0844673 0.01 0.0025 -9.42488e-17 0 0.0025 -9.42488e-17 0.01 -0.00713707 0.0855793 0.01 0.00142522 0.0287402 0.01 -0.00179313 0.0573198 0.01 -0.00713707 0.0855793 0 0.00142522 0.0287402 0 -0.00179313 0.0573198 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0120669 -0.0849566 0 -0.00719217 -0.0860686 0 -0.00719217 -0.0860686 0.01 -0.0120669 -0.0849566 0.01 -0.0120669 -0.0849566 0 -0.00719217 -0.0860686 0 -0.0025 -9.3563e-17 0 -0.00676189 -0.0569028 0 -0.00356696 -0.0285311 0 -0.0120669 0.0849566 0 -0.00356696 0.0285311 0 -0.00676189 0.0569028 0 -0.00719217 0.0860686 0 0.0025 -9.47877e-17 0 0.00141907 0.0289045 0 -0.00181768 0.0576476 0 -0.00181768 -0.0576476 0 0.00141907 -0.0289045 0 -0.00719217 -0.0860686 0 -0.00719217 -0.0860686 0.01 0.0025 -9.47877e-17 0.01 -0.00181768 -0.0576476 0.01 0.00141907 -0.0289045 0.01 0.0025 -9.47877e-17 0 -0.00181768 -0.0576476 0 0.00141907 -0.0289045 0 -0.0120669 -0.0849566 0.01 -0.00719217 -0.0860686 0.01 -0.0025 -9.3563e-17 0.01 -0.00676189 -0.0569028 0.01 -0.00356696 -0.0285311 0.01 -0.0120669 0.0849566 0.01 -0.00356696 0.0285311 0.01 -0.00676189 0.0569028 0.01 -0.00719217 0.0860686 0.01 0.0025 -9.47877e-17 0.01 0.00141907 0.0289045 0.01 -0.00181768 0.0576476 0.01 -0.00181768 -0.0576476 0.01 0.00141907 -0.0289045 0.01 -0.0120669 -0.0849566 0 -0.0120669 -0.0849566 0.01 -0.0025 -9.3563e-17 0.01 -0.00676189 -0.0569028 0.01 -0.00356696 -0.0285311 0.01 -0.0025 -9.3563e-17 0 -0.00676189 -0.0569028 0 -0.00356696 -0.0285311 0 -0.0025 -9.3563e-17 0 -0.0025 -9.3563e-17 0.01 -0.0120669 0.0849566 0.01 -0.00356696 0.0285311 0.01 -0.00676189 0.0569028 0.01 -0.0120669 0.0849566 0 -0.00356696 0.0285311 0 -0.00676189 0.0569028 0 -0.0120669 0.0849566 0 -0.00719217 0.0860686 0 -0.00719217 0.0860686 0.01 -0.0120669 0.0849566 0.01 0.0025 -9.47877e-17 0 0.0025 -9.47877e-17 0.01 -0.00719217 0.0860686 0.01 0.00141907 0.0289045 0.01 -0.00181768 0.0576476 0.01 -0.00719217 0.0860686 0 0.00141907 0.0289045 0 -0.00181768 0.0576476 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0122473 -0.0865578 0 -0.00737248 -0.0876698 0 -0.00737248 -0.0876698 0.01 -0.0122473 -0.0865578 0.01 -0.0122473 -0.0865578 0 -0.00737248 -0.0876698 0 -0.0025 -9.53265e-17 0 -0.00684222 -0.0579753 0 -0.00358707 -0.0290688 0 -0.0122473 0.0865578 0 -0.00358707 0.0290688 0 -0.00684222 0.0579753 0 -0.00737248 0.0876698 0 0.0025 -9.65512e-17 0 0.00139896 0.0294423 0 -0.00189801 0.0587201 0 -0.00189801 -0.0587201 0 0.00139896 -0.0294423 0 -0.00737248 -0.0876698 0 -0.00737248 -0.0876698 0.01 0.0025 -9.65512e-17 0.01 -0.00189801 -0.0587201 0.01 0.00139896 -0.0294423 0.01 0.0025 -9.65512e-17 0 -0.00189801 -0.0587201 0 0.00139896 -0.0294423 0 -0.0122473 -0.0865578 0.01 -0.00737248 -0.0876698 0.01 -0.0025 -9.53265e-17 0.01 -0.00684222 -0.0579753 0.01 -0.00358707 -0.0290688 0.01 -0.0122473 0.0865578 0.01 -0.00358707 0.0290688 0.01 -0.00684222 0.0579753 0.01 -0.00737248 0.0876698 0.01 0.0025 -9.65512e-17 0.01 0.00139896 0.0294423 0.01 -0.00189801 0.0587201 0.01 -0.00189801 -0.0587201 0.01 0.00139896 -0.0294423 0.01 -0.0122473 -0.0865578 0 -0.0122473 -0.0865578 0.01 -0.0025 -9.53265e-17 0.01 -0.00684222 -0.0579753 0.01 -0.00358707 -0.0290688 0.01 -0.0025 -9.53265e-17 0 -0.00684222 -0.0579753 0 -0.00358707 -0.0290688 0 -0.0025 -9.53265e-17 0 -0.0025 -9.53265e-17 0.01 -0.0122473 0.0865578 0.01 -0.00358707 0.0290688 0.01 -0.00684222 0.0579753 0.01 -0.0122473 0.0865578 0 -0.00358707 0.0290688 0 -0.00684222 0.0579753 0 -0.0122473 0.0865578 0 -0.00737248 0.0876698 0 -0.00737248 0.0876698 0.01 -0.0122473 0.0865578 0.01 0.0025 -9.65512e-17 0 0.0025 -9.65512e-17 0.01 -0.00737248 0.0876698 0.01 0.00139896 0.0294423 0.01 -0.00189801 0.0587201 0.01 -0.00737248 0.0876698 0 0.00139896 0.0294423 0 -0.00189801 0.0587201 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0123049 -0.0870694 0 -0.00743009 -0.0881814 0 -0.00743009 -0.0881814 0.01 -0.0123049 -0.0870694 0.01 -0.0123049 -0.0870694 0 -0.00743009 -0.0881814 0 -0.0025 -9.58898e-17 0 -0.00686788 -0.0583179 0 -0.0035935 -0.0292406 0 -0.0123049 0.0870694 0 -0.0035935 0.0292406 0 -0.00686788 0.0583179 0 -0.00743009 0.0881814 0 0.0025 -9.71145e-17 0 0.00139254 0.0296141 0 -0.00192367 0.0590627 0 -0.00192367 -0.0590627 0 0.00139254 -0.0296141 0 -0.00743009 -0.0881814 0 -0.00743009 -0.0881814 0.01 0.0025 -9.71145e-17 0.01 -0.00192367 -0.0590627 0.01 0.00139254 -0.0296141 0.01 0.0025 -9.71145e-17 0 -0.00192367 -0.0590627 0 0.00139254 -0.0296141 0 -0.0123049 -0.0870694 0.01 -0.00743009 -0.0881814 0.01 -0.0025 -9.58898e-17 0.01 -0.00686788 -0.0583179 0.01 -0.0035935 -0.0292406 0.01 -0.0123049 0.0870694 0.01 -0.0035935 0.0292406 0.01 -0.00686788 0.0583179 0.01 -0.00743009 0.0881814 0.01 0.0025 -9.71145e-17 0.01 0.00139254 0.0296141 0.01 -0.00192367 0.0590627 0.01 -0.00192367 -0.0590627 0.01 0.00139254 -0.0296141 0.01 -0.0123049 -0.0870694 0 -0.0123049 -0.0870694 0.01 -0.0025 -9.58898e-17 0.01 -0.00686788 -0.0583179 0.01 -0.0035935 -0.0292406 0.01 -0.0025 -9.58898e-17 0 -0.00686788 -0.0583179 0 -0.0035935 -0.0292406 0 -0.0025 -9.58898e-17 0 -0.0025 -9.58898e-17 0.01 -0.0123049 0.0870694 0.01 -0.0035935 0.0292406 0.01 -0.00686788 0.0583179 0.01 -0.0123049 0.0870694 0 -0.0035935 0.0292406 0 -0.00686788 0.0583179 0 -0.0123049 0.0870694 0 -0.00743009 0.0881814 0 -0.00743009 0.0881814 0.01 -0.0123049 0.0870694 0.01 0.0025 -9.71145e-17 0 0.0025 -9.71145e-17 0.01 -0.00743009 0.0881814 0.01 0.00139254 0.0296141 0.01 -0.00192367 0.0590627 0.01 -0.00743009 0.0881814 0 0.00139254 0.0296141 0 -0.00192367 0.0590627 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0124852 -0.0886706 0 -0.00761041 -0.0897826 0 -0.00761041 -0.0897826 0.01 -0.0124852 -0.0886706 0.01 -0.0124852 -0.0886706 0 -0.00761041 -0.0897826 0 -0.0025 -9.76533e-17 0 -0.00694821 -0.0593904 0 -0.00361361 -0.0297784 0 -0.0124852 0.0886706 0 -0.00361361 0.0297784 0 -0.00694821 0.0593904 0 -0.00761041 0.0897826 0 0.0025 -9.8878e-17 0 0.00137243 0.0301518 0 -0.002004 0.0601352 0 -0.002004 -0.0601352 0 0.00137243 -0.0301518 0 -0.00761041 -0.0897826 0 -0.00761041 -0.0897826 0.01 0.0025 -9.8878e-17 0.01 -0.002004 -0.0601352 0.01 0.00137243 -0.0301518 0.01 0.0025 -9.8878e-17 0 -0.002004 -0.0601352 0 0.00137243 -0.0301518 0 -0.0124852 -0.0886706 0.01 -0.00761041 -0.0897826 0.01 -0.0025 -9.76533e-17 0.01 -0.00694821 -0.0593904 0.01 -0.00361361 -0.0297784 0.01 -0.0124852 0.0886706 0.01 -0.00361361 0.0297784 0.01 -0.00694821 0.0593904 0.01 -0.00761041 0.0897826 0.01 0.0025 -9.8878e-17 0.01 0.00137243 0.0301518 0.01 -0.002004 0.0601352 0.01 -0.002004 -0.0601352 0.01 0.00137243 -0.0301518 0.01 -0.0124852 -0.0886706 0 -0.0124852 -0.0886706 0.01 -0.0025 -9.76533e-17 0.01 -0.00694821 -0.0593904 0.01 -0.00361361 -0.0297784 0.01 -0.0025 -9.76533e-17 0 -0.00694821 -0.0593904 0 -0.00361361 -0.0297784 0 -0.0025 -9.76533e-17 0 -0.0025 -9.76533e-17 0.01 -0.0124852 0.0886706 0.01 -0.00361361 0.0297784 0.01 -0.00694821 0.0593904 0.01 -0.0124852 0.0886706 0 -0.00361361 0.0297784 0 -0.00694821 0.0593904 0 -0.0124852 0.0886706 0 -0.00761041 0.0897826 0 -0.00761041 0.0897826 0.01 -0.0124852 0.0886706 0.01 0.0025 -9.8878e-17 0 0.0025 -9.8878e-17 0.01 -0.00761041 0.0897826 0.01 0.00137243 0.0301518 0.01 -0.002004 0.0601352 0.01 -0.00761041 0.0897826 0 0.00137243 0.0301518 0 -0.002004 0.0601352 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0125428 -0.0891822 0 -0.00766801 -0.0902942 0 -0.00766801 -0.0902942 0.01 -0.0125428 -0.0891822 0.01 -0.0125428 -0.0891822 0 -0.00766801 -0.0902942 0 -0.0025 -9.82167e-17 0 -0.00697387 -0.059733 0 -0.00362003 -0.0299502 0 -0.0125428 0.0891822 0 -0.00362003 0.0299502 0 -0.00697387 0.059733 0 -0.00766801 0.0902942 0 0.0025 -9.94413e-17 0 0.001366 0.0303236 0 -0.00202966 0.0604778 0 -0.00202966 -0.0604778 0 0.001366 -0.0303236 0 -0.00766801 -0.0902942 0 -0.00766801 -0.0902942 0.01 0.0025 -9.94413e-17 0.01 -0.00202966 -0.0604778 0.01 0.001366 -0.0303236 0.01 0.0025 -9.94413e-17 0 -0.00202966 -0.0604778 0 0.001366 -0.0303236 0 -0.0125428 -0.0891822 0.01 -0.00766801 -0.0902942 0.01 -0.0025 -9.82167e-17 0.01 -0.00697387 -0.059733 0.01 -0.00362003 -0.0299502 0.01 -0.0125428 0.0891822 0.01 -0.00362003 0.0299502 0.01 -0.00697387 0.059733 0.01 -0.00766801 0.0902942 0.01 0.0025 -9.94413e-17 0.01 0.001366 0.0303236 0.01 -0.00202966 0.0604778 0.01 -0.00202966 -0.0604778 0.01 0.001366 -0.0303236 0.01 -0.0125428 -0.0891822 0 -0.0125428 -0.0891822 0.01 -0.0025 -9.82167e-17 0.01 -0.00697387 -0.059733 0.01 -0.00362003 -0.0299502 0.01 -0.0025 -9.82167e-17 0 -0.00697387 -0.059733 0 -0.00362003 -0.0299502 0 -0.0025 -9.82167e-17 0 -0.0025 -9.82167e-17 0.01 -0.0125428 0.0891822 0.01 -0.00362003 0.0299502 0.01 -0.00697387 0.059733 0.01 -0.0125428 0.0891822 0 -0.00362003 0.0299502 0 -0.00697387 0.059733 0 -0.0125428 0.0891822 0 -0.00766801 0.0902942 0 -0.00766801 0.0902942 0.01 -0.0125428 0.0891822 0.01 0.0025 -9.94413e-17 0 0.0025 -9.94413e-17 0.01 -0.00766801 0.0902942 0.01 0.001366 0.0303236 0.01 -0.00202966 0.0604778 0.01 -0.00766801 0.0902942 0 0.001366 0.0303236 0 -0.00202966 0.0604778 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0105868 -0.0718128 0 -0.00571204 -0.0729248 0 -0.00571204 -0.0729248 0.01 -0.0105868 -0.0718128 0.01 -0.0105868 -0.0718128 0 -0.00571204 -0.0729248 0 -0.0025 -7.90877e-17 0 -0.00610253 -0.0480992 0 -0.00340189 -0.024117 0 -0.0105868 0.0718128 0 -0.00340189 0.024117 0 -0.00610253 0.0480992 0 -0.00571204 0.0729248 0 0.0025 -8.03123e-17 0 0.00158414 0.0244904 0 -0.00115831 0.048844 0 -0.00115831 -0.048844 0 0.00158414 -0.0244904 0 -0.00571204 -0.0729248 0 -0.00571204 -0.0729248 0.01 0.0025 -8.03123e-17 0.01 -0.00115831 -0.048844 0.01 0.00158414 -0.0244904 0.01 0.0025 -8.03123e-17 0 -0.00115831 -0.048844 0 0.00158414 -0.0244904 0 -0.0105868 -0.0718128 0.01 -0.00571204 -0.0729248 0.01 -0.0025 -7.90877e-17 0.01 -0.00610253 -0.0480992 0.01 -0.00340189 -0.024117 0.01 -0.0105868 0.0718128 0.01 -0.00340189 0.024117 0.01 -0.00610253 0.0480992 0.01 -0.00571204 0.0729248 0.01 0.0025 -8.03123e-17 0.01 0.00158414 0.0244904 0.01 -0.00115831 0.048844 0.01 -0.00115831 -0.048844 0.01 0.00158414 -0.0244904 0.01 -0.0105868 -0.0718128 0 -0.0105868 -0.0718128 0.01 -0.0025 -7.90877e-17 0.01 -0.00610253 -0.0480992 0.01 -0.00340189 -0.024117 0.01 -0.0025 -7.90877e-17 0 -0.00610253 -0.0480992 0 -0.00340189 -0.024117 0 -0.0025 -7.90877e-17 0 -0.0025 -7.90877e-17 0.01 -0.0105868 0.0718128 0.01 -0.00340189 0.024117 0.01 -0.00610253 0.0480992 0.01 -0.0105868 0.0718128 0 -0.00340189 0.024117 0 -0.00610253 0.0480992 0 -0.0105868 0.0718128 0 -0.00571204 0.0729248 0 -0.00571204 0.0729248 0.01 -0.0105868 0.0718128 0.01 0.0025 -8.03123e-17 0 0.0025 -8.03123e-17 0.01 -0.00571204 0.0729248 0.01 0.00158414 0.0244904 0.01 -0.00115831 0.048844 0.01 -0.00571204 0.0729248 0 0.00158414 0.0244904 0 -0.00115831 0.048844 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0106444 -0.0723243 0 -0.00576965 -0.0734363 0 -0.00576965 -0.0734363 0.01 -0.0106444 -0.0723243 0.01 -0.0106444 -0.0723243 0 -0.00576965 -0.0734363 0 -0.0025 -7.9651e-17 0 -0.00612819 -0.0484418 0 -0.00340832 -0.0242888 0 -0.0106444 0.0723243 0 -0.00340832 0.0242888 0 -0.00612819 0.0484418 0 -0.00576965 0.0734363 0 0.0025 -8.08757e-17 0 0.00157772 0.0246622 0 -0.00118397 0.0491866 0 -0.00118397 -0.0491866 0 0.00157772 -0.0246622 0 -0.00576965 -0.0734363 0 -0.00576965 -0.0734363 0.01 0.0025 -8.08757e-17 0.01 -0.00118397 -0.0491866 0.01 0.00157772 -0.0246622 0.01 0.0025 -8.08757e-17 0 -0.00118397 -0.0491866 0 0.00157772 -0.0246622 0 -0.0106444 -0.0723243 0.01 -0.00576965 -0.0734363 0.01 -0.0025 -7.9651e-17 0.01 -0.00612819 -0.0484418 0.01 -0.00340832 -0.0242888 0.01 -0.0106444 0.0723243 0.01 -0.00340832 0.0242888 0.01 -0.00612819 0.0484418 0.01 -0.00576965 0.0734363 0.01 0.0025 -8.08757e-17 0.01 0.00157772 0.0246622 0.01 -0.00118397 0.0491866 0.01 -0.00118397 -0.0491866 0.01 0.00157772 -0.0246622 0.01 -0.0106444 -0.0723243 0 -0.0106444 -0.0723243 0.01 -0.0025 -7.9651e-17 0.01 -0.00612819 -0.0484418 0.01 -0.00340832 -0.0242888 0.01 -0.0025 -7.9651e-17 0 -0.00612819 -0.0484418 0 -0.00340832 -0.0242888 0 -0.0025 -7.9651e-17 0 -0.0025 -7.9651e-17 0.01 -0.0106444 0.0723243 0.01 -0.00340832 0.0242888 0.01 -0.00612819 0.0484418 0.01 -0.0106444 0.0723243 0 -0.00340832 0.0242888 0 -0.00612819 0.0484418 0 -0.0106444 0.0723243 0 -0.00576965 0.0734363 0 -0.00576965 0.0734363 0.01 -0.0106444 0.0723243 0.01 0.0025 -8.08757e-17 0 0.0025 -8.08757e-17 0.01 -0.00576965 0.0734363 0.01 0.00157772 0.0246622 0.01 -0.00118397 0.0491866 0.01 -0.00576965 0.0734363 0 0.00157772 0.0246622 0 -0.00118397 0.0491866 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0108247 -0.0739256 0 -0.00594997 -0.0750376 0 -0.00594997 -0.0750376 0.01 -0.0108247 -0.0739256 0.01 -0.0108247 -0.0739256 0 -0.00594997 -0.0750376 0 -0.0025 -8.14145e-17 0 -0.00620852 -0.0495143 0 -0.00342843 -0.0248265 0 -0.0108247 0.0739256 0 -0.00342843 0.0248265 0 -0.00620852 0.0495143 0 -0.00594997 0.0750376 0 0.0025 -8.26392e-17 0 0.00155761 0.0252 0 -0.0012643 0.0502591 0 -0.0012643 -0.0502591 0 0.00155761 -0.0252 0 -0.00594997 -0.0750376 0 -0.00594997 -0.0750376 0.01 0.0025 -8.26392e-17 0.01 -0.0012643 -0.0502591 0.01 0.00155761 -0.0252 0.01 0.0025 -8.26392e-17 0 -0.0012643 -0.0502591 0 0.00155761 -0.0252 0 -0.0108247 -0.0739256 0.01 -0.00594997 -0.0750376 0.01 -0.0025 -8.14145e-17 0.01 -0.00620852 -0.0495143 0.01 -0.00342843 -0.0248265 0.01 -0.0108247 0.0739256 0.01 -0.00342843 0.0248265 0.01 -0.00620852 0.0495143 0.01 -0.00594997 0.0750376 0.01 0.0025 -8.26392e-17 0.01 0.00155761 0.0252 0.01 -0.0012643 0.0502591 0.01 -0.0012643 -0.0502591 0.01 0.00155761 -0.0252 0.01 -0.0108247 -0.0739256 0 -0.0108247 -0.0739256 0.01 -0.0025 -8.14145e-17 0.01 -0.00620852 -0.0495143 0.01 -0.00342843 -0.0248265 0.01 -0.0025 -8.14145e-17 0 -0.00620852 -0.0495143 0 -0.00342843 -0.0248265 0 -0.0025 -8.14145e-17 0 -0.0025 -8.14145e-17 0.01 -0.0108247 0.0739256 0.01 -0.00342843 0.0248265 0.01 -0.00620852 0.0495143 0.01 -0.0108247 0.0739256 0 -0.00342843 0.0248265 0 -0.00620852 0.0495143 0 -0.0108247 0.0739256 0 -0.00594997 0.0750376 0 -0.00594997 0.0750376 0.01 -0.0108247 0.0739256 0.01 0.0025 -8.26392e-17 0 0.0025 -8.26392e-17 0.01 -0.00594997 0.0750376 0.01 0.00155761 0.0252 0.01 -0.0012643 0.0502591 0.01 -0.00594997 0.0750376 0 0.00155761 0.0252 0 -0.0012643 0.0502591 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0108798 -0.0744148 0 -0.00600506 -0.0755268 0 -0.00600506 -0.0755268 0.01 -0.0108798 -0.0744148 0.01 -0.0108798 -0.0744148 0 -0.00600506 -0.0755268 0 -0.0025 -8.19534e-17 0 -0.00623306 -0.049842 0 -0.00343457 -0.0249908 0 -0.0108798 0.0744148 0 -0.00343457 0.0249908 0 -0.00623306 0.049842 0 -0.00600506 0.0755268 0 0.0025 -8.3178e-17 0 0.00155146 0.0253643 0 -0.00128885 0.0505868 0 -0.00128885 -0.0505868 0 0.00155146 -0.0253643 0 -0.00600506 -0.0755268 0 -0.00600506 -0.0755268 0.01 0.0025 -8.3178e-17 0.01 -0.00128885 -0.0505868 0.01 0.00155146 -0.0253643 0.01 0.0025 -8.3178e-17 0 -0.00128885 -0.0505868 0 0.00155146 -0.0253643 0 -0.0108798 -0.0744148 0.01 -0.00600506 -0.0755268 0.01 -0.0025 -8.19534e-17 0.01 -0.00623306 -0.049842 0.01 -0.00343457 -0.0249908 0.01 -0.0108798 0.0744148 0.01 -0.00343457 0.0249908 0.01 -0.00623306 0.049842 0.01 -0.00600506 0.0755268 0.01 0.0025 -8.3178e-17 0.01 0.00155146 0.0253643 0.01 -0.00128885 0.0505868 0.01 -0.00128885 -0.0505868 0.01 0.00155146 -0.0253643 0.01 -0.0108798 -0.0744148 0 -0.0108798 -0.0744148 0.01 -0.0025 -8.19534e-17 0.01 -0.00623306 -0.049842 0.01 -0.00343457 -0.0249908 0.01 -0.0025 -8.19534e-17 0 -0.00623306 -0.049842 0 -0.00343457 -0.0249908 0 -0.0025 -8.19534e-17 0 -0.0025 -8.19534e-17 0.01 -0.0108798 0.0744148 0.01 -0.00343457 0.0249908 0.01 -0.00623306 0.049842 0.01 -0.0108798 0.0744148 0 -0.00343457 0.0249908 0 -0.00623306 0.049842 0 -0.0108798 0.0744148 0 -0.00600506 0.0755268 0 -0.00600506 0.0755268 0.01 -0.0108798 0.0744148 0.01 0.0025 -8.3178e-17 0 0.0025 -8.3178e-17 0.01 -0.00600506 0.0755268 0.01 0.00155146 0.0253643 0.01 -0.00128885 0.0505868 0.01 -0.00600506 0.0755268 0 0.00155146 0.0253643 0 -0.00128885 0.0505868 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0110602 -0.0760161 0 -0.00618538 -0.0771281 0 -0.00618538 -0.0771281 0.01 -0.0110602 -0.0760161 0.01 -0.0110602 -0.0760161 0 -0.00618538 -0.0771281 0 -0.0025 -8.37169e-17 0 -0.00631339 -0.0509146 0 -0.00345468 -0.0255286 0 -0.0110602 0.0760161 0 -0.00345468 0.0255286 0 -0.00631339 0.0509146 0 -0.00618538 0.0771281 0 0.0025 -8.49415e-17 0 0.00153135 0.025902 0 -0.00136917 0.0516594 0 -0.00136917 -0.0516594 0 0.00153135 -0.025902 0 -0.00618538 -0.0771281 0 -0.00618538 -0.0771281 0.01 0.0025 -8.49415e-17 0.01 -0.00136917 -0.0516594 0.01 0.00153135 -0.025902 0.01 0.0025 -8.49415e-17 0 -0.00136917 -0.0516594 0 0.00153135 -0.025902 0 -0.0110602 -0.0760161 0.01 -0.00618538 -0.0771281 0.01 -0.0025 -8.37169e-17 0.01 -0.00631339 -0.0509146 0.01 -0.00345468 -0.0255286 0.01 -0.0110602 0.0760161 0.01 -0.00345468 0.0255286 0.01 -0.00631339 0.0509146 0.01 -0.00618538 0.0771281 0.01 0.0025 -8.49415e-17 0.01 0.00153135 0.025902 0.01 -0.00136917 0.0516594 0.01 -0.00136917 -0.0516594 0.01 0.00153135 -0.025902 0.01 -0.0110602 -0.0760161 0 -0.0110602 -0.0760161 0.01 -0.0025 -8.37169e-17 0.01 -0.00631339 -0.0509146 0.01 -0.00345468 -0.0255286 0.01 -0.0025 -8.37169e-17 0 -0.00631339 -0.0509146 0 -0.00345468 -0.0255286 0 -0.0025 -8.37169e-17 0 -0.0025 -8.37169e-17 0.01 -0.0110602 0.0760161 0.01 -0.00345468 0.0255286 0.01 -0.00631339 0.0509146 0.01 -0.0110602 0.0760161 0 -0.00345468 0.0255286 0 -0.00631339 0.0509146 0 -0.0110602 0.0760161 0 -0.00618538 0.0771281 0 -0.00618538 0.0771281 0.01 -0.0110602 0.0760161 0.01 0.0025 -8.49415e-17 0 0.0025 -8.49415e-17 0.01 -0.00618538 0.0771281 0.01 0.00153135 0.025902 0.01 -0.00136917 0.0516594 0.01 -0.00618538 0.0771281 0 0.00153135 0.025902 0 -0.00136917 0.0516594 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0111178 -0.0765276 0 -0.00624298 -0.0776396 0 -0.00624298 -0.0776396 0.01 -0.0111178 -0.0765276 0.01 -0.0111178 -0.0765276 0 -0.00624298 -0.0776396 0 -0.0025 -8.42802e-17 0 -0.00633905 -0.0512572 0 -0.00346111 -0.0257004 0 -0.0111178 0.0765276 0 -0.00346111 0.0257004 0 -0.00633905 0.0512572 0 -0.00624298 0.0776396 0 0.0025 -8.55048e-17 0 0.00152493 0.0260738 0 -0.00139484 0.052002 0 -0.00139484 -0.052002 0 0.00152493 -0.0260738 0 -0.00624298 -0.0776396 0 -0.00624298 -0.0776396 0.01 0.0025 -8.55048e-17 0.01 -0.00139484 -0.052002 0.01 0.00152493 -0.0260738 0.01 0.0025 -8.55048e-17 0 -0.00139484 -0.052002 0 0.00152493 -0.0260738 0 -0.0111178 -0.0765276 0.01 -0.00624298 -0.0776396 0.01 -0.0025 -8.42802e-17 0.01 -0.00633905 -0.0512572 0.01 -0.00346111 -0.0257004 0.01 -0.0111178 0.0765276 0.01 -0.00346111 0.0257004 0.01 -0.00633905 0.0512572 0.01 -0.00624298 0.0776396 0.01 0.0025 -8.55048e-17 0.01 0.00152493 0.0260738 0.01 -0.00139484 0.052002 0.01 -0.00139484 -0.052002 0.01 0.00152493 -0.0260738 0.01 -0.0111178 -0.0765276 0 -0.0111178 -0.0765276 0.01 -0.0025 -8.42802e-17 0.01 -0.00633905 -0.0512572 0.01 -0.00346111 -0.0257004 0.01 -0.0025 -8.42802e-17 0 -0.00633905 -0.0512572 0 -0.00346111 -0.0257004 0 -0.0025 -8.42802e-17 0 -0.0025 -8.42802e-17 0.01 -0.0111178 0.0765276 0.01 -0.00346111 0.0257004 0.01 -0.00633905 0.0512572 0.01 -0.0111178 0.0765276 0 -0.00346111 0.0257004 0 -0.00633905 0.0512572 0 -0.0111178 0.0765276 0 -0.00624298 0.0776396 0 -0.00624298 0.0776396 0.01 -0.0111178 0.0765276 0.01 0.0025 -8.55048e-17 0 0.0025 -8.55048e-17 0.01 -0.00624298 0.0776396 0.01 0.00152493 0.0260738 0.01 -0.00139484 0.052002 0.01 -0.00624298 0.0776396 0 0.00152493 0.0260738 0 -0.00139484 0.052002 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0112981 -0.0781289 0 -0.0064233 -0.0792409 0 -0.0064233 -0.0792409 0.01 -0.0112981 -0.0781289 0.01 -0.0112981 -0.0781289 0 -0.0064233 -0.0792409 0 -0.0025 -8.60437e-17 0 -0.00641938 -0.0523297 0 -0.00348122 -0.0262381 0 -0.0112981 0.0781289 0 -0.00348122 0.0262381 0 -0.00641938 0.0523297 0 -0.0064233 0.0792409 0 0.0025 -8.72683e-17 0 0.00150482 0.0266116 0 -0.00147516 0.0530745 0 -0.00147516 -0.0530745 0 0.00150482 -0.0266116 0 -0.0064233 -0.0792409 0 -0.0064233 -0.0792409 0.01 0.0025 -8.72683e-17 0.01 -0.00147516 -0.0530745 0.01 0.00150482 -0.0266116 0.01 0.0025 -8.72683e-17 0 -0.00147516 -0.0530745 0 0.00150482 -0.0266116 0 -0.0112981 -0.0781289 0.01 -0.0064233 -0.0792409 0.01 -0.0025 -8.60437e-17 0.01 -0.00641938 -0.0523297 0.01 -0.00348122 -0.0262381 0.01 -0.0112981 0.0781289 0.01 -0.00348122 0.0262381 0.01 -0.00641938 0.0523297 0.01 -0.0064233 0.0792409 0.01 0.0025 -8.72683e-17 0.01 0.00150482 0.0266116 0.01 -0.00147516 0.0530745 0.01 -0.00147516 -0.0530745 0.01 0.00150482 -0.0266116 0.01 -0.0112981 -0.0781289 0 -0.0112981 -0.0781289 0.01 -0.0025 -8.60437e-17 0.01 -0.00641938 -0.0523297 0.01 -0.00348122 -0.0262381 0.01 -0.0025 -8.60437e-17 0 -0.00641938 -0.0523297 0 -0.00348122 -0.0262381 0 -0.0025 -8.60437e-17 0 -0.0025 -8.60437e-17 0.01 -0.0112981 0.0781289 0.01 -0.00348122 0.0262381 0.01 -0.00641938 0.0523297 0.01 -0.0112981 0.0781289 0 -0.00348122 0.0262381 0 -0.00641938 0.0523297 0 -0.0112981 0.0781289 0 -0.0064233 0.0792409 0 -0.0064233 0.0792409 0.01 -0.0112981 0.0781289 0.01 0.0025 -8.72683e-17 0 0.0025 -8.72683e-17 0.01 -0.0064233 0.0792409 0.01 0.00150482 0.0266116 0.01 -0.00147516 0.0530745 0.01 -0.0064233 0.0792409 0 0.00150482 0.0266116 0 -0.00147516 0.0530745 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0113557 -0.0786404 0 -0.00648091 -0.0797524 0 -0.00648091 -0.0797524 0.01 -0.0113557 -0.0786404 0.01 -0.0113557 -0.0786404 0 -0.00648091 -0.0797524 0 -0.0025 -8.6607e-17 0 -0.00644504 -0.0526723 0 -0.00348764 -0.0264099 0 -0.0113557 0.0786404 0 -0.00348764 0.0264099 0 -0.00644504 0.0526723 0 -0.00648091 0.0797524 0 0.0025 -8.78317e-17 0 0.00149839 0.0267834 0 -0.00150082 0.0534171 0 -0.00150082 -0.0534171 0 0.00149839 -0.0267834 0 -0.00648091 -0.0797524 0 -0.00648091 -0.0797524 0.01 0.0025 -8.78317e-17 0.01 -0.00150082 -0.0534171 0.01 0.00149839 -0.0267834 0.01 0.0025 -8.78317e-17 0 -0.00150082 -0.0534171 0 0.00149839 -0.0267834 0 -0.0113557 -0.0786404 0.01 -0.00648091 -0.0797524 0.01 -0.0025 -8.6607e-17 0.01 -0.00644504 -0.0526723 0.01 -0.00348764 -0.0264099 0.01 -0.0113557 0.0786404 0.01 -0.00348764 0.0264099 0.01 -0.00644504 0.0526723 0.01 -0.00648091 0.0797524 0.01 0.0025 -8.78317e-17 0.01 0.00149839 0.0267834 0.01 -0.00150082 0.0534171 0.01 -0.00150082 -0.0534171 0.01 0.00149839 -0.0267834 0.01 -0.0113557 -0.0786404 0 -0.0113557 -0.0786404 0.01 -0.0025 -8.6607e-17 0.01 -0.00644504 -0.0526723 0.01 -0.00348764 -0.0264099 0.01 -0.0025 -8.6607e-17 0 -0.00644504 -0.0526723 0 -0.00348764 -0.0264099 0 -0.0025 -8.6607e-17 0 -0.0025 -8.6607e-17 0.01 -0.0113557 0.0786404 0.01 -0.00348764 0.0264099 0.01 -0.00644504 0.0526723 0.01 -0.0113557 0.0786404 0 -0.00348764 0.0264099 0 -0.00644504 0.0526723 0 -0.0113557 0.0786404 0 -0.00648091 0.0797524 0 -0.00648091 0.0797524 0.01 -0.0113557 0.0786404 0.01 0.0025 -8.78317e-17 0 0.0025 -8.78317e-17 0.01 -0.00648091 0.0797524 0.01 0.00149839 0.0267834 0.01 -0.00150082 0.0534171 0.01 -0.00648091 0.0797524 0 0.00149839 0.0267834 0 -0.00150082 0.0534171 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0138476 -0.100769 0 -0.00897282 -0.101881 0 -0.00897282 -0.101881 0.01 -0.0138476 -0.100769 0.01 -0.0138476 -0.100769 0 -0.00897282 -0.101881 0 -0.0025 -1.10977e-16 0 -0.00755514 -0.0674938 0 -0.00376555 -0.0338414 0 -0.0138476 0.100769 0 -0.00376555 0.0338414 0 -0.00755514 0.0674938 0 -0.00897282 0.101881 0 0.0025 -1.12202e-16 0 0.00122048 0.0342149 0 -0.00261093 0.0682386 0 -0.00261093 -0.0682386 0 0.00122048 -0.0342149 0 -0.00897282 -0.101881 0 -0.00897282 -0.101881 0.01 0.0025 -1.12202e-16 0.01 -0.00261093 -0.0682386 0.01 0.00122048 -0.0342149 0.01 0.0025 -1.12202e-16 0 -0.00261093 -0.0682386 0 0.00122048 -0.0342149 0 -0.0138476 -0.100769 0.01 -0.00897282 -0.101881 0.01 -0.0025 -1.10977e-16 0.01 -0.00755514 -0.0674938 0.01 -0.00376555 -0.0338414 0.01 -0.0138476 0.100769 0.01 -0.00376555 0.0338414 0.01 -0.00755514 0.0674938 0.01 -0.00897282 0.101881 0.01 0.0025 -1.12202e-16 0.01 0.00122048 0.0342149 0.01 -0.00261093 0.0682386 0.01 -0.00261093 -0.0682386 0.01 0.00122048 -0.0342149 0.01 -0.0138476 -0.100769 0 -0.0138476 -0.100769 0.01 -0.0025 -1.10977e-16 0.01 -0.00755514 -0.0674938 0.01 -0.00376555 -0.0338414 0.01 -0.0025 -1.10977e-16 0 -0.00755514 -0.0674938 0 -0.00376555 -0.0338414 0 -0.0025 -1.10977e-16 0 -0.0025 -1.10977e-16 0.01 -0.0138476 0.100769 0.01 -0.00376555 0.0338414 0.01 -0.00755514 0.0674938 0.01 -0.0138476 0.100769 0 -0.00376555 0.0338414 0 -0.00755514 0.0674938 0 -0.0138476 0.100769 0 -0.00897282 0.101881 0 -0.00897282 0.101881 0.01 -0.0138476 0.100769 0.01 0.0025 -1.12202e-16 0 0.0025 -1.12202e-16 0.01 -0.00897282 0.101881 0.01 0.00122048 0.0342149 0.01 -0.00261093 0.0682386 0.01 -0.00897282 0.101881 0 0.00122048 0.0342149 0 -0.00261093 0.0682386 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0138852 -0.101103 0 -0.00901039 -0.102215 0 -0.00901039 -0.102215 0.01 -0.0138852 -0.101103 0.01 -0.0138852 -0.101103 0 -0.00901039 -0.102215 0 -0.0025 -1.11345e-16 0 -0.00757188 -0.0677173 0 -0.00376974 -0.0339535 0 -0.0138852 0.101103 0 -0.00376974 0.0339535 0 -0.00757188 0.0677173 0 -0.00901039 0.102215 0 0.0025 -1.1257e-16 0 0.00121629 0.0343269 0 -0.00262766 0.0684621 0 -0.00262766 -0.0684621 0 0.00121629 -0.0343269 0 -0.00901039 -0.102215 0 -0.00901039 -0.102215 0.01 0.0025 -1.1257e-16 0.01 -0.00262766 -0.0684621 0.01 0.00121629 -0.0343269 0.01 0.0025 -1.1257e-16 0 -0.00262766 -0.0684621 0 0.00121629 -0.0343269 0 -0.0138852 -0.101103 0.01 -0.00901039 -0.102215 0.01 -0.0025 -1.11345e-16 0.01 -0.00757188 -0.0677173 0.01 -0.00376974 -0.0339535 0.01 -0.0138852 0.101103 0.01 -0.00376974 0.0339535 0.01 -0.00757188 0.0677173 0.01 -0.00901039 0.102215 0.01 0.0025 -1.1257e-16 0.01 0.00121629 0.0343269 0.01 -0.00262766 0.0684621 0.01 -0.00262766 -0.0684621 0.01 0.00121629 -0.0343269 0.01 -0.0138852 -0.101103 0 -0.0138852 -0.101103 0.01 -0.0025 -1.11345e-16 0.01 -0.00757188 -0.0677173 0.01 -0.00376974 -0.0339535 0.01 -0.0025 -1.11345e-16 0 -0.00757188 -0.0677173 0 -0.00376974 -0.0339535 0 -0.0025 -1.11345e-16 0 -0.0025 -1.11345e-16 0.01 -0.0138852 0.101103 0.01 -0.00376974 0.0339535 0.01 -0.00757188 0.0677173 0.01 -0.0138852 0.101103 0 -0.00376974 0.0339535 0 -0.00757188 0.0677173 0 -0.0138852 0.101103 0 -0.00901039 0.102215 0 -0.00901039 0.102215 0.01 -0.0138852 0.101103 0.01 0.0025 -1.1257e-16 0 0.0025 -1.1257e-16 0.01 -0.00901039 0.102215 0.01 0.00121629 0.0343269 0.01 -0.00262766 0.0684621 0.01 -0.00901039 0.102215 0 0.00121629 0.0343269 0 -0.00262766 0.0684621 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0149946 -0.110955 0 -0.0101199 -0.112067 0 -0.0101199 -0.112067 0.01 -0.0149946 -0.110955 0.01 -0.0149946 -0.110955 0 -0.0101199 -0.112067 0 -0.0025 -1.22195e-16 0 -0.00806612 -0.0743162 0 -0.00389348 -0.0372622 0 -0.0149946 0.110955 0 -0.00389348 0.0372622 0 -0.00806612 0.0743162 0 -0.0101199 0.112067 0 0.0025 -1.2342e-16 0 0.00109256 0.0376356 0 -0.00312191 0.075061 0 -0.00312191 -0.075061 0 0.00109256 -0.0376356 0 -0.0101199 -0.112067 0 -0.0101199 -0.112067 0.01 0.0025 -1.2342e-16 0.01 -0.00312191 -0.075061 0.01 0.00109256 -0.0376356 0.01 0.0025 -1.2342e-16 0 -0.00312191 -0.075061 0 0.00109256 -0.0376356 0 -0.0149946 -0.110955 0.01 -0.0101199 -0.112067 0.01 -0.0025 -1.22195e-16 0.01 -0.00806612 -0.0743162 0.01 -0.00389348 -0.0372622 0.01 -0.0149946 0.110955 0.01 -0.00389348 0.0372622 0.01 -0.00806612 0.0743162 0.01 -0.0101199 0.112067 0.01 0.0025 -1.2342e-16 0.01 0.00109256 0.0376356 0.01 -0.00312191 0.075061 0.01 -0.00312191 -0.075061 0.01 0.00109256 -0.0376356 0.01 -0.0149946 -0.110955 0 -0.0149946 -0.110955 0.01 -0.0025 -1.22195e-16 0.01 -0.00806612 -0.0743162 0.01 -0.00389348 -0.0372622 0.01 -0.0025 -1.22195e-16 0 -0.00806612 -0.0743162 0 -0.00389348 -0.0372622 0 -0.0025 -1.22195e-16 0 -0.0025 -1.22195e-16 0.01 -0.0149946 0.110955 0.01 -0.00389348 0.0372622 0.01 -0.00806612 0.0743162 0.01 -0.0149946 0.110955 0 -0.00389348 0.0372622 0 -0.00806612 0.0743162 0 -0.0149946 0.110955 0 -0.0101199 0.112067 0 -0.0101199 0.112067 0.01 -0.0149946 0.110955 0.01 0.0025 -1.2342e-16 0 0.0025 -1.2342e-16 0.01 -0.0101199 0.112067 0.01 0.00109256 0.0376356 0.01 -0.00312191 0.075061 0.01 -0.0101199 0.112067 0 0.00109256 0.0376356 0 -0.00312191 0.075061 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0150322 -0.111289 0 -0.0101574 -0.112401 0 -0.0101574 -0.112401 0.01 -0.0150322 -0.111289 0.01 -0.0150322 -0.111289 0 -0.0101574 -0.112401 0 -0.0025 -1.22563e-16 0 -0.00808286 -0.0745396 0 -0.00389767 -0.0373742 0 -0.0150322 0.111289 0 -0.00389767 0.0373742 0 -0.00808286 0.0745396 0 -0.0101574 0.112401 0 0.0025 -1.23787e-16 0 0.00108837 0.0377476 0 -0.00313864 0.0752844 0 -0.00313864 -0.0752844 0 0.00108837 -0.0377476 0 -0.0101574 -0.112401 0 -0.0101574 -0.112401 0.01 0.0025 -1.23787e-16 0.01 -0.00313864 -0.0752844 0.01 0.00108837 -0.0377476 0.01 0.0025 -1.23787e-16 0 -0.00313864 -0.0752844 0 0.00108837 -0.0377476 0 -0.0150322 -0.111289 0.01 -0.0101574 -0.112401 0.01 -0.0025 -1.22563e-16 0.01 -0.00808286 -0.0745396 0.01 -0.00389767 -0.0373742 0.01 -0.0150322 0.111289 0.01 -0.00389767 0.0373742 0.01 -0.00808286 0.0745396 0.01 -0.0101574 0.112401 0.01 0.0025 -1.23787e-16 0.01 0.00108837 0.0377476 0.01 -0.00313864 0.0752844 0.01 -0.00313864 -0.0752844 0.01 0.00108837 -0.0377476 0.01 -0.0150322 -0.111289 0 -0.0150322 -0.111289 0.01 -0.0025 -1.22563e-16 0.01 -0.00808286 -0.0745396 0.01 -0.00389767 -0.0373742 0.01 -0.0025 -1.22563e-16 0 -0.00808286 -0.0745396 0 -0.00389767 -0.0373742 0 -0.0025 -1.22563e-16 0 -0.0025 -1.22563e-16 0.01 -0.0150322 0.111289 0.01 -0.00389767 0.0373742 0.01 -0.00808286 0.0745396 0.01 -0.0150322 0.111289 0 -0.00389767 0.0373742 0 -0.00808286 0.0745396 0 -0.0150322 0.111289 0 -0.0101574 0.112401 0 -0.0101574 0.112401 0.01 -0.0150322 0.111289 0.01 0.0025 -1.23787e-16 0 0.0025 -1.23787e-16 0.01 -0.0101574 0.112401 0.01 0.00108837 0.0377476 0.01 -0.00313864 0.0752844 0.01 -0.0101574 0.112401 0 0.00108837 0.0377476 0 -0.00313864 0.0752844 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.015225 -0.113001 0 -0.0103503 -0.114113 0 -0.0103503 -0.114113 0.01 -0.015225 -0.113001 0.01 -0.015225 -0.113001 0 -0.0103503 -0.114113 0 -0.0025 -1.24449e-16 0 -0.00816877 -0.0756866 0 -0.00391917 -0.0379493 0 -0.015225 0.113001 0 -0.00391917 0.0379493 0 -0.00816877 0.0756866 0 -0.0103503 0.114113 0 0.0025 -1.25673e-16 0 0.00106686 0.0383227 0 -0.00322455 0.0764314 0 -0.00322455 -0.0764314 0 0.00106686 -0.0383227 0 -0.0103503 -0.114113 0 -0.0103503 -0.114113 0.01 0.0025 -1.25673e-16 0.01 -0.00322455 -0.0764314 0.01 0.00106686 -0.0383227 0.01 0.0025 -1.25673e-16 0 -0.00322455 -0.0764314 0 0.00106686 -0.0383227 0 -0.015225 -0.113001 0.01 -0.0103503 -0.114113 0.01 -0.0025 -1.24449e-16 0.01 -0.00816877 -0.0756866 0.01 -0.00391917 -0.0379493 0.01 -0.015225 0.113001 0.01 -0.00391917 0.0379493 0.01 -0.00816877 0.0756866 0.01 -0.0103503 0.114113 0.01 0.0025 -1.25673e-16 0.01 0.00106686 0.0383227 0.01 -0.00322455 0.0764314 0.01 -0.00322455 -0.0764314 0.01 0.00106686 -0.0383227 0.01 -0.015225 -0.113001 0 -0.015225 -0.113001 0.01 -0.0025 -1.24449e-16 0.01 -0.00816877 -0.0756866 0.01 -0.00391917 -0.0379493 0.01 -0.0025 -1.24449e-16 0 -0.00816877 -0.0756866 0 -0.00391917 -0.0379493 0 -0.0025 -1.24449e-16 0 -0.0025 -1.24449e-16 0.01 -0.015225 0.113001 0.01 -0.00391917 0.0379493 0.01 -0.00816877 0.0756866 0.01 -0.015225 0.113001 0 -0.00391917 0.0379493 0 -0.00816877 0.0756866 0 -0.015225 0.113001 0 -0.0103503 0.114113 0 -0.0103503 0.114113 0.01 -0.015225 0.113001 0.01 0.0025 -1.25673e-16 0 0.0025 -1.25673e-16 0.01 -0.0103503 0.114113 0.01 0.00106686 0.0383227 0.01 -0.00322455 0.0764314 0.01 -0.0103503 0.114113 0 0.00106686 0.0383227 0 -0.00322455 0.0764314 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0152626 -0.113335 0 -0.0103878 -0.114447 0 -0.0103878 -0.114447 0.01 -0.0152626 -0.113335 0.01 -0.0152626 -0.113335 0 -0.0103878 -0.114447 0 -0.0025 -1.24816e-16 0 -0.0081855 -0.0759101 0 -0.00392336 -0.0380613 0 -0.0152626 0.113335 0 -0.00392336 0.0380613 0 -0.0081855 0.0759101 0 -0.0103878 0.114447 0 0.0025 -1.26041e-16 0 0.00106267 0.0384348 0 -0.00324128 0.0766549 0 -0.00324128 -0.0766549 0 0.00106267 -0.0384348 0 -0.0103878 -0.114447 0 -0.0103878 -0.114447 0.01 0.0025 -1.26041e-16 0.01 -0.00324128 -0.0766549 0.01 0.00106267 -0.0384348 0.01 0.0025 -1.26041e-16 0 -0.00324128 -0.0766549 0 0.00106267 -0.0384348 0 -0.0152626 -0.113335 0.01 -0.0103878 -0.114447 0.01 -0.0025 -1.24816e-16 0.01 -0.0081855 -0.0759101 0.01 -0.00392336 -0.0380613 0.01 -0.0152626 0.113335 0.01 -0.00392336 0.0380613 0.01 -0.0081855 0.0759101 0.01 -0.0103878 0.114447 0.01 0.0025 -1.26041e-16 0.01 0.00106267 0.0384348 0.01 -0.00324128 0.0766549 0.01 -0.00324128 -0.0766549 0.01 0.00106267 -0.0384348 0.01 -0.0152626 -0.113335 0 -0.0152626 -0.113335 0.01 -0.0025 -1.24816e-16 0.01 -0.0081855 -0.0759101 0.01 -0.00392336 -0.0380613 0.01 -0.0025 -1.24816e-16 0 -0.0081855 -0.0759101 0 -0.00392336 -0.0380613 0 -0.0025 -1.24816e-16 0 -0.0025 -1.24816e-16 0.01 -0.0152626 0.113335 0.01 -0.00392336 0.0380613 0.01 -0.0081855 0.0759101 0.01 -0.0152626 0.113335 0 -0.00392336 0.0380613 0 -0.0081855 0.0759101 0 -0.0152626 0.113335 0 -0.0103878 0.114447 0 -0.0103878 0.114447 0.01 -0.0152626 0.113335 0.01 0.0025 -1.26041e-16 0 0.0025 -1.26041e-16 0.01 -0.0103878 0.114447 0.01 0.00106267 0.0384348 0.01 -0.00324128 0.0766549 0.01 -0.0103878 0.114447 0 0.00106267 0.0384348 0 -0.00324128 0.0766549 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0154554 -0.115047 0 -0.0105807 -0.116159 0 -0.0105807 -0.116159 0.01 -0.0154554 -0.115047 0.01 -0.0154554 -0.115047 0 -0.0105807 -0.116159 0 -0.0025 -1.26702e-16 0 -0.00827141 -0.0770571 0 -0.00394487 -0.0386364 0 -0.0154554 0.115047 0 -0.00394487 0.0386364 0 -0.00827141 0.0770571 0 -0.0105807 0.116159 0 0.0025 -1.27927e-16 0 0.00104116 0.0390099 0 -0.00332719 0.0778019 0 -0.00332719 -0.0778019 0 0.00104116 -0.0390099 0 -0.0105807 -0.116159 0 -0.0105807 -0.116159 0.01 0.0025 -1.27927e-16 0.01 -0.00332719 -0.0778019 0.01 0.00104116 -0.0390099 0.01 0.0025 -1.27927e-16 0 -0.00332719 -0.0778019 0 0.00104116 -0.0390099 0 -0.0154554 -0.115047 0.01 -0.0105807 -0.116159 0.01 -0.0025 -1.26702e-16 0.01 -0.00827141 -0.0770571 0.01 -0.00394487 -0.0386364 0.01 -0.0154554 0.115047 0.01 -0.00394487 0.0386364 0.01 -0.00827141 0.0770571 0.01 -0.0105807 0.116159 0.01 0.0025 -1.27927e-16 0.01 0.00104116 0.0390099 0.01 -0.00332719 0.0778019 0.01 -0.00332719 -0.0778019 0.01 0.00104116 -0.0390099 0.01 -0.0154554 -0.115047 0 -0.0154554 -0.115047 0.01 -0.0025 -1.26702e-16 0.01 -0.00827141 -0.0770571 0.01 -0.00394487 -0.0386364 0.01 -0.0025 -1.26702e-16 0 -0.00827141 -0.0770571 0 -0.00394487 -0.0386364 0 -0.0025 -1.26702e-16 0 -0.0025 -1.26702e-16 0.01 -0.0154554 0.115047 0.01 -0.00394487 0.0386364 0.01 -0.00827141 0.0770571 0.01 -0.0154554 0.115047 0 -0.00394487 0.0386364 0 -0.00827141 0.0770571 0 -0.0154554 0.115047 0 -0.0105807 0.116159 0 -0.0105807 0.116159 0.01 -0.0154554 0.115047 0.01 0.0025 -1.27927e-16 0 0.0025 -1.27927e-16 0.01 -0.0105807 0.116159 0.01 0.00104116 0.0390099 0.01 -0.00332719 0.0778019 0.01 -0.0105807 0.116159 0 0.00104116 0.0390099 0 -0.00332719 0.0778019 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.015493 -0.115381 0 -0.0106182 -0.116493 0 -0.0106182 -0.116493 0.01 -0.015493 -0.115381 0.01 -0.015493 -0.115381 0 -0.0106182 -0.116493 0 -0.0025 -1.27069e-16 0 -0.00828814 -0.0772805 0 -0.00394906 -0.0387485 0 -0.015493 0.115381 0 -0.00394906 0.0387485 0 -0.00828814 0.0772805 0 -0.0106182 0.116493 0 0.0025 -1.28294e-16 0 0.00103698 0.0391219 0 -0.00334393 0.0780253 0 -0.00334393 -0.0780253 0 0.00103698 -0.0391219 0 -0.0106182 -0.116493 0 -0.0106182 -0.116493 0.01 0.0025 -1.28294e-16 0.01 -0.00334393 -0.0780253 0.01 0.00103698 -0.0391219 0.01 0.0025 -1.28294e-16 0 -0.00334393 -0.0780253 0 0.00103698 -0.0391219 0 -0.015493 -0.115381 0.01 -0.0106182 -0.116493 0.01 -0.0025 -1.27069e-16 0.01 -0.00828814 -0.0772805 0.01 -0.00394906 -0.0387485 0.01 -0.015493 0.115381 0.01 -0.00394906 0.0387485 0.01 -0.00828814 0.0772805 0.01 -0.0106182 0.116493 0.01 0.0025 -1.28294e-16 0.01 0.00103698 0.0391219 0.01 -0.00334393 0.0780253 0.01 -0.00334393 -0.0780253 0.01 0.00103698 -0.0391219 0.01 -0.015493 -0.115381 0 -0.015493 -0.115381 0.01 -0.0025 -1.27069e-16 0.01 -0.00828814 -0.0772805 0.01 -0.00394906 -0.0387485 0.01 -0.0025 -1.27069e-16 0 -0.00828814 -0.0772805 0 -0.00394906 -0.0387485 0 -0.0025 -1.27069e-16 0 -0.0025 -1.27069e-16 0.01 -0.015493 0.115381 0.01 -0.00394906 0.0387485 0.01 -0.00828814 0.0772805 0.01 -0.015493 0.115381 0 -0.00394906 0.0387485 0 -0.00828814 0.0772805 0 -0.015493 0.115381 0 -0.0106182 0.116493 0 -0.0106182 0.116493 0.01 -0.015493 0.115381 0.01 0.0025 -1.28294e-16 0 0.0025 -1.28294e-16 0.01 -0.0106182 0.116493 0.01 0.00103698 0.0391219 0.01 -0.00334393 0.0780253 0.01 -0.0106182 0.116493 0 0.00103698 0.0391219 0 -0.00334393 0.0780253 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0156833 -0.117071 0 -0.0108086 -0.118183 0 -0.0108086 -0.118183 0.01 -0.0156833 -0.117071 0.01 -0.0156833 -0.117071 0 -0.0108086 -0.118183 0 -0.0025 -1.28931e-16 0 -0.00837293 -0.0784126 0 -0.00397029 -0.0393161 0 -0.0156833 0.117071 0 -0.00397029 0.0393161 0 -0.00837293 0.0784126 0 -0.0108086 0.118183 0 0.0025 -1.30155e-16 0 0.00101575 0.0396896 0 -0.00342872 0.0791574 0 -0.00342872 -0.0791574 0 0.00101575 -0.0396896 0 -0.0108086 -0.118183 0 -0.0108086 -0.118183 0.01 0.0025 -1.30155e-16 0.01 -0.00342872 -0.0791574 0.01 0.00101575 -0.0396896 0.01 0.0025 -1.30155e-16 0 -0.00342872 -0.0791574 0 0.00101575 -0.0396896 0 -0.0156833 -0.117071 0.01 -0.0108086 -0.118183 0.01 -0.0025 -1.28931e-16 0.01 -0.00837293 -0.0784126 0.01 -0.00397029 -0.0393161 0.01 -0.0156833 0.117071 0.01 -0.00397029 0.0393161 0.01 -0.00837293 0.0784126 0.01 -0.0108086 0.118183 0.01 0.0025 -1.30155e-16 0.01 0.00101575 0.0396896 0.01 -0.00342872 0.0791574 0.01 -0.00342872 -0.0791574 0.01 0.00101575 -0.0396896 0.01 -0.0156833 -0.117071 0 -0.0156833 -0.117071 0.01 -0.0025 -1.28931e-16 0.01 -0.00837293 -0.0784126 0.01 -0.00397029 -0.0393161 0.01 -0.0025 -1.28931e-16 0 -0.00837293 -0.0784126 0 -0.00397029 -0.0393161 0 -0.0025 -1.28931e-16 0 -0.0025 -1.28931e-16 0.01 -0.0156833 0.117071 0.01 -0.00397029 0.0393161 0.01 -0.00837293 0.0784126 0.01 -0.0156833 0.117071 0 -0.00397029 0.0393161 0 -0.00837293 0.0784126 0 -0.0156833 0.117071 0 -0.0108086 0.118183 0 -0.0108086 0.118183 0.01 -0.0156833 0.117071 0.01 0.0025 -1.30155e-16 0 0.0025 -1.30155e-16 0.01 -0.0108086 0.118183 0.01 0.00101575 0.0396896 0.01 -0.00342872 0.0791574 0.01 -0.0108086 0.118183 0 0.00101575 0.0396896 0 -0.00342872 0.0791574 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0157234 -0.117427 0 -0.0108486 -0.118539 0 -0.0108486 -0.118539 0.01 -0.0157234 -0.117427 0.01 -0.0157234 -0.117427 0 -0.0108486 -0.118539 0 -0.0025 -1.29323e-16 0 -0.00839079 -0.0786509 0 -0.00397476 -0.0394356 0 -0.0157234 0.117427 0 -0.00397476 0.0394356 0 -0.00839079 0.0786509 0 -0.0108486 0.118539 0 0.0025 -1.30547e-16 0 0.00101128 0.0398091 0 -0.00344657 0.0793957 0 -0.00344657 -0.0793957 0 0.00101128 -0.0398091 0 -0.0108486 -0.118539 0 -0.0108486 -0.118539 0.01 0.0025 -1.30547e-16 0.01 -0.00344657 -0.0793957 0.01 0.00101128 -0.0398091 0.01 0.0025 -1.30547e-16 0 -0.00344657 -0.0793957 0 0.00101128 -0.0398091 0 -0.0157234 -0.117427 0.01 -0.0108486 -0.118539 0.01 -0.0025 -1.29323e-16 0.01 -0.00839079 -0.0786509 0.01 -0.00397476 -0.0394356 0.01 -0.0157234 0.117427 0.01 -0.00397476 0.0394356 0.01 -0.00839079 0.0786509 0.01 -0.0108486 0.118539 0.01 0.0025 -1.30547e-16 0.01 0.00101128 0.0398091 0.01 -0.00344657 0.0793957 0.01 -0.00344657 -0.0793957 0.01 0.00101128 -0.0398091 0.01 -0.0157234 -0.117427 0 -0.0157234 -0.117427 0.01 -0.0025 -1.29323e-16 0.01 -0.00839079 -0.0786509 0.01 -0.00397476 -0.0394356 0.01 -0.0025 -1.29323e-16 0 -0.00839079 -0.0786509 0 -0.00397476 -0.0394356 0 -0.0025 -1.29323e-16 0 -0.0025 -1.29323e-16 0.01 -0.0157234 0.117427 0.01 -0.00397476 0.0394356 0.01 -0.00839079 0.0786509 0.01 -0.0157234 0.117427 0 -0.00397476 0.0394356 0 -0.00839079 0.0786509 0 -0.0157234 0.117427 0 -0.0108486 0.118539 0 -0.0108486 0.118539 0.01 -0.0157234 0.117427 0.01 0.0025 -1.30547e-16 0 0.0025 -1.30547e-16 0.01 -0.0108486 0.118539 0.01 0.00101128 0.0398091 0.01 -0.00344657 0.0793957 0.01 -0.0108486 0.118539 0 0.00101128 0.0398091 0 -0.00344657 0.0793957 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0159138 -0.119117 0 -0.011039 -0.120229 0 -0.011039 -0.120229 0.01 -0.0159138 -0.119117 0.01 -0.0159138 -0.119117 0 -0.011039 -0.120229 0 -0.0025 -1.31184e-16 0 -0.00847558 -0.079783 0 -0.00399598 -0.0400032 0 -0.0159138 0.119117 0 -0.00399598 0.0400032 0 -0.00847558 0.079783 0 -0.011039 0.120229 0 0.0025 -1.32409e-16 0 0.000990051 0.0403767 0 -0.00353136 0.0805278 0 -0.00353136 -0.0805278 0 0.000990051 -0.0403767 0 -0.011039 -0.120229 0 -0.011039 -0.120229 0.01 0.0025 -1.32409e-16 0.01 -0.00353136 -0.0805278 0.01 0.000990051 -0.0403767 0.01 0.0025 -1.32409e-16 0 -0.00353136 -0.0805278 0 0.000990051 -0.0403767 0 -0.0159138 -0.119117 0.01 -0.011039 -0.120229 0.01 -0.0025 -1.31184e-16 0.01 -0.00847558 -0.079783 0.01 -0.00399598 -0.0400032 0.01 -0.0159138 0.119117 0.01 -0.00399598 0.0400032 0.01 -0.00847558 0.079783 0.01 -0.011039 0.120229 0.01 0.0025 -1.32409e-16 0.01 0.000990051 0.0403767 0.01 -0.00353136 0.0805278 0.01 -0.00353136 -0.0805278 0.01 0.000990051 -0.0403767 0.01 -0.0159138 -0.119117 0 -0.0159138 -0.119117 0.01 -0.0025 -1.31184e-16 0.01 -0.00847558 -0.079783 0.01 -0.00399598 -0.0400032 0.01 -0.0025 -1.31184e-16 0 -0.00847558 -0.079783 0 -0.00399598 -0.0400032 0 -0.0025 -1.31184e-16 0 -0.0025 -1.31184e-16 0.01 -0.0159138 0.119117 0.01 -0.00399598 0.0400032 0.01 -0.00847558 0.079783 0.01 -0.0159138 0.119117 0 -0.00399598 0.0400032 0 -0.00847558 0.079783 0 -0.0159138 0.119117 0 -0.011039 0.120229 0 -0.011039 0.120229 0.01 -0.0159138 0.119117 0.01 0.0025 -1.32409e-16 0 0.0025 -1.32409e-16 0.01 -0.011039 0.120229 0.01 0.000990051 0.0403767 0.01 -0.00353136 0.0805278 0.01 -0.011039 0.120229 0 0.000990051 0.0403767 0 -0.00353136 0.0805278 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0159513 -0.119451 0 -0.0110765 -0.120563 0 -0.0110765 -0.120563 0.01 -0.0159513 -0.119451 0.01 -0.0159513 -0.119451 0 -0.0110765 -0.120563 0 -0.0025 -1.31552e-16 0 -0.00849231 -0.0800065 0 -0.00400017 -0.0401153 0 -0.0159513 0.119451 0 -0.00400017 0.0401153 0 -0.00849231 0.0800065 0 -0.0110765 0.120563 0 0.0025 -1.32776e-16 0 0.000985861 0.0404887 0 -0.0035481 0.0807513 0 -0.0035481 -0.0807513 0 0.000985861 -0.0404887 0 -0.0110765 -0.120563 0 -0.0110765 -0.120563 0.01 0.0025 -1.32776e-16 0.01 -0.0035481 -0.0807513 0.01 0.000985861 -0.0404887 0.01 0.0025 -1.32776e-16 0 -0.0035481 -0.0807513 0 0.000985861 -0.0404887 0 -0.0159513 -0.119451 0.01 -0.0110765 -0.120563 0.01 -0.0025 -1.31552e-16 0.01 -0.00849231 -0.0800065 0.01 -0.00400017 -0.0401153 0.01 -0.0159513 0.119451 0.01 -0.00400017 0.0401153 0.01 -0.00849231 0.0800065 0.01 -0.0110765 0.120563 0.01 0.0025 -1.32776e-16 0.01 0.000985861 0.0404887 0.01 -0.0035481 0.0807513 0.01 -0.0035481 -0.0807513 0.01 0.000985861 -0.0404887 0.01 -0.0159513 -0.119451 0 -0.0159513 -0.119451 0.01 -0.0025 -1.31552e-16 0.01 -0.00849231 -0.0800065 0.01 -0.00400017 -0.0401153 0.01 -0.0025 -1.31552e-16 0 -0.00849231 -0.0800065 0 -0.00400017 -0.0401153 0 -0.0025 -1.31552e-16 0 -0.0025 -1.31552e-16 0.01 -0.0159513 0.119451 0.01 -0.00400017 0.0401153 0.01 -0.00849231 0.0800065 0.01 -0.0159513 0.119451 0 -0.00400017 0.0401153 0 -0.00849231 0.0800065 0 -0.0159513 0.119451 0 -0.0110765 0.120563 0 -0.0110765 0.120563 0.01 -0.0159513 0.119451 0.01 0.0025 -1.32776e-16 0 0.0025 -1.32776e-16 0.01 -0.0110765 0.120563 0.01 0.000985861 0.0404887 0.01 -0.0035481 0.0807513 0.01 -0.0110765 0.120563 0 0.000985861 0.0404887 0 -0.0035481 0.0807513 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0140755 -0.102793 0 -0.00920072 -0.103905 0 -0.00920072 -0.103905 0.01 -0.0140755 -0.102793 0.01 -0.0140755 -0.102793 0 -0.00920072 -0.103905 0 -0.0025 -1.13206e-16 0 -0.00765667 -0.0688494 0 -0.00379097 -0.0345211 0 -0.0140755 0.102793 0 -0.00379097 0.0345211 0 -0.00765667 0.0688494 0 -0.00920072 0.103905 0 0.0025 -1.14431e-16 0 0.00119506 0.0348945 0 -0.00271245 0.0695942 0 -0.00271245 -0.0695942 0 0.00119506 -0.0348945 0 -0.00920072 -0.103905 0 -0.00920072 -0.103905 0.01 0.0025 -1.14431e-16 0.01 -0.00271245 -0.0695942 0.01 0.00119506 -0.0348945 0.01 0.0025 -1.14431e-16 0 -0.00271245 -0.0695942 0 0.00119506 -0.0348945 0 -0.0140755 -0.102793 0.01 -0.00920072 -0.103905 0.01 -0.0025 -1.13206e-16 0.01 -0.00765667 -0.0688494 0.01 -0.00379097 -0.0345211 0.01 -0.0140755 0.102793 0.01 -0.00379097 0.0345211 0.01 -0.00765667 0.0688494 0.01 -0.00920072 0.103905 0.01 0.0025 -1.14431e-16 0.01 0.00119506 0.0348945 0.01 -0.00271245 0.0695942 0.01 -0.00271245 -0.0695942 0.01 0.00119506 -0.0348945 0.01 -0.0140755 -0.102793 0 -0.0140755 -0.102793 0.01 -0.0025 -1.13206e-16 0.01 -0.00765667 -0.0688494 0.01 -0.00379097 -0.0345211 0.01 -0.0025 -1.13206e-16 0 -0.00765667 -0.0688494 0 -0.00379097 -0.0345211 0 -0.0025 -1.13206e-16 0 -0.0025 -1.13206e-16 0.01 -0.0140755 0.102793 0.01 -0.00379097 0.0345211 0.01 -0.00765667 0.0688494 0.01 -0.0140755 0.102793 0 -0.00379097 0.0345211 0 -0.00765667 0.0688494 0 -0.0140755 0.102793 0 -0.00920072 0.103905 0 -0.00920072 0.103905 0.01 -0.0140755 0.102793 0.01 0.0025 -1.14431e-16 0 0.0025 -1.14431e-16 0.01 -0.00920072 0.103905 0.01 0.00119506 0.0348945 0.01 -0.00271245 0.0695942 0.01 -0.00920072 0.103905 0 0.00119506 0.0348945 0 -0.00271245 0.0695942 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0141156 -0.103149 0 -0.00924079 -0.104261 0 -0.00924079 -0.104261 0.01 -0.0141156 -0.103149 0.01 -0.0141156 -0.103149 0 -0.00924079 -0.104261 0 -0.0025 -1.13598e-16 0 -0.00767452 -0.0690877 0 -0.00379544 -0.0346406 0 -0.0141156 0.103149 0 -0.00379544 0.0346406 0 -0.00767452 0.0690877 0 -0.00924079 0.104261 0 0.0025 -1.14823e-16 0 0.0011906 0.035014 0 -0.0027303 0.0698325 0 -0.0027303 -0.0698325 0 0.0011906 -0.035014 0 -0.00924079 -0.104261 0 -0.00924079 -0.104261 0.01 0.0025 -1.14823e-16 0.01 -0.0027303 -0.0698325 0.01 0.0011906 -0.035014 0.01 0.0025 -1.14823e-16 0 -0.0027303 -0.0698325 0 0.0011906 -0.035014 0 -0.0141156 -0.103149 0.01 -0.00924079 -0.104261 0.01 -0.0025 -1.13598e-16 0.01 -0.00767452 -0.0690877 0.01 -0.00379544 -0.0346406 0.01 -0.0141156 0.103149 0.01 -0.00379544 0.0346406 0.01 -0.00767452 0.0690877 0.01 -0.00924079 0.104261 0.01 0.0025 -1.14823e-16 0.01 0.0011906 0.035014 0.01 -0.0027303 0.0698325 0.01 -0.0027303 -0.0698325 0.01 0.0011906 -0.035014 0.01 -0.0141156 -0.103149 0 -0.0141156 -0.103149 0.01 -0.0025 -1.13598e-16 0.01 -0.00767452 -0.0690877 0.01 -0.00379544 -0.0346406 0.01 -0.0025 -1.13598e-16 0 -0.00767452 -0.0690877 0 -0.00379544 -0.0346406 0 -0.0025 -1.13598e-16 0 -0.0025 -1.13598e-16 0.01 -0.0141156 0.103149 0.01 -0.00379544 0.0346406 0.01 -0.00767452 0.0690877 0.01 -0.0141156 0.103149 0 -0.00379544 0.0346406 0 -0.00767452 0.0690877 0 -0.0141156 0.103149 0 -0.00924079 0.104261 0 -0.00924079 0.104261 0.01 -0.0141156 0.103149 0.01 0.0025 -1.14823e-16 0 0.0025 -1.14823e-16 0.01 -0.00924079 0.104261 0.01 0.0011906 0.035014 0.01 -0.0027303 0.0698325 0.01 -0.00924079 0.104261 0 0.0011906 0.035014 0 -0.0027303 0.0698325 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0143059 -0.104839 0 -0.00943113 -0.105951 0 -0.00943113 -0.105951 0.01 -0.0143059 -0.104839 0.01 -0.0143059 -0.104839 0 -0.00943113 -0.105951 0 -0.0025 -1.1546e-16 0 -0.00775931 -0.0702198 0 -0.00381667 -0.0352082 0 -0.0143059 0.104839 0 -0.00381667 0.0352082 0 -0.00775931 0.0702198 0 -0.00943113 0.105951 0 0.0025 -1.16684e-16 0 0.00116937 0.0355817 0 -0.00281509 0.0709646 0 -0.00281509 -0.0709646 0 0.00116937 -0.0355817 0 -0.00943113 -0.105951 0 -0.00943113 -0.105951 0.01 0.0025 -1.16684e-16 0.01 -0.00281509 -0.0709646 0.01 0.00116937 -0.0355817 0.01 0.0025 -1.16684e-16 0 -0.00281509 -0.0709646 0 0.00116937 -0.0355817 0 -0.0143059 -0.104839 0.01 -0.00943113 -0.105951 0.01 -0.0025 -1.1546e-16 0.01 -0.00775931 -0.0702198 0.01 -0.00381667 -0.0352082 0.01 -0.0143059 0.104839 0.01 -0.00381667 0.0352082 0.01 -0.00775931 0.0702198 0.01 -0.00943113 0.105951 0.01 0.0025 -1.16684e-16 0.01 0.00116937 0.0355817 0.01 -0.00281509 0.0709646 0.01 -0.00281509 -0.0709646 0.01 0.00116937 -0.0355817 0.01 -0.0143059 -0.104839 0 -0.0143059 -0.104839 0.01 -0.0025 -1.1546e-16 0.01 -0.00775931 -0.0702198 0.01 -0.00381667 -0.0352082 0.01 -0.0025 -1.1546e-16 0 -0.00775931 -0.0702198 0 -0.00381667 -0.0352082 0 -0.0025 -1.1546e-16 0 -0.0025 -1.1546e-16 0.01 -0.0143059 0.104839 0.01 -0.00381667 0.0352082 0.01 -0.00775931 0.0702198 0.01 -0.0143059 0.104839 0 -0.00381667 0.0352082 0 -0.00775931 0.0702198 0 -0.0143059 0.104839 0 -0.00943113 0.105951 0 -0.00943113 0.105951 0.01 -0.0143059 0.104839 0.01 0.0025 -1.16684e-16 0 0.0025 -1.16684e-16 0.01 -0.00943113 0.105951 0.01 0.00116937 0.0355817 0.01 -0.00281509 0.0709646 0.01 -0.00943113 0.105951 0 0.00116937 0.0355817 0 -0.00281509 0.0709646 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0143435 -0.105173 0 -0.0094687 -0.106285 0 -0.0094687 -0.106285 0.01 -0.0143435 -0.105173 0.01 -0.0143435 -0.105173 0 -0.0094687 -0.106285 0 -0.0025 -1.15827e-16 0 -0.00777605 -0.0704432 0 -0.00382086 -0.0353203 0 -0.0143435 0.105173 0 -0.00382086 0.0353203 0 -0.00777605 0.0704432 0 -0.0094687 0.106285 0 0.0025 -1.17052e-16 0 0.00116518 0.0356937 0 -0.00283183 0.071188 0 -0.00283183 -0.071188 0 0.00116518 -0.0356937 0 -0.0094687 -0.106285 0 -0.0094687 -0.106285 0.01 0.0025 -1.17052e-16 0.01 -0.00283183 -0.071188 0.01 0.00116518 -0.0356937 0.01 0.0025 -1.17052e-16 0 -0.00283183 -0.071188 0 0.00116518 -0.0356937 0 -0.0143435 -0.105173 0.01 -0.0094687 -0.106285 0.01 -0.0025 -1.15827e-16 0.01 -0.00777605 -0.0704432 0.01 -0.00382086 -0.0353203 0.01 -0.0143435 0.105173 0.01 -0.00382086 0.0353203 0.01 -0.00777605 0.0704432 0.01 -0.0094687 0.106285 0.01 0.0025 -1.17052e-16 0.01 0.00116518 0.0356937 0.01 -0.00283183 0.071188 0.01 -0.00283183 -0.071188 0.01 0.00116518 -0.0356937 0.01 -0.0143435 -0.105173 0 -0.0143435 -0.105173 0.01 -0.0025 -1.15827e-16 0.01 -0.00777605 -0.0704432 0.01 -0.00382086 -0.0353203 0.01 -0.0025 -1.15827e-16 0 -0.00777605 -0.0704432 0 -0.00382086 -0.0353203 0 -0.0025 -1.15827e-16 0 -0.0025 -1.15827e-16 0.01 -0.0143435 0.105173 0.01 -0.00382086 0.0353203 0.01 -0.00777605 0.0704432 0.01 -0.0143435 0.105173 0 -0.00382086 0.0353203 0 -0.00777605 0.0704432 0 -0.0143435 0.105173 0 -0.0094687 0.106285 0 -0.0094687 0.106285 0.01 -0.0143435 0.105173 0.01 0.0025 -1.17052e-16 0 0.0025 -1.17052e-16 0.01 -0.0094687 0.106285 0.01 0.00116518 0.0356937 0.01 -0.00283183 0.071188 0.01 -0.0094687 0.106285 0 0.00116518 0.0356937 0 -0.00283183 0.071188 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145363 -0.106885 0 -0.00966154 -0.107997 0 -0.00966154 -0.107997 0.01 -0.0145363 -0.106885 0.01 -0.0145363 -0.106885 0 -0.00966154 -0.107997 0 -0.0025 -1.17713e-16 0 -0.00786195 -0.0715902 0 -0.00384236 -0.0358954 0 -0.0145363 0.106885 0 -0.00384236 0.0358954 0 -0.00786195 0.0715902 0 -0.00966154 0.107997 0 0.0025 -1.18938e-16 0 0.00114367 0.0362688 0 -0.00291774 0.072335 0 -0.00291774 -0.072335 0 0.00114367 -0.0362688 0 -0.00966154 -0.107997 0 -0.00966154 -0.107997 0.01 0.0025 -1.18938e-16 0.01 -0.00291774 -0.072335 0.01 0.00114367 -0.0362688 0.01 0.0025 -1.18938e-16 0 -0.00291774 -0.072335 0 0.00114367 -0.0362688 0 -0.0145363 -0.106885 0.01 -0.00966154 -0.107997 0.01 -0.0025 -1.17713e-16 0.01 -0.00786195 -0.0715902 0.01 -0.00384236 -0.0358954 0.01 -0.0145363 0.106885 0.01 -0.00384236 0.0358954 0.01 -0.00786195 0.0715902 0.01 -0.00966154 0.107997 0.01 0.0025 -1.18938e-16 0.01 0.00114367 0.0362688 0.01 -0.00291774 0.072335 0.01 -0.00291774 -0.072335 0.01 0.00114367 -0.0362688 0.01 -0.0145363 -0.106885 0 -0.0145363 -0.106885 0.01 -0.0025 -1.17713e-16 0.01 -0.00786195 -0.0715902 0.01 -0.00384236 -0.0358954 0.01 -0.0025 -1.17713e-16 0 -0.00786195 -0.0715902 0 -0.00384236 -0.0358954 0 -0.0025 -1.17713e-16 0 -0.0025 -1.17713e-16 0.01 -0.0145363 0.106885 0.01 -0.00384236 0.0358954 0.01 -0.00786195 0.0715902 0.01 -0.0145363 0.106885 0 -0.00384236 0.0358954 0 -0.00786195 0.0715902 0 -0.0145363 0.106885 0 -0.00966154 0.107997 0 -0.00966154 0.107997 0.01 -0.0145363 0.106885 0.01 0.0025 -1.18938e-16 0 0.0025 -1.18938e-16 0.01 -0.00966154 0.107997 0.01 0.00114367 0.0362688 0.01 -0.00291774 0.072335 0.01 -0.00966154 0.107997 0 0.00114367 0.0362688 0 -0.00291774 0.072335 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145739 -0.107219 0 -0.00969911 -0.108331 0 -0.00969911 -0.108331 0.01 -0.0145739 -0.107219 0.01 -0.0145739 -0.107219 0 -0.00969911 -0.108331 0 -0.0025 -1.1808e-16 0 -0.00787869 -0.0718137 0 -0.00384655 -0.0360074 0 -0.0145739 0.107219 0 -0.00384655 0.0360074 0 -0.00787869 0.0718137 0 -0.00969911 0.108331 0 0.0025 -1.19305e-16 0 0.00113948 0.0363808 0 -0.00293447 0.0725585 0 -0.00293447 -0.0725585 0 0.00113948 -0.0363808 0 -0.00969911 -0.108331 0 -0.00969911 -0.108331 0.01 0.0025 -1.19305e-16 0.01 -0.00293447 -0.0725585 0.01 0.00113948 -0.0363808 0.01 0.0025 -1.19305e-16 0 -0.00293447 -0.0725585 0 0.00113948 -0.0363808 0 -0.0145739 -0.107219 0.01 -0.00969911 -0.108331 0.01 -0.0025 -1.1808e-16 0.01 -0.00787869 -0.0718137 0.01 -0.00384655 -0.0360074 0.01 -0.0145739 0.107219 0.01 -0.00384655 0.0360074 0.01 -0.00787869 0.0718137 0.01 -0.00969911 0.108331 0.01 0.0025 -1.19305e-16 0.01 0.00113948 0.0363808 0.01 -0.00293447 0.0725585 0.01 -0.00293447 -0.0725585 0.01 0.00113948 -0.0363808 0.01 -0.0145739 -0.107219 0 -0.0145739 -0.107219 0.01 -0.0025 -1.1808e-16 0.01 -0.00787869 -0.0718137 0.01 -0.00384655 -0.0360074 0.01 -0.0025 -1.1808e-16 0 -0.00787869 -0.0718137 0 -0.00384655 -0.0360074 0 -0.0025 -1.1808e-16 0 -0.0025 -1.1808e-16 0.01 -0.0145739 0.107219 0.01 -0.00384655 0.0360074 0.01 -0.00787869 0.0718137 0.01 -0.0145739 0.107219 0 -0.00384655 0.0360074 0 -0.00787869 0.0718137 0 -0.0145739 0.107219 0 -0.00969911 0.108331 0 -0.00969911 0.108331 0.01 -0.0145739 0.107219 0.01 0.0025 -1.19305e-16 0 0.0025 -1.19305e-16 0.01 -0.00969911 0.108331 0.01 0.00113948 0.0363808 0.01 -0.00293447 0.0725585 0.01 -0.00969911 0.108331 0 0.00113948 0.0363808 0 -0.00293447 0.0725585 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0147667 -0.108931 0 -0.00989195 -0.110043 0 -0.00989195 -0.110043 0.01 -0.0147667 -0.108931 0.01 -0.0147667 -0.108931 0 -0.00989195 -0.110043 0 -0.0025 -1.19966e-16 0 -0.0079646 -0.0729606 0 -0.00386806 -0.0365825 0 -0.0147667 0.108931 0 -0.00386806 0.0365825 0 -0.0079646 0.0729606 0 -0.00989195 0.110043 0 0.0025 -1.21191e-16 0 0.00111797 0.0369559 0 -0.00302038 0.0737054 0 -0.00302038 -0.0737054 0 0.00111797 -0.0369559 0 -0.00989195 -0.110043 0 -0.00989195 -0.110043 0.01 0.0025 -1.21191e-16 0.01 -0.00302038 -0.0737054 0.01 0.00111797 -0.0369559 0.01 0.0025 -1.21191e-16 0 -0.00302038 -0.0737054 0 0.00111797 -0.0369559 0 -0.0147667 -0.108931 0.01 -0.00989195 -0.110043 0.01 -0.0025 -1.19966e-16 0.01 -0.0079646 -0.0729606 0.01 -0.00386806 -0.0365825 0.01 -0.0147667 0.108931 0.01 -0.00386806 0.0365825 0.01 -0.0079646 0.0729606 0.01 -0.00989195 0.110043 0.01 0.0025 -1.21191e-16 0.01 0.00111797 0.0369559 0.01 -0.00302038 0.0737054 0.01 -0.00302038 -0.0737054 0.01 0.00111797 -0.0369559 0.01 -0.0147667 -0.108931 0 -0.0147667 -0.108931 0.01 -0.0025 -1.19966e-16 0.01 -0.0079646 -0.0729606 0.01 -0.00386806 -0.0365825 0.01 -0.0025 -1.19966e-16 0 -0.0079646 -0.0729606 0 -0.00386806 -0.0365825 0 -0.0025 -1.19966e-16 0 -0.0025 -1.19966e-16 0.01 -0.0147667 0.108931 0.01 -0.00386806 0.0365825 0.01 -0.0079646 0.0729606 0.01 -0.0147667 0.108931 0 -0.00386806 0.0365825 0 -0.0079646 0.0729606 0 -0.0147667 0.108931 0 -0.00989195 0.110043 0 -0.00989195 0.110043 0.01 -0.0147667 0.108931 0.01 0.0025 -1.21191e-16 0 0.0025 -1.21191e-16 0.01 -0.00989195 0.110043 0.01 0.00111797 0.0369559 0.01 -0.00302038 0.0737054 0.01 -0.00989195 0.110043 0 0.00111797 0.0369559 0 -0.00302038 0.0737054 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0148043 -0.109265 0 -0.00992951 -0.110377 0 -0.00992951 -0.110377 0.01 -0.0148043 -0.109265 0.01 -0.0148043 -0.109265 0 -0.00992951 -0.110377 0 -0.0025 -1.20334e-16 0 -0.00798133 -0.0731841 0 -0.00387225 -0.0366945 0 -0.0148043 0.109265 0 -0.00387225 0.0366945 0 -0.00798133 0.0731841 0 -0.00992951 0.110377 0 0.0025 -1.21558e-16 0 0.00111379 0.037068 0 -0.00303711 0.0739289 0 -0.00303711 -0.0739289 0 0.00111379 -0.037068 0 -0.00992951 -0.110377 0 -0.00992951 -0.110377 0.01 0.0025 -1.21558e-16 0.01 -0.00303711 -0.0739289 0.01 0.00111379 -0.037068 0.01 0.0025 -1.21558e-16 0 -0.00303711 -0.0739289 0 0.00111379 -0.037068 0 -0.0148043 -0.109265 0.01 -0.00992951 -0.110377 0.01 -0.0025 -1.20334e-16 0.01 -0.00798133 -0.0731841 0.01 -0.00387225 -0.0366945 0.01 -0.0148043 0.109265 0.01 -0.00387225 0.0366945 0.01 -0.00798133 0.0731841 0.01 -0.00992951 0.110377 0.01 0.0025 -1.21558e-16 0.01 0.00111379 0.037068 0.01 -0.00303711 0.0739289 0.01 -0.00303711 -0.0739289 0.01 0.00111379 -0.037068 0.01 -0.0148043 -0.109265 0 -0.0148043 -0.109265 0.01 -0.0025 -1.20334e-16 0.01 -0.00798133 -0.0731841 0.01 -0.00387225 -0.0366945 0.01 -0.0025 -1.20334e-16 0 -0.00798133 -0.0731841 0 -0.00387225 -0.0366945 0 -0.0025 -1.20334e-16 0 -0.0025 -1.20334e-16 0.01 -0.0148043 0.109265 0.01 -0.00387225 0.0366945 0.01 -0.00798133 0.0731841 0.01 -0.0148043 0.109265 0 -0.00387225 0.0366945 0 -0.00798133 0.0731841 0 -0.0148043 0.109265 0 -0.00992951 0.110377 0 -0.00992951 0.110377 0.01 -0.0148043 0.109265 0.01 0.0025 -1.21558e-16 0 0.0025 -1.21558e-16 0.01 -0.00992951 0.110377 0.01 0.00111379 0.037068 0.01 -0.00303711 0.0739289 0.01 -0.00992951 0.110377 0 0.00111379 0.037068 0 -0.00303711 0.0739289 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.017742 -0.135352 0 -0.0128672 -0.136464 0 -0.0128672 -0.136464 0.01 -0.017742 -0.135352 0.01 -0.017742 -0.135352 0 -0.0128672 -0.136464 0 -0.0025 -1.49064e-16 0 -0.00929002 -0.0906571 0 -0.00419988 -0.0454555 0 -0.017742 0.135352 0 -0.00419988 0.0454555 0 -0.00929002 0.0906571 0 -0.0128672 0.136464 0 0.0025 -1.50289e-16 0 0.000786155 0.045829 0 -0.00434581 0.0914019 0 -0.00434581 -0.0914019 0 0.000786155 -0.045829 0 -0.0128672 -0.136464 0 -0.0128672 -0.136464 0.01 0.0025 -1.50289e-16 0.01 -0.00434581 -0.0914019 0.01 0.000786155 -0.045829 0.01 0.0025 -1.50289e-16 0 -0.00434581 -0.0914019 0 0.000786155 -0.045829 0 -0.017742 -0.135352 0.01 -0.0128672 -0.136464 0.01 -0.0025 -1.49064e-16 0.01 -0.00929002 -0.0906571 0.01 -0.00419988 -0.0454555 0.01 -0.017742 0.135352 0.01 -0.00419988 0.0454555 0.01 -0.00929002 0.0906571 0.01 -0.0128672 0.136464 0.01 0.0025 -1.50289e-16 0.01 0.000786155 0.045829 0.01 -0.00434581 0.0914019 0.01 -0.00434581 -0.0914019 0.01 0.000786155 -0.045829 0.01 -0.017742 -0.135352 0 -0.017742 -0.135352 0.01 -0.0025 -1.49064e-16 0.01 -0.00929002 -0.0906571 0.01 -0.00419988 -0.0454555 0.01 -0.0025 -1.49064e-16 0 -0.00929002 -0.0906571 0 -0.00419988 -0.0454555 0 -0.0025 -1.49064e-16 0 -0.0025 -1.49064e-16 0.01 -0.017742 0.135352 0.01 -0.00419988 0.0454555 0.01 -0.00929002 0.0906571 0.01 -0.017742 0.135352 0 -0.00419988 0.0454555 0 -0.00929002 0.0906571 0 -0.017742 0.135352 0 -0.0128672 0.136464 0 -0.0128672 0.136464 0.01 -0.017742 0.135352 0.01 0.0025 -1.50289e-16 0 0.0025 -1.50289e-16 0.01 -0.0128672 0.136464 0.01 0.000786155 0.045829 0.01 -0.00434581 0.0914019 0.01 -0.0128672 0.136464 0 0.000786155 0.045829 0 -0.00434581 0.0914019 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.017762 -0.13553 0 -0.0128873 -0.136642 0 -0.0128873 -0.136642 0.01 -0.017762 -0.13553 0.01 -0.017762 -0.13553 0 -0.0128873 -0.136642 0 -0.0025 -1.4926e-16 0 -0.00929895 -0.0907763 0 -0.00420211 -0.0455153 0 -0.017762 0.13553 0 -0.00420211 0.0455153 0 -0.00929895 0.0907763 0 -0.0128873 0.136642 0 0.0025 -1.50485e-16 0 0.00078392 0.0458887 0 -0.00435473 0.0915211 0 -0.00435473 -0.0915211 0 0.00078392 -0.0458887 0 -0.0128873 -0.136642 0 -0.0128873 -0.136642 0.01 0.0025 -1.50485e-16 0.01 -0.00435473 -0.0915211 0.01 0.00078392 -0.0458887 0.01 0.0025 -1.50485e-16 0 -0.00435473 -0.0915211 0 0.00078392 -0.0458887 0 -0.017762 -0.13553 0.01 -0.0128873 -0.136642 0.01 -0.0025 -1.4926e-16 0.01 -0.00929895 -0.0907763 0.01 -0.00420211 -0.0455153 0.01 -0.017762 0.13553 0.01 -0.00420211 0.0455153 0.01 -0.00929895 0.0907763 0.01 -0.0128873 0.136642 0.01 0.0025 -1.50485e-16 0.01 0.00078392 0.0458887 0.01 -0.00435473 0.0915211 0.01 -0.00435473 -0.0915211 0.01 0.00078392 -0.0458887 0.01 -0.017762 -0.13553 0 -0.017762 -0.13553 0.01 -0.0025 -1.4926e-16 0.01 -0.00929895 -0.0907763 0.01 -0.00420211 -0.0455153 0.01 -0.0025 -1.4926e-16 0 -0.00929895 -0.0907763 0 -0.00420211 -0.0455153 0 -0.0025 -1.4926e-16 0 -0.0025 -1.4926e-16 0.01 -0.017762 0.13553 0.01 -0.00420211 0.0455153 0.01 -0.00929895 0.0907763 0.01 -0.017762 0.13553 0 -0.00420211 0.0455153 0 -0.00929895 0.0907763 0 -0.017762 0.13553 0 -0.0128873 0.136642 0 -0.0128873 0.136642 0.01 -0.017762 0.13553 0.01 0.0025 -1.50485e-16 0 0.0025 -1.50485e-16 0.01 -0.0128873 0.136642 0.01 0.00078392 0.0458887 0.01 -0.00435473 0.0915211 0.01 -0.0128873 0.136642 0 0.00078392 0.0458887 0 -0.00435473 0.0915211 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0188465 -0.14516 0 -0.0139717 -0.146272 0 -0.0139717 -0.146272 0.01 -0.0188465 -0.14516 0.01 -0.0188465 -0.14516 0 -0.0139717 -0.146272 0 -0.0025 -1.59865e-16 0 -0.00978204 -0.0972262 0 -0.00432306 -0.0487493 0 -0.0188465 0.14516 0 -0.00432306 0.0487493 0 -0.00978204 0.0972262 0 -0.0139717 0.146272 0 0.0025 -1.6109e-16 0 0.000662979 0.0491227 0 -0.00483782 0.097971 0 -0.00483782 -0.097971 0 0.000662979 -0.0491227 0 -0.0139717 -0.146272 0 -0.0139717 -0.146272 0.01 0.0025 -1.6109e-16 0.01 -0.00483782 -0.097971 0.01 0.000662979 -0.0491227 0.01 0.0025 -1.6109e-16 0 -0.00483782 -0.097971 0 0.000662979 -0.0491227 0 -0.0188465 -0.14516 0.01 -0.0139717 -0.146272 0.01 -0.0025 -1.59865e-16 0.01 -0.00978204 -0.0972262 0.01 -0.00432306 -0.0487493 0.01 -0.0188465 0.14516 0.01 -0.00432306 0.0487493 0.01 -0.00978204 0.0972262 0.01 -0.0139717 0.146272 0.01 0.0025 -1.6109e-16 0.01 0.000662979 0.0491227 0.01 -0.00483782 0.097971 0.01 -0.00483782 -0.097971 0.01 0.000662979 -0.0491227 0.01 -0.0188465 -0.14516 0 -0.0188465 -0.14516 0.01 -0.0025 -1.59865e-16 0.01 -0.00978204 -0.0972262 0.01 -0.00432306 -0.0487493 0.01 -0.0025 -1.59865e-16 0 -0.00978204 -0.0972262 0 -0.00432306 -0.0487493 0 -0.0025 -1.59865e-16 0 -0.0025 -1.59865e-16 0.01 -0.0188465 0.14516 0.01 -0.00432306 0.0487493 0.01 -0.00978204 0.0972262 0.01 -0.0188465 0.14516 0 -0.00432306 0.0487493 0 -0.00978204 0.0972262 0 -0.0188465 0.14516 0 -0.0139717 0.146272 0 -0.0139717 0.146272 0.01 -0.0188465 0.14516 0.01 0.0025 -1.6109e-16 0 0.0025 -1.6109e-16 0.01 -0.0139717 0.146272 0.01 0.000662979 0.0491227 0.01 -0.00483782 0.097971 0.01 -0.0139717 0.146272 0 0.000662979 0.0491227 0 -0.00483782 0.097971 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0188665 -0.145338 0 -0.0139917 -0.14645 0 -0.0139917 -0.14645 0.01 -0.0188665 -0.145338 0.01 -0.0188665 -0.145338 0 -0.0139917 -0.14645 0 -0.0025 -1.60061e-16 0 -0.00979096 -0.0973454 0 -0.00432529 -0.048809 0 -0.0188665 0.145338 0 -0.00432529 0.048809 0 -0.00979096 0.0973454 0 -0.0139917 0.14645 0 0.0025 -1.61286e-16 0 0.000660745 0.0491825 0 -0.00484675 0.0980902 0 -0.00484675 -0.0980902 0 0.000660745 -0.0491825 0 -0.0139917 -0.14645 0 -0.0139917 -0.14645 0.01 0.0025 -1.61286e-16 0.01 -0.00484675 -0.0980902 0.01 0.000660745 -0.0491825 0.01 0.0025 -1.61286e-16 0 -0.00484675 -0.0980902 0 0.000660745 -0.0491825 0 -0.0188665 -0.145338 0.01 -0.0139917 -0.14645 0.01 -0.0025 -1.60061e-16 0.01 -0.00979096 -0.0973454 0.01 -0.00432529 -0.048809 0.01 -0.0188665 0.145338 0.01 -0.00432529 0.048809 0.01 -0.00979096 0.0973454 0.01 -0.0139917 0.14645 0.01 0.0025 -1.61286e-16 0.01 0.000660745 0.0491825 0.01 -0.00484675 0.0980902 0.01 -0.00484675 -0.0980902 0.01 0.000660745 -0.0491825 0.01 -0.0188665 -0.145338 0 -0.0188665 -0.145338 0.01 -0.0025 -1.60061e-16 0.01 -0.00979096 -0.0973454 0.01 -0.00432529 -0.048809 0.01 -0.0025 -1.60061e-16 0 -0.00979096 -0.0973454 0 -0.00432529 -0.048809 0 -0.0025 -1.60061e-16 0 -0.0025 -1.60061e-16 0.01 -0.0188665 0.145338 0.01 -0.00432529 0.048809 0.01 -0.00979096 0.0973454 0.01 -0.0188665 0.145338 0 -0.00432529 0.048809 0 -0.00979096 0.0973454 0 -0.0188665 0.145338 0 -0.0139917 0.14645 0 -0.0139917 0.14645 0.01 -0.0188665 0.145338 0.01 0.0025 -1.61286e-16 0 0.0025 -1.61286e-16 0.01 -0.0139917 0.14645 0.01 0.000660745 0.0491825 0.01 -0.00484675 0.0980902 0.01 -0.0139917 0.14645 0 0.000660745 0.0491825 0 -0.00484675 0.0980902 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0190668 -0.147117 0 -0.0141921 -0.148229 0 -0.0141921 -0.148229 0.01 -0.0190668 -0.147117 0.01 -0.0190668 -0.147117 0 -0.0141921 -0.148229 0 -0.0025 -1.62021e-16 0 -0.00988022 -0.0985371 0 -0.00434763 -0.0494065 0 -0.0190668 0.147117 0 -0.00434763 0.0494065 0 -0.00988022 0.0985371 0 -0.0141921 0.148229 0 0.0025 -1.63245e-16 0 0.0006384 0.04978 0 -0.004936 0.0992819 0 -0.004936 -0.0992819 0 0.0006384 -0.04978 0 -0.0141921 -0.148229 0 -0.0141921 -0.148229 0.01 0.0025 -1.63245e-16 0.01 -0.004936 -0.0992819 0.01 0.0006384 -0.04978 0.01 0.0025 -1.63245e-16 0 -0.004936 -0.0992819 0 0.0006384 -0.04978 0 -0.0190668 -0.147117 0.01 -0.0141921 -0.148229 0.01 -0.0025 -1.62021e-16 0.01 -0.00988022 -0.0985371 0.01 -0.00434763 -0.0494065 0.01 -0.0190668 0.147117 0.01 -0.00434763 0.0494065 0.01 -0.00988022 0.0985371 0.01 -0.0141921 0.148229 0.01 0.0025 -1.63245e-16 0.01 0.0006384 0.04978 0.01 -0.004936 0.0992819 0.01 -0.004936 -0.0992819 0.01 0.0006384 -0.04978 0.01 -0.0190668 -0.147117 0 -0.0190668 -0.147117 0.01 -0.0025 -1.62021e-16 0.01 -0.00988022 -0.0985371 0.01 -0.00434763 -0.0494065 0.01 -0.0025 -1.62021e-16 0 -0.00988022 -0.0985371 0 -0.00434763 -0.0494065 0 -0.0025 -1.62021e-16 0 -0.0025 -1.62021e-16 0.01 -0.0190668 0.147117 0.01 -0.00434763 0.0494065 0.01 -0.00988022 0.0985371 0.01 -0.0190668 0.147117 0 -0.00434763 0.0494065 0 -0.00988022 0.0985371 0 -0.0190668 0.147117 0 -0.0141921 0.148229 0 -0.0141921 0.148229 0.01 -0.0190668 0.147117 0.01 0.0025 -1.63245e-16 0 0.0025 -1.63245e-16 0.01 -0.0141921 0.148229 0.01 0.0006384 0.04978 0.01 -0.004936 0.0992819 0.01 -0.0141921 0.148229 0 0.0006384 0.04978 0 -0.004936 0.0992819 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 43 46 47 44 43 47 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0190869 -0.147295 0 -0.0142121 -0.148407 0 -0.0142121 -0.148407 0.01 -0.0190869 -0.147295 0.01 -0.0190869 -0.147295 0 -0.0142121 -0.148407 0 -0.0025 -1.62217e-16 0 -0.00988914 -0.0986563 0 -0.00434987 -0.0494663 0 -0.0190869 0.147295 0 -0.00434987 0.0494663 0 -0.00988914 0.0986563 0 -0.0142121 0.148407 0 0.0025 -1.63441e-16 0 0.000636166 0.0498397 0 -0.00494493 0.0994011 0 -0.00494493 -0.0994011 0 0.000636166 -0.0498397 0 -0.0142121 -0.148407 0 -0.0142121 -0.148407 0.01 0.0025 -1.63441e-16 0.01 -0.00494493 -0.0994011 0.01 0.000636166 -0.0498397 0.01 0.0025 -1.63441e-16 0 -0.00494493 -0.0994011 0 0.000636166 -0.0498397 0 -0.0190869 -0.147295 0.01 -0.0142121 -0.148407 0.01 -0.0025 -1.62217e-16 0.01 -0.00988914 -0.0986563 0.01 -0.00434987 -0.0494663 0.01 -0.0190869 0.147295 0.01 -0.00434987 0.0494663 0.01 -0.00988914 0.0986563 0.01 -0.0142121 0.148407 0.01 0.0025 -1.63441e-16 0.01 0.000636166 0.0498397 0.01 -0.00494493 0.0994011 0.01 -0.00494493 -0.0994011 0.01 0.000636166 -0.0498397 0.01 -0.0190869 -0.147295 0 -0.0190869 -0.147295 0.01 -0.0025 -1.62217e-16 0.01 -0.00988914 -0.0986563 0.01 -0.00434987 -0.0494663 0.01 -0.0025 -1.62217e-16 0 -0.00988914 -0.0986563 0 -0.00434987 -0.0494663 0 -0.0025 -1.62217e-16 0 -0.0025 -1.62217e-16 0.01 -0.0190869 0.147295 0.01 -0.00434987 0.0494663 0.01 -0.00988914 0.0986563 0.01 -0.0190869 0.147295 0 -0.00434987 0.0494663 0 -0.00988914 0.0986563 0 -0.0190869 0.147295 0 -0.0142121 0.148407 0 -0.0142121 0.148407 0.01 -0.0190869 0.147295 0.01 0.0025 -1.63441e-16 0 0.0025 -1.63441e-16 0.01 -0.0142121 0.148407 0.01 0.000636166 0.0498397 0.01 -0.00494493 0.0994011 0.01 -0.0142121 0.148407 0 0.000636166 0.0498397 0 -0.00494493 0.0994011 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0192897 -0.149097 0 -0.014415 -0.150209 0 -0.014415 -0.150209 0.01 -0.0192897 -0.149097 0.01 -0.0192897 -0.149097 0 -0.014415 -0.150209 0 -0.0025 -1.64201e-16 0 -0.00997951 -0.0998628 0 -0.00437249 -0.0500713 0 -0.0192897 0.149097 0 -0.00437249 0.0500713 0 -0.00997951 0.0998628 0 -0.014415 0.150209 0 0.0025 -1.65425e-16 0 0.000613541 0.0504447 0 -0.0050353 0.100608 0 -0.0050353 -0.100608 0 0.000613541 -0.0504447 0 -0.014415 -0.150209 0 -0.014415 -0.150209 0.01 0.0025 -1.65425e-16 0.01 -0.0050353 -0.100608 0.01 0.000613541 -0.0504447 0.01 0.0025 -1.65425e-16 0 -0.0050353 -0.100608 0 0.000613541 -0.0504447 0 -0.0192897 -0.149097 0.01 -0.014415 -0.150209 0.01 -0.0025 -1.64201e-16 0.01 -0.00997951 -0.0998628 0.01 -0.00437249 -0.0500713 0.01 -0.0192897 0.149097 0.01 -0.00437249 0.0500713 0.01 -0.00997951 0.0998628 0.01 -0.014415 0.150209 0.01 0.0025 -1.65425e-16 0.01 0.000613541 0.0504447 0.01 -0.0050353 0.100608 0.01 -0.0050353 -0.100608 0.01 0.000613541 -0.0504447 0.01 -0.0192897 -0.149097 0 -0.0192897 -0.149097 0.01 -0.0025 -1.64201e-16 0.01 -0.00997951 -0.0998628 0.01 -0.00437249 -0.0500713 0.01 -0.0025 -1.64201e-16 0 -0.00997951 -0.0998628 0 -0.00437249 -0.0500713 0 -0.0025 -1.64201e-16 0 -0.0025 -1.64201e-16 0.01 -0.0192897 0.149097 0.01 -0.00437249 0.0500713 0.01 -0.00997951 0.0998628 0.01 -0.0192897 0.149097 0 -0.00437249 0.0500713 0 -0.00997951 0.0998628 0 -0.0192897 0.149097 0 -0.014415 0.150209 0 -0.014415 0.150209 0.01 -0.0192897 0.149097 0.01 0.0025 -1.65425e-16 0 0.0025 -1.65425e-16 0.01 -0.014415 0.150209 0.01 0.000613541 0.0504447 0.01 -0.0050353 0.100608 0.01 -0.014415 0.150209 0 0.000613541 0.0504447 0 -0.0050353 0.100608 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 21 24 25 22 21 25 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0193098 -0.149274 0 -0.014435 -0.150386 0 -0.014435 -0.150386 0.01 -0.0193098 -0.149274 0.01 -0.0193098 -0.149274 0 -0.014435 -0.150386 0 -0.0025 -1.64397e-16 0 -0.00998844 -0.099982 0 -0.00437473 -0.050131 0 -0.0193098 0.149274 0 -0.00437473 0.050131 0 -0.00998844 0.099982 0 -0.014435 0.150386 0 0.0025 -1.65621e-16 0 0.000611307 0.0505045 0 -0.00504422 0.100727 0 -0.00504422 -0.100727 0 0.000611307 -0.0505045 0 -0.014435 -0.150386 0 -0.014435 -0.150386 0.01 0.0025 -1.65621e-16 0.01 -0.00504422 -0.100727 0.01 0.000611307 -0.0505045 0.01 0.0025 -1.65621e-16 0 -0.00504422 -0.100727 0 0.000611307 -0.0505045 0 -0.0193098 -0.149274 0.01 -0.014435 -0.150386 0.01 -0.0025 -1.64397e-16 0.01 -0.00998844 -0.099982 0.01 -0.00437473 -0.050131 0.01 -0.0193098 0.149274 0.01 -0.00437473 0.050131 0.01 -0.00998844 0.099982 0.01 -0.014435 0.150386 0.01 0.0025 -1.65621e-16 0.01 0.000611307 0.0505045 0.01 -0.00504422 0.100727 0.01 -0.00504422 -0.100727 0.01 0.000611307 -0.0505045 0.01 -0.0193098 -0.149274 0 -0.0193098 -0.149274 0.01 -0.0025 -1.64397e-16 0.01 -0.00998844 -0.099982 0.01 -0.00437473 -0.050131 0.01 -0.0025 -1.64397e-16 0 -0.00998844 -0.099982 0 -0.00437473 -0.050131 0 -0.0025 -1.64397e-16 0 -0.0025 -1.64397e-16 0.01 -0.0193098 0.149274 0.01 -0.00437473 0.050131 0.01 -0.00998844 0.099982 0.01 -0.0193098 0.149274 0 -0.00437473 0.050131 0 -0.00998844 0.099982 0 -0.0193098 0.149274 0 -0.014435 0.150386 0 -0.014435 0.150386 0.01 -0.0193098 0.149274 0.01 0.0025 -1.65621e-16 0 0.0025 -1.65621e-16 0.01 -0.014435 0.150386 0.01 0.000611307 0.0505045 0.01 -0.00504422 0.100727 0.01 -0.014435 0.150386 0 0.000611307 0.0505045 0 -0.00504422 0.100727 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 21 24 25 22 21 25 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0195101 -0.151054 0 -0.0146353 -0.152166 0 -0.0146353 -0.152166 0.01 -0.0195101 -0.151054 0.01 -0.0195101 -0.151054 0 -0.0146353 -0.152166 0 -0.0025 -1.66356e-16 0 -0.0100777 -0.101174 0 -0.00439707 -0.0507285 0 -0.0195101 0.151054 0 -0.00439707 0.0507285 0 -0.0100777 0.101174 0 -0.0146353 0.152166 0 0.0025 -1.67581e-16 0 0.000588962 0.051102 0 -0.00513348 0.101918 0 -0.00513348 -0.101918 0 0.000588962 -0.051102 0 -0.0146353 -0.152166 0 -0.0146353 -0.152166 0.01 0.0025 -1.67581e-16 0.01 -0.00513348 -0.101918 0.01 0.000588962 -0.051102 0.01 0.0025 -1.67581e-16 0 -0.00513348 -0.101918 0 0.000588962 -0.051102 0 -0.0195101 -0.151054 0.01 -0.0146353 -0.152166 0.01 -0.0025 -1.66356e-16 0.01 -0.0100777 -0.101174 0.01 -0.00439707 -0.0507285 0.01 -0.0195101 0.151054 0.01 -0.00439707 0.0507285 0.01 -0.0100777 0.101174 0.01 -0.0146353 0.152166 0.01 0.0025 -1.67581e-16 0.01 0.000588962 0.051102 0.01 -0.00513348 0.101918 0.01 -0.00513348 -0.101918 0.01 0.000588962 -0.051102 0.01 -0.0195101 -0.151054 0 -0.0195101 -0.151054 0.01 -0.0025 -1.66356e-16 0.01 -0.0100777 -0.101174 0.01 -0.00439707 -0.0507285 0.01 -0.0025 -1.66356e-16 0 -0.0100777 -0.101174 0 -0.00439707 -0.0507285 0 -0.0025 -1.66356e-16 0 -0.0025 -1.66356e-16 0.01 -0.0195101 0.151054 0.01 -0.00439707 0.0507285 0.01 -0.0100777 0.101174 0.01 -0.0195101 0.151054 0 -0.00439707 0.0507285 0 -0.0100777 0.101174 0 -0.0195101 0.151054 0 -0.0146353 0.152166 0 -0.0146353 0.152166 0.01 -0.0195101 0.151054 0.01 0.0025 -1.67581e-16 0 0.0025 -1.67581e-16 0.01 -0.0146353 0.152166 0.01 0.000588962 0.051102 0.01 -0.00513348 0.101918 0.01 -0.0146353 0.152166 0 0.000588962 0.051102 0 -0.00513348 0.101918 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 21 24 25 22 21 25 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0195302 -0.151232 0 -0.0146554 -0.152344 0 -0.0146554 -0.152344 0.01 -0.0195302 -0.151232 0.01 -0.0195302 -0.151232 0 -0.0146554 -0.152344 0 -0.0025 -1.66552e-16 0 -0.0100866 -0.101293 0 -0.00439931 -0.0507883 0 -0.0195302 0.151232 0 -0.00439931 0.0507883 0 -0.0100866 0.101293 0 -0.0146554 0.152344 0 0.0025 -1.67777e-16 0 0.000586728 0.0511617 0 -0.0051424 0.102038 0 -0.0051424 -0.102038 0 0.000586728 -0.0511617 0 -0.0146554 -0.152344 0 -0.0146554 -0.152344 0.01 0.0025 -1.67777e-16 0.01 -0.0051424 -0.102038 0.01 0.000586728 -0.0511617 0.01 0.0025 -1.67777e-16 0 -0.0051424 -0.102038 0 0.000586728 -0.0511617 0 -0.0195302 -0.151232 0.01 -0.0146554 -0.152344 0.01 -0.0025 -1.66552e-16 0.01 -0.0100866 -0.101293 0.01 -0.00439931 -0.0507883 0.01 -0.0195302 0.151232 0.01 -0.00439931 0.0507883 0.01 -0.0100866 0.101293 0.01 -0.0146554 0.152344 0.01 0.0025 -1.67777e-16 0.01 0.000586728 0.0511617 0.01 -0.0051424 0.102038 0.01 -0.0051424 -0.102038 0.01 0.000586728 -0.0511617 0.01 -0.0195302 -0.151232 0 -0.0195302 -0.151232 0.01 -0.0025 -1.66552e-16 0.01 -0.0100866 -0.101293 0.01 -0.00439931 -0.0507883 0.01 -0.0025 -1.66552e-16 0 -0.0100866 -0.101293 0 -0.00439931 -0.0507883 0 -0.0025 -1.66552e-16 0 -0.0025 -1.66552e-16 0.01 -0.0195302 0.151232 0.01 -0.00439931 0.0507883 0.01 -0.0100866 0.101293 0.01 -0.0195302 0.151232 0 -0.00439931 0.0507883 0 -0.0100866 0.101293 0 -0.0195302 0.151232 0 -0.0146554 0.152344 0 -0.0146554 0.152344 0.01 -0.0195302 0.151232 0.01 0.0025 -1.67777e-16 0 0.0025 -1.67777e-16 0.01 -0.0146554 0.152344 0.01 0.000586728 0.0511617 0.01 -0.0051424 0.102038 0.01 -0.0146554 0.152344 0 0.000586728 0.0511617 0 -0.0051424 0.102038 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0197305 -0.153011 0 -0.0148557 -0.154123 0 -0.0148557 -0.154123 0.01 -0.0197305 -0.153011 0.01 -0.0197305 -0.153011 0 -0.0148557 -0.154123 0 -0.0025 -1.68511e-16 0 -0.0101759 -0.102485 0 -0.00442165 -0.0513858 0 -0.0197305 0.153011 0 -0.00442165 0.0513858 0 -0.0101759 0.102485 0 -0.0148557 0.154123 0 0.0025 -1.69736e-16 0 0.000564383 0.0517592 0 -0.00523166 0.103229 0 -0.00523166 -0.103229 0 0.000564383 -0.0517592 0 -0.0148557 -0.154123 0 -0.0148557 -0.154123 0.01 0.0025 -1.69736e-16 0.01 -0.00523166 -0.103229 0.01 0.000564383 -0.0517592 0.01 0.0025 -1.69736e-16 0 -0.00523166 -0.103229 0 0.000564383 -0.0517592 0 -0.0197305 -0.153011 0.01 -0.0148557 -0.154123 0.01 -0.0025 -1.68511e-16 0.01 -0.0101759 -0.102485 0.01 -0.00442165 -0.0513858 0.01 -0.0197305 0.153011 0.01 -0.00442165 0.0513858 0.01 -0.0101759 0.102485 0.01 -0.0148557 0.154123 0.01 0.0025 -1.69736e-16 0.01 0.000564383 0.0517592 0.01 -0.00523166 0.103229 0.01 -0.00523166 -0.103229 0.01 0.000564383 -0.0517592 0.01 -0.0197305 -0.153011 0 -0.0197305 -0.153011 0.01 -0.0025 -1.68511e-16 0.01 -0.0101759 -0.102485 0.01 -0.00442165 -0.0513858 0.01 -0.0025 -1.68511e-16 0 -0.0101759 -0.102485 0 -0.00442165 -0.0513858 0 -0.0025 -1.68511e-16 0 -0.0025 -1.68511e-16 0.01 -0.0197305 0.153011 0.01 -0.00442165 0.0513858 0.01 -0.0101759 0.102485 0.01 -0.0197305 0.153011 0 -0.00442165 0.0513858 0 -0.0101759 0.102485 0 -0.0197305 0.153011 0 -0.0148557 0.154123 0 -0.0148557 0.154123 0.01 -0.0197305 0.153011 0.01 0.0025 -1.69736e-16 0 0.0025 -1.69736e-16 0.01 -0.0148557 0.154123 0.01 0.000564383 0.0517592 0.01 -0.00523166 0.103229 0.01 -0.0148557 0.154123 0 0.000564383 0.0517592 0 -0.00523166 0.103229 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0197506 -0.153189 0 -0.0148758 -0.154301 0 -0.0148758 -0.154301 0.01 -0.0197506 -0.153189 0.01 -0.0197506 -0.153189 0 -0.0148758 -0.154301 0 -0.0025 -1.68707e-16 0 -0.0101848 -0.102604 0 -0.00442389 -0.0514455 0 -0.0197506 0.153189 0 -0.00442389 0.0514455 0 -0.0101848 0.102604 0 -0.0148758 0.154301 0 0.0025 -1.69932e-16 0 0.000562148 0.051819 0 -0.00524058 0.103349 0 -0.00524058 -0.103349 0 0.000562148 -0.051819 0 -0.0148758 -0.154301 0 -0.0148758 -0.154301 0.01 0.0025 -1.69932e-16 0.01 -0.00524058 -0.103349 0.01 0.000562148 -0.051819 0.01 0.0025 -1.69932e-16 0 -0.00524058 -0.103349 0 0.000562148 -0.051819 0 -0.0197506 -0.153189 0.01 -0.0148758 -0.154301 0.01 -0.0025 -1.68707e-16 0.01 -0.0101848 -0.102604 0.01 -0.00442389 -0.0514455 0.01 -0.0197506 0.153189 0.01 -0.00442389 0.0514455 0.01 -0.0101848 0.102604 0.01 -0.0148758 0.154301 0.01 0.0025 -1.69932e-16 0.01 0.000562148 0.051819 0.01 -0.00524058 0.103349 0.01 -0.00524058 -0.103349 0.01 0.000562148 -0.051819 0.01 -0.0197506 -0.153189 0 -0.0197506 -0.153189 0.01 -0.0025 -1.68707e-16 0.01 -0.0101848 -0.102604 0.01 -0.00442389 -0.0514455 0.01 -0.0025 -1.68707e-16 0 -0.0101848 -0.102604 0 -0.00442389 -0.0514455 0 -0.0025 -1.68707e-16 0 -0.0025 -1.68707e-16 0.01 -0.0197506 0.153189 0.01 -0.00442389 0.0514455 0.01 -0.0101848 0.102604 0.01 -0.0197506 0.153189 0 -0.00442389 0.0514455 0 -0.0101848 0.102604 0 -0.0197506 0.153189 0 -0.0148758 0.154301 0 -0.0148758 0.154301 0.01 -0.0197506 0.153189 0.01 0.0025 -1.69932e-16 0 0.0025 -1.69932e-16 0.01 -0.0148758 0.154301 0.01 0.000562148 0.051819 0.01 -0.00524058 0.103349 0.01 -0.0148758 0.154301 0 0.000562148 0.051819 0 -0.00524058 0.103349 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179624 -0.137309 0 -0.0130876 -0.138421 0 -0.0130876 -0.138421 0.01 -0.0179624 -0.137309 0.01 -0.0179624 -0.137309 0 -0.0130876 -0.138421 0 -0.0025 -1.51219e-16 0 -0.0093882 -0.091968 0 -0.00422446 -0.0461128 0 -0.0179624 0.137309 0 -0.00422446 0.0461128 0 -0.0093882 0.091968 0 -0.0130876 0.138421 0 0.0025 -1.52444e-16 0 0.000761576 0.0464862 0 -0.00444399 0.0927128 0 -0.00444399 -0.0927128 0 0.000761576 -0.0464862 0 -0.0130876 -0.138421 0 -0.0130876 -0.138421 0.01 0.0025 -1.52444e-16 0.01 -0.00444399 -0.0927128 0.01 0.000761576 -0.0464862 0.01 0.0025 -1.52444e-16 0 -0.00444399 -0.0927128 0 0.000761576 -0.0464862 0 -0.0179624 -0.137309 0.01 -0.0130876 -0.138421 0.01 -0.0025 -1.51219e-16 0.01 -0.0093882 -0.091968 0.01 -0.00422446 -0.0461128 0.01 -0.0179624 0.137309 0.01 -0.00422446 0.0461128 0.01 -0.0093882 0.091968 0.01 -0.0130876 0.138421 0.01 0.0025 -1.52444e-16 0.01 0.000761576 0.0464862 0.01 -0.00444399 0.0927128 0.01 -0.00444399 -0.0927128 0.01 0.000761576 -0.0464862 0.01 -0.0179624 -0.137309 0 -0.0179624 -0.137309 0.01 -0.0025 -1.51219e-16 0.01 -0.0093882 -0.091968 0.01 -0.00422446 -0.0461128 0.01 -0.0025 -1.51219e-16 0 -0.0093882 -0.091968 0 -0.00422446 -0.0461128 0 -0.0025 -1.51219e-16 0 -0.0025 -1.51219e-16 0.01 -0.0179624 0.137309 0.01 -0.00422446 0.0461128 0.01 -0.0093882 0.091968 0.01 -0.0179624 0.137309 0 -0.00422446 0.0461128 0 -0.0093882 0.091968 0 -0.0179624 0.137309 0 -0.0130876 0.138421 0 -0.0130876 0.138421 0.01 -0.0179624 0.137309 0.01 0.0025 -1.52444e-16 0 0.0025 -1.52444e-16 0.01 -0.0130876 0.138421 0.01 0.000761576 0.0464862 0.01 -0.00444399 0.0927128 0.01 -0.0130876 0.138421 0 0.000761576 0.0464862 0 -0.00444399 0.0927128 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179824 -0.137487 0 -0.0131076 -0.138599 0 -0.0131076 -0.138599 0.01 -0.0179824 -0.137487 0.01 -0.0179824 -0.137487 0 -0.0131076 -0.138599 0 -0.0025 -1.51415e-16 0 -0.00939713 -0.0920871 0 -0.00422669 -0.0461725 0 -0.0179824 0.137487 0 -0.00422669 0.0461725 0 -0.00939713 0.0920871 0 -0.0131076 0.138599 0 0.0025 -1.5264e-16 0 0.000759341 0.046546 0 -0.00445291 0.0928319 0 -0.00445291 -0.0928319 0 0.000759341 -0.046546 0 -0.0131076 -0.138599 0 -0.0131076 -0.138599 0.01 0.0025 -1.5264e-16 0.01 -0.00445291 -0.0928319 0.01 0.000759341 -0.046546 0.01 0.0025 -1.5264e-16 0 -0.00445291 -0.0928319 0 0.000759341 -0.046546 0 -0.0179824 -0.137487 0.01 -0.0131076 -0.138599 0.01 -0.0025 -1.51415e-16 0.01 -0.00939713 -0.0920871 0.01 -0.00422669 -0.0461725 0.01 -0.0179824 0.137487 0.01 -0.00422669 0.0461725 0.01 -0.00939713 0.0920871 0.01 -0.0131076 0.138599 0.01 0.0025 -1.5264e-16 0.01 0.000759341 0.046546 0.01 -0.00445291 0.0928319 0.01 -0.00445291 -0.0928319 0.01 0.000759341 -0.046546 0.01 -0.0179824 -0.137487 0 -0.0179824 -0.137487 0.01 -0.0025 -1.51415e-16 0.01 -0.00939713 -0.0920871 0.01 -0.00422669 -0.0461725 0.01 -0.0025 -1.51415e-16 0 -0.00939713 -0.0920871 0 -0.00422669 -0.0461725 0 -0.0025 -1.51415e-16 0 -0.0025 -1.51415e-16 0.01 -0.0179824 0.137487 0.01 -0.00422669 0.0461725 0.01 -0.00939713 0.0920871 0.01 -0.0179824 0.137487 0 -0.00422669 0.0461725 0 -0.00939713 0.0920871 0 -0.0179824 0.137487 0 -0.0131076 0.138599 0 -0.0131076 0.138599 0.01 -0.0179824 0.137487 0.01 0.0025 -1.5264e-16 0 0.0025 -1.5264e-16 0.01 -0.0131076 0.138599 0.01 0.000759341 0.046546 0.01 -0.00445291 0.0928319 0.01 -0.0131076 0.138599 0 0.000759341 0.046546 0 -0.00445291 0.0928319 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0181828 -0.139266 0 -0.013308 -0.140378 0 -0.013308 -0.140378 0.01 -0.0181828 -0.139266 0.01 -0.0181828 -0.139266 0 -0.013308 -0.140378 0 -0.0025 -1.53375e-16 0 -0.00948638 -0.0932788 0 -0.00424904 -0.04677 0 -0.0181828 0.139266 0 -0.00424904 0.04677 0 -0.00948638 0.0932788 0 -0.013308 0.140378 0 0.0025 -1.54599e-16 0 0.000736996 0.0471435 0 -0.00454217 0.0940236 0 -0.00454217 -0.0940236 0 0.000736996 -0.0471435 0 -0.013308 -0.140378 0 -0.013308 -0.140378 0.01 0.0025 -1.54599e-16 0.01 -0.00454217 -0.0940236 0.01 0.000736996 -0.0471435 0.01 0.0025 -1.54599e-16 0 -0.00454217 -0.0940236 0 0.000736996 -0.0471435 0 -0.0181828 -0.139266 0.01 -0.013308 -0.140378 0.01 -0.0025 -1.53375e-16 0.01 -0.00948638 -0.0932788 0.01 -0.00424904 -0.04677 0.01 -0.0181828 0.139266 0.01 -0.00424904 0.04677 0.01 -0.00948638 0.0932788 0.01 -0.013308 0.140378 0.01 0.0025 -1.54599e-16 0.01 0.000736996 0.0471435 0.01 -0.00454217 0.0940236 0.01 -0.00454217 -0.0940236 0.01 0.000736996 -0.0471435 0.01 -0.0181828 -0.139266 0 -0.0181828 -0.139266 0.01 -0.0025 -1.53375e-16 0.01 -0.00948638 -0.0932788 0.01 -0.00424904 -0.04677 0.01 -0.0025 -1.53375e-16 0 -0.00948638 -0.0932788 0 -0.00424904 -0.04677 0 -0.0025 -1.53375e-16 0 -0.0025 -1.53375e-16 0.01 -0.0181828 0.139266 0.01 -0.00424904 0.04677 0.01 -0.00948638 0.0932788 0.01 -0.0181828 0.139266 0 -0.00424904 0.04677 0 -0.00948638 0.0932788 0 -0.0181828 0.139266 0 -0.013308 0.140378 0 -0.013308 0.140378 0.01 -0.0181828 0.139266 0.01 0.0025 -1.54599e-16 0 0.0025 -1.54599e-16 0.01 -0.013308 0.140378 0.01 0.000736996 0.0471435 0.01 -0.00454217 0.0940236 0.01 -0.013308 0.140378 0 0.000736996 0.0471435 0 -0.00454217 0.0940236 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0182028 -0.139444 0 -0.013328 -0.140556 0 -0.013328 -0.140556 0.01 -0.0182028 -0.139444 0.01 -0.0182028 -0.139444 0 -0.013328 -0.140556 0 -0.0025 -1.53571e-16 0 -0.00949531 -0.093398 0 -0.00425127 -0.0468298 0 -0.0182028 0.139444 0 -0.00425127 0.0468298 0 -0.00949531 0.093398 0 -0.013328 0.140556 0 0.0025 -1.54795e-16 0 0.000734762 0.0472032 0 -0.00455109 0.0941428 0 -0.00455109 -0.0941428 0 0.000734762 -0.0472032 0 -0.013328 -0.140556 0 -0.013328 -0.140556 0.01 0.0025 -1.54795e-16 0.01 -0.00455109 -0.0941428 0.01 0.000734762 -0.0472032 0.01 0.0025 -1.54795e-16 0 -0.00455109 -0.0941428 0 0.000734762 -0.0472032 0 -0.0182028 -0.139444 0.01 -0.013328 -0.140556 0.01 -0.0025 -1.53571e-16 0.01 -0.00949531 -0.093398 0.01 -0.00425127 -0.0468298 0.01 -0.0182028 0.139444 0.01 -0.00425127 0.0468298 0.01 -0.00949531 0.093398 0.01 -0.013328 0.140556 0.01 0.0025 -1.54795e-16 0.01 0.000734762 0.0472032 0.01 -0.00455109 0.0941428 0.01 -0.00455109 -0.0941428 0.01 0.000734762 -0.0472032 0.01 -0.0182028 -0.139444 0 -0.0182028 -0.139444 0.01 -0.0025 -1.53571e-16 0.01 -0.00949531 -0.093398 0.01 -0.00425127 -0.0468298 0.01 -0.0025 -1.53571e-16 0 -0.00949531 -0.093398 0 -0.00425127 -0.0468298 0 -0.0025 -1.53571e-16 0 -0.0025 -1.53571e-16 0.01 -0.0182028 0.139444 0.01 -0.00425127 0.0468298 0.01 -0.00949531 0.093398 0.01 -0.0182028 0.139444 0 -0.00425127 0.0468298 0 -0.00949531 0.093398 0 -0.0182028 0.139444 0 -0.013328 0.140556 0 -0.013328 0.140556 0.01 -0.0182028 0.139444 0.01 0.0025 -1.54795e-16 0 0.0025 -1.54795e-16 0.01 -0.013328 0.140556 0.01 0.000734762 0.0472032 0.01 -0.00455109 0.0941428 0.01 -0.013328 0.140556 0 0.000734762 0.0472032 0 -0.00455109 0.0941428 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 21 24 25 22 21 25 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0184057 -0.141246 0 -0.0135309 -0.142358 0 -0.0135309 -0.142358 0.01 -0.0184057 -0.141246 0.01 -0.0184057 -0.141246 0 -0.0135309 -0.142358 0 -0.0025 -1.55555e-16 0 -0.00958568 -0.0946045 0 -0.0042739 -0.0474348 0 -0.0184057 0.141246 0 -0.0042739 0.0474348 0 -0.00958568 0.0946045 0 -0.0135309 0.142358 0 0.0025 -1.56779e-16 0 0.000712138 0.0478082 0 -0.00464146 0.0953493 0 -0.00464146 -0.0953493 0 0.000712138 -0.0478082 0 -0.0135309 -0.142358 0 -0.0135309 -0.142358 0.01 0.0025 -1.56779e-16 0.01 -0.00464146 -0.0953493 0.01 0.000712138 -0.0478082 0.01 0.0025 -1.56779e-16 0 -0.00464146 -0.0953493 0 0.000712138 -0.0478082 0 -0.0184057 -0.141246 0.01 -0.0135309 -0.142358 0.01 -0.0025 -1.55555e-16 0.01 -0.00958568 -0.0946045 0.01 -0.0042739 -0.0474348 0.01 -0.0184057 0.141246 0.01 -0.0042739 0.0474348 0.01 -0.00958568 0.0946045 0.01 -0.0135309 0.142358 0.01 0.0025 -1.56779e-16 0.01 0.000712138 0.0478082 0.01 -0.00464146 0.0953493 0.01 -0.00464146 -0.0953493 0.01 0.000712138 -0.0478082 0.01 -0.0184057 -0.141246 0 -0.0184057 -0.141246 0.01 -0.0025 -1.55555e-16 0.01 -0.00958568 -0.0946045 0.01 -0.0042739 -0.0474348 0.01 -0.0025 -1.55555e-16 0 -0.00958568 -0.0946045 0 -0.0042739 -0.0474348 0 -0.0025 -1.55555e-16 0 -0.0025 -1.55555e-16 0.01 -0.0184057 0.141246 0.01 -0.0042739 0.0474348 0.01 -0.00958568 0.0946045 0.01 -0.0184057 0.141246 0 -0.0042739 0.0474348 0 -0.00958568 0.0946045 0 -0.0184057 0.141246 0 -0.0135309 0.142358 0 -0.0135309 0.142358 0.01 -0.0184057 0.141246 0.01 0.0025 -1.56779e-16 0 0.0025 -1.56779e-16 0.01 -0.0135309 0.142358 0.01 0.000712138 0.0478082 0.01 -0.00464146 0.0953493 0.01 -0.0135309 0.142358 0 0.000712138 0.0478082 0 -0.00464146 0.0953493 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0184257 -0.141424 0 -0.0135509 -0.142536 0 -0.0135509 -0.142536 0.01 -0.0184257 -0.141424 0.01 -0.0184257 -0.141424 0 -0.0135509 -0.142536 0 -0.0025 -1.55751e-16 0 -0.0095946 -0.0947237 0 -0.00427613 -0.0474945 0 -0.0184257 0.141424 0 -0.00427613 0.0474945 0 -0.0095946 0.0947237 0 -0.0135509 0.142536 0 0.0025 -1.56975e-16 0 0.000709903 0.047868 0 -0.00465039 0.0954685 0 -0.00465039 -0.0954685 0 0.000709903 -0.047868 0 -0.0135509 -0.142536 0 -0.0135509 -0.142536 0.01 0.0025 -1.56975e-16 0.01 -0.00465039 -0.0954685 0.01 0.000709903 -0.047868 0.01 0.0025 -1.56975e-16 0 -0.00465039 -0.0954685 0 0.000709903 -0.047868 0 -0.0184257 -0.141424 0.01 -0.0135509 -0.142536 0.01 -0.0025 -1.55751e-16 0.01 -0.0095946 -0.0947237 0.01 -0.00427613 -0.0474945 0.01 -0.0184257 0.141424 0.01 -0.00427613 0.0474945 0.01 -0.0095946 0.0947237 0.01 -0.0135509 0.142536 0.01 0.0025 -1.56975e-16 0.01 0.000709903 0.047868 0.01 -0.00465039 0.0954685 0.01 -0.00465039 -0.0954685 0.01 0.000709903 -0.047868 0.01 -0.0184257 -0.141424 0 -0.0184257 -0.141424 0.01 -0.0025 -1.55751e-16 0.01 -0.0095946 -0.0947237 0.01 -0.00427613 -0.0474945 0.01 -0.0025 -1.55751e-16 0 -0.0095946 -0.0947237 0 -0.00427613 -0.0474945 0 -0.0025 -1.55751e-16 0 -0.0025 -1.55751e-16 0.01 -0.0184257 0.141424 0.01 -0.00427613 0.0474945 0.01 -0.0095946 0.0947237 0.01 -0.0184257 0.141424 0 -0.00427613 0.0474945 0 -0.0095946 0.0947237 0 -0.0184257 0.141424 0 -0.0135509 0.142536 0 -0.0135509 0.142536 0.01 -0.0184257 0.141424 0.01 0.0025 -1.56975e-16 0 0.0025 -1.56975e-16 0.01 -0.0135509 0.142536 0.01 0.000709903 0.047868 0.01 -0.00465039 0.0954685 0.01 -0.0135509 0.142536 0 0.000709903 0.047868 0 -0.00465039 0.0954685 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0186261 -0.143203 0 -0.0137513 -0.144315 0 -0.0137513 -0.144315 0.01 -0.0186261 -0.143203 0.01 -0.0186261 -0.143203 0 -0.0137513 -0.144315 0 -0.0025 -1.5771e-16 0 -0.00968386 -0.0959154 0 -0.00429848 -0.048092 0 -0.0186261 0.143203 0 -0.00429848 0.048092 0 -0.00968386 0.0959154 0 -0.0137513 0.144315 0 0.0025 -1.58935e-16 0 0.000687559 0.0484655 0 -0.00473964 0.0966602 0 -0.00473964 -0.0966602 0 0.000687559 -0.0484655 0 -0.0137513 -0.144315 0 -0.0137513 -0.144315 0.01 0.0025 -1.58935e-16 0.01 -0.00473964 -0.0966602 0.01 0.000687559 -0.0484655 0.01 0.0025 -1.58935e-16 0 -0.00473964 -0.0966602 0 0.000687559 -0.0484655 0 -0.0186261 -0.143203 0.01 -0.0137513 -0.144315 0.01 -0.0025 -1.5771e-16 0.01 -0.00968386 -0.0959154 0.01 -0.00429848 -0.048092 0.01 -0.0186261 0.143203 0.01 -0.00429848 0.048092 0.01 -0.00968386 0.0959154 0.01 -0.0137513 0.144315 0.01 0.0025 -1.58935e-16 0.01 0.000687559 0.0484655 0.01 -0.00473964 0.0966602 0.01 -0.00473964 -0.0966602 0.01 0.000687559 -0.0484655 0.01 -0.0186261 -0.143203 0 -0.0186261 -0.143203 0.01 -0.0025 -1.5771e-16 0.01 -0.00968386 -0.0959154 0.01 -0.00429848 -0.048092 0.01 -0.0025 -1.5771e-16 0 -0.00968386 -0.0959154 0 -0.00429848 -0.048092 0 -0.0025 -1.5771e-16 0 -0.0025 -1.5771e-16 0.01 -0.0186261 0.143203 0.01 -0.00429848 0.048092 0.01 -0.00968386 0.0959154 0.01 -0.0186261 0.143203 0 -0.00429848 0.048092 0 -0.00968386 0.0959154 0 -0.0186261 0.143203 0 -0.0137513 0.144315 0 -0.0137513 0.144315 0.01 -0.0186261 0.143203 0.01 0.0025 -1.58935e-16 0 0.0025 -1.58935e-16 0.01 -0.0137513 0.144315 0.01 0.000687559 0.0484655 0.01 -0.00473964 0.0966602 0.01 -0.0137513 0.144315 0 0.000687559 0.0484655 0 -0.00473964 0.0966602 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0186461 -0.143381 0 -0.0137713 -0.144493 0 -0.0137713 -0.144493 0.01 -0.0186461 -0.143381 0.01 -0.0186461 -0.143381 0 -0.0137713 -0.144493 0 -0.0025 -1.57906e-16 0 -0.00969278 -0.0960346 0 -0.00430071 -0.0481518 0 -0.0186461 0.143381 0 -0.00430071 0.0481518 0 -0.00969278 0.0960346 0 -0.0137713 0.144493 0 0.0025 -1.59131e-16 0 0.000685324 0.0485252 0 -0.00474857 0.0967794 0 -0.00474857 -0.0967794 0 0.000685324 -0.0485252 0 -0.0137713 -0.144493 0 -0.0137713 -0.144493 0.01 0.0025 -1.59131e-16 0.01 -0.00474857 -0.0967794 0.01 0.000685324 -0.0485252 0.01 0.0025 -1.59131e-16 0 -0.00474857 -0.0967794 0 0.000685324 -0.0485252 0 -0.0186461 -0.143381 0.01 -0.0137713 -0.144493 0.01 -0.0025 -1.57906e-16 0.01 -0.00969278 -0.0960346 0.01 -0.00430071 -0.0481518 0.01 -0.0186461 0.143381 0.01 -0.00430071 0.0481518 0.01 -0.00969278 0.0960346 0.01 -0.0137713 0.144493 0.01 0.0025 -1.59131e-16 0.01 0.000685324 0.0485252 0.01 -0.00474857 0.0967794 0.01 -0.00474857 -0.0967794 0.01 0.000685324 -0.0485252 0.01 -0.0186461 -0.143381 0 -0.0186461 -0.143381 0.01 -0.0025 -1.57906e-16 0.01 -0.00969278 -0.0960346 0.01 -0.00430071 -0.0481518 0.01 -0.0025 -1.57906e-16 0 -0.00969278 -0.0960346 0 -0.00430071 -0.0481518 0 -0.0025 -1.57906e-16 0 -0.0025 -1.57906e-16 0.01 -0.0186461 0.143381 0.01 -0.00430071 0.0481518 0.01 -0.00969278 0.0960346 0.01 -0.0186461 0.143381 0 -0.00430071 0.0481518 0 -0.00969278 0.0960346 0 -0.0186461 0.143381 0 -0.0137713 0.144493 0 -0.0137713 0.144493 0.01 -0.0186461 0.143381 0.01 0.0025 -1.59131e-16 0 0.0025 -1.59131e-16 0.01 -0.0137713 0.144493 0.01 0.000685324 0.0485252 0.01 -0.00474857 0.0967794 0.01 -0.0137713 0.144493 0 0.000685324 0.0485252 0 -0.00474857 0.0967794 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0144077 -0.136105 0 -0.00948364 -0.136974 0 -0.00948364 -0.136974 0.01 -0.0144077 -0.136105 0.01 -0.0144077 -0.136105 0 -0.00948364 -0.136974 0 -0.0025 -1.91976e-16 0 -0.00779978 -0.0909936 0 -0.00382607 -0.0455739 0 -0.0144077 0.136105 0 -0.00382607 0.0455739 0 -0.00779978 0.0909936 0 -0.00948364 0.136974 0 0.0025 -1.932e-16 0 0.00116548 0.0458646 0 -0.00283358 0.0915741 0 -0.00283358 -0.0915741 0 0.00116548 -0.0458646 0 -0.00948364 -0.136974 0 -0.00948364 -0.136974 0.01 0.0025 -1.932e-16 0.01 -0.00283358 -0.0915741 0.01 0.00116548 -0.0458646 0.01 0.0025 -1.932e-16 0 -0.00283358 -0.0915741 0 0.00116548 -0.0458646 0 -0.0144077 -0.136105 0.01 -0.00948364 -0.136974 0.01 -0.0025 -1.91976e-16 0.01 -0.00779978 -0.0909936 0.01 -0.00382607 -0.0455739 0.01 -0.0144077 0.136105 0.01 -0.00382607 0.0455739 0.01 -0.00779978 0.0909936 0.01 -0.00948364 0.136974 0.01 0.0025 -1.932e-16 0.01 0.00116548 0.0458646 0.01 -0.00283358 0.0915741 0.01 -0.00283358 -0.0915741 0.01 0.00116548 -0.0458646 0.01 -0.0144077 -0.136105 0 -0.0144077 -0.136105 0.01 -0.0025 -1.91976e-16 0.01 -0.00779978 -0.0909936 0.01 -0.00382607 -0.0455739 0.01 -0.0025 -1.91976e-16 0 -0.00779978 -0.0909936 0 -0.00382607 -0.0455739 0 -0.0025 -1.91976e-16 0 -0.0025 -1.91976e-16 0.01 -0.0144077 0.136105 0.01 -0.00382607 0.0455739 0.01 -0.00779978 0.0909936 0.01 -0.0144077 0.136105 0 -0.00382607 0.0455739 0 -0.00779978 0.0909936 0 -0.0144077 0.136105 0 -0.00948364 0.136974 0 -0.00948364 0.136974 0.01 -0.0144077 0.136105 0.01 0.0025 -1.932e-16 0 0.0025 -1.932e-16 0.01 -0.00948364 0.136974 0.01 0.00116548 0.0458646 0.01 -0.00283358 0.0915741 0.01 -0.00948364 0.136974 0 0.00116548 0.0458646 0 -0.00283358 0.0915741 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0144092 -0.136123 0 -0.00948516 -0.136991 0 -0.00948516 -0.136991 0.01 -0.0144092 -0.136123 0.01 -0.0144092 -0.136123 0 -0.00948516 -0.136991 0 -0.0025 -1.92e-16 0 -0.00780045 -0.0910052 0 -0.00382623 -0.0455797 0 -0.0144092 0.136123 0 -0.00382623 0.0455797 0 -0.00780045 0.0910052 0 -0.00948516 0.136991 0 0.0025 -1.93225e-16 0 0.00116531 0.0458705 0 -0.00283426 0.0915857 0 -0.00283426 -0.0915857 0 0.00116531 -0.0458705 0 -0.00948516 -0.136991 0 -0.00948516 -0.136991 0.01 0.0025 -1.93225e-16 0.01 -0.00283426 -0.0915857 0.01 0.00116531 -0.0458705 0.01 0.0025 -1.93225e-16 0 -0.00283426 -0.0915857 0 0.00116531 -0.0458705 0 -0.0144092 -0.136123 0.01 -0.00948516 -0.136991 0.01 -0.0025 -1.92e-16 0.01 -0.00780045 -0.0910052 0.01 -0.00382623 -0.0455797 0.01 -0.0144092 0.136123 0.01 -0.00382623 0.0455797 0.01 -0.00780045 0.0910052 0.01 -0.00948516 0.136991 0.01 0.0025 -1.93225e-16 0.01 0.00116531 0.0458705 0.01 -0.00283426 0.0915857 0.01 -0.00283426 -0.0915857 0.01 0.00116531 -0.0458705 0.01 -0.0144092 -0.136123 0 -0.0144092 -0.136123 0.01 -0.0025 -1.92e-16 0.01 -0.00780045 -0.0910052 0.01 -0.00382623 -0.0455797 0.01 -0.0025 -1.92e-16 0 -0.00780045 -0.0910052 0 -0.00382623 -0.0455797 0 -0.0025 -1.92e-16 0 -0.0025 -1.92e-16 0.01 -0.0144092 0.136123 0.01 -0.00382623 0.0455797 0.01 -0.00780045 0.0910052 0.01 -0.0144092 0.136123 0 -0.00382623 0.0455797 0 -0.00780045 0.0910052 0 -0.0144092 0.136123 0 -0.00948516 0.136991 0 -0.00948516 0.136991 0.01 -0.0144092 0.136123 0.01 0.0025 -1.93225e-16 0 0.0025 -1.93225e-16 0.01 -0.00948516 0.136991 0.01 0.00116531 0.0458705 0.01 -0.00283426 0.0915857 0.01 -0.00948516 0.136991 0 0.00116531 0.0458705 0 -0.00283426 0.0915857 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0150503 -0.143451 0 -0.0101263 -0.144319 0 -0.0101263 -0.144319 0.01 -0.0150503 -0.143451 0.01 -0.0150503 -0.143451 0 -0.0101263 -0.144319 0 -0.0025 -2.02336e-16 0 -0.00808579 -0.0959044 0 -0.00389763 -0.0480334 0 -0.0150503 0.143451 0 -0.00389763 0.0480334 0 -0.00808579 0.0959044 0 -0.0101263 0.144319 0 0.0025 -2.03561e-16 0 0.00109391 0.0483242 0 -0.0031196 0.0964848 0 -0.0031196 -0.0964848 0 0.00109391 -0.0483242 0 -0.0101263 -0.144319 0 -0.0101263 -0.144319 0.01 0.0025 -2.03561e-16 0.01 -0.0031196 -0.0964848 0.01 0.00109391 -0.0483242 0.01 0.0025 -2.03561e-16 0 -0.0031196 -0.0964848 0 0.00109391 -0.0483242 0 -0.0150503 -0.143451 0.01 -0.0101263 -0.144319 0.01 -0.0025 -2.02336e-16 0.01 -0.00808579 -0.0959044 0.01 -0.00389763 -0.0480334 0.01 -0.0150503 0.143451 0.01 -0.00389763 0.0480334 0.01 -0.00808579 0.0959044 0.01 -0.0101263 0.144319 0.01 0.0025 -2.03561e-16 0.01 0.00109391 0.0483242 0.01 -0.0031196 0.0964848 0.01 -0.0031196 -0.0964848 0.01 0.00109391 -0.0483242 0.01 -0.0150503 -0.143451 0 -0.0150503 -0.143451 0.01 -0.0025 -2.02336e-16 0.01 -0.00808579 -0.0959044 0.01 -0.00389763 -0.0480334 0.01 -0.0025 -2.02336e-16 0 -0.00808579 -0.0959044 0 -0.00389763 -0.0480334 0 -0.0025 -2.02336e-16 0 -0.0025 -2.02336e-16 0.01 -0.0150503 0.143451 0.01 -0.00389763 0.0480334 0.01 -0.00808579 0.0959044 0.01 -0.0150503 0.143451 0 -0.00389763 0.0480334 0 -0.00808579 0.0959044 0 -0.0150503 0.143451 0 -0.0101263 0.144319 0 -0.0101263 0.144319 0.01 -0.0150503 0.143451 0.01 0.0025 -2.03561e-16 0 0.0025 -2.03561e-16 0.01 -0.0101263 0.144319 0.01 0.00109391 0.0483242 0.01 -0.0031196 0.0964848 0.01 -0.0101263 0.144319 0 0.00109391 0.0483242 0 -0.0031196 0.0964848 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0150518 -0.143468 0 -0.0101278 -0.144336 0 -0.0101278 -0.144336 0.01 -0.0150518 -0.143468 0.01 -0.0150518 -0.143468 0 -0.0101278 -0.144336 0 -0.0025 -2.02361e-16 0 -0.00808647 -0.095916 0 -0.0038978 -0.0480393 0 -0.0150518 0.143468 0 -0.0038978 0.0480393 0 -0.00808647 0.095916 0 -0.0101278 0.144336 0 0.0025 -2.03585e-16 0 0.00109374 0.04833 0 -0.00312028 0.0964964 0 -0.00312028 -0.0964964 0 0.00109374 -0.04833 0 -0.0101278 -0.144336 0 -0.0101278 -0.144336 0.01 0.0025 -2.03585e-16 0.01 -0.00312028 -0.0964964 0.01 0.00109374 -0.04833 0.01 0.0025 -2.03585e-16 0 -0.00312028 -0.0964964 0 0.00109374 -0.04833 0 -0.0150518 -0.143468 0.01 -0.0101278 -0.144336 0.01 -0.0025 -2.02361e-16 0.01 -0.00808647 -0.095916 0.01 -0.0038978 -0.0480393 0.01 -0.0150518 0.143468 0.01 -0.0038978 0.0480393 0.01 -0.00808647 0.095916 0.01 -0.0101278 0.144336 0.01 0.0025 -2.03585e-16 0.01 0.00109374 0.04833 0.01 -0.00312028 0.0964964 0.01 -0.00312028 -0.0964964 0.01 0.00109374 -0.04833 0.01 -0.0150518 -0.143468 0 -0.0150518 -0.143468 0.01 -0.0025 -2.02361e-16 0.01 -0.00808647 -0.095916 0.01 -0.0038978 -0.0480393 0.01 -0.0025 -2.02361e-16 0 -0.00808647 -0.095916 0 -0.0038978 -0.0480393 0 -0.0025 -2.02361e-16 0 -0.0025 -2.02361e-16 0.01 -0.0150518 0.143468 0.01 -0.0038978 0.0480393 0.01 -0.00808647 0.095916 0.01 -0.0150518 0.143468 0 -0.0038978 0.0480393 0 -0.00808647 0.095916 0 -0.0150518 0.143468 0 -0.0101278 0.144336 0 -0.0101278 0.144336 0.01 -0.0150518 0.143468 0.01 0.0025 -2.03585e-16 0 0.0025 -2.03585e-16 0.01 -0.0101278 0.144336 0.01 0.00109374 0.04833 0.01 -0.00312028 0.0964964 0.01 -0.0101278 0.144336 0 0.00109374 0.04833 0 -0.00312028 0.0964964 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0151779 -0.144909 0 -0.0102539 -0.145778 0 -0.0102539 -0.145778 0.01 -0.0151779 -0.144909 0.01 -0.0151779 -0.144909 0 -0.0102539 -0.145778 0 -0.0025 -2.04394e-16 0 -0.00814259 -0.0968795 0 -0.00391184 -0.0485219 0 -0.0151779 0.144909 0 -0.00391184 0.0485219 0 -0.00814259 0.0968795 0 -0.0102539 0.145778 0 0.0025 -2.05618e-16 0 0.0010797 0.0488126 0 -0.0031764 0.09746 0 -0.0031764 -0.09746 0 0.0010797 -0.0488126 0 -0.0102539 -0.145778 0 -0.0102539 -0.145778 0.01 0.0025 -2.05618e-16 0.01 -0.0031764 -0.09746 0.01 0.0010797 -0.0488126 0.01 0.0025 -2.05618e-16 0 -0.0031764 -0.09746 0 0.0010797 -0.0488126 0 -0.0151779 -0.144909 0.01 -0.0102539 -0.145778 0.01 -0.0025 -2.04394e-16 0.01 -0.00814259 -0.0968795 0.01 -0.00391184 -0.0485219 0.01 -0.0151779 0.144909 0.01 -0.00391184 0.0485219 0.01 -0.00814259 0.0968795 0.01 -0.0102539 0.145778 0.01 0.0025 -2.05618e-16 0.01 0.0010797 0.0488126 0.01 -0.0031764 0.09746 0.01 -0.0031764 -0.09746 0.01 0.0010797 -0.0488126 0.01 -0.0151779 -0.144909 0 -0.0151779 -0.144909 0.01 -0.0025 -2.04394e-16 0.01 -0.00814259 -0.0968795 0.01 -0.00391184 -0.0485219 0.01 -0.0025 -2.04394e-16 0 -0.00814259 -0.0968795 0 -0.00391184 -0.0485219 0 -0.0025 -2.04394e-16 0 -0.0025 -2.04394e-16 0.01 -0.0151779 0.144909 0.01 -0.00391184 0.0485219 0.01 -0.00814259 0.0968795 0.01 -0.0151779 0.144909 0 -0.00391184 0.0485219 0 -0.00814259 0.0968795 0 -0.0151779 0.144909 0 -0.0102539 0.145778 0 -0.0102539 0.145778 0.01 -0.0151779 0.144909 0.01 0.0025 -2.05618e-16 0 0.0025 -2.05618e-16 0.01 -0.0102539 0.145778 0.01 0.0010797 0.0488126 0.01 -0.0031764 0.09746 0.01 -0.0102539 0.145778 0 0.0010797 0.0488126 0 -0.0031764 0.09746 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.015181 -0.144944 0 -0.0102569 -0.145812 0 -0.0102569 -0.145812 0.01 -0.015181 -0.144944 0.01 -0.015181 -0.144944 0 -0.0102569 -0.145812 0 -0.0025 -2.04443e-16 0 -0.00814394 -0.0969028 0 -0.00391218 -0.0485335 0 -0.015181 0.144944 0 -0.00391218 0.0485335 0 -0.00814394 0.0969028 0 -0.0102569 0.145812 0 0.0025 -2.05667e-16 0 0.00107936 0.0488242 0 -0.00317775 0.0974832 0 -0.00317775 -0.0974832 0 0.00107936 -0.0488242 0 -0.0102569 -0.145812 0 -0.0102569 -0.145812 0.01 0.0025 -2.05667e-16 0.01 -0.00317775 -0.0974832 0.01 0.00107936 -0.0488242 0.01 0.0025 -2.05667e-16 0 -0.00317775 -0.0974832 0 0.00107936 -0.0488242 0 -0.015181 -0.144944 0.01 -0.0102569 -0.145812 0.01 -0.0025 -2.04443e-16 0.01 -0.00814394 -0.0969028 0.01 -0.00391218 -0.0485335 0.01 -0.015181 0.144944 0.01 -0.00391218 0.0485335 0.01 -0.00814394 0.0969028 0.01 -0.0102569 0.145812 0.01 0.0025 -2.05667e-16 0.01 0.00107936 0.0488242 0.01 -0.00317775 0.0974832 0.01 -0.00317775 -0.0974832 0.01 0.00107936 -0.0488242 0.01 -0.015181 -0.144944 0 -0.015181 -0.144944 0.01 -0.0025 -2.04443e-16 0.01 -0.00814394 -0.0969028 0.01 -0.00391218 -0.0485335 0.01 -0.0025 -2.04443e-16 0 -0.00814394 -0.0969028 0 -0.00391218 -0.0485335 0 -0.0025 -2.04443e-16 0 -0.0025 -2.04443e-16 0.01 -0.015181 0.144944 0.01 -0.00391218 0.0485335 0.01 -0.00814394 0.0969028 0.01 -0.015181 0.144944 0 -0.00391218 0.0485335 0 -0.00814394 0.0969028 0 -0.015181 0.144944 0 -0.0102569 0.145812 0 -0.0102569 0.145812 0.01 -0.015181 0.144944 0.01 0.0025 -2.05667e-16 0 0.0025 -2.05667e-16 0.01 -0.0102569 0.145812 0.01 0.00107936 0.0488242 0.01 -0.00317775 0.0974832 0.01 -0.0102569 0.145812 0 0.00107936 0.0488242 0 -0.00317775 0.0974832 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0153071 -0.146385 0 -0.010383 -0.147254 0 -0.010383 -0.147254 0.01 -0.0153071 -0.146385 0.01 -0.0153071 -0.146385 0 -0.010383 -0.147254 0 -0.0025 -2.06475e-16 0 -0.00820006 -0.0978663 0 -0.00392622 -0.0490161 0 -0.0153071 0.146385 0 -0.00392622 0.0490161 0 -0.00820006 0.0978663 0 -0.010383 0.147254 0 0.0025 -2.077e-16 0 0.00106532 0.0493068 0 -0.00323387 0.0984468 0 -0.00323387 -0.0984468 0 0.00106532 -0.0493068 0 -0.010383 -0.147254 0 -0.010383 -0.147254 0.01 0.0025 -2.077e-16 0.01 -0.00323387 -0.0984468 0.01 0.00106532 -0.0493068 0.01 0.0025 -2.077e-16 0 -0.00323387 -0.0984468 0 0.00106532 -0.0493068 0 -0.0153071 -0.146385 0.01 -0.010383 -0.147254 0.01 -0.0025 -2.06475e-16 0.01 -0.00820006 -0.0978663 0.01 -0.00392622 -0.0490161 0.01 -0.0153071 0.146385 0.01 -0.00392622 0.0490161 0.01 -0.00820006 0.0978663 0.01 -0.010383 0.147254 0.01 0.0025 -2.077e-16 0.01 0.00106532 0.0493068 0.01 -0.00323387 0.0984468 0.01 -0.00323387 -0.0984468 0.01 0.00106532 -0.0493068 0.01 -0.0153071 -0.146385 0 -0.0153071 -0.146385 0.01 -0.0025 -2.06475e-16 0.01 -0.00820006 -0.0978663 0.01 -0.00392622 -0.0490161 0.01 -0.0025 -2.06475e-16 0 -0.00820006 -0.0978663 0 -0.00392622 -0.0490161 0 -0.0025 -2.06475e-16 0 -0.0025 -2.06475e-16 0.01 -0.0153071 0.146385 0.01 -0.00392622 0.0490161 0.01 -0.00820006 0.0978663 0.01 -0.0153071 0.146385 0 -0.00392622 0.0490161 0 -0.00820006 0.0978663 0 -0.0153071 0.146385 0 -0.010383 0.147254 0 -0.010383 0.147254 0.01 -0.0153071 0.146385 0.01 0.0025 -2.077e-16 0 0.0025 -2.077e-16 0.01 -0.010383 0.147254 0.01 0.00106532 0.0493068 0.01 -0.00323387 0.0984468 0.01 -0.010383 0.147254 0 0.00106532 0.0493068 0 -0.00323387 0.0984468 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0153086 -0.146403 0 -0.0103845 -0.147271 0 -0.0103845 -0.147271 0.01 -0.0153086 -0.146403 0.01 -0.0153086 -0.146403 0 -0.0103845 -0.147271 0 -0.0025 -2.065e-16 0 -0.00820074 -0.0978779 0 -0.00392639 -0.0490219 0 -0.0153086 0.146403 0 -0.00392639 0.0490219 0 -0.00820074 0.0978779 0 -0.0103845 0.147271 0 0.0025 -2.07725e-16 0 0.00106515 0.0493126 0 -0.00323455 0.0984584 0 -0.00323455 -0.0984584 0 0.00106515 -0.0493126 0 -0.0103845 -0.147271 0 -0.0103845 -0.147271 0.01 0.0025 -2.07725e-16 0.01 -0.00323455 -0.0984584 0.01 0.00106515 -0.0493126 0.01 0.0025 -2.07725e-16 0 -0.00323455 -0.0984584 0 0.00106515 -0.0493126 0 -0.0153086 -0.146403 0.01 -0.0103845 -0.147271 0.01 -0.0025 -2.065e-16 0.01 -0.00820074 -0.0978779 0.01 -0.00392639 -0.0490219 0.01 -0.0153086 0.146403 0.01 -0.00392639 0.0490219 0.01 -0.00820074 0.0978779 0.01 -0.0103845 0.147271 0.01 0.0025 -2.07725e-16 0.01 0.00106515 0.0493126 0.01 -0.00323455 0.0984584 0.01 -0.00323455 -0.0984584 0.01 0.00106515 -0.0493126 0.01 -0.0153086 -0.146403 0 -0.0153086 -0.146403 0.01 -0.0025 -2.065e-16 0.01 -0.00820074 -0.0978779 0.01 -0.00392639 -0.0490219 0.01 -0.0025 -2.065e-16 0 -0.00820074 -0.0978779 0 -0.00392639 -0.0490219 0 -0.0025 -2.065e-16 0 -0.0025 -2.065e-16 0.01 -0.0153086 0.146403 0.01 -0.00392639 0.0490219 0.01 -0.00820074 0.0978779 0.01 -0.0153086 0.146403 0 -0.00392639 0.0490219 0 -0.00820074 0.0978779 0 -0.0153086 0.146403 0 -0.0103845 0.147271 0 -0.0103845 0.147271 0.01 -0.0153086 0.146403 0.01 0.0025 -2.07725e-16 0 0.0025 -2.07725e-16 0.01 -0.0103845 0.147271 0.01 0.00106515 0.0493126 0.01 -0.00323455 0.0984584 0.01 -0.0103845 0.147271 0 0.00106515 0.0493126 0 -0.00323455 0.0984584 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145991 -0.138293 0 -0.00967507 -0.139162 0 -0.00967507 -0.139162 0.01 -0.0145991 -0.138293 0.01 -0.0145991 -0.138293 0 -0.00967507 -0.139162 0 -0.0025 -1.95062e-16 0 -0.00788497 -0.0924564 0 -0.00384738 -0.0463065 0 -0.0145991 0.138293 0 -0.00384738 0.0463065 0 -0.00788497 0.0924564 0 -0.00967507 0.139162 0 0.0025 -1.96286e-16 0 0.00114416 0.0465973 0 -0.00291878 0.0930369 0 -0.00291878 -0.0930369 0 0.00114416 -0.0465973 0 -0.00967507 -0.139162 0 -0.00967507 -0.139162 0.01 0.0025 -1.96286e-16 0.01 -0.00291878 -0.0930369 0.01 0.00114416 -0.0465973 0.01 0.0025 -1.96286e-16 0 -0.00291878 -0.0930369 0 0.00114416 -0.0465973 0 -0.0145991 -0.138293 0.01 -0.00967507 -0.139162 0.01 -0.0025 -1.95062e-16 0.01 -0.00788497 -0.0924564 0.01 -0.00384738 -0.0463065 0.01 -0.0145991 0.138293 0.01 -0.00384738 0.0463065 0.01 -0.00788497 0.0924564 0.01 -0.00967507 0.139162 0.01 0.0025 -1.96286e-16 0.01 0.00114416 0.0465973 0.01 -0.00291878 0.0930369 0.01 -0.00291878 -0.0930369 0.01 0.00114416 -0.0465973 0.01 -0.0145991 -0.138293 0 -0.0145991 -0.138293 0.01 -0.0025 -1.95062e-16 0.01 -0.00788497 -0.0924564 0.01 -0.00384738 -0.0463065 0.01 -0.0025 -1.95062e-16 0 -0.00788497 -0.0924564 0 -0.00384738 -0.0463065 0 -0.0025 -1.95062e-16 0 -0.0025 -1.95062e-16 0.01 -0.0145991 0.138293 0.01 -0.00384738 0.0463065 0.01 -0.00788497 0.0924564 0.01 -0.0145991 0.138293 0 -0.00384738 0.0463065 0 -0.00788497 0.0924564 0 -0.0145991 0.138293 0 -0.00967507 0.139162 0 -0.00967507 0.139162 0.01 -0.0145991 0.138293 0.01 0.0025 -1.96286e-16 0 0.0025 -1.96286e-16 0.01 -0.00967507 0.139162 0.01 0.00114416 0.0465973 0.01 -0.00291878 0.0930369 0.01 -0.00967507 0.139162 0 0.00114416 0.0465973 0 -0.00291878 0.0930369 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0154377 -0.147879 0 -0.0105137 -0.148747 0 -0.0105137 -0.148747 0.01 -0.0154377 -0.147879 0.01 -0.0154377 -0.147879 0 -0.0105137 -0.148747 0 -0.0025 -2.08582e-16 0 -0.00825821 -0.0988647 0 -0.00394077 -0.0495161 0 -0.0154377 0.147879 0 -0.00394077 0.0495161 0 -0.00825821 0.0988647 0 -0.0105137 0.148747 0 0.0025 -2.09806e-16 0 0.00105077 0.0498069 0 -0.00329202 0.0994452 0 -0.00329202 -0.0994452 0 0.00105077 -0.0498069 0 -0.0105137 -0.148747 0 -0.0105137 -0.148747 0.01 0.0025 -2.09806e-16 0.01 -0.00329202 -0.0994452 0.01 0.00105077 -0.0498069 0.01 0.0025 -2.09806e-16 0 -0.00329202 -0.0994452 0 0.00105077 -0.0498069 0 -0.0154377 -0.147879 0.01 -0.0105137 -0.148747 0.01 -0.0025 -2.08582e-16 0.01 -0.00825821 -0.0988647 0.01 -0.00394077 -0.0495161 0.01 -0.0154377 0.147879 0.01 -0.00394077 0.0495161 0.01 -0.00825821 0.0988647 0.01 -0.0105137 0.148747 0.01 0.0025 -2.09806e-16 0.01 0.00105077 0.0498069 0.01 -0.00329202 0.0994452 0.01 -0.00329202 -0.0994452 0.01 0.00105077 -0.0498069 0.01 -0.0154377 -0.147879 0 -0.0154377 -0.147879 0.01 -0.0025 -2.08582e-16 0.01 -0.00825821 -0.0988647 0.01 -0.00394077 -0.0495161 0.01 -0.0025 -2.08582e-16 0 -0.00825821 -0.0988647 0 -0.00394077 -0.0495161 0 -0.0025 -2.08582e-16 0 -0.0025 -2.08582e-16 0.01 -0.0154377 0.147879 0.01 -0.00394077 0.0495161 0.01 -0.00825821 0.0988647 0.01 -0.0154377 0.147879 0 -0.00394077 0.0495161 0 -0.00825821 0.0988647 0 -0.0154377 0.147879 0 -0.0105137 0.148747 0 -0.0105137 0.148747 0.01 -0.0154377 0.147879 0.01 0.0025 -2.09806e-16 0 0.0025 -2.09806e-16 0.01 -0.0105137 0.148747 0.01 0.00105077 0.0498069 0.01 -0.00329202 0.0994452 0.01 -0.0105137 0.148747 0 0.00105077 0.0498069 0 -0.00329202 0.0994452 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0155638 -0.14932 0 -0.0106398 -0.150188 0 -0.0106398 -0.150188 0.01 -0.0155638 -0.14932 0.01 -0.0155638 -0.14932 0 -0.0106398 -0.150188 0 -0.0025 -2.10615e-16 0 -0.00831434 -0.0998283 0 -0.00395481 -0.0499987 0 -0.0155638 0.14932 0 -0.00395481 0.0499987 0 -0.00831434 0.0998283 0 -0.0106398 0.150188 0 0.0025 -2.11839e-16 0 0.00103673 0.0502895 0 -0.00334814 0.100409 0 -0.00334814 -0.100409 0 0.00103673 -0.0502895 0 -0.0106398 -0.150188 0 -0.0106398 -0.150188 0.01 0.0025 -2.11839e-16 0.01 -0.00334814 -0.100409 0.01 0.00103673 -0.0502895 0.01 0.0025 -2.11839e-16 0 -0.00334814 -0.100409 0 0.00103673 -0.0502895 0 -0.0155638 -0.14932 0.01 -0.0106398 -0.150188 0.01 -0.0025 -2.10615e-16 0.01 -0.00831434 -0.0998283 0.01 -0.00395481 -0.0499987 0.01 -0.0155638 0.14932 0.01 -0.00395481 0.0499987 0.01 -0.00831434 0.0998283 0.01 -0.0106398 0.150188 0.01 0.0025 -2.11839e-16 0.01 0.00103673 0.0502895 0.01 -0.00334814 0.100409 0.01 -0.00334814 -0.100409 0.01 0.00103673 -0.0502895 0.01 -0.0155638 -0.14932 0 -0.0155638 -0.14932 0.01 -0.0025 -2.10615e-16 0.01 -0.00831434 -0.0998283 0.01 -0.00395481 -0.0499987 0.01 -0.0025 -2.10615e-16 0 -0.00831434 -0.0998283 0 -0.00395481 -0.0499987 0 -0.0025 -2.10615e-16 0 -0.0025 -2.10615e-16 0.01 -0.0155638 0.14932 0.01 -0.00395481 0.0499987 0.01 -0.00831434 0.0998283 0.01 -0.0155638 0.14932 0 -0.00395481 0.0499987 0 -0.00831434 0.0998283 0 -0.0155638 0.14932 0 -0.0106398 0.150188 0 -0.0106398 0.150188 0.01 -0.0155638 0.14932 0.01 0.0025 -2.11839e-16 0 0.0025 -2.11839e-16 0.01 -0.0106398 0.150188 0.01 0.00103673 0.0502895 0.01 -0.00334814 0.100409 0.01 -0.0106398 0.150188 0 0.00103673 0.0502895 0 -0.00334814 0.100409 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0155653 -0.149337 0 -0.0106413 -0.150206 0 -0.0106413 -0.150206 0.01 -0.0155653 -0.149337 0.01 -0.0155653 -0.149337 0 -0.0106413 -0.150206 0 -0.0025 -2.10639e-16 0 -0.00831501 -0.0998399 0 -0.00395498 -0.0500046 0 -0.0155653 0.149337 0 -0.00395498 0.0500046 0 -0.00831501 0.0998399 0 -0.0106413 0.150206 0 0.0025 -2.11864e-16 0 0.00103656 0.0502953 0 -0.00334882 0.10042 0 -0.00334882 -0.10042 0 0.00103656 -0.0502953 0 -0.0106413 -0.150206 0 -0.0106413 -0.150206 0.01 0.0025 -2.11864e-16 0.01 -0.00334882 -0.10042 0.01 0.00103656 -0.0502953 0.01 0.0025 -2.11864e-16 0 -0.00334882 -0.10042 0 0.00103656 -0.0502953 0 -0.0155653 -0.149337 0.01 -0.0106413 -0.150206 0.01 -0.0025 -2.10639e-16 0.01 -0.00831501 -0.0998399 0.01 -0.00395498 -0.0500046 0.01 -0.0155653 0.149337 0.01 -0.00395498 0.0500046 0.01 -0.00831501 0.0998399 0.01 -0.0106413 0.150206 0.01 0.0025 -2.11864e-16 0.01 0.00103656 0.0502953 0.01 -0.00334882 0.10042 0.01 -0.00334882 -0.10042 0.01 0.00103656 -0.0502953 0.01 -0.0155653 -0.149337 0 -0.0155653 -0.149337 0.01 -0.0025 -2.10639e-16 0.01 -0.00831501 -0.0998399 0.01 -0.00395498 -0.0500046 0.01 -0.0025 -2.10639e-16 0 -0.00831501 -0.0998399 0 -0.00395498 -0.0500046 0 -0.0025 -2.10639e-16 0 -0.0025 -2.10639e-16 0.01 -0.0155653 0.149337 0.01 -0.00395498 0.0500046 0.01 -0.00831501 0.0998399 0.01 -0.0155653 0.149337 0 -0.00395498 0.0500046 0 -0.00831501 0.0998399 0 -0.0155653 0.149337 0 -0.0106413 0.150206 0 -0.0106413 0.150206 0.01 -0.0155653 0.149337 0.01 0.0025 -2.11864e-16 0 0.0025 -2.11864e-16 0.01 -0.0106413 0.150206 0.01 0.00103656 0.0502953 0.01 -0.00334882 0.10042 0.01 -0.0106413 0.150206 0 0.00103656 0.0502953 0 -0.00334882 0.10042 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145353 -0.137564 0 -0.00961126 -0.138432 0 -0.00961126 -0.138432 0.01 -0.0145353 -0.137564 0.01 -0.0145353 -0.137564 0 -0.00961126 -0.138432 0 -0.0025 -1.94033e-16 0 -0.00785657 -0.0919688 0 -0.00384028 -0.0460623 0 -0.0145353 0.137564 0 -0.00384028 0.0460623 0 -0.00785657 0.0919688 0 -0.00961126 0.138432 0 0.0025 -1.95258e-16 0 0.00115126 0.0463531 0 -0.00289038 0.0925493 0 -0.00289038 -0.0925493 0 0.00115126 -0.0463531 0 -0.00961126 -0.138432 0 -0.00961126 -0.138432 0.01 0.0025 -1.95258e-16 0.01 -0.00289038 -0.0925493 0.01 0.00115126 -0.0463531 0.01 0.0025 -1.95258e-16 0 -0.00289038 -0.0925493 0 0.00115126 -0.0463531 0 -0.0145353 -0.137564 0.01 -0.00961126 -0.138432 0.01 -0.0025 -1.94033e-16 0.01 -0.00785657 -0.0919688 0.01 -0.00384028 -0.0460623 0.01 -0.0145353 0.137564 0.01 -0.00384028 0.0460623 0.01 -0.00785657 0.0919688 0.01 -0.00961126 0.138432 0.01 0.0025 -1.95258e-16 0.01 0.00115126 0.0463531 0.01 -0.00289038 0.0925493 0.01 -0.00289038 -0.0925493 0.01 0.00115126 -0.0463531 0.01 -0.0145353 -0.137564 0 -0.0145353 -0.137564 0.01 -0.0025 -1.94033e-16 0.01 -0.00785657 -0.0919688 0.01 -0.00384028 -0.0460623 0.01 -0.0025 -1.94033e-16 0 -0.00785657 -0.0919688 0 -0.00384028 -0.0460623 0 -0.0025 -1.94033e-16 0 -0.0025 -1.94033e-16 0.01 -0.0145353 0.137564 0.01 -0.00384028 0.0460623 0.01 -0.00785657 0.0919688 0.01 -0.0145353 0.137564 0 -0.00384028 0.0460623 0 -0.00785657 0.0919688 0 -0.0145353 0.137564 0 -0.00961126 0.138432 0 -0.00961126 0.138432 0.01 -0.0145353 0.137564 0.01 0.0025 -1.95258e-16 0 0.0025 -1.95258e-16 0.01 -0.00961126 0.138432 0.01 0.00115126 0.0463531 0.01 -0.00289038 0.0925493 0.01 -0.00961126 0.138432 0 0.00115126 0.0463531 0 -0.00289038 0.0925493 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145368 -0.137581 0 -0.00961278 -0.13845 0 -0.00961278 -0.13845 0.01 -0.0145368 -0.137581 0.01 -0.0145368 -0.137581 0 -0.00961278 -0.13845 0 -0.0025 -1.94058e-16 0 -0.00785725 -0.0919804 0 -0.00384045 -0.0460681 0 -0.0145368 0.137581 0 -0.00384045 0.0460681 0 -0.00785725 0.0919804 0 -0.00961278 0.13845 0 0.0025 -1.95282e-16 0 0.00115109 0.0463589 0 -0.00289106 0.0925609 0 -0.00289106 -0.0925609 0 0.00115109 -0.0463589 0 -0.00961278 -0.13845 0 -0.00961278 -0.13845 0.01 0.0025 -1.95282e-16 0.01 -0.00289106 -0.0925609 0.01 0.00115109 -0.0463589 0.01 0.0025 -1.95282e-16 0 -0.00289106 -0.0925609 0 0.00115109 -0.0463589 0 -0.0145368 -0.137581 0.01 -0.00961278 -0.13845 0.01 -0.0025 -1.94058e-16 0.01 -0.00785725 -0.0919804 0.01 -0.00384045 -0.0460681 0.01 -0.0145368 0.137581 0.01 -0.00384045 0.0460681 0.01 -0.00785725 0.0919804 0.01 -0.00961278 0.13845 0.01 0.0025 -1.95282e-16 0.01 0.00115109 0.0463589 0.01 -0.00289106 0.0925609 0.01 -0.00289106 -0.0925609 0.01 0.00115109 -0.0463589 0.01 -0.0145368 -0.137581 0 -0.0145368 -0.137581 0.01 -0.0025 -1.94058e-16 0.01 -0.00785725 -0.0919804 0.01 -0.00384045 -0.0460681 0.01 -0.0025 -1.94058e-16 0 -0.00785725 -0.0919804 0 -0.00384045 -0.0460681 0 -0.0025 -1.94058e-16 0 -0.0025 -1.94058e-16 0.01 -0.0145368 0.137581 0.01 -0.00384045 0.0460681 0.01 -0.00785725 0.0919804 0.01 -0.0145368 0.137581 0 -0.00384045 0.0460681 0 -0.00785725 0.0919804 0 -0.0145368 0.137581 0 -0.00961278 0.13845 0 -0.00961278 0.13845 0.01 -0.0145368 0.137581 0.01 0.0025 -1.95282e-16 0 0.0025 -1.95282e-16 0.01 -0.00961278 0.13845 0.01 0.00115109 0.0463589 0.01 -0.00289106 0.0925609 0.01 -0.00961278 0.13845 0 0.00115109 0.0463589 0 -0.00289106 0.0925609 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0146644 -0.13904 0 -0.00974039 -0.139908 0 -0.00974039 -0.139908 0.01 -0.0146644 -0.13904 0.01 -0.0146644 -0.13904 0 -0.00974039 -0.139908 0 -0.0025 -1.96115e-16 0 -0.00791405 -0.0929556 0 -0.00385466 -0.0465566 0 -0.0146644 0.13904 0 -0.00385466 0.0465566 0 -0.00791405 0.0929556 0 -0.00974039 0.139908 0 0.0025 -1.9734e-16 0 0.00113688 0.0468473 0 -0.00294786 0.0935361 0 -0.00294786 -0.0935361 0 0.00113688 -0.0468473 0 -0.00974039 -0.139908 0 -0.00974039 -0.139908 0.01 0.0025 -1.9734e-16 0.01 -0.00294786 -0.0935361 0.01 0.00113688 -0.0468473 0.01 0.0025 -1.9734e-16 0 -0.00294786 -0.0935361 0 0.00113688 -0.0468473 0 -0.0146644 -0.13904 0.01 -0.00974039 -0.139908 0.01 -0.0025 -1.96115e-16 0.01 -0.00791405 -0.0929556 0.01 -0.00385466 -0.0465566 0.01 -0.0146644 0.13904 0.01 -0.00385466 0.0465566 0.01 -0.00791405 0.0929556 0.01 -0.00974039 0.139908 0.01 0.0025 -1.9734e-16 0.01 0.00113688 0.0468473 0.01 -0.00294786 0.0935361 0.01 -0.00294786 -0.0935361 0.01 0.00113688 -0.0468473 0.01 -0.0146644 -0.13904 0 -0.0146644 -0.13904 0.01 -0.0025 -1.96115e-16 0.01 -0.00791405 -0.0929556 0.01 -0.00385466 -0.0465566 0.01 -0.0025 -1.96115e-16 0 -0.00791405 -0.0929556 0 -0.00385466 -0.0465566 0 -0.0025 -1.96115e-16 0 -0.0025 -1.96115e-16 0.01 -0.0146644 0.13904 0.01 -0.00385466 0.0465566 0.01 -0.00791405 0.0929556 0.01 -0.0146644 0.13904 0 -0.00385466 0.0465566 0 -0.00791405 0.0929556 0 -0.0146644 0.13904 0 -0.00974039 0.139908 0 -0.00974039 0.139908 0.01 -0.0146644 0.13904 0.01 0.0025 -1.9734e-16 0 0.0025 -1.9734e-16 0.01 -0.00974039 0.139908 0.01 0.00113688 0.0468473 0.01 -0.00294786 0.0935361 0.01 -0.00974039 0.139908 0 0.00113688 0.0468473 0 -0.00294786 0.0935361 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.014666 -0.139057 0 -0.00974191 -0.139926 0 -0.00974191 -0.139926 0.01 -0.014666 -0.139057 0.01 -0.014666 -0.139057 0 -0.00974191 -0.139926 0 -0.0025 -1.96139e-16 0 -0.00791472 -0.0929672 0 -0.00385483 -0.0465624 0 -0.014666 0.139057 0 -0.00385483 0.0465624 0 -0.00791472 0.0929672 0 -0.00974191 0.139926 0 0.0025 -1.97364e-16 0 0.00113671 0.0468531 0 -0.00294853 0.0935477 0 -0.00294853 -0.0935477 0 0.00113671 -0.0468531 0 -0.00974191 -0.139926 0 -0.00974191 -0.139926 0.01 0.0025 -1.97364e-16 0.01 -0.00294853 -0.0935477 0.01 0.00113671 -0.0468531 0.01 0.0025 -1.97364e-16 0 -0.00294853 -0.0935477 0 0.00113671 -0.0468531 0 -0.014666 -0.139057 0.01 -0.00974191 -0.139926 0.01 -0.0025 -1.96139e-16 0.01 -0.00791472 -0.0929672 0.01 -0.00385483 -0.0465624 0.01 -0.014666 0.139057 0.01 -0.00385483 0.0465624 0.01 -0.00791472 0.0929672 0.01 -0.00974191 0.139926 0.01 0.0025 -1.97364e-16 0.01 0.00113671 0.0468531 0.01 -0.00294853 0.0935477 0.01 -0.00294853 -0.0935477 0.01 0.00113671 -0.0468531 0.01 -0.014666 -0.139057 0 -0.014666 -0.139057 0.01 -0.0025 -1.96139e-16 0.01 -0.00791472 -0.0929672 0.01 -0.00385483 -0.0465624 0.01 -0.0025 -1.96139e-16 0 -0.00791472 -0.0929672 0 -0.00385483 -0.0465624 0 -0.0025 -1.96139e-16 0 -0.0025 -1.96139e-16 0.01 -0.014666 0.139057 0.01 -0.00385483 0.0465624 0.01 -0.00791472 0.0929672 0.01 -0.014666 0.139057 0 -0.00385483 0.0465624 0 -0.00791472 0.0929672 0 -0.014666 0.139057 0 -0.00974191 0.139926 0 -0.00974191 0.139926 0.01 -0.014666 0.139057 0.01 0.0025 -1.97364e-16 0 0.0025 -1.97364e-16 0.01 -0.00974191 0.139926 0.01 0.00113671 0.0468531 0.01 -0.00294853 0.0935477 0.01 -0.00974191 0.139926 0 0.00113671 0.0468531 0 -0.00294853 0.0935477 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.014792 -0.140499 0 -0.00986801 -0.141367 0 -0.00986801 -0.141367 0.01 -0.014792 -0.140499 0.01 -0.014792 -0.140499 0 -0.00986801 -0.141367 0 -0.0025 -1.98172e-16 0 -0.00797084 -0.0939308 0 -0.00386887 -0.047045 0 -0.014792 0.140499 0 -0.00386887 0.047045 0 -0.00797084 0.0939308 0 -0.00986801 0.141367 0 0.0025 -1.99397e-16 0 0.00112267 0.0473357 0 -0.00300465 0.0945112 0 -0.00300465 -0.0945112 0 0.00112267 -0.0473357 0 -0.00986801 -0.141367 0 -0.00986801 -0.141367 0.01 0.0025 -1.99397e-16 0.01 -0.00300465 -0.0945112 0.01 0.00112267 -0.0473357 0.01 0.0025 -1.99397e-16 0 -0.00300465 -0.0945112 0 0.00112267 -0.0473357 0 -0.014792 -0.140499 0.01 -0.00986801 -0.141367 0.01 -0.0025 -1.98172e-16 0.01 -0.00797084 -0.0939308 0.01 -0.00386887 -0.047045 0.01 -0.014792 0.140499 0.01 -0.00386887 0.047045 0.01 -0.00797084 0.0939308 0.01 -0.00986801 0.141367 0.01 0.0025 -1.99397e-16 0.01 0.00112267 0.0473357 0.01 -0.00300465 0.0945112 0.01 -0.00300465 -0.0945112 0.01 0.00112267 -0.0473357 0.01 -0.014792 -0.140499 0 -0.014792 -0.140499 0.01 -0.0025 -1.98172e-16 0.01 -0.00797084 -0.0939308 0.01 -0.00386887 -0.047045 0.01 -0.0025 -1.98172e-16 0 -0.00797084 -0.0939308 0 -0.00386887 -0.047045 0 -0.0025 -1.98172e-16 0 -0.0025 -1.98172e-16 0.01 -0.014792 0.140499 0.01 -0.00386887 0.047045 0.01 -0.00797084 0.0939308 0.01 -0.014792 0.140499 0 -0.00386887 0.047045 0 -0.00797084 0.0939308 0 -0.014792 0.140499 0 -0.00986801 0.141367 0 -0.00986801 0.141367 0.01 -0.014792 0.140499 0.01 0.0025 -1.99397e-16 0 0.0025 -1.99397e-16 0.01 -0.00986801 0.141367 0.01 0.00112267 0.0473357 0.01 -0.00300465 0.0945112 0.01 -0.00986801 0.141367 0 0.00112267 0.0473357 0 -0.00300465 0.0945112 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0147951 -0.140533 0 -0.00987105 -0.141402 0 -0.00987105 -0.141402 0.01 -0.0147951 -0.140533 0.01 -0.0147951 -0.140533 0 -0.00987105 -0.141402 0 -0.0025 -1.98221e-16 0 -0.0079722 -0.093954 0 -0.00386921 -0.0470566 0 -0.0147951 0.140533 0 -0.00386921 0.0470566 0 -0.0079722 0.093954 0 -0.00987105 0.141402 0 0.0025 -1.99446e-16 0 0.00112233 0.0473473 0 -0.00300601 0.0945345 0 -0.00300601 -0.0945345 0 0.00112233 -0.0473473 0 -0.00987105 -0.141402 0 -0.00987105 -0.141402 0.01 0.0025 -1.99446e-16 0.01 -0.00300601 -0.0945345 0.01 0.00112233 -0.0473473 0.01 0.0025 -1.99446e-16 0 -0.00300601 -0.0945345 0 0.00112233 -0.0473473 0 -0.0147951 -0.140533 0.01 -0.00987105 -0.141402 0.01 -0.0025 -1.98221e-16 0.01 -0.0079722 -0.093954 0.01 -0.00386921 -0.0470566 0.01 -0.0147951 0.140533 0.01 -0.00386921 0.0470566 0.01 -0.0079722 0.093954 0.01 -0.00987105 0.141402 0.01 0.0025 -1.99446e-16 0.01 0.00112233 0.0473473 0.01 -0.00300601 0.0945345 0.01 -0.00300601 -0.0945345 0.01 0.00112233 -0.0473473 0.01 -0.0147951 -0.140533 0 -0.0147951 -0.140533 0.01 -0.0025 -1.98221e-16 0.01 -0.0079722 -0.093954 0.01 -0.00386921 -0.0470566 0.01 -0.0025 -1.98221e-16 0 -0.0079722 -0.093954 0 -0.00386921 -0.0470566 0 -0.0025 -1.98221e-16 0 -0.0025 -1.98221e-16 0.01 -0.0147951 0.140533 0.01 -0.00386921 0.0470566 0.01 -0.0079722 0.093954 0.01 -0.0147951 0.140533 0 -0.00386921 0.0470566 0 -0.0079722 0.093954 0 -0.0147951 0.140533 0 -0.00987105 0.141402 0 -0.00987105 0.141402 0.01 -0.0147951 0.140533 0.01 0.0025 -1.99446e-16 0 0.0025 -1.99446e-16 0.01 -0.00987105 0.141402 0.01 0.00112233 0.0473473 0.01 -0.00300601 0.0945345 0.01 -0.00987105 0.141402 0 0.00112233 0.0473473 0 -0.00300601 0.0945345 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0149212 -0.141975 0 -0.00999714 -0.142843 0 -0.00999714 -0.142843 0.01 -0.0149212 -0.141975 0.01 -0.0149212 -0.141975 0 -0.00999714 -0.142843 0 -0.0025 -2.00254e-16 0 -0.00802832 -0.0949176 0 -0.00388325 -0.0475392 0 -0.0149212 0.141975 0 -0.00388325 0.0475392 0 -0.00802832 0.0949176 0 -0.00999714 0.142843 0 0.0025 -2.01479e-16 0 0.00110829 0.0478299 0 -0.00306213 0.095498 0 -0.00306213 -0.095498 0 0.00110829 -0.0478299 0 -0.00999714 -0.142843 0 -0.00999714 -0.142843 0.01 0.0025 -2.01479e-16 0.01 -0.00306213 -0.095498 0.01 0.00110829 -0.0478299 0.01 0.0025 -2.01479e-16 0 -0.00306213 -0.095498 0 0.00110829 -0.0478299 0 -0.0149212 -0.141975 0.01 -0.00999714 -0.142843 0.01 -0.0025 -2.00254e-16 0.01 -0.00802832 -0.0949176 0.01 -0.00388325 -0.0475392 0.01 -0.0149212 0.141975 0.01 -0.00388325 0.0475392 0.01 -0.00802832 0.0949176 0.01 -0.00999714 0.142843 0.01 0.0025 -2.01479e-16 0.01 0.00110829 0.0478299 0.01 -0.00306213 0.095498 0.01 -0.00306213 -0.095498 0.01 0.00110829 -0.0478299 0.01 -0.0149212 -0.141975 0 -0.0149212 -0.141975 0.01 -0.0025 -2.00254e-16 0.01 -0.00802832 -0.0949176 0.01 -0.00388325 -0.0475392 0.01 -0.0025 -2.00254e-16 0 -0.00802832 -0.0949176 0 -0.00388325 -0.0475392 0 -0.0025 -2.00254e-16 0 -0.0025 -2.00254e-16 0.01 -0.0149212 0.141975 0.01 -0.00388325 0.0475392 0.01 -0.00802832 0.0949176 0.01 -0.0149212 0.141975 0 -0.00388325 0.0475392 0 -0.00802832 0.0949176 0 -0.0149212 0.141975 0 -0.00999714 0.142843 0 -0.00999714 0.142843 0.01 -0.0149212 0.141975 0.01 0.0025 -2.01479e-16 0 0.0025 -2.01479e-16 0.01 -0.00999714 0.142843 0.01 0.00110829 0.0478299 0.01 -0.00306213 0.095498 0.01 -0.00999714 0.142843 0 0.00110829 0.0478299 0 -0.00306213 0.095498 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0149227 -0.141992 0 -0.00999866 -0.14286 0 -0.00999866 -0.14286 0.01 -0.0149227 -0.141992 0.01 -0.0149227 -0.141992 0 -0.00999866 -0.14286 0 -0.0025 -2.00279e-16 0 -0.00802899 -0.0949292 0 -0.00388342 -0.047545 0 -0.0149227 0.141992 0 -0.00388342 0.047545 0 -0.00802899 0.0949292 0 -0.00999866 0.14286 0 0.0025 -2.01503e-16 0 0.00110812 0.0478358 0 -0.0030628 0.0955096 0 -0.0030628 -0.0955096 0 0.00110812 -0.0478358 0 -0.00999866 -0.14286 0 -0.00999866 -0.14286 0.01 0.0025 -2.01503e-16 0.01 -0.0030628 -0.0955096 0.01 0.00110812 -0.0478358 0.01 0.0025 -2.01503e-16 0 -0.0030628 -0.0955096 0 0.00110812 -0.0478358 0 -0.0149227 -0.141992 0.01 -0.00999866 -0.14286 0.01 -0.0025 -2.00279e-16 0.01 -0.00802899 -0.0949292 0.01 -0.00388342 -0.047545 0.01 -0.0149227 0.141992 0.01 -0.00388342 0.047545 0.01 -0.00802899 0.0949292 0.01 -0.00999866 0.14286 0.01 0.0025 -2.01503e-16 0.01 0.00110812 0.0478358 0.01 -0.0030628 0.0955096 0.01 -0.0030628 -0.0955096 0.01 0.00110812 -0.0478358 0.01 -0.0149227 -0.141992 0 -0.0149227 -0.141992 0.01 -0.0025 -2.00279e-16 0.01 -0.00802899 -0.0949292 0.01 -0.00388342 -0.047545 0.01 -0.0025 -2.00279e-16 0 -0.00802899 -0.0949292 0 -0.00388342 -0.047545 0 -0.0025 -2.00279e-16 0 -0.0025 -2.00279e-16 0.01 -0.0149227 0.141992 0.01 -0.00388342 0.047545 0.01 -0.00802899 0.0949292 0.01 -0.0149227 0.141992 0 -0.00388342 0.047545 0 -0.00802899 0.0949292 0 -0.0149227 0.141992 0 -0.00999866 0.14286 0 -0.00999866 0.14286 0.01 -0.0149227 0.141992 0.01 0.0025 -2.01503e-16 0 0.0025 -2.01503e-16 0.01 -0.00999866 0.14286 0.01 0.00110812 0.0478358 0.01 -0.0030628 0.0955096 0.01 -0.00999866 0.14286 0 0.00110812 0.0478358 0 -0.0030628 0.0955096 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0173155 -0.169342 0 -0.0123914 -0.17021 0 -0.0123914 -0.17021 0.01 -0.0173155 -0.169342 0.01 -0.0173155 -0.169342 0 -0.0123914 -0.17021 0 -0.0025 -2.38855e-16 0 -0.00909395 -0.113214 0 -0.00414988 -0.0567028 0 -0.0173155 0.169342 0 -0.00414988 0.0567028 0 -0.00909395 0.113214 0 -0.0123914 0.17021 0 0.0025 -2.4008e-16 0 0.000841657 0.0569936 0 -0.00412776 0.113794 0 -0.00412776 -0.113794 0 0.000841657 -0.0569936 0 -0.0123914 -0.17021 0 -0.0123914 -0.17021 0.01 0.0025 -2.4008e-16 0.01 -0.00412776 -0.113794 0.01 0.000841657 -0.0569936 0.01 0.0025 -2.4008e-16 0 -0.00412776 -0.113794 0 0.000841657 -0.0569936 0 -0.0173155 -0.169342 0.01 -0.0123914 -0.17021 0.01 -0.0025 -2.38855e-16 0.01 -0.00909395 -0.113214 0.01 -0.00414988 -0.0567028 0.01 -0.0173155 0.169342 0.01 -0.00414988 0.0567028 0.01 -0.00909395 0.113214 0.01 -0.0123914 0.17021 0.01 0.0025 -2.4008e-16 0.01 0.000841657 0.0569936 0.01 -0.00412776 0.113794 0.01 -0.00412776 -0.113794 0.01 0.000841657 -0.0569936 0.01 -0.0173155 -0.169342 0 -0.0173155 -0.169342 0.01 -0.0025 -2.38855e-16 0.01 -0.00909395 -0.113214 0.01 -0.00414988 -0.0567028 0.01 -0.0025 -2.38855e-16 0 -0.00909395 -0.113214 0 -0.00414988 -0.0567028 0 -0.0025 -2.38855e-16 0 -0.0025 -2.38855e-16 0.01 -0.0173155 0.169342 0.01 -0.00414988 0.0567028 0.01 -0.00909395 0.113214 0.01 -0.0173155 0.169342 0 -0.00414988 0.0567028 0 -0.00909395 0.113214 0 -0.0173155 0.169342 0 -0.0123914 0.17021 0 -0.0123914 0.17021 0.01 -0.0173155 0.169342 0.01 0.0025 -2.4008e-16 0 0.0025 -2.4008e-16 0.01 -0.0123914 0.17021 0.01 0.000841657 0.0569936 0.01 -0.00412776 0.113794 0.01 -0.0123914 0.17021 0 0.000841657 0.0569936 0 -0.00412776 0.113794 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0173094 -0.169272 0 -0.0123854 -0.17014 0 -0.0123854 -0.17014 0.01 -0.0173094 -0.169272 0.01 -0.0173094 -0.169272 0 -0.0123854 -0.17014 0 -0.0025 -2.38757e-16 0 -0.00909125 -0.113167 0 -0.00414921 -0.0566796 0 -0.0173094 0.169272 0 -0.00414921 0.0566796 0 -0.00909125 0.113167 0 -0.0123854 0.17014 0 0.0025 -2.39982e-16 0 0.000842333 0.0569703 0 -0.00412506 0.113748 0 -0.00412506 -0.113748 0 0.000842333 -0.0569703 0 -0.0123854 -0.17014 0 -0.0123854 -0.17014 0.01 0.0025 -2.39982e-16 0.01 -0.00412506 -0.113748 0.01 0.000842333 -0.0569703 0.01 0.0025 -2.39982e-16 0 -0.00412506 -0.113748 0 0.000842333 -0.0569703 0 -0.0173094 -0.169272 0.01 -0.0123854 -0.17014 0.01 -0.0025 -2.38757e-16 0.01 -0.00909125 -0.113167 0.01 -0.00414921 -0.0566796 0.01 -0.0173094 0.169272 0.01 -0.00414921 0.0566796 0.01 -0.00909125 0.113167 0.01 -0.0123854 0.17014 0.01 0.0025 -2.39982e-16 0.01 0.000842333 0.0569703 0.01 -0.00412506 0.113748 0.01 -0.00412506 -0.113748 0.01 0.000842333 -0.0569703 0.01 -0.0173094 -0.169272 0 -0.0173094 -0.169272 0.01 -0.0025 -2.38757e-16 0.01 -0.00909125 -0.113167 0.01 -0.00414921 -0.0566796 0.01 -0.0025 -2.38757e-16 0 -0.00909125 -0.113167 0 -0.00414921 -0.0566796 0 -0.0025 -2.38757e-16 0 -0.0025 -2.38757e-16 0.01 -0.0173094 0.169272 0.01 -0.00414921 0.0566796 0.01 -0.00909125 0.113167 0.01 -0.0173094 0.169272 0 -0.00414921 0.0566796 0 -0.00909125 0.113167 0 -0.0173094 0.169272 0 -0.0123854 0.17014 0 -0.0123854 0.17014 0.01 -0.0173094 0.169272 0.01 0.0025 -2.39982e-16 0 0.0025 -2.39982e-16 0.01 -0.0123854 0.17014 0.01 0.000842333 0.0569703 0.01 -0.00412506 0.113748 0.01 -0.0123854 0.17014 0 0.000842333 0.0569703 0 -0.00412506 0.113748 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179323 -0.176392 0 -0.0130082 -0.17726 0 -0.0130082 -0.17726 0.01 -0.0179323 -0.176392 0.01 -0.0179323 -0.176392 0 -0.0130082 -0.17726 0 -0.0025 -2.48799e-16 0 -0.00936848 -0.117927 0 -0.00421857 -0.0590635 0 -0.0179323 0.176392 0 -0.00421857 0.0590635 0 -0.00936848 0.117927 0 -0.0130082 0.17726 0 0.0025 -2.50024e-16 0 0.000772968 0.0593542 0 -0.00440228 0.118508 0 -0.00440228 -0.118508 0 0.000772968 -0.0593542 0 -0.0130082 -0.17726 0 -0.0130082 -0.17726 0.01 0.0025 -2.50024e-16 0.01 -0.00440228 -0.118508 0.01 0.000772968 -0.0593542 0.01 0.0025 -2.50024e-16 0 -0.00440228 -0.118508 0 0.000772968 -0.0593542 0 -0.0179323 -0.176392 0.01 -0.0130082 -0.17726 0.01 -0.0025 -2.48799e-16 0.01 -0.00936848 -0.117927 0.01 -0.00421857 -0.0590635 0.01 -0.0179323 0.176392 0.01 -0.00421857 0.0590635 0.01 -0.00936848 0.117927 0.01 -0.0130082 0.17726 0.01 0.0025 -2.50024e-16 0.01 0.000772968 0.0593542 0.01 -0.00440228 0.118508 0.01 -0.00440228 -0.118508 0.01 0.000772968 -0.0593542 0.01 -0.0179323 -0.176392 0 -0.0179323 -0.176392 0.01 -0.0025 -2.48799e-16 0.01 -0.00936848 -0.117927 0.01 -0.00421857 -0.0590635 0.01 -0.0025 -2.48799e-16 0 -0.00936848 -0.117927 0 -0.00421857 -0.0590635 0 -0.0025 -2.48799e-16 0 -0.0025 -2.48799e-16 0.01 -0.0179323 0.176392 0.01 -0.00421857 0.0590635 0.01 -0.00936848 0.117927 0.01 -0.0179323 0.176392 0 -0.00421857 0.0590635 0 -0.00936848 0.117927 0 -0.0179323 0.176392 0 -0.0130082 0.17726 0 -0.0130082 0.17726 0.01 -0.0179323 0.176392 0.01 0.0025 -2.50024e-16 0 0.0025 -2.50024e-16 0.01 -0.0130082 0.17726 0.01 0.000772968 0.0593542 0.01 -0.00440228 0.118508 0.01 -0.0130082 0.17726 0 0.000772968 0.0593542 0 -0.00440228 0.118508 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179247 -0.176305 0 -0.0130006 -0.177173 0 -0.0130006 -0.177173 0.01 -0.0179247 -0.176305 0.01 -0.0179247 -0.176305 0 -0.0130006 -0.177173 0 -0.0025 -2.48677e-16 0 -0.0093651 -0.117869 0 -0.00421773 -0.0590344 0 -0.0179247 0.176305 0 -0.00421773 0.0590344 0 -0.0093651 0.117869 0 -0.0130006 0.177173 0 0.0025 -2.49901e-16 0 0.000773814 0.0593252 0 -0.0043989 0.11845 0 -0.0043989 -0.11845 0 0.000773814 -0.0593252 0 -0.0130006 -0.177173 0 -0.0130006 -0.177173 0.01 0.0025 -2.49901e-16 0.01 -0.0043989 -0.11845 0.01 0.000773814 -0.0593252 0.01 0.0025 -2.49901e-16 0 -0.0043989 -0.11845 0 0.000773814 -0.0593252 0 -0.0179247 -0.176305 0.01 -0.0130006 -0.177173 0.01 -0.0025 -2.48677e-16 0.01 -0.0093651 -0.117869 0.01 -0.00421773 -0.0590344 0.01 -0.0179247 0.176305 0.01 -0.00421773 0.0590344 0.01 -0.0093651 0.117869 0.01 -0.0130006 0.177173 0.01 0.0025 -2.49901e-16 0.01 0.000773814 0.0593252 0.01 -0.0043989 0.11845 0.01 -0.0043989 -0.11845 0.01 0.000773814 -0.0593252 0.01 -0.0179247 -0.176305 0 -0.0179247 -0.176305 0.01 -0.0025 -2.48677e-16 0.01 -0.0093651 -0.117869 0.01 -0.00421773 -0.0590344 0.01 -0.0025 -2.48677e-16 0 -0.0093651 -0.117869 0 -0.00421773 -0.0590344 0 -0.0025 -2.48677e-16 0 -0.0025 -2.48677e-16 0.01 -0.0179247 0.176305 0.01 -0.00421773 0.0590344 0.01 -0.0093651 0.117869 0.01 -0.0179247 0.176305 0 -0.00421773 0.0590344 0 -0.0093651 0.117869 0 -0.0179247 0.176305 0 -0.0130006 0.177173 0 -0.0130006 0.177173 0.01 -0.0179247 0.176305 0.01 0.0025 -2.49901e-16 0 0.0025 -2.49901e-16 0.01 -0.0130006 0.177173 0.01 0.000773814 0.0593252 0.01 -0.0043989 0.11845 0.01 -0.0130006 0.177173 0 0.000773814 0.0593252 0 -0.0043989 0.11845 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0180553 -0.177798 0 -0.0131313 -0.178667 0 -0.0131313 -0.178667 0.01 -0.0180553 -0.177798 0.01 -0.0180553 -0.177798 0 -0.0131313 -0.178667 0 -0.0025 -2.50783e-16 0 -0.00942325 -0.118868 0 -0.00423228 -0.0595345 0 -0.0180553 0.177798 0 -0.00423228 0.0595345 0 -0.00942325 0.118868 0 -0.0131313 0.178667 0 0.0025 -2.52008e-16 0 0.000759264 0.0598252 0 -0.00445705 0.119448 0 -0.00445705 -0.119448 0 0.000759264 -0.0598252 0 -0.0131313 -0.178667 0 -0.0131313 -0.178667 0.01 0.0025 -2.52008e-16 0.01 -0.00445705 -0.119448 0.01 0.000759264 -0.0598252 0.01 0.0025 -2.52008e-16 0 -0.00445705 -0.119448 0 0.000759264 -0.0598252 0 -0.0180553 -0.177798 0.01 -0.0131313 -0.178667 0.01 -0.0025 -2.50783e-16 0.01 -0.00942325 -0.118868 0.01 -0.00423228 -0.0595345 0.01 -0.0180553 0.177798 0.01 -0.00423228 0.0595345 0.01 -0.00942325 0.118868 0.01 -0.0131313 0.178667 0.01 0.0025 -2.52008e-16 0.01 0.000759264 0.0598252 0.01 -0.00445705 0.119448 0.01 -0.00445705 -0.119448 0.01 0.000759264 -0.0598252 0.01 -0.0180553 -0.177798 0 -0.0180553 -0.177798 0.01 -0.0025 -2.50783e-16 0.01 -0.00942325 -0.118868 0.01 -0.00423228 -0.0595345 0.01 -0.0025 -2.50783e-16 0 -0.00942325 -0.118868 0 -0.00423228 -0.0595345 0 -0.0025 -2.50783e-16 0 -0.0025 -2.50783e-16 0.01 -0.0180553 0.177798 0.01 -0.00423228 0.0595345 0.01 -0.00942325 0.118868 0.01 -0.0180553 0.177798 0 -0.00423228 0.0595345 0 -0.00942325 0.118868 0 -0.0180553 0.177798 0 -0.0131313 0.178667 0 -0.0131313 0.178667 0.01 -0.0180553 0.177798 0.01 0.0025 -2.52008e-16 0 0.0025 -2.52008e-16 0.01 -0.0131313 0.178667 0.01 0.000759264 0.0598252 0.01 -0.00445705 0.119448 0.01 -0.0131313 0.178667 0 0.000759264 0.0598252 0 -0.00445705 0.119448 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0180477 -0.177712 0 -0.0131237 -0.17858 0 -0.0131237 -0.17858 0.01 -0.0180477 -0.177712 0.01 -0.0180477 -0.177712 0 -0.0131237 -0.17858 0 -0.0025 -2.50661e-16 0 -0.00941986 -0.118809 0 -0.00423143 -0.0595054 0 -0.0180477 0.177712 0 -0.00423143 0.0595054 0 -0.00941986 0.118809 0 -0.0131237 0.17858 0 0.0025 -2.51885e-16 0 0.00076011 0.0597961 0 -0.00445367 0.11939 0 -0.00445367 -0.11939 0 0.00076011 -0.0597961 0 -0.0131237 -0.17858 0 -0.0131237 -0.17858 0.01 0.0025 -2.51885e-16 0.01 -0.00445367 -0.11939 0.01 0.00076011 -0.0597961 0.01 0.0025 -2.51885e-16 0 -0.00445367 -0.11939 0 0.00076011 -0.0597961 0 -0.0180477 -0.177712 0.01 -0.0131237 -0.17858 0.01 -0.0025 -2.50661e-16 0.01 -0.00941986 -0.118809 0.01 -0.00423143 -0.0595054 0.01 -0.0180477 0.177712 0.01 -0.00423143 0.0595054 0.01 -0.00941986 0.118809 0.01 -0.0131237 0.17858 0.01 0.0025 -2.51885e-16 0.01 0.00076011 0.0597961 0.01 -0.00445367 0.11939 0.01 -0.00445367 -0.11939 0.01 0.00076011 -0.0597961 0.01 -0.0180477 -0.177712 0 -0.0180477 -0.177712 0.01 -0.0025 -2.50661e-16 0.01 -0.00941986 -0.118809 0.01 -0.00423143 -0.0595054 0.01 -0.0025 -2.50661e-16 0 -0.00941986 -0.118809 0 -0.00423143 -0.0595054 0 -0.0025 -2.50661e-16 0 -0.0025 -2.50661e-16 0.01 -0.0180477 0.177712 0.01 -0.00423143 0.0595054 0.01 -0.00941986 0.118809 0.01 -0.0180477 0.177712 0 -0.00423143 0.0595054 0 -0.00941986 0.118809 0 -0.0180477 0.177712 0 -0.0131237 0.17858 0 -0.0131237 0.17858 0.01 -0.0180477 0.177712 0.01 0.0025 -2.51885e-16 0 0.0025 -2.51885e-16 0.01 -0.0131237 0.17858 0.01 0.00076011 0.0597961 0.01 -0.00445367 0.11939 0.01 -0.0131237 0.17858 0 0.00076011 0.0597961 0 -0.00445367 0.11939 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0181784 -0.179205 0 -0.0132544 -0.180073 0 -0.0132544 -0.180073 0.01 -0.0181784 -0.179205 0.01 -0.0181784 -0.179205 0 -0.0132544 -0.180073 0 -0.0025 -2.52767e-16 0 -0.00947801 -0.119808 0 -0.00424598 -0.0600055 0 -0.0181784 0.179205 0 -0.00424598 0.0600055 0 -0.00947801 0.119808 0 -0.0132544 0.180073 0 0.0025 -2.53992e-16 0 0.00074556 0.0602962 0 -0.00451182 0.120388 0 -0.00451182 -0.120388 0 0.00074556 -0.0602962 0 -0.0132544 -0.180073 0 -0.0132544 -0.180073 0.01 0.0025 -2.53992e-16 0.01 -0.00451182 -0.120388 0.01 0.00074556 -0.0602962 0.01 0.0025 -2.53992e-16 0 -0.00451182 -0.120388 0 0.00074556 -0.0602962 0 -0.0181784 -0.179205 0.01 -0.0132544 -0.180073 0.01 -0.0025 -2.52767e-16 0.01 -0.00947801 -0.119808 0.01 -0.00424598 -0.0600055 0.01 -0.0181784 0.179205 0.01 -0.00424598 0.0600055 0.01 -0.00947801 0.119808 0.01 -0.0132544 0.180073 0.01 0.0025 -2.53992e-16 0.01 0.00074556 0.0602962 0.01 -0.00451182 0.120388 0.01 -0.00451182 -0.120388 0.01 0.00074556 -0.0602962 0.01 -0.0181784 -0.179205 0 -0.0181784 -0.179205 0.01 -0.0025 -2.52767e-16 0.01 -0.00947801 -0.119808 0.01 -0.00424598 -0.0600055 0.01 -0.0025 -2.52767e-16 0 -0.00947801 -0.119808 0 -0.00424598 -0.0600055 0 -0.0025 -2.52767e-16 0 -0.0025 -2.52767e-16 0.01 -0.0181784 0.179205 0.01 -0.00424598 0.0600055 0.01 -0.00947801 0.119808 0.01 -0.0181784 0.179205 0 -0.00424598 0.0600055 0 -0.00947801 0.119808 0 -0.0181784 0.179205 0 -0.0132544 0.180073 0 -0.0132544 0.180073 0.01 -0.0181784 0.179205 0.01 0.0025 -2.53992e-16 0 0.0025 -2.53992e-16 0.01 -0.0132544 0.180073 0.01 0.00074556 0.0602962 0.01 -0.00451182 0.120388 0.01 -0.0132544 0.180073 0 0.00074556 0.0602962 0 -0.00451182 0.120388 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0181708 -0.179118 0 -0.0132468 -0.179986 0 -0.0132468 -0.179986 0.01 -0.0181708 -0.179118 0.01 -0.0181708 -0.179118 0 -0.0132468 -0.179986 0 -0.0025 -2.52645e-16 0 -0.00947463 -0.11975 0 -0.00424513 -0.0599764 0 -0.0181708 0.179118 0 -0.00424513 0.0599764 0 -0.00947463 0.11975 0 -0.0132468 0.179986 0 0.0025 -2.53869e-16 0 0.000746406 0.0602671 0 -0.00450844 0.12033 0 -0.00450844 -0.12033 0 0.000746406 -0.0602671 0 -0.0132468 -0.179986 0 -0.0132468 -0.179986 0.01 0.0025 -2.53869e-16 0.01 -0.00450844 -0.12033 0.01 0.000746406 -0.0602671 0.01 0.0025 -2.53869e-16 0 -0.00450844 -0.12033 0 0.000746406 -0.0602671 0 -0.0181708 -0.179118 0.01 -0.0132468 -0.179986 0.01 -0.0025 -2.52645e-16 0.01 -0.00947463 -0.11975 0.01 -0.00424513 -0.0599764 0.01 -0.0181708 0.179118 0.01 -0.00424513 0.0599764 0.01 -0.00947463 0.11975 0.01 -0.0132468 0.179986 0.01 0.0025 -2.53869e-16 0.01 0.000746406 0.0602671 0.01 -0.00450844 0.12033 0.01 -0.00450844 -0.12033 0.01 0.000746406 -0.0602671 0.01 -0.0181708 -0.179118 0 -0.0181708 -0.179118 0.01 -0.0025 -2.52645e-16 0.01 -0.00947463 -0.11975 0.01 -0.00424513 -0.0599764 0.01 -0.0025 -2.52645e-16 0 -0.00947463 -0.11975 0 -0.00424513 -0.0599764 0 -0.0025 -2.52645e-16 0 -0.0025 -2.52645e-16 0.01 -0.0181708 0.179118 0.01 -0.00424513 0.0599764 0.01 -0.00947463 0.11975 0.01 -0.0181708 0.179118 0 -0.00424513 0.0599764 0 -0.00947463 0.11975 0 -0.0181708 0.179118 0 -0.0132468 0.179986 0 -0.0132468 0.179986 0.01 -0.0181708 0.179118 0.01 0.0025 -2.53869e-16 0 0.0025 -2.53869e-16 0.01 -0.0132468 0.179986 0.01 0.000746406 0.0602671 0.01 -0.00450844 0.12033 0.01 -0.0132468 0.179986 0 0.000746406 0.0602671 0 -0.00450844 0.12033 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0183015 -0.180611 0 -0.0133774 -0.18148 0 -0.0133774 -0.18148 0.01 -0.0183015 -0.180611 0.01 -0.0183015 -0.180611 0 -0.0133774 -0.18148 0 -0.0025 -2.54751e-16 0 -0.00953278 -0.120748 0 -0.00425968 -0.0604764 0 -0.0183015 0.180611 0 -0.00425968 0.0604764 0 -0.00953278 0.120748 0 -0.0133774 0.18148 0 0.0025 -2.55976e-16 0 0.000731856 0.0607672 0 -0.00456659 0.121329 0 -0.00456659 -0.121329 0 0.000731856 -0.0607672 0 -0.0133774 -0.18148 0 -0.0133774 -0.18148 0.01 0.0025 -2.55976e-16 0.01 -0.00456659 -0.121329 0.01 0.000731856 -0.0607672 0.01 0.0025 -2.55976e-16 0 -0.00456659 -0.121329 0 0.000731856 -0.0607672 0 -0.0183015 -0.180611 0.01 -0.0133774 -0.18148 0.01 -0.0025 -2.54751e-16 0.01 -0.00953278 -0.120748 0.01 -0.00425968 -0.0604764 0.01 -0.0183015 0.180611 0.01 -0.00425968 0.0604764 0.01 -0.00953278 0.120748 0.01 -0.0133774 0.18148 0.01 0.0025 -2.55976e-16 0.01 0.000731856 0.0607672 0.01 -0.00456659 0.121329 0.01 -0.00456659 -0.121329 0.01 0.000731856 -0.0607672 0.01 -0.0183015 -0.180611 0 -0.0183015 -0.180611 0.01 -0.0025 -2.54751e-16 0.01 -0.00953278 -0.120748 0.01 -0.00425968 -0.0604764 0.01 -0.0025 -2.54751e-16 0 -0.00953278 -0.120748 0 -0.00425968 -0.0604764 0 -0.0025 -2.54751e-16 0 -0.0025 -2.54751e-16 0.01 -0.0183015 0.180611 0.01 -0.00425968 0.0604764 0.01 -0.00953278 0.120748 0.01 -0.0183015 0.180611 0 -0.00425968 0.0604764 0 -0.00953278 0.120748 0 -0.0183015 0.180611 0 -0.0133774 0.18148 0 -0.0133774 0.18148 0.01 -0.0183015 0.180611 0.01 0.0025 -2.55976e-16 0 0.0025 -2.55976e-16 0.01 -0.0133774 0.18148 0.01 0.000731856 0.0607672 0.01 -0.00456659 0.121329 0.01 -0.0133774 0.18148 0 0.000731856 0.0607672 0 -0.00456659 0.121329 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0182954 -0.180542 0 -0.0133713 -0.18141 0 -0.0133713 -0.18141 0.01 -0.0182954 -0.180542 0.01 -0.0182954 -0.180542 0 -0.0133713 -0.18141 0 -0.0025 -2.54653e-16 0 -0.00953008 -0.120702 0 -0.00425901 -0.0604532 0 -0.0182954 0.180542 0 -0.00425901 0.0604532 0 -0.00953008 0.120702 0 -0.0133713 0.18141 0 0.0025 -2.55878e-16 0 0.000732533 0.0607439 0 -0.00456389 0.121282 0 -0.00456389 -0.121282 0 0.000732533 -0.0607439 0 -0.0133713 -0.18141 0 -0.0133713 -0.18141 0.01 0.0025 -2.55878e-16 0.01 -0.00456389 -0.121282 0.01 0.000732533 -0.0607439 0.01 0.0025 -2.55878e-16 0 -0.00456389 -0.121282 0 0.000732533 -0.0607439 0 -0.0182954 -0.180542 0.01 -0.0133713 -0.18141 0.01 -0.0025 -2.54653e-16 0.01 -0.00953008 -0.120702 0.01 -0.00425901 -0.0604532 0.01 -0.0182954 0.180542 0.01 -0.00425901 0.0604532 0.01 -0.00953008 0.120702 0.01 -0.0133713 0.18141 0.01 0.0025 -2.55878e-16 0.01 0.000732533 0.0607439 0.01 -0.00456389 0.121282 0.01 -0.00456389 -0.121282 0.01 0.000732533 -0.0607439 0.01 -0.0182954 -0.180542 0 -0.0182954 -0.180542 0.01 -0.0025 -2.54653e-16 0.01 -0.00953008 -0.120702 0.01 -0.00425901 -0.0604532 0.01 -0.0025 -2.54653e-16 0 -0.00953008 -0.120702 0 -0.00425901 -0.0604532 0 -0.0025 -2.54653e-16 0 -0.0025 -2.54653e-16 0.01 -0.0182954 0.180542 0.01 -0.00425901 0.0604532 0.01 -0.00953008 0.120702 0.01 -0.0182954 0.180542 0 -0.00425901 0.0604532 0 -0.00953008 0.120702 0 -0.0182954 0.180542 0 -0.0133713 0.18141 0 -0.0133713 0.18141 0.01 -0.0182954 0.180542 0.01 0.0025 -2.55878e-16 0 0.0025 -2.55878e-16 0.01 -0.0133713 0.18141 0.01 0.000732533 0.0607439 0.01 -0.00456389 0.121282 0.01 -0.0133713 0.18141 0 0.000732533 0.0607439 0 -0.00456389 0.121282 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0184245 -0.182018 0 -0.0135005 -0.182886 0 -0.0135005 -0.182886 0.01 -0.0184245 -0.182018 0.01 -0.0184245 -0.182018 0 -0.0135005 -0.182886 0 -0.0025 -2.56735e-16 0 -0.00958755 -0.121689 0 -0.00427339 -0.0609474 0 -0.0184245 0.182018 0 -0.00427339 0.0609474 0 -0.00958755 0.121689 0 -0.0135005 0.182886 0 0.0025 -2.5796e-16 0 0.000718152 0.0612381 0 -0.00462136 0.122269 0 -0.00462136 -0.122269 0 0.000718152 -0.0612381 0 -0.0135005 -0.182886 0 -0.0135005 -0.182886 0.01 0.0025 -2.5796e-16 0.01 -0.00462136 -0.122269 0.01 0.000718152 -0.0612381 0.01 0.0025 -2.5796e-16 0 -0.00462136 -0.122269 0 0.000718152 -0.0612381 0 -0.0184245 -0.182018 0.01 -0.0135005 -0.182886 0.01 -0.0025 -2.56735e-16 0.01 -0.00958755 -0.121689 0.01 -0.00427339 -0.0609474 0.01 -0.0184245 0.182018 0.01 -0.00427339 0.0609474 0.01 -0.00958755 0.121689 0.01 -0.0135005 0.182886 0.01 0.0025 -2.5796e-16 0.01 0.000718152 0.0612381 0.01 -0.00462136 0.122269 0.01 -0.00462136 -0.122269 0.01 0.000718152 -0.0612381 0.01 -0.0184245 -0.182018 0 -0.0184245 -0.182018 0.01 -0.0025 -2.56735e-16 0.01 -0.00958755 -0.121689 0.01 -0.00427339 -0.0609474 0.01 -0.0025 -2.56735e-16 0 -0.00958755 -0.121689 0 -0.00427339 -0.0609474 0 -0.0025 -2.56735e-16 0 -0.0025 -2.56735e-16 0.01 -0.0184245 0.182018 0.01 -0.00427339 0.0609474 0.01 -0.00958755 0.121689 0.01 -0.0184245 0.182018 0 -0.00427339 0.0609474 0 -0.00958755 0.121689 0 -0.0184245 0.182018 0 -0.0135005 0.182886 0 -0.0135005 0.182886 0.01 -0.0184245 0.182018 0.01 0.0025 -2.5796e-16 0 0.0025 -2.5796e-16 0.01 -0.0135005 0.182886 0.01 0.000718152 0.0612381 0.01 -0.00462136 0.122269 0.01 -0.0135005 0.182886 0 0.000718152 0.0612381 0 -0.00462136 0.122269 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0184184 -0.181949 0 -0.0134944 -0.182817 0 -0.0134944 -0.182817 0.01 -0.0184184 -0.181949 0.01 -0.0184184 -0.181949 0 -0.0134944 -0.182817 0 -0.0025 -2.56637e-16 0 -0.00958485 -0.121642 0 -0.00427271 -0.0609242 0 -0.0184184 0.181949 0 -0.00427271 0.0609242 0 -0.00958485 0.121642 0 -0.0134944 0.182817 0 0.0025 -2.57862e-16 0 0.000718829 0.0612149 0 -0.00461866 0.122223 0 -0.00461866 -0.122223 0 0.000718829 -0.0612149 0 -0.0134944 -0.182817 0 -0.0134944 -0.182817 0.01 0.0025 -2.57862e-16 0.01 -0.00461866 -0.122223 0.01 0.000718829 -0.0612149 0.01 0.0025 -2.57862e-16 0 -0.00461866 -0.122223 0 0.000718829 -0.0612149 0 -0.0184184 -0.181949 0.01 -0.0134944 -0.182817 0.01 -0.0025 -2.56637e-16 0.01 -0.00958485 -0.121642 0.01 -0.00427271 -0.0609242 0.01 -0.0184184 0.181949 0.01 -0.00427271 0.0609242 0.01 -0.00958485 0.121642 0.01 -0.0134944 0.182817 0.01 0.0025 -2.57862e-16 0.01 0.000718829 0.0612149 0.01 -0.00461866 0.122223 0.01 -0.00461866 -0.122223 0.01 0.000718829 -0.0612149 0.01 -0.0184184 -0.181949 0 -0.0184184 -0.181949 0.01 -0.0025 -2.56637e-16 0.01 -0.00958485 -0.121642 0.01 -0.00427271 -0.0609242 0.01 -0.0025 -2.56637e-16 0 -0.00958485 -0.121642 0 -0.00427271 -0.0609242 0 -0.0025 -2.56637e-16 0 -0.0025 -2.56637e-16 0.01 -0.0184184 0.181949 0.01 -0.00427271 0.0609242 0.01 -0.00958485 0.121642 0.01 -0.0184184 0.181949 0 -0.00427271 0.0609242 0 -0.00958485 0.121642 0 -0.0184184 0.181949 0 -0.0134944 0.182817 0 -0.0134944 0.182817 0.01 -0.0184184 0.181949 0.01 0.0025 -2.57862e-16 0 0.0025 -2.57862e-16 0.01 -0.0134944 0.182817 0.01 0.000718829 0.0612149 0.01 -0.00461866 0.122223 0.01 -0.0134944 0.182817 0 0.000718829 0.0612149 0 -0.00461866 0.122223 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0174385 -0.170748 0 -0.0125145 -0.171616 0 -0.0125145 -0.171616 0.01 -0.0174385 -0.170748 0.01 -0.0174385 -0.170748 0 -0.0125145 -0.171616 0 -0.0025 -2.40839e-16 0 -0.00914872 -0.114154 0 -0.00416359 -0.0571738 0 -0.0174385 0.170748 0 -0.00416359 0.0571738 0 -0.00914872 0.114154 0 -0.0125145 0.171616 0 0.0025 -2.42064e-16 0 0.000827953 0.0574645 0 -0.00418253 0.114735 0 -0.00418253 -0.114735 0 0.000827953 -0.0574645 0 -0.0125145 -0.171616 0 -0.0125145 -0.171616 0.01 0.0025 -2.42064e-16 0.01 -0.00418253 -0.114735 0.01 0.000827953 -0.0574645 0.01 0.0025 -2.42064e-16 0 -0.00418253 -0.114735 0 0.000827953 -0.0574645 0 -0.0174385 -0.170748 0.01 -0.0125145 -0.171616 0.01 -0.0025 -2.40839e-16 0.01 -0.00914872 -0.114154 0.01 -0.00416359 -0.0571738 0.01 -0.0174385 0.170748 0.01 -0.00416359 0.0571738 0.01 -0.00914872 0.114154 0.01 -0.0125145 0.171616 0.01 0.0025 -2.42064e-16 0.01 0.000827953 0.0574645 0.01 -0.00418253 0.114735 0.01 -0.00418253 -0.114735 0.01 0.000827953 -0.0574645 0.01 -0.0174385 -0.170748 0 -0.0174385 -0.170748 0.01 -0.0025 -2.40839e-16 0.01 -0.00914872 -0.114154 0.01 -0.00416359 -0.0571738 0.01 -0.0025 -2.40839e-16 0 -0.00914872 -0.114154 0 -0.00416359 -0.0571738 0 -0.0025 -2.40839e-16 0 -0.0025 -2.40839e-16 0.01 -0.0174385 0.170748 0.01 -0.00416359 0.0571738 0.01 -0.00914872 0.114154 0.01 -0.0174385 0.170748 0 -0.00416359 0.0571738 0 -0.00914872 0.114154 0 -0.0174385 0.170748 0 -0.0125145 0.171616 0 -0.0125145 0.171616 0.01 -0.0174385 0.170748 0.01 0.0025 -2.42064e-16 0 0.0025 -2.42064e-16 0.01 -0.0125145 0.171616 0.01 0.000827953 0.0574645 0.01 -0.00418253 0.114735 0.01 -0.0125145 0.171616 0 0.000827953 0.0574645 0 -0.00418253 0.114735 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0174325 -0.170679 0 -0.0125084 -0.171547 0 -0.0125084 -0.171547 0.01 -0.0174325 -0.170679 0.01 -0.0174325 -0.170679 0 -0.0125084 -0.171547 0 -0.0025 -2.40741e-16 0 -0.00914602 -0.114108 0 -0.00416291 -0.0571506 0 -0.0174325 0.170679 0 -0.00416291 0.0571506 0 -0.00914602 0.114108 0 -0.0125084 0.171547 0 0.0025 -2.41966e-16 0 0.00082863 0.0574413 0 -0.00417983 0.114688 0 -0.00417983 -0.114688 0 0.00082863 -0.0574413 0 -0.0125084 -0.171547 0 -0.0125084 -0.171547 0.01 0.0025 -2.41966e-16 0.01 -0.00417983 -0.114688 0.01 0.00082863 -0.0574413 0.01 0.0025 -2.41966e-16 0 -0.00417983 -0.114688 0 0.00082863 -0.0574413 0 -0.0174325 -0.170679 0.01 -0.0125084 -0.171547 0.01 -0.0025 -2.40741e-16 0.01 -0.00914602 -0.114108 0.01 -0.00416291 -0.0571506 0.01 -0.0174325 0.170679 0.01 -0.00416291 0.0571506 0.01 -0.00914602 0.114108 0.01 -0.0125084 0.171547 0.01 0.0025 -2.41966e-16 0.01 0.00082863 0.0574413 0.01 -0.00417983 0.114688 0.01 -0.00417983 -0.114688 0.01 0.00082863 -0.0574413 0.01 -0.0174325 -0.170679 0 -0.0174325 -0.170679 0.01 -0.0025 -2.40741e-16 0.01 -0.00914602 -0.114108 0.01 -0.00416291 -0.0571506 0.01 -0.0025 -2.40741e-16 0 -0.00914602 -0.114108 0 -0.00416291 -0.0571506 0 -0.0025 -2.40741e-16 0 -0.0025 -2.40741e-16 0.01 -0.0174325 0.170679 0.01 -0.00416291 0.0571506 0.01 -0.00914602 0.114108 0.01 -0.0174325 0.170679 0 -0.00416291 0.0571506 0 -0.00914602 0.114108 0 -0.0174325 0.170679 0 -0.0125084 0.171547 0 -0.0125084 0.171547 0.01 -0.0174325 0.170679 0.01 0.0025 -2.41966e-16 0 0.0025 -2.41966e-16 0.01 -0.0125084 0.171547 0.01 0.00082863 0.0574413 0.01 -0.00417983 0.114688 0.01 -0.0125084 0.171547 0 0.00082863 0.0574413 0 -0.00417983 0.114688 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0175616 -0.172155 0 -0.0126376 -0.173023 0 -0.0126376 -0.173023 0.01 -0.0175616 -0.172155 0.01 -0.0175616 -0.172155 0 -0.0126376 -0.173023 0 -0.0025 -2.42823e-16 0 -0.00920349 -0.115095 0 -0.00417729 -0.0576448 0 -0.0175616 0.172155 0 -0.00417729 0.0576448 0 -0.00920349 0.115095 0 -0.0126376 0.173023 0 0.0025 -2.44048e-16 0 0.000814249 0.0579355 0 -0.0042373 0.115675 0 -0.0042373 -0.115675 0 0.000814249 -0.0579355 0 -0.0126376 -0.173023 0 -0.0126376 -0.173023 0.01 0.0025 -2.44048e-16 0.01 -0.0042373 -0.115675 0.01 0.000814249 -0.0579355 0.01 0.0025 -2.44048e-16 0 -0.0042373 -0.115675 0 0.000814249 -0.0579355 0 -0.0175616 -0.172155 0.01 -0.0126376 -0.173023 0.01 -0.0025 -2.42823e-16 0.01 -0.00920349 -0.115095 0.01 -0.00417729 -0.0576448 0.01 -0.0175616 0.172155 0.01 -0.00417729 0.0576448 0.01 -0.00920349 0.115095 0.01 -0.0126376 0.173023 0.01 0.0025 -2.44048e-16 0.01 0.000814249 0.0579355 0.01 -0.0042373 0.115675 0.01 -0.0042373 -0.115675 0.01 0.000814249 -0.0579355 0.01 -0.0175616 -0.172155 0 -0.0175616 -0.172155 0.01 -0.0025 -2.42823e-16 0.01 -0.00920349 -0.115095 0.01 -0.00417729 -0.0576448 0.01 -0.0025 -2.42823e-16 0 -0.00920349 -0.115095 0 -0.00417729 -0.0576448 0 -0.0025 -2.42823e-16 0 -0.0025 -2.42823e-16 0.01 -0.0175616 0.172155 0.01 -0.00417729 0.0576448 0.01 -0.00920349 0.115095 0.01 -0.0175616 0.172155 0 -0.00417729 0.0576448 0 -0.00920349 0.115095 0 -0.0175616 0.172155 0 -0.0126376 0.173023 0 -0.0126376 0.173023 0.01 -0.0175616 0.172155 0.01 0.0025 -2.44048e-16 0 0.0025 -2.44048e-16 0.01 -0.0126376 0.173023 0.01 0.000814249 0.0579355 0.01 -0.0042373 0.115675 0.01 -0.0126376 0.173023 0 0.000814249 0.0579355 0 -0.0042373 0.115675 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0175555 -0.172085 0 -0.0126315 -0.172954 0 -0.0126315 -0.172954 0.01 -0.0175555 -0.172085 0.01 -0.0175555 -0.172085 0 -0.0126315 -0.172954 0 -0.0025 -2.42725e-16 0 -0.00920079 -0.115048 0 -0.00417662 -0.0576215 0 -0.0175555 0.172085 0 -0.00417662 0.0576215 0 -0.00920079 0.115048 0 -0.0126315 0.172954 0 0.0025 -2.4395e-16 0 0.000814926 0.0579122 0 -0.0042346 0.115629 0 -0.0042346 -0.115629 0 0.000814926 -0.0579122 0 -0.0126315 -0.172954 0 -0.0126315 -0.172954 0.01 0.0025 -2.4395e-16 0.01 -0.0042346 -0.115629 0.01 0.000814926 -0.0579122 0.01 0.0025 -2.4395e-16 0 -0.0042346 -0.115629 0 0.000814926 -0.0579122 0 -0.0175555 -0.172085 0.01 -0.0126315 -0.172954 0.01 -0.0025 -2.42725e-16 0.01 -0.00920079 -0.115048 0.01 -0.00417662 -0.0576215 0.01 -0.0175555 0.172085 0.01 -0.00417662 0.0576215 0.01 -0.00920079 0.115048 0.01 -0.0126315 0.172954 0.01 0.0025 -2.4395e-16 0.01 0.000814926 0.0579122 0.01 -0.0042346 0.115629 0.01 -0.0042346 -0.115629 0.01 0.000814926 -0.0579122 0.01 -0.0175555 -0.172085 0 -0.0175555 -0.172085 0.01 -0.0025 -2.42725e-16 0.01 -0.00920079 -0.115048 0.01 -0.00417662 -0.0576215 0.01 -0.0025 -2.42725e-16 0 -0.00920079 -0.115048 0 -0.00417662 -0.0576215 0 -0.0025 -2.42725e-16 0 -0.0025 -2.42725e-16 0.01 -0.0175555 0.172085 0.01 -0.00417662 0.0576215 0.01 -0.00920079 0.115048 0.01 -0.0175555 0.172085 0 -0.00417662 0.0576215 0 -0.00920079 0.115048 0 -0.0175555 0.172085 0 -0.0126315 0.172954 0 -0.0126315 0.172954 0.01 -0.0175555 0.172085 0.01 0.0025 -2.4395e-16 0 0.0025 -2.4395e-16 0.01 -0.0126315 0.172954 0.01 0.000814926 0.0579122 0.01 -0.0042346 0.115629 0.01 -0.0126315 0.172954 0 0.000814926 0.0579122 0 -0.0042346 0.115629 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0176862 -0.173579 0 -0.0127621 -0.174447 0 -0.0127621 -0.174447 0.01 -0.0176862 -0.173579 0.01 -0.0176862 -0.173579 0 -0.0127621 -0.174447 0 -0.0025 -2.44831e-16 0 -0.00925894 -0.116046 0 -0.00419116 -0.0581216 0 -0.0176862 0.173579 0 -0.00419116 0.0581216 0 -0.00925894 0.116046 0 -0.0127621 0.174447 0 0.0025 -2.46056e-16 0 0.000800376 0.0584123 0 -0.00429275 0.116627 0 -0.00429275 -0.116627 0 0.000800376 -0.0584123 0 -0.0127621 -0.174447 0 -0.0127621 -0.174447 0.01 0.0025 -2.46056e-16 0.01 -0.00429275 -0.116627 0.01 0.000800376 -0.0584123 0.01 0.0025 -2.46056e-16 0 -0.00429275 -0.116627 0 0.000800376 -0.0584123 0 -0.0176862 -0.173579 0.01 -0.0127621 -0.174447 0.01 -0.0025 -2.44831e-16 0.01 -0.00925894 -0.116046 0.01 -0.00419116 -0.0581216 0.01 -0.0176862 0.173579 0.01 -0.00419116 0.0581216 0.01 -0.00925894 0.116046 0.01 -0.0127621 0.174447 0.01 0.0025 -2.46056e-16 0.01 0.000800376 0.0584123 0.01 -0.00429275 0.116627 0.01 -0.00429275 -0.116627 0.01 0.000800376 -0.0584123 0.01 -0.0176862 -0.173579 0 -0.0176862 -0.173579 0.01 -0.0025 -2.44831e-16 0.01 -0.00925894 -0.116046 0.01 -0.00419116 -0.0581216 0.01 -0.0025 -2.44831e-16 0 -0.00925894 -0.116046 0 -0.00419116 -0.0581216 0 -0.0025 -2.44831e-16 0 -0.0025 -2.44831e-16 0.01 -0.0176862 0.173579 0.01 -0.00419116 0.0581216 0.01 -0.00925894 0.116046 0.01 -0.0176862 0.173579 0 -0.00419116 0.0581216 0 -0.00925894 0.116046 0 -0.0176862 0.173579 0 -0.0127621 0.174447 0 -0.0127621 0.174447 0.01 -0.0176862 0.173579 0.01 0.0025 -2.46056e-16 0 0.0025 -2.46056e-16 0.01 -0.0127621 0.174447 0.01 0.000800376 0.0584123 0.01 -0.00429275 0.116627 0.01 -0.0127621 0.174447 0 0.000800376 0.0584123 0 -0.00429275 0.116627 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0176786 -0.173492 0 -0.0127545 -0.17436 0 -0.0127545 -0.17436 0.01 -0.0176786 -0.173492 0.01 -0.0176786 -0.173492 0 -0.0127545 -0.17436 0 -0.0025 -2.44709e-16 0 -0.00925556 -0.115988 0 -0.00419032 -0.0580925 0 -0.0176786 0.173492 0 -0.00419032 0.0580925 0 -0.00925556 0.115988 0 -0.0127545 0.17436 0 0.0025 -2.45934e-16 0 0.000801222 0.0583832 0 -0.00428936 0.116569 0 -0.00428936 -0.116569 0 0.000801222 -0.0583832 0 -0.0127545 -0.17436 0 -0.0127545 -0.17436 0.01 0.0025 -2.45934e-16 0.01 -0.00428936 -0.116569 0.01 0.000801222 -0.0583832 0.01 0.0025 -2.45934e-16 0 -0.00428936 -0.116569 0 0.000801222 -0.0583832 0 -0.0176786 -0.173492 0.01 -0.0127545 -0.17436 0.01 -0.0025 -2.44709e-16 0.01 -0.00925556 -0.115988 0.01 -0.00419032 -0.0580925 0.01 -0.0176786 0.173492 0.01 -0.00419032 0.0580925 0.01 -0.00925556 0.115988 0.01 -0.0127545 0.17436 0.01 0.0025 -2.45934e-16 0.01 0.000801222 0.0583832 0.01 -0.00428936 0.116569 0.01 -0.00428936 -0.116569 0.01 0.000801222 -0.0583832 0.01 -0.0176786 -0.173492 0 -0.0176786 -0.173492 0.01 -0.0025 -2.44709e-16 0.01 -0.00925556 -0.115988 0.01 -0.00419032 -0.0580925 0.01 -0.0025 -2.44709e-16 0 -0.00925556 -0.115988 0 -0.00419032 -0.0580925 0 -0.0025 -2.44709e-16 0 -0.0025 -2.44709e-16 0.01 -0.0176786 0.173492 0.01 -0.00419032 0.0580925 0.01 -0.00925556 0.115988 0.01 -0.0176786 0.173492 0 -0.00419032 0.0580925 0 -0.00925556 0.115988 0 -0.0176786 0.173492 0 -0.0127545 0.17436 0 -0.0127545 0.17436 0.01 -0.0176786 0.173492 0.01 0.0025 -2.45934e-16 0 0.0025 -2.45934e-16 0.01 -0.0127545 0.17436 0.01 0.000801222 0.0583832 0.01 -0.00428936 0.116569 0.01 -0.0127545 0.17436 0 0.000801222 0.0583832 0 -0.00428936 0.116569 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0178092 -0.174985 0 -0.0128852 -0.175854 0 -0.0128852 -0.175854 0.01 -0.0178092 -0.174985 0.01 -0.0178092 -0.174985 0 -0.0128852 -0.175854 0 -0.0025 -2.46815e-16 0 -0.00931371 -0.116987 0 -0.00420487 -0.0585925 0 -0.0178092 0.174985 0 -0.00420487 0.0585925 0 -0.00931371 0.116987 0 -0.0128852 0.175854 0 0.0025 -2.4804e-16 0 0.000786672 0.0588833 0 -0.00434752 0.117567 0 -0.00434752 -0.117567 0 0.000786672 -0.0588833 0 -0.0128852 -0.175854 0 -0.0128852 -0.175854 0.01 0.0025 -2.4804e-16 0.01 -0.00434752 -0.117567 0.01 0.000786672 -0.0588833 0.01 0.0025 -2.4804e-16 0 -0.00434752 -0.117567 0 0.000786672 -0.0588833 0 -0.0178092 -0.174985 0.01 -0.0128852 -0.175854 0.01 -0.0025 -2.46815e-16 0.01 -0.00931371 -0.116987 0.01 -0.00420487 -0.0585925 0.01 -0.0178092 0.174985 0.01 -0.00420487 0.0585925 0.01 -0.00931371 0.116987 0.01 -0.0128852 0.175854 0.01 0.0025 -2.4804e-16 0.01 0.000786672 0.0588833 0.01 -0.00434752 0.117567 0.01 -0.00434752 -0.117567 0.01 0.000786672 -0.0588833 0.01 -0.0178092 -0.174985 0 -0.0178092 -0.174985 0.01 -0.0025 -2.46815e-16 0.01 -0.00931371 -0.116987 0.01 -0.00420487 -0.0585925 0.01 -0.0025 -2.46815e-16 0 -0.00931371 -0.116987 0 -0.00420487 -0.0585925 0 -0.0025 -2.46815e-16 0 -0.0025 -2.46815e-16 0.01 -0.0178092 0.174985 0.01 -0.00420487 0.0585925 0.01 -0.00931371 0.116987 0.01 -0.0178092 0.174985 0 -0.00420487 0.0585925 0 -0.00931371 0.116987 0 -0.0178092 0.174985 0 -0.0128852 0.175854 0 -0.0128852 0.175854 0.01 -0.0178092 0.174985 0.01 0.0025 -2.4804e-16 0 0.0025 -2.4804e-16 0.01 -0.0128852 0.175854 0.01 0.000786672 0.0588833 0.01 -0.00434752 0.117567 0.01 -0.0128852 0.175854 0 0.000786672 0.0588833 0 -0.00434752 0.117567 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0178016 -0.174898 0 -0.0128776 -0.175767 0 -0.0128776 -0.175767 0.01 -0.0178016 -0.174898 0.01 -0.0178016 -0.174898 0 -0.0128776 -0.175767 0 -0.0025 -2.46693e-16 0 -0.00931033 -0.116929 0 -0.00420402 -0.0585635 0 -0.0178016 0.174898 0 -0.00420402 0.0585635 0 -0.00931033 0.116929 0 -0.0128776 0.175767 0 0.0025 -2.47917e-16 0 0.000787518 0.0588542 0 -0.00434413 0.117509 0 -0.00434413 -0.117509 0 0.000787518 -0.0588542 0 -0.0128776 -0.175767 0 -0.0128776 -0.175767 0.01 0.0025 -2.47917e-16 0.01 -0.00434413 -0.117509 0.01 0.000787518 -0.0588542 0.01 0.0025 -2.47917e-16 0 -0.00434413 -0.117509 0 0.000787518 -0.0588542 0 -0.0178016 -0.174898 0.01 -0.0128776 -0.175767 0.01 -0.0025 -2.46693e-16 0.01 -0.00931033 -0.116929 0.01 -0.00420402 -0.0585635 0.01 -0.0178016 0.174898 0.01 -0.00420402 0.0585635 0.01 -0.00931033 0.116929 0.01 -0.0128776 0.175767 0.01 0.0025 -2.47917e-16 0.01 0.000787518 0.0588542 0.01 -0.00434413 0.117509 0.01 -0.00434413 -0.117509 0.01 0.000787518 -0.0588542 0.01 -0.0178016 -0.174898 0 -0.0178016 -0.174898 0.01 -0.0025 -2.46693e-16 0.01 -0.00931033 -0.116929 0.01 -0.00420402 -0.0585635 0.01 -0.0025 -2.46693e-16 0 -0.00931033 -0.116929 0 -0.00420402 -0.0585635 0 -0.0025 -2.46693e-16 0 -0.0025 -2.46693e-16 0.01 -0.0178016 0.174898 0.01 -0.00420402 0.0585635 0.01 -0.00931033 0.116929 0.01 -0.0178016 0.174898 0 -0.00420402 0.0585635 0 -0.00931033 0.116929 0 -0.0178016 0.174898 0 -0.0128776 0.175767 0 -0.0128776 0.175767 0.01 -0.0178016 0.174898 0.01 0.0025 -2.47917e-16 0 0.0025 -2.47917e-16 0.01 -0.0128776 0.175767 0.01 0.000787518 0.0588542 0.01 -0.00434413 0.117509 0.01 -0.0128776 0.175767 0 0.000787518 0.0588542 0 -0.00434413 0.117509 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + + + + + + + + + + + + + + + + + + From 754fdafff4c339b834c4e2bdf3b8b54e4bcf6c72 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 11 Sep 2014 12:16:07 +0100 Subject: [PATCH 035/284] Made symmetrise work as intended, updated docs Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 54 +++++++++----- .../src/IndirectSymmetrise.cpp | 73 ++++++++++++------- .../docs/source/algorithms/Symmetrise-v1.rst | 19 ++++- 3 files changed, 97 insertions(+), 49 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 3538d9a740b8..178740b3e1ee 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -58,13 +58,14 @@ def PyExec(self): sample_x = mtd[self._sample].readX(0) self._calculate_array_points(sample_x, sample_array_len) - # Calculate number of elements needed for new array (per spectra) - # TODO: This can be simplified a lot - new_array_len = 2 * sample_array_len - (self._positive_min_index + self._negative_min_index) - 2 * (sample_array_len - self._positive_max_index) + 1 - - # Calculate the position in the output array to split between the LHS reflected betwen +XMin and +XMax and - # the LHS copied frim -XMin and +XMax - output_cut_index = sample_array_len - self._positive_min_index - (sample_array_len - self._positive_max_index) + copy_lhs = sample_x[0] < -sample_x[self._positive_max_index] + if copy_lhs: + lhs_cut_index = self._negative_max_index + output_cut_index = lhs_cut_index + (self._positive_max_index - self._positive_min_index) + new_array_len = output_cut_index + (sample_array_len - self._negative_min_index) + 1 + else: + new_array_len = 2 * sample_array_len - (self._positive_min_index + self._negative_min_index) - (sample_array_len - self._positive_max_index) + 1 + output_cut_index = sample_array_len - self._positive_min_index - (sample_array_len - self._positive_max_index) if self._verbose: logger.notice('Sample array length = %d' % sample_array_len) @@ -78,12 +79,18 @@ def PyExec(self): logger.notice('No negative X max found') else: logger.notice('Negative X max at i=%d, x=%f' - % (self._negative_max_index, sample_x[self._negative_max_index])) - + % (self._negative_max_index, sample_x[self._negative_max_index])) logger.notice('Positive X max at i=%d, x=%f' % (self._positive_max_index, sample_x[self._positive_max_index])) logger.notice('New array length = %d' % new_array_len) + + if copy_lhs: + logger.notice('LHS: Copy + Reflect') + logger.notice('LHS cut index = %d' % lhs_cut_index) + else: + logger.notice('LHS: Reflect Only') + logger.notice('Output array LR split index = %d' % output_cut_index) x_unit = mtd[self._sample].getXDimension().getUnits() @@ -116,15 +123,26 @@ def PyExec(self): y_out = np.zeros(new_array_len) e_out = np.zeros(new_array_len) - # Left hand side - x_out[:output_cut_index] = -x_in[self._positive_max_index:self._positive_min_index:-1] - y_out[:output_cut_index] = y_in[self._positive_max_index:self._positive_min_index:-1] - e_out[:output_cut_index] = e_in[self._positive_max_index:self._positive_min_index:-1] + if copy_lhs: + # Left hand side (reflected) + x_out[lhs_cut_index:output_cut_index] = -x_in[self._positive_max_index:self._positive_min_index:-1] + y_out[lhs_cut_index:output_cut_index] = y_in[self._positive_max_index:self._positive_min_index:-1] + e_out[lhs_cut_index:output_cut_index] = e_in[self._positive_max_index:self._positive_min_index:-1] + + # Left hand side (copied) + x_out[:lhs_cut_index] = x_in[:self._negative_max_index] + y_out[:lhs_cut_index] = y_in[:self._negative_max_index] + e_out[:lhs_cut_index] = e_in[:self._negative_max_index] + else: + # Left hand side (reflected) + x_out[:output_cut_index] = -x_in[self._positive_max_index:self._positive_min_index:-1] + y_out[:output_cut_index] = y_in[self._positive_max_index:self._positive_min_index:-1] + e_out[:output_cut_index] = e_in[self._positive_max_index:self._positive_min_index:-1] - # Right hand side - x_out[output_cut_index:] = x_in[self._negative_min_index:self._positive_max_index] - y_out[output_cut_index:] = y_in[self._negative_min_index:self._positive_max_index] - e_out[output_cut_index:] = e_in[self._negative_min_index:self._positive_max_index] + # Right hand side (copied) + x_out[output_cut_index:] = x_in[self._negative_min_index:] + y_out[output_cut_index:] = y_in[self._negative_min_index:] + e_out[output_cut_index:] = e_in[self._negative_min_index:] # Set output spectrum data mtd[temp_ws_name].setX(output_spectrum_index, x_out) @@ -232,7 +250,7 @@ def _check_bounds(self, index, num_pts, label=''): @param num_pts - total number of points in the range. @param label - label to call the point if an error is thrown. """ - if index <= 0: + if index < 0: raise ValueError('%s point %d < 0' % (label, index)) elif index >= num_pts: raise ValueError('%s point %d > %d' % (label, index, num_pts)) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 74f435f26f6c..ff43d3d54aec 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -66,25 +66,31 @@ namespace CustomInterfaces m_plots["SymmRawPlot"] = new QwtPlot(m_parentWidget); m_curves["SymmRawPlot"] = new QwtPlotCurve(); - // Indicators for negative and positive XCut values on X axis - m_rangeSelectors["NegativeXCut_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + // Indicators for negative and positive X range values on X axis + m_rangeSelectors["NegativeEMin_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, false); - m_rangeSelectors["PositiveXCut_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + m_rangeSelectors["PositiveEMin_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + MantidWidgets::RangeSelector::XSINGLE, true, false); + m_rangeSelectors["NegativeEMax_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + MantidWidgets::RangeSelector::XSINGLE, true, false); + m_rangeSelectors["PositiveEMax_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::XSINGLE, true, false); - m_rangeSelectors["NegativeXCut_Raw"]->setColour(Qt::darkGreen); - m_rangeSelectors["PositiveXCut_Raw"]->setColour(Qt::darkGreen); + m_rangeSelectors["NegativeEMin_Raw"]->setColour(Qt::darkGreen); + m_rangeSelectors["PositiveEMin_Raw"]->setColour(Qt::darkGreen); + m_rangeSelectors["NegativeEMax_Raw"]->setColour(Qt::darkGreen); + m_rangeSelectors["PositiveEMax_Raw"]->setColour(Qt::darkGreen); - // Indicators for Y value at each XCut position - m_rangeSelectors["NegativeXCutYPos"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + // Indicators for Y value at each EMin position + m_rangeSelectors["NegativeEMinYPos"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::YSINGLE, true, false); - m_rangeSelectors["PositiveXCutYPos"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], + m_rangeSelectors["PositiveEMinYPos"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], MantidWidgets::RangeSelector::YSINGLE, true, false); - m_rangeSelectors["NegativeXCutYPos"]->setColour(Qt::red); - m_rangeSelectors["PositiveXCutYPos"]->setColour(Qt::blue); - m_rangeSelectors["NegativeXCutYPos"]->setMinimum(0); - m_rangeSelectors["PositiveXCutYPos"]->setMinimum(0); + m_rangeSelectors["NegativeEMinYPos"]->setColour(Qt::red); + m_rangeSelectors["PositiveEMinYPos"]->setColour(Qt::blue); + m_rangeSelectors["NegativeEMinYPos"]->setMinimum(0); + m_rangeSelectors["PositiveEMinYPos"]->setMinimum(0); // Indicator for centre of symmetry (x=0) m_rangeSelectors["CentreMark_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], @@ -101,14 +107,20 @@ namespace CustomInterfaces m_plots["SymmPreviewPlot"] = new QwtPlot(m_parentWidget); m_curves["SymmPreviewPlot"] = new QwtPlotCurve(); - // Indicators for negative and positive XCut values on X axis - m_rangeSelectors["NegativeXCut_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], + // Indicators for negative and positive X range values on X axis + m_rangeSelectors["NegativeEMin_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], + MantidWidgets::RangeSelector::XSINGLE, true, true); + m_rangeSelectors["PositiveEMin_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], + MantidWidgets::RangeSelector::XSINGLE, true, true); + m_rangeSelectors["NegativeEMax_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], MantidWidgets::RangeSelector::XSINGLE, true, true); - m_rangeSelectors["PositiveXCut_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], + m_rangeSelectors["PositiveEMax_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], MantidWidgets::RangeSelector::XSINGLE, true, true); - m_rangeSelectors["NegativeXCut_PV"]->setColour(Qt::darkGreen); - m_rangeSelectors["PositiveXCut_PV"]->setColour(Qt::darkGreen); + m_rangeSelectors["NegativeEMin_PV"]->setColour(Qt::darkGreen); + m_rangeSelectors["PositiveEMin_PV"]->setColour(Qt::darkGreen); + m_rangeSelectors["NegativeEMax_PV"]->setColour(Qt::darkGreen); + m_rangeSelectors["PositiveEMax_PV"]->setColour(Qt::darkGreen); // Indicator for centre of symmetry (x=0) m_rangeSelectors["CentreMark_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], @@ -135,7 +147,7 @@ namespace CustomInterfaces // Preview symmetrise connect(m_uiForm.symm_previewButton, SIGNAL(clicked()), this, SLOT(preview())); - // Set default XCut value + // Set default X range values m_dblManager->setValue(m_properties["EMin"], 0.1); m_dblManager->setValue(m_properties["EMax"], 0.5); @@ -180,8 +192,8 @@ namespace CustomInterfaces bool verbose = m_uiForm.symm_ckVerbose->isChecked(); bool save = m_uiForm.symm_ckSave->isChecked(); - double e_min = m_dblManager->value(m_properties["XEMin"]); - double e_max = m_dblManager->value(m_properties["XEMax"]); + double e_min = m_dblManager->value(m_properties["EMin"]); + double e_max = m_dblManager->value(m_properties["EMax"]); IAlgorithm_sptr symmetriseAlg = AlgorithmManager::Instance().create("Symmetrise", -1); symmetriseAlg->initialize(); @@ -267,15 +279,20 @@ namespace CustomInterfaces { if(prop == m_properties["EMin"]) { - m_rangeSelectors["NegativeXCut_Raw"]->setMinimum(-value); - m_rangeSelectors["PositiveXCut_Raw"]->setMinimum(value); + m_rangeSelectors["NegativeEMin_Raw"]->setMinimum(-value); + m_rangeSelectors["PositiveEMin_Raw"]->setMinimum(value); - m_rangeSelectors["NegativeXCut_PV"]->setMinimum(-value); - m_rangeSelectors["PositiveXCut_PV"]->setMinimum(value); + m_rangeSelectors["NegativeEMin_PV"]->setMinimum(-value); + m_rangeSelectors["PositiveEMin_PV"]->setMinimum(value); } if(prop == m_properties["EMax"]) { + m_rangeSelectors["NegativeEMax_Raw"]->setMinimum(-value); + m_rangeSelectors["PositiveEMax_Raw"]->setMinimum(value); + + m_rangeSelectors["NegativeEMax_PV"]->setMinimum(-value); + m_rangeSelectors["PositiveEMax_PV"]->setMinimum(value); } } @@ -290,7 +307,7 @@ namespace CustomInterfaces { // Handle algorithm completion signal // TODO: Temp. removal to checkbuild #10092 - /* connect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); */ + connect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); // Do nothing if no data has been laoded QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); @@ -349,8 +366,8 @@ namespace CustomInterfaces m_dblManager->setValue(m_properties["DeltaY"], deltaY); // Set indicator positions - m_rangeSelectors["NegativeXCutYPos"]->setMinimum(negativeY); - m_rangeSelectors["PositiveXCutYPos"]->setMinimum(positiveY); + m_rangeSelectors["NegativeEMinYPos"]->setMinimum(negativeY); + m_rangeSelectors["PositiveEMinYPos"]->setMinimum(positiveY); // Plot preview plot size_t spectrumIndex = symmWS->getIndexFromSpectrumNumber(spectrumNumber); @@ -358,7 +375,7 @@ namespace CustomInterfaces // Don't want this to trigger when the algorithm is run for all spectra // TODO: Temp. removal to checkbuild #10092 - /* disconnect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); */ + disconnect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); } } // namespace CustomInterfaces diff --git a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst index 9c799dbf8247..f256f0dfdabb 100644 --- a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst +++ b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst @@ -15,9 +15,22 @@ moduli of xmin & xmax are different. Typically xmax is > mod(xmin). Two values, XMin and XMax, are chosen to specify the section of the positive side of the curve to be reflected onto the negative side. -The output curve between negative XMin and XMax is unchnaged from the sample -curve, between negative XMax and negative XMin the curve is reflected from -the sample curve between XMin and XMax. +Depending on the input curve and EMax parameter the algorithm can behave in +two ways: + +Reflect Left Hand Side +^^^^^^^^^^^^^^^^^^^^^^ + +If negative XMax is less than the lowest X value on the curve then the positive +section of the curve between XMin and XMax will be reflected to the negative side, +appending the curve to the left hand side. + +Copy and Reflect Left Hand Side +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +If negative XMax is greater than the lowest value on the curve then the positive +section of the curve between XMin and XMax is reflected on to the negative side, +the curve between negative XMax and the loest X value will remain unchanged. Usage ----- From aabc0c0189575328005e47a711eb86c8850577b0 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 11 Sep 2014 12:27:14 +0100 Subject: [PATCH 036/284] Small refactoring, small docs change Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 23 ++++++++----------- .../docs/source/algorithms/Symmetrise-v1.rst | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 178740b3e1ee..02a4e28019e8 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -58,39 +58,36 @@ def PyExec(self): sample_x = mtd[self._sample].readX(0) self._calculate_array_points(sample_x, sample_array_len) - copy_lhs = sample_x[0] < -sample_x[self._positive_max_index] - if copy_lhs: + if self._negative_max_index is not None: lhs_cut_index = self._negative_max_index output_cut_index = lhs_cut_index + (self._positive_max_index - self._positive_min_index) new_array_len = output_cut_index + (sample_array_len - self._negative_min_index) + 1 else: - new_array_len = 2 * sample_array_len - (self._positive_min_index + self._negative_min_index) - (sample_array_len - self._positive_max_index) + 1 output_cut_index = sample_array_len - self._positive_min_index - (sample_array_len - self._positive_max_index) + new_array_len = 2 * sample_array_len - (self._positive_min_index + self._negative_min_index) - (sample_array_len - self._positive_max_index) + 1 if self._verbose: logger.notice('Sample array length = %d' % sample_array_len) - logger.notice('Negative X min at i=%d, x=%f' - % (self._negative_min_index, sample_x[self._negative_min_index])) logger.notice('Positive X min at i=%d, x=%f' % (self._positive_min_index, sample_x[self._positive_min_index])) + logger.notice('Negative X min at i=%d, x=%f' + % (self._negative_min_index, sample_x[self._negative_min_index])) - if self._negative_max_index is None: - logger.notice('No negative X max found') - else: - logger.notice('Negative X max at i=%d, x=%f' - % (self._negative_max_index, sample_x[self._negative_max_index])) logger.notice('Positive X max at i=%d, x=%f' % (self._positive_max_index, sample_x[self._positive_max_index])) - logger.notice('New array length = %d' % new_array_len) + if self._negative_max_index is not None: + logger.notice('Negative X max at i=%d, x=%f' + % (self._negative_max_index, sample_x[self._negative_max_index])) - if copy_lhs: logger.notice('LHS: Copy + Reflect') logger.notice('LHS cut index = %d' % lhs_cut_index) else: + logger.notice('No negative X max found') logger.notice('LHS: Reflect Only') + logger.notice('New array length = %d' % new_array_len) logger.notice('Output array LR split index = %d' % output_cut_index) x_unit = mtd[self._sample].getXDimension().getUnits() @@ -123,7 +120,7 @@ def PyExec(self): y_out = np.zeros(new_array_len) e_out = np.zeros(new_array_len) - if copy_lhs: + if self._negative_max_index is not None: # Left hand side (reflected) x_out[lhs_cut_index:output_cut_index] = -x_in[self._positive_max_index:self._positive_min_index:-1] y_out[lhs_cut_index:output_cut_index] = y_in[self._positive_max_index:self._positive_min_index:-1] diff --git a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst index f256f0dfdabb..19e496055dfc 100644 --- a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst +++ b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst @@ -15,7 +15,7 @@ moduli of xmin & xmax are different. Typically xmax is > mod(xmin). Two values, XMin and XMax, are chosen to specify the section of the positive side of the curve to be reflected onto the negative side. -Depending on the input curve and EMax parameter the algorithm can behave in +Depending on the input curve and XMax parameter the algorithm can behave in two ways: Reflect Left Hand Side From 35b8bec01d70839c04261d341e8350fce4f74788 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 11 Sep 2014 15:17:23 +0100 Subject: [PATCH 037/284] Made range selectors select X range, couple of fixes in alg Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 8 +- .../IndirectSymmetrise.h | 2 + .../src/IndirectSymmetrise.cpp | 168 +++++++++++------- 3 files changed, 107 insertions(+), 71 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 02a4e28019e8..97a8e78e0af7 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -44,7 +44,7 @@ def PyExec(self): StartTime('Symmetrise') self._setup() - temp_ws_name = '__Symmetrise_temp' + temp_ws_name = '__symm_temp' # The number of spectra that will actually be changed num_symm_spectra = self._spectra_range[1] - self._spectra_range[0] + 1 @@ -148,10 +148,9 @@ def PyExec(self): # Set output spectrum number mtd[temp_ws_name].getSpectrum(output_spectrum_index).setSpectrumNo(spectrum_no) - output_spectrum_index += 1 - logger.information('Symmetrise spectra %d' % spectrum_no) + logger.information('Symmetrise spectrum %d' % spectrum_no) RenameWorkspace(InputWorkspace=temp_ws_name, OutputWorkspace=self._output_workspace) @@ -212,6 +211,9 @@ def _setup(self): def _calculate_array_points(self, sample_x, sample_array_len): """ Finds the points in the array that match the cut points. + + @param sample_x - Sample X axis data + @param sample_array_len - Lengh of data array for sample data """ delta_x = sample_x[1] - sample_x[0] diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h index 3eb019206bef..0deb19860033 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h @@ -72,6 +72,8 @@ namespace CustomInterfaces void updateRangeSelectors(QtProperty *prop, double value); void preview(); void previewAlgDone(bool error); + void xRangeMaxChanged(double value); + void xRangeMinChanged(double value); }; } // namespace CustomInterfaces diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index ff43d3d54aec..3a7db78735f4 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -64,28 +64,16 @@ namespace CustomInterfaces // Raw plot m_plots["SymmRawPlot"] = new QwtPlot(m_parentWidget); - m_curves["SymmRawPlot"] = new QwtPlotCurve(); - - // Indicators for negative and positive X range values on X axis - m_rangeSelectors["NegativeEMin_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], - MantidWidgets::RangeSelector::XSINGLE, true, false); - m_rangeSelectors["PositiveEMin_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], - MantidWidgets::RangeSelector::XSINGLE, true, false); - m_rangeSelectors["NegativeEMax_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], - MantidWidgets::RangeSelector::XSINGLE, true, false); - m_rangeSelectors["PositiveEMax_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], - MantidWidgets::RangeSelector::XSINGLE, true, false); - - m_rangeSelectors["NegativeEMin_Raw"]->setColour(Qt::darkGreen); - m_rangeSelectors["PositiveEMin_Raw"]->setColour(Qt::darkGreen); - m_rangeSelectors["NegativeEMax_Raw"]->setColour(Qt::darkGreen); - m_rangeSelectors["PositiveEMax_Raw"]->setColour(Qt::darkGreen); + m_plots["SymmRawPlot"]->setAxisFont(QwtPlot::xBottom, parent->font()); + m_plots["SymmRawPlot"]->setAxisFont(QwtPlot::yLeft, parent->font()); + m_plots["SymmRawPlot"]->setCanvasBackground(Qt::white); + m_uiForm.symm_plot->addWidget(m_plots["SymmRawPlot"]); // Indicators for Y value at each EMin position m_rangeSelectors["NegativeEMinYPos"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], - MantidWidgets::RangeSelector::YSINGLE, true, false); + MantidWidgets::RangeSelector::YSINGLE, true, true); m_rangeSelectors["PositiveEMinYPos"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"], - MantidWidgets::RangeSelector::YSINGLE, true, false); + MantidWidgets::RangeSelector::YSINGLE, true, true); m_rangeSelectors["NegativeEMinYPos"]->setColour(Qt::red); m_rangeSelectors["PositiveEMinYPos"]->setColour(Qt::blue); @@ -98,29 +86,31 @@ namespace CustomInterfaces m_rangeSelectors["CentreMark_Raw"]->setColour(Qt::cyan); m_rangeSelectors["CentreMark_Raw"]->setMinimum(0.0); - m_plots["SymmRawPlot"]->setAxisFont(QwtPlot::xBottom, parent->font()); - m_plots["SymmRawPlot"]->setAxisFont(QwtPlot::yLeft, parent->font()); - m_plots["SymmRawPlot"]->setCanvasBackground(Qt::white); - m_uiForm.symm_plot->addWidget(m_plots["SymmRawPlot"]); + // Indicators for negative and positive X range values on X axis + // The user can use these to move the X range + // Note that the max and min of the negative range selector corespond to the opposit X value + // i.e. RS min is X max + m_rangeSelectors["NegativeE_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"]); + m_rangeSelectors["PositiveE_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"]); + + m_rangeSelectors["NegativeE_Raw"]->setColour(Qt::darkGreen); + m_rangeSelectors["PositiveE_Raw"]->setColour(Qt::darkGreen); // Preview plot m_plots["SymmPreviewPlot"] = new QwtPlot(m_parentWidget); - m_curves["SymmPreviewPlot"] = new QwtPlotCurve(); + m_plots["SymmPreviewPlot"]->setAxisFont(QwtPlot::xBottom, parent->font()); + m_plots["SymmPreviewPlot"]->setAxisFont(QwtPlot::yLeft, parent->font()); + m_plots["SymmPreviewPlot"]->setCanvasBackground(Qt::white); + m_uiForm.symm_previewPlot->addWidget(m_plots["SymmPreviewPlot"]); // Indicators for negative and positive X range values on X axis - m_rangeSelectors["NegativeEMin_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], - MantidWidgets::RangeSelector::XSINGLE, true, true); - m_rangeSelectors["PositiveEMin_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], - MantidWidgets::RangeSelector::XSINGLE, true, true); - m_rangeSelectors["NegativeEMax_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], - MantidWidgets::RangeSelector::XSINGLE, true, true); - m_rangeSelectors["PositiveEMax_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], - MantidWidgets::RangeSelector::XSINGLE, true, true); + m_rangeSelectors["NegativeE_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], + MantidWidgets::RangeSelector::XMINMAX, true, true); + m_rangeSelectors["PositiveE_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], + MantidWidgets::RangeSelector::XMINMAX, true, true); - m_rangeSelectors["NegativeEMin_PV"]->setColour(Qt::darkGreen); - m_rangeSelectors["PositiveEMin_PV"]->setColour(Qt::darkGreen); - m_rangeSelectors["NegativeEMax_PV"]->setColour(Qt::darkGreen); - m_rangeSelectors["PositiveEMax_PV"]->setColour(Qt::darkGreen); + m_rangeSelectors["NegativeE_PV"]->setColour(Qt::darkGreen); + m_rangeSelectors["PositiveE_PV"]->setColour(Qt::darkGreen); // Indicator for centre of symmetry (x=0) m_rangeSelectors["CentreMark_PV"] = new MantidWidgets::RangeSelector(m_plots["SymmPreviewPlot"], @@ -128,11 +118,6 @@ namespace CustomInterfaces m_rangeSelectors["CentreMark_PV"]->setColour(Qt::cyan); m_rangeSelectors["CentreMark_PV"]->setMinimum(0.0); - m_plots["SymmPreviewPlot"]->setAxisFont(QwtPlot::xBottom, parent->font()); - m_plots["SymmPreviewPlot"]->setAxisFont(QwtPlot::yLeft, parent->font()); - m_plots["SymmPreviewPlot"]->setCanvasBackground(Qt::white); - m_uiForm.symm_previewPlot->addWidget(m_plots["SymmPreviewPlot"]); - // Refresh the plot windows m_plots["SymmRawPlot"]->replot(); m_plots["SymmPreviewPlot"]->replot(); @@ -146,6 +131,11 @@ namespace CustomInterfaces connect(m_uiForm.symm_dsInput, SIGNAL(dataReady(const QString&)), this, SLOT(plotRawInput(const QString&))); // Preview symmetrise connect(m_uiForm.symm_previewButton, SIGNAL(clicked()), this, SLOT(preview())); + // X range selectors + connect(m_rangeSelectors["PositiveE_Raw"], SIGNAL(minValueChanged(double)), this, SLOT(xRangeMinChanged(double))); + connect(m_rangeSelectors["PositiveE_Raw"], SIGNAL(maxValueChanged(double)), this, SLOT(xRangeMaxChanged(double))); + connect(m_rangeSelectors["NegativeE_Raw"], SIGNAL(minValueChanged(double)), this, SLOT(xRangeMinChanged(double))); + connect(m_rangeSelectors["NegativeE_Raw"], SIGNAL(maxValueChanged(double)), this, SLOT(xRangeMaxChanged(double))); // Set default X range values m_dblManager->setValue(m_properties["EMin"], 0.1); @@ -229,6 +219,10 @@ namespace CustomInterfaces g_log.information() << "Symmetrise x axis range +/- " << symmRange << std::endl; m_dblManager->setValue(m_properties["PreviewRange"], symmRange); + // Set valid range for range selectors + m_rangeSelectors["NegativeE_Raw"]->setRange(-symmRange, 0); + m_rangeSelectors["PositiveE_Raw"]->setRange(0, symmRange); + updateMiniPlots(); } @@ -272,30 +266,6 @@ namespace CustomInterfaces updateMiniPlots(); } - /** - * Updates position of XCut range selectors when used changed value of XCut. - */ - void IndirectSymmetrise::updateRangeSelectors(QtProperty *prop, double value) - { - if(prop == m_properties["EMin"]) - { - m_rangeSelectors["NegativeEMin_Raw"]->setMinimum(-value); - m_rangeSelectors["PositiveEMin_Raw"]->setMinimum(value); - - m_rangeSelectors["NegativeEMin_PV"]->setMinimum(-value); - m_rangeSelectors["PositiveEMin_PV"]->setMinimum(value); - } - - if(prop == m_properties["EMax"]) - { - m_rangeSelectors["NegativeEMax_Raw"]->setMinimum(-value); - m_rangeSelectors["PositiveEMax_Raw"]->setMinimum(value); - - m_rangeSelectors["NegativeEMax_PV"]->setMinimum(-value); - m_rangeSelectors["PositiveEMax_PV"]->setMinimum(value); - } - } - /** * Handles a request to preview the symmetrise. * @@ -306,7 +276,6 @@ namespace CustomInterfaces void IndirectSymmetrise::preview() { // Handle algorithm completion signal - // TODO: Temp. removal to checkbuild #10092 connect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); // Do nothing if no data has been laoded @@ -338,6 +307,8 @@ namespace CustomInterfaces /** * Handles completion of the preview algorithm. + * + * @param error If the algorithm failed */ void IndirectSymmetrise::previewAlgDone(bool error) { @@ -352,8 +323,8 @@ namespace CustomInterfaces MatrixWorkspace_sptr symmWS = AnalysisDataService::Instance().retrieveWS("__Symmetrise_temp"); // Get the index of XCut on each side of zero - int negativeIndex = propsTable->getColumn("NegativeCutIndex")->cell(0); - int positiveIndex = propsTable->getColumn("PositiveCutIndex")->cell(0); + int negativeIndex = propsTable->getColumn("NegativeXMinIndex")->cell(0); + int positiveIndex = propsTable->getColumn("PositiveXMinIndex")->cell(0); // Get the Y values for each XCut and the difference between them double negativeY = sampleWS->dataY(0)[negativeIndex]; @@ -374,9 +345,70 @@ namespace CustomInterfaces plotMiniPlot("__Symmetrise_temp", spectrumIndex, "SymmPreviewPlot"); // Don't want this to trigger when the algorithm is run for all spectra - // TODO: Temp. removal to checkbuild #10092 disconnect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); } + /** + * Updates position of XCut range selectors when used changed value of XCut. + */ + void IndirectSymmetrise::updateRangeSelectors(QtProperty *prop, double value) + { + if(prop == m_properties["EMin"]) + { + m_rangeSelectors["NegativeE_Raw"]->setMaximum(-value); + m_rangeSelectors["PositiveE_Raw"]->setMinimum(value); + + m_rangeSelectors["NegativeE_PV"]->setMinimum(-value); + m_rangeSelectors["PositiveE_PV"]->setMinimum(value); + } + + if(prop == m_properties["EMax"]) + { + m_rangeSelectors["NegativeE_Raw"]->setMinimum(-value); + m_rangeSelectors["PositiveE_Raw"]->setMaximum(value); + + m_rangeSelectors["NegativeE_PV"]->setMaximum(-value); + m_rangeSelectors["PositiveE_PV"]->setMaximum(value); + } + } + + /** + * Handles the X minimum value being changed from a range selector. + * + * @param value New range selector value + */ + void IndirectSymmetrise::xRangeMinChanged(double value) + { + MantidWidgets::RangeSelector *from = qobject_cast(sender()); + + if(from == m_rangeSelectors["PositiveE_Raw"]) + { + m_dblManager->setValue(m_properties["EMin"], std::abs(value)); + } + else if(from == m_rangeSelectors["NegativeE_Raw"]) + { + m_dblManager->setValue(m_properties["EMax"], std::abs(value)); + } + } + + /** + * Handles the X maximum value being changed from a range selector. + * + * @param value New range selector value + */ + void IndirectSymmetrise::xRangeMaxChanged(double value) + { + MantidWidgets::RangeSelector *from = qobject_cast(sender()); + + if(from == m_rangeSelectors["PositiveE_Raw"]) + { + m_dblManager->setValue(m_properties["EMax"], std::abs(value)); + } + else if(from == m_rangeSelectors["NegativeE_Raw"]) + { + m_dblManager->setValue(m_properties["EMin"], std::abs(value)); + } + } + } // namespace CustomInterfaces } // namespace Mantid From 5411426668626000502c9996db7921ef661a1ca3 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 11 Sep 2014 16:59:57 +0100 Subject: [PATCH 038/284] Small change to naming convention for symmetrise output Refs #7860 --- .../Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 3a7db78735f4..cf5d98f31f40 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -176,7 +176,7 @@ namespace CustomInterfaces void IndirectSymmetrise::run() { QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); - QString outputWorkspaceName = workspaceName.left(workspaceName.length() - 4) + "_Symmetrise"; + QString outputWorkspaceName = workspaceName.left(workspaceName.length() - 4) + "_sym" + workspaceName.right(4); bool plot = m_uiForm.symm_ckPlot->isChecked(); bool verbose = m_uiForm.symm_ckVerbose->isChecked(); From 88a06061c69d27422b3ceefdb3f48985d84fe39b Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 17 Sep 2014 15:28:55 +0100 Subject: [PATCH 039/284] Switch Symmetrise to the batch algorithm runner Refs #7860 --- .../CustomInterfaces/src/IndirectDataReductionTab.cpp | 2 +- .../MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp index 162b1e445be1..5957a09db11a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp @@ -19,7 +19,7 @@ namespace CustomInterfaces m_properties(), m_dblManager(new QtDoublePropertyManager()), m_blnManager(new QtBoolPropertyManager()), m_grpManager(new QtGroupPropertyManager()), m_dblEdFac(new DoubleEditorFactory()), - m_algRunner(NULL), + m_batchAlgoRunner(NULL), m_uiForm(uiForm) { m_parentWidget = dynamic_cast(parent); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index cf5d98f31f40..ad74329e3ad5 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -276,7 +276,7 @@ namespace CustomInterfaces void IndirectSymmetrise::preview() { // Handle algorithm completion signal - connect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); + connect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(previewAlgDone(bool))); // Do nothing if no data has been laoded QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); @@ -345,7 +345,7 @@ namespace CustomInterfaces plotMiniPlot("__Symmetrise_temp", spectrumIndex, "SymmPreviewPlot"); // Don't want this to trigger when the algorithm is run for all spectra - disconnect(&m_algRunner, SIGNAL(algorithmComplete(bool)), this, SLOT(previewAlgDone(bool))); + disconnect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(previewAlgDone(bool))); } /** From 11ead26b73690d8cf3af2d51b1f3ad660d244c90 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 17 Sep 2014 15:49:11 +0100 Subject: [PATCH 040/284] Update unit test for last Symmetrise property change Refs #7860 --- .../test/python/plugins/algorithms/SymmetriseTest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py index 713c9edfa7da..81771a81f8ac 100644 --- a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py +++ b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py @@ -10,7 +10,7 @@ def setUp(self): self._sample_ws = self._generate_sample_ws('symm_test_sample_ws') def test_basic(self): - symm_test_out_ws= Symmetrise(Sample=self._sample_ws, XCut=0.05) + symm_test_out_ws= Symmetrise(Sample=self._sample_ws, XMin=0.05, XMax=0.2) def _rayleigh(self, x, sigma): return (x / sigma ** 2) * np.exp(-x ** 2 / (2 * sigma ** 2)) From 4171d9ece618d0b59fe02e46c65443e640624186 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 17 Sep 2014 16:34:14 +0100 Subject: [PATCH 041/284] FIx usage example for Symmetrise Refs #7860 --- Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst index 19e496055dfc..fc13717db13f 100644 --- a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst +++ b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst @@ -51,6 +51,6 @@ Usage sample_ws = CreateWorkspace(data_x, data_y) sample_ws = ScaleX(sample_ws, -1, "Add") # centre the peak over 0 - symm_ws = Symmetrise(Sample=sample_ws, XCut=0.05) + symm_ws = Symmetrise(Sample=sample_ws, XMin=0.05, XMax=8.0) .. categories:: From 7efc8f600cbac7c69f1b860979a8268edbb5be0f Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 18 Sep 2014 10:05:46 +0100 Subject: [PATCH 042/284] Made Symmetrise crop to XMax Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 54 ++++--------------- .../docs/source/algorithms/Symmetrise-v1.rst | 20 ++----- 2 files changed, 13 insertions(+), 61 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 97a8e78e0af7..e3cbd71f9428 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -1,6 +1,6 @@ from mantid import logger, mtd from mantid.api import PythonAlgorithm, AlgorithmFactory, WorkspaceProperty, PropertyMode -from mantid.kernel import Direction, IntArrayProperty, IntArrayMandatoryValidator +from mantid.kernel import Direction, IntArrayProperty from mantid.simpleapi import CreateWorkspace, CopyLogs, CopySample, CopyInstrumentParameters, SaveNexusProcessed, CreateEmptyTableWorkspace, RenameWorkspace import math @@ -58,13 +58,8 @@ def PyExec(self): sample_x = mtd[self._sample].readX(0) self._calculate_array_points(sample_x, sample_array_len) - if self._negative_max_index is not None: - lhs_cut_index = self._negative_max_index - output_cut_index = lhs_cut_index + (self._positive_max_index - self._positive_min_index) - new_array_len = output_cut_index + (sample_array_len - self._negative_min_index) + 1 - else: - output_cut_index = sample_array_len - self._positive_min_index - (sample_array_len - self._positive_max_index) - new_array_len = 2 * sample_array_len - (self._positive_min_index + self._negative_min_index) - (sample_array_len - self._positive_max_index) + 1 + output_cut_index = sample_array_len - self._positive_min_index - (sample_array_len - self._positive_max_index) + new_array_len = 2 * sample_array_len - (self._positive_min_index + self._negative_min_index) - 2 * (sample_array_len - self._positive_max_index) if self._verbose: logger.notice('Sample array length = %d' % sample_array_len) @@ -77,16 +72,6 @@ def PyExec(self): logger.notice('Positive X max at i=%d, x=%f' % (self._positive_max_index, sample_x[self._positive_max_index])) - if self._negative_max_index is not None: - logger.notice('Negative X max at i=%d, x=%f' - % (self._negative_max_index, sample_x[self._negative_max_index])) - - logger.notice('LHS: Copy + Reflect') - logger.notice('LHS cut index = %d' % lhs_cut_index) - else: - logger.notice('No negative X max found') - logger.notice('LHS: Reflect Only') - logger.notice('New array length = %d' % new_array_len) logger.notice('Output array LR split index = %d' % output_cut_index) @@ -120,26 +105,15 @@ def PyExec(self): y_out = np.zeros(new_array_len) e_out = np.zeros(new_array_len) - if self._negative_max_index is not None: - # Left hand side (reflected) - x_out[lhs_cut_index:output_cut_index] = -x_in[self._positive_max_index:self._positive_min_index:-1] - y_out[lhs_cut_index:output_cut_index] = y_in[self._positive_max_index:self._positive_min_index:-1] - e_out[lhs_cut_index:output_cut_index] = e_in[self._positive_max_index:self._positive_min_index:-1] - - # Left hand side (copied) - x_out[:lhs_cut_index] = x_in[:self._negative_max_index] - y_out[:lhs_cut_index] = y_in[:self._negative_max_index] - e_out[:lhs_cut_index] = e_in[:self._negative_max_index] - else: - # Left hand side (reflected) - x_out[:output_cut_index] = -x_in[self._positive_max_index:self._positive_min_index:-1] - y_out[:output_cut_index] = y_in[self._positive_max_index:self._positive_min_index:-1] - e_out[:output_cut_index] = e_in[self._positive_max_index:self._positive_min_index:-1] + # Left hand side (reflected) + x_out[:output_cut_index] = -x_in[self._positive_max_index:self._positive_min_index:-1] + y_out[:output_cut_index] = y_in[self._positive_max_index:self._positive_min_index:-1] + e_out[:output_cut_index] = e_in[self._positive_max_index:self._positive_min_index:-1] # Right hand side (copied) - x_out[output_cut_index:] = x_in[self._negative_min_index:] - y_out[output_cut_index:] = y_in[self._negative_min_index:] - e_out[output_cut_index:] = e_in[self._negative_min_index:] + x_out[output_cut_index:] = x_in[self._negative_min_index:self._positive_max_index] + y_out[output_cut_index:] = y_in[self._negative_min_index:self._positive_max_index] + e_out[output_cut_index:] = e_in[self._negative_min_index:self._positive_max_index] # Set output spectrum data mtd[temp_ws_name].setX(output_spectrum_index, x_out) @@ -232,14 +206,6 @@ def _calculate_array_points(self, sample_x, sample_array_len): self._positive_max_index = np.where(positive_max_diff < delta_x)[0][-1] self._check_bounds(self._positive_max_index, sample_array_len, label='Positive') - # Find array index of negative XMax - if -self._x_max < sample_x[0]: - self._negative_max_index = None; - else: - negative_max_diff = np.absolute(sample_x + sample_x[self._positive_max_index]) - self._negative_max_index = np.where(negative_max_diff < delta_x)[0][-1] - self._check_bounds(self._negative_max_index, sample_array_len, label='Negative') - def _check_bounds(self, index, num_pts, label=''): """ Check if the index falls within the bounds of the x range. diff --git a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst index fc13717db13f..58b6fafe03fc 100644 --- a/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst +++ b/Code/Mantid/docs/source/algorithms/Symmetrise-v1.rst @@ -13,24 +13,10 @@ Symmetrise takes an asymmetric :math:`S(Q,w)` - i.e. one in which the moduli of xmin & xmax are different. Typically xmax is > mod(xmin). Two values, XMin and XMax, are chosen to specify the section of the positive -side of the curve to be reflected onto the negative side. +side of the curve to be reflected onto the negative side, the sample curve +is cropped at XMax ensuring that the symmetrised curve has a symmetrical X +range. -Depending on the input curve and XMax parameter the algorithm can behave in -two ways: - -Reflect Left Hand Side -^^^^^^^^^^^^^^^^^^^^^^ - -If negative XMax is less than the lowest X value on the curve then the positive -section of the curve between XMin and XMax will be reflected to the negative side, -appending the curve to the left hand side. - -Copy and Reflect Left Hand Side -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If negative XMax is greater than the lowest value on the curve then the positive -section of the curve between XMin and XMax is reflected on to the negative side, -the curve between negative XMax and the loest X value will remain unchanged. Usage ----- From 843a44604f3bf52bf027bc0814e4521966f513bd Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Fri, 19 Sep 2014 17:36:26 +0100 Subject: [PATCH 043/284] Futher debugging on Vesuvio MS calculation. We now get something that looks like a distribution but it doesn't match the VMS output yet. Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 6 +- .../CurveFitting/src/CalculateMSVesuvio.cpp | 181 ++++++++++-------- .../test/CalculateMSVesuvioTest.h | 18 +- .../inc/MantidKernel/PhysicalConstants.h | 15 +- 4 files changed, 124 insertions(+), 96 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index d1d6dc322d75..6e8d0e45579d 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -98,8 +98,6 @@ namespace Mantid std::vector> counts; size_t maxorder; - double weight; - size_t nmscat; }; // Stores counts for each scatter order with errors struct SimulationWithErrors @@ -163,8 +161,8 @@ namespace Mantid Kernel::V3D generateSrcPos(const double l1) const; double generateE0(const double l1, const double t2, double &weight) const; double generateTOF(const double gaussTOF, const double en0, const double dl1) const; - Kernel::V3D generateScatter(const Kernel::V3D &startPos, const Kernel::V3D &direc, - double &weight) const; + bool generateScatter(const Kernel::V3D &startPos, const Kernel::V3D &direc, double &weight, + Kernel::V3D &scatterPt) const; std::pair calculateE1Range(const double theta, const double en0) const; double partialDiffXSec(const double en0, const double en1, const double theta) const; Kernel::V3D generateDetectorPos(const double l2, const double angle, const double energy) const; diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index b36b7d0f83b5..da609f862280 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -34,9 +34,9 @@ namespace Mantid namespace { const size_t NSIMULATIONS = 10; - const size_t NEVENTS = 100000; + const size_t NEVENTS = 500000; const size_t NSCATTERS = 3; - const size_t MAX_SCATTER_PT_TRIES = 500; + const size_t MAX_SCATTER_PT_TRIES = 25; /// Conversion constant const double MASS_TO_MEV = 0.5*PhysicalConstants::NeutronMass/PhysicalConstants::meV; @@ -313,6 +313,7 @@ namespace Mantid //------------------------------------------------------------------------- // RandomNumberGenerator helper //------------------------------------------------------------------------- + /** * Produces random numbers with various probability distributions */ @@ -346,7 +347,7 @@ namespace Mantid CalculateMSVesuvio::Simulation:: Simulation(const size_t order, const size_t ntimes) : counts(order, std::vector(ntimes)), - maxorder(order), weight(0.0), nmscat(0) + maxorder(order) {} //------------------------------------------------------------------------- // SimulationAggreator @@ -394,28 +395,36 @@ namespace Mantid double mean(0.0); size_t npoints(0); for(size_t k = 0; k < nruns; ++k) - { - const double val = results[k].counts[i][j]; - if(val > 0.0) - { - mean += val; - npoints +=1; - } - } - const double dblPts = static_cast(npoints); - orderCounts[j] = mean/dblPts; - // error is std dev - double sumsq(0.0); - for(size_t k = 0; k < nruns; ++k) { const double val = results[k].counts[i][j]; if(val > 0.0) { - const double diff = (val - mean); - sumsq += diff*diff; + mean += val; + npoints +=1; + } + } + if(npoints < 2) + { + orderCounts[j] = 0.0; + orderErrors[j] = 0.0; + } + else + { + const double dblPts = static_cast(npoints); + orderCounts[j] = mean/dblPts; + // error is std dev + double sumsq(0.0); + for(size_t k = 0; k < nruns; ++k) + { + const double val = results[k].counts[i][j]; + if(val > 0.0) + { + const double diff = (val - mean); + sumsq += diff*diff; + } } + orderErrors[j] = sqrt(sumsq/(dblPts*(dblPts-1))); } - orderErrors[j] = sqrt(sumsq/(dblPts*(dblPts-1))); } } @@ -432,23 +441,25 @@ namespace Mantid { const double sumSingle = std::accumulate(sim.counts.front().begin(), sim.counts.front().end(), 0.0); - const double invSum = 1.0/sumSingle; // multiply is faster - // Divide everything by the sum - const size_t nscatters = sim.counts.size(); - for(size_t i = 0; i < nscatters; ++i) + if(sumSingle > 0.0) { - auto & counts = sim.counts[i]; - auto & scerrors = this->errors[i]; - for(auto cit = counts.begin(), eit = scerrors.begin(); cit != counts.end(); - ++cit, ++eit) + const double invSum = 1.0/sumSingle; // multiply is faster + // Divide everything by the sum + const size_t nscatters = sim.counts.size(); + for(size_t i = 0; i < nscatters; ++i) { - (*cit) *= invSum; - (*eit) *= invSum; + auto & counts = sim.counts[i]; + auto & scerrors = this->errors[i]; + for(auto cit = counts.begin(), eit = scerrors.begin(); cit != counts.end(); + ++cit, ++eit) + { + (*cit) *= invSum; + (*eit) *= invSum; + } } } } - //------------------------------------------------------------------------- // Algorithm definitions //------------------------------------------------------------------------- @@ -582,7 +593,7 @@ namespace Mantid setProperty("TotalScatteringWS", totalsc); setProperty("MultipleScatteringWS", multsc); - } + } /** * Caches inputs insuitable form for speed in later calculations @@ -626,9 +637,9 @@ namespace Mantid // -- Workspace -- const auto & inX = m_inputWS->readX(0); - m_tmin = inX.front(); - m_tmax = inX.back(); - m_delt = inX[1] - m_tmin; + m_tmin = inX.front()*1e-06; + m_tmax = inX.back()*1e-06; + m_delt = (inX[1] - m_tmin)*1e-06; // -- Sample -- int nmasses = getProperty("NoOfMasses"); @@ -646,13 +657,13 @@ namespace Mantid m_sampleProps = new SampleComptonProperties(natoms); m_sampleProps->density = getProperty("SampleDensity"); - double totalMass(0.0); + double totalMass(0.0); // total mass in grams m_sampleProps->totalxsec = 0.0; for(int i = 0; i < natoms; ++i) { auto & comptonAtom = m_sampleProps->atoms[i]; comptonAtom.mass = sampleInfo[nExptdAtomProp*i]; - totalMass += comptonAtom.mass; + totalMass += comptonAtom.mass*PhysicalConstants::AtomicMassUnit*1000; const double xsec = sampleInfo[nExptdAtomProp*i + 1]; comptonAtom.sclength = sqrt(xsec/4.0*M_PI); @@ -679,8 +690,8 @@ namespace Mantid if(!detPixel->isMonitor()) break; } // Bounding box in detector frame - auto pixelShape = detPixel->shape(); - if(!pixelShape) + Geometry::Object_const_sptr pixelShape = detPixel->shape(); + if(!pixelShape || !pixelShape->hasValidShape()) { throw std::invalid_argument("Detector pixel has no defined shape!"); } @@ -782,7 +793,7 @@ namespace Mantid { for(size_t i = 0; i < nevents; ++i) { - simulCounts.weight += calculateCounts(nscatters, detpar, respar, simulCounts); + calculateCounts(nscatters, detpar, respar, simulCounts); } } @@ -792,21 +803,13 @@ namespace Mantid * @param detpar Detector information describing the final detector position * @param respar Resolution information on the intrument as a whole * @param simulation [Output] Store the calculated counts here - * @return + * @return The sum of the weights for all scatters */ double CalculateMSVesuvio::calculateCounts(const size_t nscatters, const DetectorParams &detpar, const ResolutionParams &respar, Simulation &simulation) const { double weightSum(0.0); - std::vector weights(nscatters, 1.0), // start at 1.0 - tofs(nscatters, 0.0), - scAngs(nscatters, 0.0), // scattering angles between each order - en1(nscatters, 0.0); - std::vector directions(nscatters), // directions after each scatter - scatterPts(nscatters); // origin of each scatter - - // Initial TOF based on uncertainty in time measurement on detector // moderator coord in lab frame V3D srcPos = generateSrcPos(detpar.l1); @@ -815,6 +818,12 @@ namespace Mantid if(fabs(srcPos[0]) > m_halfSampleWidth || fabs(srcPos[1]) > m_halfSampleHeight) return 0.0; // misses sample + // track various variables during calculation + std::vector weights(nscatters, 1.0), // start at 1.0 + tofs(nscatters, 0.0), + scAngs(nscatters, 0.0), // scattering angles between each order + en1(nscatters, 0.0); + const double vel2 = sqrt(detpar.efixed/MASS_TO_MEV); const double t2 = detpar.l2/vel2; en1[0] = generateE0(detpar.l1, t2, weights[0]); @@ -823,15 +832,16 @@ namespace Mantid // Neutron path // Algorithm has initial direction pointing to origin V3D particleDir = V3D() - srcPos; - directions[0] = particleDir; + particleDir.normalize(); // first scatter + std::vector scatterPts(nscatters); // track origin of each scatter V3D startPos(srcPos); - scatterPts[0] = generateScatter(startPos, particleDir, weights[0]); + generateScatter(startPos, particleDir, weights[0], scatterPts[0]); double distFromStart = startPos.distance(scatterPts[0]); // Compute TOF for first scatter event - double vel = sqrt(en1[0]/MASS_TO_MEV); - tofs[0] += (distFromStart*1e6/vel); + const double vel0 = sqrt(en1[0]/MASS_TO_MEV); + tofs[0] += (distFromStart*1e6/vel0); // multiple scatter events within sample, i.e not including zeroth for(size_t i = 1; i < nscatters; ++i) @@ -840,39 +850,55 @@ namespace Mantid tofs[i] = tofs[i-1]; // Generate a new direction of travel - double randth = acos(2.0*m_randgen->flat() - 1.0); - double randphi = 2.0*M_PI*m_randgen->flat(); V3D oldDir = particleDir; - particleDir.spherical_rad(1.0, randth, randphi); - directions[i] = particleDir; - scAngs[i-1] = particleDir.angle(oldDir); + size_t ntries(0); + do + { + double randth = acos(2.0*m_randgen->flat() - 1.0); + double randphi = 2.0*M_PI*m_randgen->flat(); + particleDir.spherical_rad(1.0, randth, randphi); + particleDir.normalize(); + scAngs[i-1] = particleDir.angle(oldDir); + // Update weight + const double wgt = weights[i]; + if(generateScatter(scatterPts[i-1], particleDir, weights[i], scatterPts[i])) + break; + else + { + weights[i] = wgt; // put it back to what it was + ++ntries; + } + } + while(ntries < MAX_SCATTER_PT_TRIES); + if(ntries == MAX_SCATTER_PT_TRIES) + { + throw std::runtime_error("Unable to generate scatter point in sample. Check sample shape."); + } - // Update weight - scatterPts[i] = generateScatter(scatterPts[i-1], particleDir, weights[i]); auto e1range = calculateE1Range(scAngs[i-1], en1[i-1]); en1[i] = e1range.first + m_randgen->flat()*(e1range.second - e1range.first); const double d2sig = partialDiffXSec(en1[i-1], en1[i], scAngs[i-1]); double weight = d2sig*4.0*M_PI*(e1range.second - e1range.first)/m_sampleProps->totalxsec; // accumulate total weight - simulation.nmscat += 1; weightSum += weight; weights[i] *= weight; // account for this scatter on top of previous // Increment time of flight... - const double distTravelled = scatterPts[i].distance(scatterPts[i-1]); - double vel = sqrt(en1[i]/MASS_TO_MEV); - tofs[i] += (distTravelled*1e6/vel); + const double veli = sqrt(en1[i]/MASS_TO_MEV); + tofs[i] += (scatterPts[i].distance(scatterPts[i-1])*1e6/veli); } // force all orders in to current detector const auto & inX = m_inputWS->readX(0); for(size_t i = 0; i < nscatters; ++i) { - V3D detPos = generateDetectorPos(detpar.l1, detpar.theta, en1[i]); + V3D detPos = generateDetectorPos(detpar.l2, detpar.theta, en1[i]); // transform to sample frame detPos.rotate(*m_goniometer); // Distance to exit the sample for this order - Geometry::Track scatterToDet(scatterPts[i], detPos - scatterPts[i]); + V3D detDirection = detPos - scatterPts[i]; + detDirection.normalize(); + Geometry::Track scatterToDet(scatterPts[i], detDirection); if(m_sampleShape->interceptSurface(scatterToDet) == 0) { throw std::logic_error("CalculateMSVesuvio::calculateCounts() - " @@ -889,8 +915,8 @@ namespace Mantid weights[i] *= partialDiffXSec(en1[i], efinal, scAngs[i])/m_sampleProps->totalxsec; // final TOF - double vel = sqrt(efinal/MASS_TO_MEV); - tofs[i] += detpar.t0 + (scatterPts[i].distance(detPos)*1e6)/vel; + const double veli = sqrt(efinal/MASS_TO_MEV); + tofs[i] += detpar.t0 + (scatterPts[i].distance(detPos)*1e6)/veli; // "Bin" weight into appropriate place std::vector &counts = simulation.counts[i]; @@ -902,7 +928,8 @@ namespace Mantid auto prevIter = uppIter - 1; if(finalTOF < *uppIter - 0.5*(*uppIter - *prevIter)) --uppIter; } - counts[std::distance(inX.begin(), uppIter)] += weights[i]; + size_t idx = std::distance(inX.begin(), uppIter); + counts[idx] += weights[i]; } return weightSum; @@ -949,7 +976,7 @@ namespace Mantid const double vel0 = l1/t1; const double en0 = MASS_TO_MEV*vel0*vel0; - weight *= 2.0*weight/t1/pow(weight, 0.9); + weight = 2.0*en0/t1/pow(en0, 0.9); weight *= 1e-4; // Reduce weight to ~1 return en0; @@ -1004,16 +1031,16 @@ namespace Mantid * @param startPos Starting position * @param direc Direction of travel for the neutron * @param weight [InOut] Multiply the incoming weight by the attenuation factor - * @return The generated scattering point + * @param scatterPt [Out] Generated scattering point + * @return True if the scatter event was generated, false otherwise */ - Kernel::V3D CalculateMSVesuvio::generateScatter(const Kernel::V3D &startPos, const Kernel::V3D &direc, - double &weight) const + bool CalculateMSVesuvio::generateScatter(const Kernel::V3D &startPos, const Kernel::V3D &direc, + double &weight, V3D &scatterPt) const { Track particleTrack(startPos, direc); if(m_sampleShape->interceptSurface(particleTrack) != 1) { - throw std::runtime_error("CalculateMSVesuvio::calculateCounts - " - "Sample shape appears to have a hole in it?. Unable to continue"); + return false; } // Find distance inside object and compute probability of scattering const auto & link = particleTrack.begin(); @@ -1024,12 +1051,12 @@ namespace Mantid const double dist = -log(1.0 - m_randgen->flat()*scatterProb)/m_sampleProps->mu; // From start point advance in direction of travel by computed distance to find scatter point // Track is defined as set of links and exit point of first link is entry to sample! - V3D scatterPt = link->entryPoint; + scatterPt = link->entryPoint; scatterPt += direc*dist; // Update weight weight *= scatterProb; - return scatterPt; + return true; } /** @@ -1087,7 +1114,7 @@ namespace Mantid { const double jstddev = atoms[i].profile; const double mass = atoms[i].mass; - const double y = 0.5*mass*w/(4.18036*q) - q; + const double y = mass*w/(4.18036*q) - 0.5*q; const double jy = exp(-0.5*y*y/(jstddev*jstddev))/(jstddev*rt2pi); const double sqw = mass*jy/(4.18036*q); diff --git a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h index bca1678e785d..dae6b089a0c6 100644 --- a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h +++ b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h @@ -129,7 +129,7 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite void test_input_workspace_with_detector_that_has_no_shape_throws_exception() { - auto alg = createTestAlgorithm(createFlatPlateSampleWS()); + auto alg = createTestAlgorithm(createFlatPlateSampleWS(false)); TS_ASSERT_THROWS(alg->execute(), std::invalid_argument); } @@ -165,10 +165,10 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite const double halfHeight(0.05), halfWidth(0.05), halfThick(0.0025); std::ostringstream sampleShapeXML; sampleShapeXML << " " - << " " - << " " - << " " - << " " + << " " + << " " + << " " + << " " << ""; auto sampleShape = Mantid::Geometry::ShapeFactory().createShape(sampleShapeXML.str()); testWS->mutableSample().setShape(*sampleShape); @@ -193,10 +193,10 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite // replace instrument with one that has a detector with a shape const std::string shapeXML = \ "" - "" - "" - "" - "" + "" + "" + "" + "" "" ""; const auto pos = ws2d->getDetector(0)->getPos(); diff --git a/Code/Mantid/Framework/Kernel/inc/MantidKernel/PhysicalConstants.h b/Code/Mantid/Framework/Kernel/inc/MantidKernel/PhysicalConstants.h index c4c59f7bad30..fa19d947a330 100644 --- a/Code/Mantid/Framework/Kernel/inc/MantidKernel/PhysicalConstants.h +++ b/Code/Mantid/Framework/Kernel/inc/MantidKernel/PhysicalConstants.h @@ -16,7 +16,7 @@ namespace Mantid @author Russell Taylor, Tessella Support Services plc @date 30/10/2007 - + Copyright © 2007-2010 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory This file is part of Mantid. @@ -34,7 +34,7 @@ namespace Mantid You should have received a copy of the GNU General Public License along with this program. If not, see . - File change history is stored at: . + File change history is stored at: . Code Documentation is available at: */ namespace PhysicalConstants @@ -52,16 +52,19 @@ namespace PhysicalConstants /** Standard acceleration due to gravity. Precise value in ms-2. */ static const double g = 9.80665; - + /** Mass of the neutron in kg. Taken from on 30/10/2007. */ static const double NeutronMass = 1.674927211e-27; /** Mass of the neutron in AMU. Taken from on 02/01/2013. */ static const double NeutronMassAMU = 1.008664916; + /** AMU in kg. Taken from on 10/09/2014. */ + static const double AtomicMassUnit = 1.660538921e-27; + /** 1 meV in Joules. Taken from on 28/03/2008. */ static const double meV = 1.602176487e-22; - + /** 1 meV in wavenumber (cm-1). Taken from on 02/04/2008. */ static const double meVtoWavenumber = 8.06554465; @@ -74,10 +77,10 @@ namespace PhysicalConstants /** Muon lifetime. Taken from MuLan experiment on 08/12/2008. */ static const double MuonLifetime = 2.197019e-6; - /** Standard atmospheric pressure in kPa. + /** Standard atmospheric pressure in kPa. * Taken from on 01/12/2010 **/ static const double StandardAtmosphere = 101.325; - + /** Boltzmann Constant in meV/K * Taken from on 10/07/2012 */ From 79a58fb91fa1e3372d0786c466080142ca8375e3 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 22 Sep 2014 14:22:28 +0100 Subject: [PATCH 044/284] Small Symmetrise improvements, added validation checks to unit test Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 34 ++++++++++++------- .../plugins/algorithms/SymmetriseTest.py | 14 +++++++- .../src/IndirectSymmetrise.cpp | 7 ++++ 3 files changed, 42 insertions(+), 13 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index e3cbd71f9428..bfefa32f6ac5 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -53,13 +53,26 @@ def PyExec(self): len_x = len(mtd[self._sample].readX(0)) len_y = len(mtd[self._sample].readY(0)) len_e = len(mtd[self._sample].readE(0)) - sample_array_len = min(len_x, len_y, len_e) - 1 + sample_array_len = min(len_x, len_y, len_e) sample_x = mtd[self._sample].readX(0) + + if self._x_max > sample_x[len(sample_x) - 1]: + raise ValueError('XMax value (%f) is greater than largest X value (%f)' % + (self._x_max, sample_x[len(sample_x) - 1])) + + if self._x_min < sample_x[0]: + raise ValueError('XMin value (%f) is less than smallest X value (%f)' % + (self._x_min, sample_x[0])) + self._calculate_array_points(sample_x, sample_array_len) - output_cut_index = sample_array_len - self._positive_min_index - (sample_array_len - self._positive_max_index) - new_array_len = 2 * sample_array_len - (self._positive_min_index + self._negative_min_index) - 2 * (sample_array_len - self._positive_max_index) + max_sample_index = sample_array_len - 1 + centre_range_len = self._positive_min_index + self._negative_min_index + posiive_diff_range_len = max_sample_index - self._positive_max_index + + output_cut_index = max_sample_index - self._positive_min_index - posiive_diff_range_len + new_array_len = 2 * max_sample_index - centre_range_len - 2 * posiive_diff_range_len if self._verbose: logger.notice('Sample array length = %d' % sample_array_len) @@ -96,9 +109,9 @@ def PyExec(self): spectrum_index = mtd[self._sample].getIndexFromSpectrumNumber(spectrum_no) # Strip any additional array cells - x_in = mtd[self._sample].readX(spectrum_index)[:sample_array_len + 1] - y_in = mtd[self._sample].readY(spectrum_index)[:sample_array_len + 1] - e_in = mtd[self._sample].readE(spectrum_index)[:sample_array_len + 1] + x_in = mtd[self._sample].readX(spectrum_index)[:sample_array_len] + y_in = mtd[self._sample].readY(spectrum_index)[:sample_array_len] + e_in = mtd[self._sample].readE(spectrum_index)[:sample_array_len] # Get some zeroed data to overwrite with copies from sample x_out = np.zeros(new_array_len) @@ -203,7 +216,8 @@ def _calculate_array_points(self, sample_x, sample_array_len): # Find array index of positive XMax positive_max_diff = np.absolute(sample_x - self._x_max) - self._positive_max_index = np.where(positive_max_diff < delta_x)[0][-1] + indicies = np.where(positive_max_diff < delta_x)[0] + self._positive_max_index = indicies[-1] self._check_bounds(self._positive_max_index, sample_array_len, label='Positive') def _check_bounds(self, index, num_pts, label=''): @@ -228,13 +242,9 @@ def _generate_props_table(self): props_table.addColumn('int', 'NegativeXMinIndex') props_table.addColumn('int', 'PositiveXMinIndex') - props_table.addColumn('int', 'NegativeXMaxIndex') props_table.addColumn('int', 'PositiveXMaxIndex') - if self._negative_max_index is None: - props_table.addRow([self._negative_min_index, self._positive_min_index, -1, self._positive_max_index]) - else: - props_table.addRow([self._negative_min_index, self._positive_min_index, self._negative_max_index, self._positive_max_index]) + props_table.addRow([self._negative_min_index, self._positive_min_index, self._positive_max_index]) self.setProperty('OutputPropertiesTable', self._props_output_workspace) diff --git a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py index 81771a81f8ac..73a5f9316157 100644 --- a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py +++ b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py @@ -10,7 +10,19 @@ def setUp(self): self._sample_ws = self._generate_sample_ws('symm_test_sample_ws') def test_basic(self): - symm_test_out_ws= Symmetrise(Sample=self._sample_ws, XMin=0.05, XMax=0.2) + symm_test_out_ws = Symmetrise(Sample=self._sample_ws, XMin=0.05, XMax=0.2) + + def test_failure_lower_range(self): + """ + Tests validation on entering an XMin value lower than the smallest value in the X range. + """ + self.assertRaises(RuntimeError, Symmetrise, Sample=self._sample_ws, OutputWOrkspace='__Symmetrise_TestWS', XMin=-5, XMax=0.2) + + def test_failure_upper_range(self): + """ + Tests validation on entering an XMax value greater than the largest value in the X range. + """ + self.assertRaises(RuntimeError, Symmetrise, Sample=self._sample_ws, OutputWOrkspace='__Symmetrise_TestWS', XMin=0.05, XMax=15) def _rayleigh(self, x, sigma): return (x / sigma ** 2) * np.exp(-x ** 2 / (2 * sigma ** 2)) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index ad74329e3ad5..ac87c7b96931 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -24,6 +24,8 @@ namespace CustomInterfaces IndirectSymmetrise::IndirectSymmetrise(Ui::IndirectDataReduction& uiForm, QWidget * parent) : IndirectDataReductionTab(uiForm, parent) { + int numDecimals = 6; + // Property Trees m_propTrees["SymmPropTree"] = new QtTreePropertyBrowser(); m_uiForm.symm_properties->addWidget(m_propTrees["SymmPropTree"]); @@ -37,8 +39,10 @@ namespace CustomInterfaces // Raw Properties m_properties["EMin"] = m_dblManager->addProperty("EMin"); + m_dblManager->setDecimals(m_properties["EMin"], numDecimals); m_propTrees["SymmPropTree"]->addProperty(m_properties["EMin"]); m_properties["EMax"] = m_dblManager->addProperty("EMax"); + m_dblManager->setDecimals(m_properties["EMax"], numDecimals); m_propTrees["SymmPropTree"]->addProperty(m_properties["EMax"]); QtProperty* rawPlotProps = m_grpManager->addProperty("Raw Plot"); @@ -54,12 +58,15 @@ namespace CustomInterfaces // Preview Properties // Mainly used for display rather than getting user input m_properties["NegativeYValue"] = m_dblManager->addProperty("Negative Y"); + m_dblManager->setDecimals(m_properties["NegativeYValue"], numDecimals); m_propTrees["SymmPVPropTree"]->addProperty(m_properties["NegativeYValue"]); m_properties["PositiveYValue"] = m_dblManager->addProperty("Positive Y"); + m_dblManager->setDecimals(m_properties["PositiveYValue"], numDecimals); m_propTrees["SymmPVPropTree"]->addProperty(m_properties["PositiveYValue"]); m_properties["DeltaY"] = m_dblManager->addProperty("Delta Y"); + m_dblManager->setDecimals(m_properties["DeltaY"], numDecimals); m_propTrees["SymmPVPropTree"]->addProperty(m_properties["DeltaY"]); // Raw plot From a3083f7128437d53ed1425844999737f9a5289c7 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Mon, 22 Sep 2014 16:10:12 +0100 Subject: [PATCH 045/284] Add error in tof to Vesuvio resolution parameters Refs #10169 --- .../MantidCurveFitting/VesuvioResolution.h | 11 ++-- .../CurveFitting/src/VesuvioResolution.cpp | 5 +- Code/Mantid/instrument/VESUVIO_Parameters.xml | 59 ++++++++++--------- 3 files changed, 41 insertions(+), 34 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/VesuvioResolution.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/VesuvioResolution.h index f03970f60223..fd9f28d1437b 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/VesuvioResolution.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/VesuvioResolution.h @@ -20,11 +20,12 @@ namespace CurveFitting /// It avoids some functions taking a huge number of arguments struct ResolutionParams { - double dl1; ///< spread in source-sample distance - double dl2; ///< spread in sample-detector distance - double dthe; ///< spread in scattering angle - double dEnLorentz; ///< lorentz width in energy - double dEnGauss; ///< gaussian width in energy + double dl1; ///< spread in source-sample distance (m) + double dl2; ///< spread in sample-detector distance (m) + double dtof; ///< spread in tof measurement (us) + double dthe; ///< spread in scattering angle (radians) + double dEnLorentz; ///< lorentz width in energy (meV) + double dEnGauss; ///< gaussian width in energy (meV }; /** diff --git a/Code/Mantid/Framework/CurveFitting/src/VesuvioResolution.cpp b/Code/Mantid/Framework/CurveFitting/src/VesuvioResolution.cpp index c0adfc1b6a56..7e0a734546ac 100644 --- a/Code/Mantid/Framework/CurveFitting/src/VesuvioResolution.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/VesuvioResolution.cpp @@ -87,6 +87,7 @@ namespace CurveFitting ResolutionParams respar; respar.dl1 = ConvertToYSpace::getComponentParameter(det, pmap, "sigma_l1"); respar.dl2 = ConvertToYSpace::getComponentParameter(det, pmap, "sigma_l2"); + respar.dtof = ConvertToYSpace::getComponentParameter(det, pmap, "sigma_tof"); respar.dthe = ConvertToYSpace::getComponentParameter(det, pmap, "sigma_theta"); //radians respar.dEnLorentz = ConvertToYSpace::getComponentParameter(det, pmap, "hwhm_lorentz"); respar.dEnGauss = ConvertToYSpace::getComponentParameter(det, pmap, "sigma_gauss"); @@ -156,7 +157,7 @@ namespace CurveFitting double wl2 = 2.0*STDDEV_TO_HWHM*std::abs((std::pow(k0y0,3)/(k1*qy0*detpar.l1))*common)*respar.dl2; m_resolutionSigma = std::sqrt(std::pow(wgauss,2) + std::pow(wtheta,2) + std::pow(wl1,2) + std::pow(wl2,2)); - + m_log.notice() << "--------------------- Mass=" << m_mass << " -----------------------" << std::endl; m_log.notice() << "w_l1 (FWHM)=" << wl2 << std::endl; m_log.notice() << "w_l0 (FWHM)=" << wl1 << std::endl; @@ -203,7 +204,7 @@ namespace CurveFitting { voigtApprox(voigt, xValues, lorentzPos, lorentzAmp, m_lorentzFWHM, m_resolutionSigma); } - + /** * Transforms the input y coordinates using the Voigt function approximation. The area is normalized to lorentzAmp * @param voigt [Out] Output values (vector is expected to be of the correct size diff --git a/Code/Mantid/instrument/VESUVIO_Parameters.xml b/Code/Mantid/instrument/VESUVIO_Parameters.xml index d1fcdc31ad6a..867fc7bdb68e 100644 --- a/Code/Mantid/instrument/VESUVIO_Parameters.xml +++ b/Code/Mantid/instrument/VESUVIO_Parameters.xml @@ -7,106 +7,111 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + - + @@ -117,7 +122,7 @@ - @@ -132,7 +137,7 @@ - + @@ -143,7 +148,7 @@ - @@ -156,8 +161,8 @@ - - From 65d01b5d6497d120bcedfcf092712767ee23c7fc Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Mon, 22 Sep 2014 16:11:40 +0100 Subject: [PATCH 046/284] Fix a few more bugs in calculation. 1. Use resolution parameter for generating initial tof 2. Use correct coordinate system for generating random scatter direction. Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 2 +- .../CurveFitting/src/CalculateMSVesuvio.cpp | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index 6e8d0e45579d..110b218c70ce 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -160,7 +160,7 @@ namespace Mantid // single-event helpers Kernel::V3D generateSrcPos(const double l1) const; double generateE0(const double l1, const double t2, double &weight) const; - double generateTOF(const double gaussTOF, const double en0, const double dl1) const; + double generateTOF(const double gaussTOF, const double dtof, const double dl1) const; bool generateScatter(const Kernel::V3D &startPos, const Kernel::V3D &direc, double &weight, Kernel::V3D &scatterPt) const; std::pair calculateE1Range(const double theta, const double en0) const; diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index da609f862280..568e0eefda57 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -559,10 +559,9 @@ namespace Mantid // Setup progress const int64_t nhist = static_cast(m_inputWS->getNumberHistograms()); - m_progress = new API::Progress(this, 0.0, 1.0, nhist); + m_progress = new API::Progress(this, 0.0, 1.0, nhist*NSIMULATIONS*2); for(int64_t i = 0; i < nhist; ++i) { - m_progress->report("Calculating corrections"); // Copy over the X-values const MantidVec & xValues = m_inputWS->readX(i); @@ -727,7 +726,7 @@ namespace Mantid { // Detector information DetectorParams detpar = ConvertToYSpace::getDetectorParameters(m_inputWS, wsIndex); - // t0 is stored in seconds here, whereas here we want microseconds + // t0 is stored in seconds by default, whereas here we want microseconds detpar.t0 *= 1e6; const Geometry::IDetector_const_sptr detector = m_inputWS->getDetector(wsIndex); @@ -736,6 +735,7 @@ namespace Mantid ResolutionParams respar; respar.dl1 = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_l1"); respar.dl2 = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_l2"); + respar.dtof = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_tof"); respar.dthe = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_theta"); //radians respar.dEnLorentz = ConvertToYSpace::getComponentParameter(detector, pmap, "hwhm_lorentz"); respar.dEnGauss = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_gauss"); @@ -745,8 +745,12 @@ namespace Mantid SimulationAggregator accumulator(nruns); for(size_t i = 0; i < nruns; ++i) { + m_progress->report("MS calculation: idx=" + boost::lexical_cast(wsIndex) + + ", run=" + boost::lexical_cast(i)); simulate(nevents, nscatters, detpar, respar, accumulator.newSimulation(nscatters, m_inputWS->blocksize())); + m_progress->report("MS calculation: idx=" + boost::lexical_cast(wsIndex) + + ", run=" + boost::lexical_cast(i)); } SimulationWithErrors avgCounts = accumulator.average(); @@ -827,7 +831,7 @@ namespace Mantid const double vel2 = sqrt(detpar.efixed/MASS_TO_MEV); const double t2 = detpar.l2/vel2; en1[0] = generateE0(detpar.l1, t2, weights[0]); - tofs[0] = generateTOF(en1[0], detpar.t0, respar.dl1); // correction for resolution in l1 + tofs[0] = generateTOF(en1[0], respar.dtof, respar.dl1); // correction for resolution in l1 // Neutron path // Algorithm has initial direction pointing to origin @@ -856,9 +860,11 @@ namespace Mantid { double randth = acos(2.0*m_randgen->flat() - 1.0); double randphi = 2.0*M_PI*m_randgen->flat(); - particleDir.spherical_rad(1.0, randth, randphi); + + particleDir.azimuth_polar_SNS(1.0, randth, randphi); particleDir.normalize(); scAngs[i-1] = particleDir.angle(oldDir); + // Update weight const double wgt = weights[i]; if(generateScatter(scatterPts[i-1], particleDir, weights[i], scatterPts[i])) @@ -986,12 +992,12 @@ namespace Mantid * Generate an initial tof from this distribution: * 1-(0.5*X**2/T0**2+X/T0+1)*EXP(-X/T0), where x is the time and t0 * is the src-sample time. - * @param dt0 Error in time resolution (us) + * @param dtof Error in time resolution (us) * @param en0 Value of the incident energy * @param dl1 S.d of moderator to sample distance * @return tof Guass TOF modified for asymmetric pulse */ - double CalculateMSVesuvio::generateTOF(const double en0, const double dt0, + double CalculateMSVesuvio::generateTOF(const double en0, const double dtof, const double dl1) const { const double vel1 = sqrt(en0/MASS_TO_MEV); @@ -1002,7 +1008,7 @@ namespace Mantid const double yv = m_randgen->flat(); double xt(xmin); - double tof = m_randgen->gaussian(0.0, dt0); + double tof = m_randgen->gaussian(0.0, dtof); while(true) { xt += dx; From 23b58b02e6c7d4e3d1c643238c1a45f30527e6d2 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Tue, 23 Sep 2014 11:47:01 +0100 Subject: [PATCH 047/284] Fix error in operator precedance when calculating scatter length Refs #10169 --- Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 568e0eefda57..16f42dd5d637 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -665,7 +665,7 @@ namespace Mantid totalMass += comptonAtom.mass*PhysicalConstants::AtomicMassUnit*1000; const double xsec = sampleInfo[nExptdAtomProp*i + 1]; - comptonAtom.sclength = sqrt(xsec/4.0*M_PI); + comptonAtom.sclength = sqrt(xsec/(4.0*M_PI)); const double factor = 1.0 + (PhysicalConstants::NeutronMassAMU/comptonAtom.mass); m_sampleProps->totalxsec += (xsec/(factor*factor)); From 472d2edb5dbdad9b7a95a88c76cbcb7fd00762da Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Mon, 22 Sep 2014 16:42:14 +0100 Subject: [PATCH 048/284] Fix bug in e1 range determination. Refs #10169 --- Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 16f42dd5d637..0f8f8ffca8bd 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -1090,7 +1090,7 @@ namespace Mantid const double e1a = en0 - wr - 10.0*width; const double e1b = en0 - wr + 10.0*width; if(e1a < e1min) e1min = e1a; - if(e1b > e1min) e1max = e1b; + if(e1b > e1max) e1max = e1b; } if(e1min < 0.0) e1min = 0.0; return std::make_pair(e1min, e1max); From 650c0d4dc8545f3a6833f83bc63037abfe6f9191 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 23 Sep 2014 11:55:47 +0100 Subject: [PATCH 049/284] Give a more useful default E range Refs #7860 --- .../PythonInterface/plugins/algorithms/Symmetrise.py | 5 +++-- .../MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index bfefa32f6ac5..43a813af9cbe 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -216,8 +216,9 @@ def _calculate_array_points(self, sample_x, sample_array_len): # Find array index of positive XMax positive_max_diff = np.absolute(sample_x - self._x_max) - indicies = np.where(positive_max_diff < delta_x)[0] - self._positive_max_index = indicies[-1] + self._positive_max_index = np.where(positive_max_diff < delta_x)[0][-1] + if self._positive_max_index == sample_array_len: + self._positive_max_index -= 1 self._check_bounds(self._positive_max_index, sample_array_len, label='Positive') def _check_bounds(self, index, num_pts, label=''): diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index ac87c7b96931..9795d593c893 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -230,6 +230,10 @@ namespace CustomInterfaces m_rangeSelectors["NegativeE_Raw"]->setRange(-symmRange, 0); m_rangeSelectors["PositiveE_Raw"]->setRange(0, symmRange); + // Set some default (and valid) values for E range + m_dblManager->setValue(m_properties["EMax"], axisRange.second); + m_dblManager->setValue(m_properties["EMin"], axisRange.second/10); + updateMiniPlots(); } From e7499732a0bfb6dc4cadb7a031ac484f6cadcee3 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 23 Sep 2014 12:20:27 +0100 Subject: [PATCH 050/284] Fix a problem with Numpy types Refs #7860 --- .../Framework/PythonInterface/plugins/algorithms/Symmetrise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 43a813af9cbe..bef5634a2647 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -94,7 +94,7 @@ def PyExec(self): zeros = np.zeros(new_array_len * num_symm_spectra) CreateWorkspace(OutputWorkspace=temp_ws_name, DataX=zeros, DataY=zeros, DataE=zeros, - NSpec=num_symm_spectra, + NSpec=np.int64(num_symm_spectra), UnitX=x_unit) # Copy logs and properties from sample workspace From 5cf3dd682feb1123defa486d27dc81b226a2633f Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 23 Sep 2014 13:33:21 +0100 Subject: [PATCH 051/284] Fia failing unit tets Refs #7860 --- .../Framework/PythonInterface/plugins/algorithms/Symmetrise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index bef5634a2647..43a813af9cbe 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -94,7 +94,7 @@ def PyExec(self): zeros = np.zeros(new_array_len * num_symm_spectra) CreateWorkspace(OutputWorkspace=temp_ws_name, DataX=zeros, DataY=zeros, DataE=zeros, - NSpec=np.int64(num_symm_spectra), + NSpec=num_symm_spectra, UnitX=x_unit) # Copy logs and properties from sample workspace From 4ef012d9d851a490505e44bf008bffdd5e3a9af4 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Tue, 23 Sep 2014 14:28:46 +0100 Subject: [PATCH 052/284] Fix bug in binning data to final workspace. Refs #10169 --- .../CurveFitting/src/CalculateMSVesuvio.cpp | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 0f8f8ffca8bd..d2d59f15b058 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -638,7 +638,7 @@ namespace Mantid const auto & inX = m_inputWS->readX(0); m_tmin = inX.front()*1e-06; m_tmax = inX.back()*1e-06; - m_delt = (inX[1] - m_tmin)*1e-06; + m_delt = (inX[1] - inX.front()); // -- Sample -- int nmasses = getProperty("NoOfMasses"); @@ -753,13 +753,14 @@ namespace Mantid + ", run=" + boost::lexical_cast(i)); } + // Average over all runs and assign to output workspaces SimulationWithErrors avgCounts = accumulator.average(); avgCounts.normalise(); - // assign to output spectrum + // Sum up all multiple scatter events auto & msscatY = multsc.dataY(); auto & msscatE = multsc.dataE(); - for(size_t i = 0; i < nscatters; ++i) + for(size_t i = 1; i < nscatters; ++i) //(i >= 1 for multiple scatters) { const auto & counts = avgCounts.sim.counts[i]; // equivalent to msscatY[j] += counts[j] @@ -927,15 +928,16 @@ namespace Mantid // "Bin" weight into appropriate place std::vector &counts = simulation.counts[i]; const double finalTOF = tofs[i]; - auto uppIter = std::upper_bound(inX.begin(), inX.end(), finalTOF); - if(uppIter != inX.begin()) + + for (size_t it = 0; it < inX.size(); ++it) { - // See which side of line between us and previous value it should fall - auto prevIter = uppIter - 1; - if(finalTOF < *uppIter - 0.5*(*uppIter - *prevIter)) --uppIter; + if (inX[it] - 0.5*m_delt < finalTOF && finalTOF < inX[it] + 0.5*m_delt) + { + counts[it] += weights[i]; + break; + } } - size_t idx = std::distance(inX.begin(), uppIter); - counts[idx] += weights[i]; + } return weightSum; From efaaa4d20cfa61c74b6638ac2b0341f9ae597f55 Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Tue, 23 Sep 2014 15:19:13 +0100 Subject: [PATCH 053/284] Re #9891. Added EvaluateMDFunction algorithm. --- .../Framework/MDAlgorithms/CMakeLists.txt | 3 + .../MantidMDAlgorithms/EvaluateMDFunction.h | 56 +++++++++++ .../MDAlgorithms/src/EvaluateMDFunction.cpp | 98 +++++++++++++++++++ .../test/EvaluateMDFunctionTest.h | 61 ++++++++++++ 4 files changed, 218 insertions(+) create mode 100644 Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/EvaluateMDFunction.h create mode 100644 Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp create mode 100644 Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h diff --git a/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt b/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt index d4952e2ba98c..92da8b42e345 100644 --- a/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt +++ b/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt @@ -22,6 +22,7 @@ set ( SRC_FILES src/CreateMDWorkspace.cpp src/DivideMD.cpp src/EqualToMD.cpp + src/EvaluateMDFunction.cpp src/ExponentialMD.cpp src/FakeMDEventData.cpp src/FindPeaksMD.cpp @@ -102,6 +103,7 @@ set ( INC_FILES inc/MantidMDAlgorithms/DllConfig.h inc/MantidMDAlgorithms/EqualToMD.h inc/MantidMDAlgorithms/ExponentialMD.h + inc/MantidMDAlgorithms/EvaluateMDFunction.h inc/MantidMDAlgorithms/FakeMDEventData.h inc/MantidMDAlgorithms/FindPeaksMD.h inc/MantidMDAlgorithms/GreaterThanMD.h @@ -183,6 +185,7 @@ set ( TEST_FILES DivideMDTest.h EqualToMDTest.h ExponentialMDTest.h + EvaluateMDFunctionTest.h FakeMDEventDataTest.h FindPeaksMDTest.h FitResolutionConvolvedModelTest.h diff --git a/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/EvaluateMDFunction.h b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/EvaluateMDFunction.h new file mode 100644 index 000000000000..ed2ee59597c9 --- /dev/null +++ b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/EvaluateMDFunction.h @@ -0,0 +1,56 @@ +#ifndef MANTID_MDALGORITHMS_EVALUATEMDFUNCTION_H_ +#define MANTID_MDALGORITHMS_EVALUATEMDFUNCTION_H_ + +#include "MantidKernel/System.h" +#include "MantidAPI/Algorithm.h" + +namespace Mantid +{ +namespace MDAlgorithms +{ + + /** EvaluateMDFunction : TODO: DESCRIPTION + + Copyright © 2014 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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. + + Mantid 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, see . + + File change history is stored at: + Code Documentation is available at: + */ + class DLLExport EvaluateMDFunction : public API::Algorithm + { + public: + EvaluateMDFunction(); + virtual ~EvaluateMDFunction(); + + virtual const std::string name() const {return "EvaluateMDFunction";} + virtual int version() const; + virtual const std::string category() const; + virtual const std::string summary() const; + + private: + void init(); + void exec(); + + + }; + + +} // namespace MDAlgorithms +} // namespace Mantid + +#endif /* MANTID_MDALGORITHMS_EVALUATEMDFUNCTION_H_ */ diff --git a/Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp b/Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp new file mode 100644 index 000000000000..d13d64033c6a --- /dev/null +++ b/Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp @@ -0,0 +1,98 @@ +#include "MantidMDAlgorithms/EvaluateMDFunction.h" +#include "MantidAPI/FunctionProperty.h" +#include "MantidAPI/IMDHistoWorkspace.h" +#include "MantidAPI/AlgorithmManager.h" +#include "MantidAPI/IMDIterator.h" +#include "MantidAPI/FunctionDomainMD.h" +#include "MantidAPI/FunctionValues.h" + +namespace Mantid +{ +namespace MDAlgorithms +{ + + using Mantid::Kernel::Direction; + using Mantid::API::WorkspaceProperty; + + // Register the algorithm into the AlgorithmFactory + DECLARE_ALGORITHM(EvaluateMDFunction) + + + + //---------------------------------------------------------------------------------------------- + /** Constructor + */ + EvaluateMDFunction::EvaluateMDFunction() + { + } + + //---------------------------------------------------------------------------------------------- + /** Destructor + */ + EvaluateMDFunction::~EvaluateMDFunction() + { + } + + + //---------------------------------------------------------------------------------------------- + + + /// Algorithm's version for identification. @see Algorithm::version + int EvaluateMDFunction::version() const { return 1;}; + + /// Algorithm's category for identification. @see Algorithm::category + const std::string EvaluateMDFunction::category() const { return "MDAlgorithms";} + + /// Algorithm's summary for use in the GUI and help. @see Algorithm::summary + const std::string EvaluateMDFunction::summary() const { return "Evaluates an MD function on a MD histo workspace.";}; + + //---------------------------------------------------------------------------------------------- + /** Initialize the algorithm's properties. + */ + void EvaluateMDFunction::init() + { + declareProperty(new WorkspaceProperty("InputWorkspace","",Direction::Input), "An input workspace."); + declareProperty(new API::FunctionProperty("Function"),"Parameters defining the fitting function and its initial values"); + declareProperty(new WorkspaceProperty("OutputWorkspace","",Direction::Output), "An output workspace."); + } + + //---------------------------------------------------------------------------------------------- + /** Execute the algorithm. + */ + void EvaluateMDFunction::exec() + { + API::IMDHistoWorkspace_sptr input = getProperty("InputWorkspace"); + + auto cloner = API::AlgorithmManager::Instance().create("CloneMDWorkspace"); + cloner->initialize(); + cloner->setChild(true); + cloner->setProperty("InputWorkspace", input); + cloner->setPropertyValue("OutputWorkspace", "_"); + cloner->execute(); + + API::IMDWorkspace_sptr clone = cloner->getProperty("OutputWorkspace"); + API::IMDHistoWorkspace_sptr output = boost::dynamic_pointer_cast(clone); + + if ( !output ) + throw std::runtime_error("Cannot create output workspace"); + + API::IFunction_sptr function = getProperty("Function"); + function->setWorkspace( output ); + + API::FunctionDomainMD domain( output ); + API::FunctionValues values( domain ); + + function->function( domain, values ); + + double *data = values.getPointerToCalculated(0); + size_t length = values.size(); + double *outputData = output->getSignalArray(); + std::copy( data, data + length, outputData ); + + setProperty("OutputWorkspace",output); + } + + + +} // namespace MDAlgorithms +} // namespace Mantid diff --git a/Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h b/Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h new file mode 100644 index 000000000000..8d5fbc2a645a --- /dev/null +++ b/Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h @@ -0,0 +1,61 @@ +#ifndef MANTID_MDALGORITHMS_EVALUATEMDFUNCTIONTEST_H_ +#define MANTID_MDALGORITHMS_EVALUATEMDFUNCTIONTEST_H_ + +#include + +#include "MantidMDAlgorithms/EvaluateMDFunction.h" + +using Mantid::MDAlgorithms::EvaluateMDFunction; +using namespace Mantid::API; + +class EvaluateMDFunctionTest : public CxxTest::TestSuite +{ +public: + // This pair of boilerplate methods prevent the suite being created statically + // This means the constructor isn't called when running other tests + static EvaluateMDFunctionTest *createSuite() { return new EvaluateMDFunctionTest(); } + static void destroySuite( EvaluateMDFunctionTest *suite ) { delete suite; } + + + void test_Init() + { + EvaluateMDFunction alg; + TS_ASSERT_THROWS_NOTHING( alg.initialize() ) + TS_ASSERT( alg.isInitialized() ) + } + + void test_exec() + { + // Name of the output workspace. + std::string outWSName("EvaluateMDFunctionTest_OutputWS"); + + EvaluateMDFunction alg; + TS_ASSERT_THROWS_NOTHING( alg.initialize() ) + TS_ASSERT( alg.isInitialized() ) + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("REPLACE_PROPERTY_NAME_HERE!!!!", "value") ); + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("OutputWorkspace", outWSName) ); + TS_ASSERT_THROWS_NOTHING( alg.execute(); ); + TS_ASSERT( alg.isExecuted() ); + + // Retrieve the workspace from data service. TODO: Change to your desired type + Workspace_sptr ws; + TS_ASSERT_THROWS_NOTHING( ws = AnalysisDataService::Instance().retrieveWS(outWSName) ); + TS_ASSERT(ws); + if (!ws) return; + + // TODO: Check the results + + // Remove workspace from the data service. + AnalysisDataService::Instance().remove(outWSName); + } + + void test_Something() + { + TSM_ASSERT( "You forgot to write a test!", 0); + } + + +}; + + +#endif /* MANTID_MDALGORITHMS_EVALUATEMDFUNCTIONTEST_H_ */ From 70488cda54504854ce43343e563f58f1b860d2a0 Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Tue, 23 Sep 2014 16:53:05 +0100 Subject: [PATCH 054/284] Re #9891. Unit test. --- .../MDAlgorithms/src/EvaluateMDFunction.cpp | 2 +- .../test/EvaluateMDFunctionTest.h | 52 ++++++++++++++++--- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp b/Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp index d13d64033c6a..b4e1a6cc8203 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp @@ -51,7 +51,7 @@ namespace MDAlgorithms */ void EvaluateMDFunction::init() { - declareProperty(new WorkspaceProperty("InputWorkspace","",Direction::Input), "An input workspace."); + declareProperty(new WorkspaceProperty("InputWorkspace","",Direction::Input), "An input workspace that provides dimensions for the output."); declareProperty(new API::FunctionProperty("Function"),"Parameters defining the fitting function and its initial values"); declareProperty(new WorkspaceProperty("OutputWorkspace","",Direction::Output), "An output workspace."); } diff --git a/Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h b/Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h index 8d5fbc2a645a..f1fe2cbbc9cd 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h @@ -4,8 +4,10 @@ #include #include "MantidMDAlgorithms/EvaluateMDFunction.h" +#include "MantidMDAlgorithms/CreateMDHistoWorkspace.h" using Mantid::MDAlgorithms::EvaluateMDFunction; +using Mantid::MDAlgorithms::CreateMDHistoWorkspace; using namespace Mantid::API; class EvaluateMDFunctionTest : public CxxTest::TestSuite @@ -28,32 +30,66 @@ class EvaluateMDFunctionTest : public CxxTest::TestSuite { // Name of the output workspace. std::string outWSName("EvaluateMDFunctionTest_OutputWS"); + + const size_t nx = 3, ny = 4; + IMDHistoWorkspace_sptr inputWorkspace = createInputWorkspace(nx,ny); + TS_ASSERT( inputWorkspace ); + std::string funcStr = "name=UserFunctionMD,Formula=x+y"; EvaluateMDFunction alg; TS_ASSERT_THROWS_NOTHING( alg.initialize() ) TS_ASSERT( alg.isInitialized() ) - TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("REPLACE_PROPERTY_NAME_HERE!!!!", "value") ); + TS_ASSERT_THROWS_NOTHING( alg.setProperty("InputWorkspace", inputWorkspace) ); + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("Function", funcStr) ); TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("OutputWorkspace", outWSName) ); TS_ASSERT_THROWS_NOTHING( alg.execute(); ); TS_ASSERT( alg.isExecuted() ); - // Retrieve the workspace from data service. TODO: Change to your desired type - Workspace_sptr ws; - TS_ASSERT_THROWS_NOTHING( ws = AnalysisDataService::Instance().retrieveWS(outWSName) ); + IMDHistoWorkspace_sptr ws; + TS_ASSERT_THROWS_NOTHING( ws = AnalysisDataService::Instance().retrieveWS(outWSName) ); TS_ASSERT(ws); if (!ws) return; - // TODO: Check the results + for(size_t i = 0; i < nx; ++i) + for(size_t j = 0; j < ny; ++j) + { + size_t linearIndex = ws->getLinearIndex(i,j); + auto v = ws->getCenter(linearIndex); + auto x = v[0]; + auto y = v[1]; + auto f = ws->getSignalAt(linearIndex); + TS_ASSERT_DELTA( f, x + y, 1e-15 ); + } // Remove workspace from the data service. AnalysisDataService::Instance().remove(outWSName); } - void test_Something() + IMDHistoWorkspace_sptr createInputWorkspace(size_t nx, size_t ny) { - TSM_ASSERT( "You forgot to write a test!", 0); - } + std::vector values( nx * ny, 1.0 ); + std::vector dims(2); + dims[0] = static_cast(nx); + dims[1] = static_cast(ny); + + CreateMDHistoWorkspace alg; + alg.initialize(); + alg.setProperty("SignalInput", values); + alg.setProperty("ErrorInput", values); + alg.setProperty("Dimensionality", 2); + alg.setProperty("NumberOfBins", dims); + alg.setPropertyValue("Extents", "-1,1,-1,1"); + alg.setPropertyValue("Names", "A,B"); + alg.setPropertyValue("Units", "U,U"); + alg.setPropertyValue("OutputWorkspace", "out"); + alg.execute(); + TS_ASSERT( alg.isExecuted() ); + + IMDHistoWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS("out"); + AnalysisDataService::Instance().remove("out"); + return ws; + } }; From 9becaa9b34ee4ab52bf5d8a97812dd7d6181ab44 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 24 Sep 2014 11:51:23 +0100 Subject: [PATCH 055/284] Second attempt at fixing the numpy type issue Refs #7860 --- .../Framework/PythonInterface/plugins/algorithms/Symmetrise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 43a813af9cbe..317045adba1b 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -94,7 +94,7 @@ def PyExec(self): zeros = np.zeros(new_array_len * num_symm_spectra) CreateWorkspace(OutputWorkspace=temp_ws_name, DataX=zeros, DataY=zeros, DataE=zeros, - NSpec=num_symm_spectra, + NSpec=int(num_symm_spectra), UnitX=x_unit) # Copy logs and properties from sample workspace From bbfab11a3701c931c5fc7046a8100d471f7a8754 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 24 Sep 2014 15:59:55 +0100 Subject: [PATCH 056/284] Corrected another numpy type issue Refs #7860 --- .../Framework/PythonInterface/plugins/algorithms/Symmetrise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 317045adba1b..346d3d08a388 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -245,7 +245,7 @@ def _generate_props_table(self): props_table.addColumn('int', 'PositiveXMinIndex') props_table.addColumn('int', 'PositiveXMaxIndex') - props_table.addRow([self._negative_min_index, self._positive_min_index, self._positive_max_index]) + props_table.addRow([int(self._negative_min_index), int(self._positive_min_index), int(self._positive_max_index)]) self.setProperty('OutputPropertiesTable', self._props_output_workspace) From 16547ade611a521a326530800f48f7a9aa6f311e Mon Sep 17 00:00:00 2001 From: John Hill Date: Wed, 24 Sep 2014 16:47:59 +0100 Subject: [PATCH 057/284] Refs #10194 basic implementation of nxtomo file saving alg --- .../inc/MantidDataHandling/SaveNXTomo.h | 51 ++-- .../Framework/DataHandling/src/SaveNXTomo.cpp | 229 +++++++++--------- 2 files changed, 137 insertions(+), 143 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 644ca2f8abdf..464f8d839495 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -4,12 +4,7 @@ //--------------------------------------------------- // Includes //--------------------------------------------------- -//#include "MantidAPI/Algorithm.h" //#include "MantidNexus/NexusClasses.h" -//#include "MantidAPI/MatrixWorkspace.h" -//#include "MantidAPI/Sample.h" -//#include "MantidDataObjects/Workspace2D.h" -//#include "MantidDataObjects/EventWorkspace.h" //#include //#include @@ -20,6 +15,7 @@ namespace Mantid /** * Saves a workspace into a NeXus/HDF5 NXTomo file. + * File format is defined here: http://download.nexusformat.org/sphinx/classes/applications/NXtomo.html * * Required properties: *
    @@ -53,49 +49,44 @@ namespace Mantid class DLLExport SaveNXTomo: public API::Algorithm { public: - /// Constructor SaveNXTomo(); /// Virtual dtor - virtual ~SaveNXTomo() - { - } - virtual const std::string name() const - { - return "SaveNXTomo"; - } + virtual ~SaveNXTomo() {} + + /// Algorithm's name for identification overriding a virtual method + virtual const std::string name() const { return "SaveNXTomo"; } + ///Summary of algorithms purpose virtual const std::string summary() const {return "Writes a MatrixWorkspace to a file in the NXTomo format.";} /// Algorithm's version - virtual int version() const - { - return (1); - } + virtual int version() const { return (1); } + /// Algorithm's category for identification - virtual const std::string category() const - { - return "DataHandling\\Nexus;DataHandling\\Tomo;Diffraction"; - } + virtual const std::string category() const { return "DataHandling\\Nexus;DataHandling\\Tomo;Diffraction"; } - private: - + private: /// Initialisation code void init(); - ///Execution code + /// Execution code void exec(); + /// Save all data to file + + /// Save batch of images to the file + ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change - //size_t nBins; + size_t m_nBins; /// The filename of the output file - //std::string filename; + std::string m_filename; // Some constants to be written for masked values. /// Value for data if pixel is masked - //static const double MASK_FLAG; + static const double MASK_FLAG; /// Value for error if pixel is masked - //static const double MASK_ERROR; - /// file format version - //static const std::string NXSPE_VER; + static const double MASK_ERROR; + /// file format version + static const std::string NXTOMO_VER; }; } // namespace DataHandling diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index 3a053edfa273..51c5f256d435 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -1,28 +1,24 @@ -#include "MantidDataHandling/SaveNXTomo.h" #include "MantidAPI/FileProperty.h" -//#include "MantidKernel/ConfigService.h" -#include "MantidKernel/MantidVersion.h" #include "MantidAPI/WorkspaceValidators.h" -//#include "MantidAPI/WorkspaceOpOverloads.h" -//#include "MantidGeometry/Instrument/Detector.h" -//#include "MantidGeometry/Instrument/ObjComponent.h" -//#include "MantidDataHandling/FindDetectorsPar.h" -// -//#include -//#include -//#include +#include "MantidDataHandling/FindDetectorsPar.h" +#include "MantidDataHandling/SaveNXTomo.h" +#include "MantidKernel/MantidVersion.h" +#include "MantidNexus/NexusClasses.h" namespace Mantid { namespace DataHandling - { - + { // Register the algorithm into the algorithm factory DECLARE_ALGORITHM(SaveNXTomo) using namespace Kernel; using namespace API; + const double SaveNXTomo::MASK_FLAG = std::numeric_limits::quiet_NaN(); + const double SaveNXTomo::MASK_ERROR = 0.0; + const std::string SaveNXTomo::NXTOMO_VER = "2.0"; + SaveNXTomo::SaveNXTomo() : API::Algorithm() { } @@ -33,7 +29,7 @@ namespace Mantid void SaveNXTomo::init() { auto wsValidator = boost::make_shared() ; - wsValidator->add(boost::make_shared("DeltaE")); + //wsValidator->add(boost::make_shared("DeltaE")); wsValidator->add(); wsValidator->add(); @@ -52,7 +48,13 @@ namespace Mantid { // Retrieve the input workspace const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); - + + const std::string workspaceID = inputWS->id(); + + if ((workspaceID.find("Workspace2D") == std::string::npos) && + (workspaceID.find("RebinnedOutput") == std::string::npos)) + throw Exception::NotImplementedError("SaveNexusProcessed passed invalid workspaces. Must be Workspace2D, EventWorkspace, ITableWorkspace, or OffsetsWorkspace."); + // Do the full check for common binning if (!WorkspaceHelpers::commonBoundaries(inputWS)) { @@ -63,98 +65,88 @@ namespace Mantid // Number of spectra const int nHist = static_cast(inputWS->getNumberHistograms()); // Number of energy bins - this->nBins = inputWS->blocksize(); + this->m_nBins = inputWS->blocksize(); // Get a pointer to the sample Geometry::IComponent_const_sptr sample = inputWS->getInstrument()->getSample(); // Retrieve the filename from the properties - this->filename = getPropertyValue("Filename"); + this->m_filename = getPropertyValue("Filename"); - // Create the file. - ::NeXus::File nxFile(this->filename, NXACC_CREATE5); + // Create some arrays for the nexus api to use + std::vector array_dims; + array_dims.push_back((int)nHist); + array_dims.push_back((int)m_nBins); + // Create the file. + ::NeXus::File nxFile(this->m_filename, NXACC_CREATE5); + // Make the top level entry (and open it) - nxFile.makeGroup(inputWS->getName(), "NXentry", true); + nxFile.makeGroup("entry1", "NXentry", true); + + // Make a sub-group for the entry to work with DAWN software (and open it) + nxFile.makeGroup("tomo_entry", "NXsubentry", true); + + // Title + nxFile.writeData("title", this->m_filename); + + // Start Time; Format ISO8601 | unused but part of NXtomo schema + //nxFile.writeData("start_time", ); + + // End Time; Format ISO8601 | unused but part of NXtomo schema + //nxFile.writeData("end_time", ); // Definition name and version - nxFile.writeData("definition", "NXSPE"); + nxFile.writeData("definition", "NXtomo"); nxFile.openData("definition"); - nxFile.putAttr("version", NXSPE_VER); + nxFile.putAttr("version", NXTOMO_VER); nxFile.closeData(); - // Program name and version + // Originating program name and version nxFile.writeData("program_name", "mantid"); nxFile.openData("program_name"); nxFile.putAttr("version", Mantid::Kernel::MantidVersion::version()); - nxFile.closeData(); - - // Create NXSPE_info - nxFile.makeGroup("NXSPE_info", "NXcollection", true); - - // Get the value out of the property first - double efixed = getProperty("Efixed"); - if ( isEmpty(efixed) ) efixed = MASK_FLAG; - // Now lets check to see if the workspace nows better. - // TODO: Check that this is the way round we want to do it. - const API::Run & run = inputWS->run(); - if (run.hasProperty("Ei")) - { - Kernel::Property* propEi = run.getProperty("Ei"); - efixed = boost::lexical_cast(propEi->value()); - } - nxFile.writeData("fixed_energy", efixed); - nxFile.openData("fixed_energy"); - nxFile.putAttr("units", "meV"); - nxFile.closeData(); - - double psi = getProperty("Psi"); - if ( isEmpty(psi) ) psi = MASK_FLAG; - nxFile.writeData("psi", psi); - nxFile.openData("psi"); - nxFile.putAttr("units", "degrees"); - nxFile.closeData(); - - bool kikfScaling = getProperty("KiOverKfScaling"); - if (kikfScaling) - { - nxFile.writeData("ki_over_kf_scaling", 1); - } - else - { - nxFile.writeData("ki_over_kf_scaling", 0); - } - - nxFile.closeGroup(); // NXSPE_info + nxFile.closeData(); + // ****************************************** // NXinstrument nxFile.makeGroup("instrument", "NXinstrument", true); - // Write the instrument name + // Write the instrument name | could add short_name attribute to name nxFile.writeData("name", inputWS->getInstrument()->getName()); - // and the short name - nxFile.openData("name"); - // TODO: Get the instrument short name - nxFile.putAttr("short_name", inputWS->getInstrument()->getName()); - nxFile.closeData(); - - // NXfermi_chopper - nxFile.makeGroup("fermi", "NXfermi_chopper", true); - - nxFile.writeData("energy", efixed); - nxFile.closeGroup(); // NXfermi_chopper - + + // detector group - diamond example file contains {data,distance,image_key,x_pixel_size,y_pixel_size} Only adding image_key for now, 0 filled. + nxFile.makeGroup("detector", "NXdetector", true); + std::vector imageKey(array_dims[1],0); + nxFile.writeData("image_key", imageKey); + nxFile.closeGroup(); + + // source group // from diamond file contains {current,energy,name,probe,type} - probe = neutron | x-ray | electron + + nxFile.closeGroup(); // NXinstrument + // ****************************************** // NXsample nxFile.makeGroup("sample", "NXsample", true); // TODO: Write sample info -// nxFile.writeData("rotation_angle", 0.0); -// nxFile.writeData("seblock", "NONE"); -// nxFile.writeData("temperature", 300.0); - + // name + // nxFile.writeData("rotation_angle", 0.0); + // x_translation + // y_translation + // z_translation nxFile.closeGroup(); // NXsample + + // ****************************************** + // Make the NXmonitor group - Holds base beam intensity for each image + // If information is not present, set as 1 + std::vector intensity(array_dims[1],1); + nxFile.makeGroup("control", "NXmonitor", true); + nxFile.writeData("data", intensity); + nxFile.closeGroup(); // NXmonitor + + // ****************************************** // Make the NXdata group nxFile.makeGroup("data", "NXdata", true); @@ -164,37 +156,31 @@ namespace Mantid nxFile.writeData("energy", X); nxFile.openData("energy"); nxFile.putAttr("units", "meV"); - nxFile.closeData(); - - // let's create some blank arrays in the nexus file - - std::vector array_dims; - array_dims.push_back((int)nHist); - array_dims.push_back((int)nBins); + nxFile.closeData(); nxFile.makeData("data", ::NeXus::FLOAT64, array_dims, false); nxFile.makeData("error", ::NeXus::FLOAT64, array_dims, false); // Add the axes attributes to the data - nxFile.openData("data"); - nxFile.putAttr("signal", 1); - nxFile.putAttr("axes", "polar:energy"); - nxFile.closeData(); + //nxFile.openData("data"); + //nxFile.putAttr("signal", 1); + //nxFile.putAttr("axes", "polar:energy"); + //nxFile.closeData(); std::vector slab_start; std::vector slab_size; // What size slabs are we going to write... slab_size.push_back(1); - slab_size.push_back((int64_t)nBins); + slab_size.push_back((int64_t)m_nBins); // And let's start at the beginning slab_start.push_back(0); slab_start.push_back(0); // define the data and error vectors for masked detectors - std::vector masked_data (nBins, MASK_FLAG); - std::vector masked_error (nBins, MASK_ERROR); + std::vector masked_data (m_nBins, MASK_FLAG); + std::vector masked_error (m_nBins, MASK_ERROR); // Create a progress reporting object Progress progress(this,0,1,100); @@ -203,8 +189,9 @@ namespace Mantid // Loop over spectra for (int i = 0; i < nHist; i++) { - try{ // detector exist - det =inputWS->getDetector(i); + try + { // detector exist + det = inputWS->getDetector(i); // Check that we aren't writing a monitor... if (!det->isMonitor()) { @@ -247,7 +234,8 @@ namespace Mantid nxFile.closeData(); } } - }catch(Exception::NotFoundError&) + } + catch(Exception::NotFoundError&) { // Catch if no detector. Next line tests whether this happened - test placed // outside here because Mac Intel compiler doesn't like 'continue' in a catch @@ -263,7 +251,7 @@ namespace Mantid } } // execute the ChildAlgorithm to calculate the detector's parameters; - IAlgorithm_sptr spCalcDetPar = this->createChildAlgorithm("FindDetectorsPar", 0, 1, true, 1); + /* IAlgorithm_sptr spCalcDetPar = this->createChildAlgorithm("FindDetectorsPar", 0, 1, true, 1); spCalcDetPar->initialize(); spCalcDetPar->setPropertyValue("InputWorkspace", inputWS->getName()); @@ -271,37 +259,52 @@ namespace Mantid if(!(parFileName.empty()||parFileName=="not_used.par")){ spCalcDetPar->setPropertyValue("ParFile",parFileName); } - spCalcDetPar->execute(); + spCalcDetPar->execute();*/ // - FindDetectorsPar * pCalcDetPar = dynamic_cast(spCalcDetPar.get()); - if(!pCalcDetPar){ // "can not get pointer to FindDetectorsPar algorithm" - throw(std::bad_cast()); - } - const std::vector & azimuthal = pCalcDetPar->getAzimuthal(); + //FindDetectorsPar * pCalcDetPar = dynamic_cast(spCalcDetPar.get()); + //if(!pCalcDetPar){ // "can not get pointer to FindDetectorsPar algorithm" + // throw(std::bad_cast()); + //} + /* const std::vector & azimuthal = pCalcDetPar->getAzimuthal(); const std::vector & polar = pCalcDetPar->getPolar(); const std::vector & azimuthal_width = pCalcDetPar->getAzimWidth(); const std::vector & polar_width = pCalcDetPar->getPolarWidth(); - const std::vector & secondary_flightpath= pCalcDetPar->getFlightPath(); + const std::vector & secondary_flightpath= pCalcDetPar->getFlightPath();*/ - // Write the Polar (2Theta) angles - nxFile.writeData("polar", polar); + //// Write the Polar (2Theta) angles + //nxFile.writeData("polar", polar); - // Write the Azimuthal (phi) angles - nxFile.writeData("azimuthal", azimuthal); + //// Write the Azimuthal (phi) angles + //nxFile.writeData("azimuthal", azimuthal); - // Now the widths... - nxFile.writeData("polar_width", polar_width); - nxFile.writeData("azimuthal_width", azimuthal_width); + //// Now the widths... + //nxFile.writeData("polar_width", polar_width); + //nxFile.writeData("azimuthal_width", azimuthal_width); - // Secondary flight path - nxFile.writeData("distance", secondary_flightpath); + //// Secondary flight path + //nxFile.writeData("distance", secondary_flightpath); nxFile.closeGroup(); // NXdata + nxFile.closeGroup(); // tomo_entry sub-group + nxFile.closeGroup(); // Top level NXentry + + // Validate the file against the schema + } + //void someRoutineToAddDataToExisting() + //{ + // //TODO: + //} + } // namespace DataHandling } // namespace Mantid + + +// TODO: don't allow a multi-file +// Follow mtd conventions +// Add comments / function descriptions etc \ No newline at end of file From e2a3548d4c8935ebd64e7230e55a389cb462f417 Mon Sep 17 00:00:00 2001 From: Michael Wedel Date: Fri, 26 Sep 2014 10:17:12 +0200 Subject: [PATCH 058/284] Refs #9711. Merging new data files As explained in #10090, the measured chopper speed is sometimes a bit off on new data files. That's why the speed has to be cleaned up for now. --- .../plugins/algorithms/PoldiMerge.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py index 6cc76b4f4ffb..612bd8ee0d8c 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PoldiMerge.py @@ -5,7 +5,7 @@ import numpy as np class PoldiMerge(PythonAlgorithm): - comparedPropertyNames = ["TablePositionX", "TablePositionY", "TablePositionZ", "ChopperSpeed"] + comparedPropertyNames = ["TablePositionX", "TablePositionY", "TablePositionZ"] comparedInstrumentParameters = [("detector", "two_theta"), ("chopper", "t0"), ("chopper", "t0_const")] @@ -72,6 +72,9 @@ def canMerge(self, leftWorkspace, rightWorkspace): leftRun = leftWorkspace.getRun() rightRun = rightWorkspace.getRun() + if not self.chopperSpeedsMatch(leftRun, rightRun): + raise RuntimeError("Chopper speeds do not match (" + '&'.join((leftWorkspace.getName(), rightWorkspace.getName())) + ")") + return self.propertiesMatch(leftRun, rightRun) and self.instrumentsMatch(leftWorkspace, rightWorkspace) def timingsMatch(self, leftXData, rightXData): @@ -80,6 +83,18 @@ def timingsMatch(self, leftXData, rightXData): return abs(leftDeltaX - rightDeltaX) < 1e-4 and abs(rightXData[0] - leftXData[0]) < 1e-4 + def chopperSpeedsMatch(self, leftRun, rightRun): + chopperSpeedLeft = self.makePlausibleChopperSpeed(self.getPropertyValue(leftRun.getProperty("ChopperSpeed"))) + chopperSpeedRight = self.makePlausibleChopperSpeed(self.getPropertyValue(rightRun.getProperty("ChopperSpeed"))) + + return abs(chopperSpeedLeft - chopperSpeedRight) < 1e-4 + + def makePlausibleChopperSpeed(self, chopperSpeed): + # This is related to ticket #10090, where a new field in new data is used + # when that ticket is finished, new data files will not need this + # cleanup method anymore. + return np.floor((chopperSpeed + 250.0) / 500.0) * 500.0; + def instrumentsMatch(self, leftWorkspace, rightWorkspace): leftInstrument = leftWorkspace.getInstrument() rightInstrument = rightWorkspace.getInstrument() @@ -104,7 +119,7 @@ def getParameterValue(self, instrument, parameterTuple): def propertiesMatch(self, leftRun, rightRun): for propertyName in self.comparedPropertyNames: - if abs(self.getPropertyValue(leftRun.getProperty(propertyName)) - self.getPropertyValue(rightRun.getProperty(propertyName))) > 1e-4: + if abs(self.getPropertyValue(leftRun.getProperty(propertyName)) - self.getPropertyValue(rightRun.getProperty(propertyName))) > 5e-3: raise RuntimeError("Property '%s' does not match" % (propertyName)) return True From c552656ffd5b07f275bd0193eecf1e9dc29228e0 Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Mon, 29 Sep 2014 13:30:21 +0100 Subject: [PATCH 059/284] Re #9891. Output a histo workspace from FitMD. --- .../MDEvents/inc/MantidMDEvents/FitMD.h | 13 +++ Code/Mantid/Framework/MDEvents/src/FitMD.cpp | 82 +++++++++++++++++-- .../Framework/MDEvents/test/FitMDTest.h | 67 ++++++++++++++- 3 files changed, 152 insertions(+), 10 deletions(-) diff --git a/Code/Mantid/Framework/MDEvents/inc/MantidMDEvents/FitMD.h b/Code/Mantid/Framework/MDEvents/inc/MantidMDEvents/FitMD.h index 95a0ffc00ec1..fd9de1a6ede8 100644 --- a/Code/Mantid/Framework/MDEvents/inc/MantidMDEvents/FitMD.h +++ b/Code/Mantid/Framework/MDEvents/inc/MantidMDEvents/FitMD.h @@ -14,6 +14,8 @@ namespace Mantid class FunctionDomain; class FunctionDomainMD; class IMDWorkspace; + class IMDEventWorkspace; + class IMDHistoWorkspace; } namespace MDEvents @@ -82,6 +84,17 @@ namespace Mantid protected: /// Set all parameters void setParameters()const; + /// Create event output workspace + boost::shared_ptr createEventOutputWorkspace(const std::string& baseName, + const API::IMDEventWorkspace &inputWorkspace, + const API::FunctionValues &values, + const std::string& outputWorkspacePropertyName); + /// Create histo output workspace + boost::shared_ptr createHistoOutputWorkspace(const std::string& baseName, + API::IFunction_sptr function, + boost::shared_ptr inputWorkspace, + const std::string& outputWorkspacePropertyName); + /// Store workspace property name std::string m_workspacePropertyName; /// Store maxSize property name diff --git a/Code/Mantid/Framework/MDEvents/src/FitMD.cpp b/Code/Mantid/Framework/MDEvents/src/FitMD.cpp index d4ec3719ebe6..c8f0a8b2f06c 100644 --- a/Code/Mantid/Framework/MDEvents/src/FitMD.cpp +++ b/Code/Mantid/Framework/MDEvents/src/FitMD.cpp @@ -10,6 +10,8 @@ #include "MantidAPI/IFunctionMD.h" #include "MantidAPI/MemoryManager.h" #include "MantidAPI/WorkspaceProperty.h" +#include "MantidAPI/AlgorithmFactory.h" + #include "MantidGeometry/MDGeometry/MDHistoDimensionBuilder.h" #include "MantidMDEvents/MDEventFactory.h" @@ -139,7 +141,7 @@ namespace Mantid * @param outputWorkspacePropertyName :: The property name */ boost::shared_ptr FitMD::createOutputWorkspace(const std::string& baseName, - API::IFunction_sptr, + API::IFunction_sptr function, boost::shared_ptr domain, boost::shared_ptr values, const std::string& outputWorkspacePropertyName) @@ -154,12 +156,35 @@ namespace Mantid return boost::shared_ptr(); } API::IMDWorkspace_const_sptr domainWS = functionMD->getWorkspace(); - auto inputWS = boost::dynamic_pointer_cast(domainWS); - if(!inputWS) + + auto inputEventWS = boost::dynamic_pointer_cast(domainWS); + if( inputEventWS ) { - return boost::shared_ptr(); + return createEventOutputWorkspace( baseName, *inputEventWS, *values, outputWorkspacePropertyName ); + } + + auto inputHistoWS = boost::dynamic_pointer_cast(domainWS); + if( inputHistoWS ) + { + return createHistoOutputWorkspace( baseName, function, inputHistoWS, outputWorkspacePropertyName ); } - auto outputWS = MDEventFactory::CreateMDWorkspace(inputWS->getNumDims(), "MDEvent"); + + return boost::shared_ptr(); + } + + /** + * Create an output event workspace filled with data simulated with the fitting function. + * @param baseName :: The base name for the workspace + * @param inputWorkspace :: The input workspace. + * @param values :: The calculated values + * @param outputWorkspacePropertyName :: The property name + */ + boost::shared_ptr FitMD::createEventOutputWorkspace(const std::string& baseName, + const API::IMDEventWorkspace &inputWorkspace, + const API::FunctionValues &values, + const std::string& outputWorkspacePropertyName) + { + auto outputWS = MDEventFactory::CreateMDWorkspace(inputWorkspace.getNumDims(), "MDEvent"); // Add events // TODO: Generalize to ND (the current framework is a bit limiting) auto mdWS = boost::dynamic_pointer_cast,4> >(outputWS); @@ -171,7 +196,7 @@ namespace Mantid // Bins extents and meta data for(size_t i = 0;i < 4; ++i) { - boost::shared_ptr inputDim = inputWS->getDimension(i); + boost::shared_ptr inputDim = inputWorkspace.getDimension(i); Geometry::MDHistoDimensionBuilder builder; builder.setName(inputDim->getName()); builder.setId(inputDim->getDimensionId()); @@ -184,7 +209,7 @@ namespace Mantid } // Run information - outputWS->copyExperimentInfos(*inputWS); + outputWS->copyExperimentInfos(inputWorkspace); // Set sensible defaults for splitting behaviour BoxController_sptr bc = outputWS->getBoxController(); bc->setSplitInto(3); @@ -192,13 +217,13 @@ namespace Mantid outputWS->initialize(); outputWS->splitBox(); - auto inputIter = inputWS->createIterator(); + auto inputIter = inputWorkspace.createIterator(); size_t resultValueIndex(0); const float errorSq = 0.0; do { const size_t numEvents = inputIter->getNumEvents(); - const float signal = static_cast(values->getCalculated(resultValueIndex)); + const float signal = static_cast(values.getCalculated(resultValueIndex)); for(size_t i = 0; i < numEvents; ++i) { coord_t centers[4] = { inputIter->getInnerPosition(i,0), inputIter->getInnerPosition(i,1), @@ -235,6 +260,45 @@ namespace Mantid return outputWS; } + /** + * Create an output histo workspace filled with data simulated with the fitting function. + * @param baseName :: The base name for the workspace + * @param function :: The function used for the calculation + * @param domain :: A pointer to the input domain + * @param values :: A pointer to the calculated values + * @param outputWorkspacePropertyName :: The property name + */ + boost::shared_ptr FitMD::createHistoOutputWorkspace(const std::string& baseName, + API::IFunction_sptr function, + API::IMDHistoWorkspace_const_sptr inputWorkspace, + const std::string& outputWorkspacePropertyName) + { + // have to cast const away to be able to pass the workspace to the algorithm + API::IMDHistoWorkspace_sptr nonConstInputWS = boost::const_pointer_cast( inputWorkspace ); + // evaluate the function on the input workspace + auto alg = API::AlgorithmFactory::Instance().create("EvaluateMDFunction",-1); + alg->setChild( true ); + alg->setRethrows( true ); + alg->initialize(); + alg->setProperty( "Function", function ); + alg->setProperty( "InputWorkspace", nonConstInputWS ); + alg->setProperty( "OutputWorkspace", "__FitMD_createHistoOutputWorkspace_outputWorkspace" ); + alg->execute(); + + // get the result + API::IMDHistoWorkspace_sptr outputWorkspace = alg->getProperty( "OutputWorkspace" ); + // Store it + if ( !outputWorkspacePropertyName.empty() ) + { + declareProperty(new API::WorkspaceProperty(outputWorkspacePropertyName,"",Direction::Output), + "Name of the output Workspace holding resulting simulated spectrum"); + m_manager->setPropertyValue(outputWorkspacePropertyName,baseName+"Workspace"); + m_manager->setProperty(outputWorkspacePropertyName,outputWorkspace); + } + + return outputWorkspace; + } + /** * Set all parameters */ diff --git a/Code/Mantid/Framework/MDEvents/test/FitMDTest.h b/Code/Mantid/Framework/MDEvents/test/FitMDTest.h index 5f15aeae0d79..300fdf2bd4be 100644 --- a/Code/Mantid/Framework/MDEvents/test/FitMDTest.h +++ b/Code/Mantid/Framework/MDEvents/test/FitMDTest.h @@ -9,6 +9,7 @@ #include "MantidAPI/FrameworkManager.h" #include "MantidAPI/IMDIterator.h" #include "MantidAPI/ITableWorkspace.h" +#include "MantidAPI/IMDHistoWorkspace.h" #include "MantidMDEvents/UserFunctionMD.h" #include @@ -212,10 +213,74 @@ class FitMDTest : public CxxTest::TestSuite TS_ASSERT_EQUALS(params->Double(2,2), 0.0); API::AnalysisDataService::Instance().clear(); - //--------------------------------------------------// } + void test_output_histo_workspace() + { + auto inputWS = createHistoWorkspace(3,4, "name=UserFunctionMD,Formula=10 + y + (2 + 0.1*y) * x"); + + auto fit = API::AlgorithmManager::Instance().create("Fit"); + fit->initialize(); + + fit->setProperty("Function","name=UserFunctionMD,Formula=h + y + (s + 0.1*y) * x, h = 0, s = 0"); + fit->setProperty("InputWorkspace",inputWS); + fit->setPropertyValue("Output","out"); + fit->execute(); + + IMDHistoWorkspace_sptr outputWS = AnalysisDataService::Instance().retrieveWS( "out_Workspace" ); + TS_ASSERT( outputWS ); + if ( !outputWS ) return; + + TS_ASSERT_EQUALS( inputWS->getNPoints(), outputWS->getNPoints() ); + + uint64_t n = outputWS->getNPoints(); + coord_t invVolume = inputWS->getInverseVolume(); + for( uint64_t i = 0; i < n; ++i ) + { + TS_ASSERT_DELTA( outputWS->signalAt(i) / inputWS->signalAt(i) / invVolume, 1.0, 0.1 ); + } + + AnalysisDataService::Instance().clear(); + } + + // ---------------------------------------------------------- // + IMDHistoWorkspace_sptr createHistoWorkspace(size_t nx, size_t ny, const std::string& function) + { + + std::vector values( nx * ny, 1.0 ); + std::vector dims(2); + dims[0] = static_cast(nx); + dims[1] = static_cast(ny); + + auto alg = AlgorithmManager::Instance().create("CreateMDHistoWorkspace"); + alg->initialize(); + alg->setProperty("SignalInput", values); + alg->setProperty("ErrorInput", values); + alg->setProperty("Dimensionality", 2); + alg->setProperty("NumberOfBins", dims); + alg->setPropertyValue("Extents", "-1,1,-1,1"); + alg->setPropertyValue("Names", "A,B"); + alg->setPropertyValue("Units", "U,U"); + alg->setPropertyValue("OutputWorkspace", "out"); + alg->execute(); + TS_ASSERT( alg->isExecuted() ); + + IMDHistoWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS("out"); + + alg = AlgorithmManager::Instance().create("EvaluateMDFunction"); + alg->initialize(); + alg->setProperty("InputWorkspace", ws); + alg->setPropertyValue("Function",function); + alg->setPropertyValue("OutputWorkspace", "out"); + alg->execute(); + + ws = AnalysisDataService::Instance().retrieveWS("out"); + + AnalysisDataService::Instance().remove("out"); + return ws; + } + }; From 9253100b69aa153f9fce27c35e562dc0f38db57a Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Mon, 29 Sep 2014 13:41:36 +0100 Subject: [PATCH 060/284] Re #9891. Fixing the builds. --- Code/Mantid/Framework/MDEvents/src/FitMD.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Mantid/Framework/MDEvents/src/FitMD.cpp b/Code/Mantid/Framework/MDEvents/src/FitMD.cpp index c8f0a8b2f06c..17d7e3f08e3b 100644 --- a/Code/Mantid/Framework/MDEvents/src/FitMD.cpp +++ b/Code/Mantid/Framework/MDEvents/src/FitMD.cpp @@ -11,6 +11,7 @@ #include "MantidAPI/MemoryManager.h" #include "MantidAPI/WorkspaceProperty.h" #include "MantidAPI/AlgorithmFactory.h" +#include "MantidAPI/Algorithm.h" #include "MantidGeometry/MDGeometry/MDHistoDimensionBuilder.h" #include "MantidMDEvents/MDEventFactory.h" From c86c4b58d3f870ec5ff4b207edbee9a21958889e Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Mon, 29 Sep 2014 13:50:14 +0100 Subject: [PATCH 061/284] Re #9891. Fix doxygen warning. --- Code/Mantid/Framework/MDEvents/src/FitMD.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/MDEvents/src/FitMD.cpp b/Code/Mantid/Framework/MDEvents/src/FitMD.cpp index 17d7e3f08e3b..d98f12cdc8c4 100644 --- a/Code/Mantid/Framework/MDEvents/src/FitMD.cpp +++ b/Code/Mantid/Framework/MDEvents/src/FitMD.cpp @@ -265,8 +265,7 @@ namespace Mantid * Create an output histo workspace filled with data simulated with the fitting function. * @param baseName :: The base name for the workspace * @param function :: The function used for the calculation - * @param domain :: A pointer to the input domain - * @param values :: A pointer to the calculated values + * @param inputWorkspace :: The input workspace * @param outputWorkspacePropertyName :: The property name */ boost::shared_ptr FitMD::createHistoOutputWorkspace(const std::string& baseName, From 8ee0e902480f309b87b23c21c6f445aafca08dd7 Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Mon, 29 Sep 2014 16:48:48 +0100 Subject: [PATCH 062/284] Re #9891. Set all fitting errors to 1.0 --- Code/Mantid/Framework/MDEvents/src/FitMD.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/Framework/MDEvents/src/FitMD.cpp b/Code/Mantid/Framework/MDEvents/src/FitMD.cpp index d98f12cdc8c4..0673b924ffe1 100644 --- a/Code/Mantid/Framework/MDEvents/src/FitMD.cpp +++ b/Code/Mantid/Framework/MDEvents/src/FitMD.cpp @@ -124,9 +124,13 @@ namespace Mantid while(iter) { values->setFitData(i,iter->getNormalizedSignal()); - double err = iter->getNormalizedError(); - if (err <= 0.0) err = 1.0; - values->setFitWeight(i,1/err); + // there is a problem with errors in md workspaces. Until it is solved + // set all weights to 1.0 + // code commented out after the next line is the normal way of setting weights + values->setFitWeight(i,1.0); + //double err = iter->getNormalizedError(); + //if (err <= 0.0) err = 1.0; + //values->setFitWeight(i,1/err); iter = dmd->getNextIterator(); ++i; }; From 9a9fd6dc1449472209d687add4fd29173c8a4a26 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Tue, 30 Sep 2014 14:18:19 +0100 Subject: [PATCH 063/284] Convert umbra and penumbra values to metres internally. Refs #10169 --- .../CurveFitting/src/CalculateMSVesuvio.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index d2d59f15b058..af602567ec64 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -34,7 +34,7 @@ namespace Mantid namespace { const size_t NSIMULATIONS = 10; - const size_t NEVENTS = 500000; + const size_t NEVENTS = 50000; const size_t NSCATTERS = 3; const size_t MAX_SCATTER_PT_TRIES = 25; /// Conversion constant @@ -313,7 +313,6 @@ namespace Mantid //------------------------------------------------------------------------- // RandomNumberGenerator helper //------------------------------------------------------------------------- - /** * Produces random numbers with various probability distributions */ @@ -618,6 +617,9 @@ namespace Mantid << m_srcR1; throw std::invalid_argument(os.str()); } + // Convert to metres + m_srcR1 /= 100.0; + m_srcR2 /= 100.0; // Sample rotation specified by a goniometer m_goniometer = &(m_inputWS->run().getGoniometerMatrix()); @@ -820,8 +822,11 @@ namespace Mantid V3D srcPos = generateSrcPos(detpar.l1); // transform to sample frame srcPos.rotate(*m_goniometer); - if(fabs(srcPos[0]) > m_halfSampleWidth || - fabs(srcPos[1]) > m_halfSampleHeight) return 0.0; // misses sample + if(fabs(srcPos[m_acrossIdx]) > m_halfSampleWidth || + fabs(srcPos[m_upIdx]) > m_halfSampleHeight) + { + return 0.0; // misses sample + } // track various variables during calculation std::vector weights(nscatters, 1.0), // start at 1.0 From 5666d5af1bafafcd21cabe162973c36a38908982 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 6 Oct 2014 10:17:06 +0100 Subject: [PATCH 064/284] Improved validation on Symmetrise algorithm Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 84 ++++++++++++++----- 1 file changed, 61 insertions(+), 23 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 346d3d08a388..0cb5b9f05c99 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -13,9 +13,11 @@ class Symmetrise(PythonAlgorithm): def category(self): return 'Workflow\\MIDAS;PythonAlgorithms' + def summary(self): return 'Takes an asymmetric S(Q,w) and makes it symmetric' + def PyInit(self): self.declareProperty(WorkspaceProperty('Sample', '', Direction.Input), doc='Sample to run with') @@ -39,6 +41,7 @@ def PyInit(self): self.declareProperty(WorkspaceProperty('OutputPropertiesTable', '', Direction.Output, PropertyMode.Optional), doc='Name to call the properties output table workspace.') + def PyExec(self): from IndirectCommon import StartTime, EndTime @@ -154,28 +157,66 @@ def PyExec(self): EndTime('Symmetrise') - def _setup(self): + + def validateInputs(self): """ - Get the algorithm properties and validate them. + Checks for invalid input properties. """ from IndirectCommon import CheckHistZero + issues = dict() - self._sample = self.getPropertyValue('Sample') + input_workspace_name = self.getPropertyValue('Sample') - num_sample_spectra, _ = CheckHistZero(self._sample) - min_spectra_number = mtd[self._sample].getSpectrum(0).getSpectrumNo() - max_spectra_number = mtd[self._sample].getSpectrum(num_sample_spectra - 1).getSpectrumNo() + # Validate spectra range + spectra_range = self.getProperty('SpectraRange').value + if len(spectra_range) != 0 and len(spectra_range) != 2: + issues['SpectraRange'] = 'Must be in format "spec_min,spec_max"' - self._x_min = math.fabs(self.getProperty('XMin').value) - self._x_max = math.fabs(self.getProperty('XMax').value) + if len(spectra_range) == 2: + spec_min = spectra_range[0] + spec_max = spectra_range[1] + + num_sample_spectra, _ = CheckHistZero(input_workspace_name) + min_spectra_number = mtd[input_workspace_name].getSpectrum(0).getSpectrumNo() + max_spectra_number = mtd[input_workspace_name].getSpectrum(num_sample_spectra - 1).getSpectrumNo() + + if spec_min < min_spectra_number: + issues['SpectraRange'] = 'Minimum spectra must be greater than or equal to %d' % min_spectra_number + + if spec_max > max_spectra_number: + issues['SpectraRange'] = 'Maximum spectra must be less than or equal to %d' % max_spectra_number + + if spec_max < spec_min: + issues['SpectraRange'] = 'Minimum spectra must be smaller than maximum spectra' + + # Validate X range + x_min = self.getProperty('XMin').value + if x_min < 1e-5: + issues['XMin'] = 'XMin must be greater than zero' + + x_max = self.getProperty('XMax').value + if x_max < 1e-5: + issues['XMax'] = 'XMax must be greater than zero' + + if math.fabs(x_max - x_min) < 1e-5: + issues['XMin'] = 'X range is close to zero' + issues['XMax'] = 'X range is close to zero' + + if x_max < x_min: + issues['XMin'] = 'XMin must be less than XMax' + issues['XMax'] = 'XMax must be greater than XMin' - if self._x_min < 1e-5: - raise ValueError('XMin point is Zero') - if self._x_max < 1e-5: - raise ValueError('XMax point is Zero') + return issues - if math.fabs(self._x_max - self._x_min) < 1e-5: - raise ValueError('X range is Zero') + + def _setup(self): + """ + Get the algorithm properties and validate them. + """ + self._sample = self.getPropertyValue('Sample') + + self._x_min = math.fabs(self.getProperty('XMin').value) + self._x_max = math.fabs(self.getProperty('XMax').value) self._verbose = self.getProperty('Verbose').value self._plot = self.getProperty('Plot').value @@ -183,18 +224,10 @@ def _setup(self): self._spectra_range = self.getProperty('SpectraRange').value - if len(self._spectra_range) < 2: - self._spectra_range = [min_spectra_number, max_spectra_number] - else: - if self._spectra_range[0] > self._spectra_range[1]: - raise ValueError('Invalid spectra range') - - if self._spectra_range[1] > max_spectra_number: - raise ValueError('Max spectrum number out of range') - self._output_workspace = self.getPropertyValue('OutputWorkspace') self._props_output_workspace = self.getPropertyValue('OutputPropertiesTable') + def _calculate_array_points(self, sample_x, sample_array_len): """ Finds the points in the array that match the cut points. @@ -221,6 +254,7 @@ def _calculate_array_points(self, sample_x, sample_array_len): self._positive_max_index -= 1 self._check_bounds(self._positive_max_index, sample_array_len, label='Positive') + def _check_bounds(self, index, num_pts, label=''): """ Check if the index falls within the bounds of the x range. @@ -235,6 +269,7 @@ def _check_bounds(self, index, num_pts, label=''): elif index >= num_pts: raise ValueError('%s point %d > %d' % (label, index, num_pts)) + def _generate_props_table(self): """ Creates a table workspace with values calculated in algorithm. @@ -249,6 +284,7 @@ def _generate_props_table(self): self.setProperty('OutputPropertiesTable', self._props_output_workspace) + def _save_output(self): """ Save the output workspace to the user's default working directory @@ -262,6 +298,7 @@ def _save_output(self): if self._verbose: logger.notice('Output file : ' + file_path) + def _plot_output(self): """ Plot the first spectrum of the input and output workspace together. @@ -271,5 +308,6 @@ def _plot_output(self): mtd_plot.plotSpectrum([self._sample, self._output_workspace], 0) + # Register algorithm with Mantid AlgorithmFactory.subscribe(Symmetrise) From e7d99d3e44392bbaf0359bc7cfb8d3055dc4c135 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 6 Oct 2014 10:36:58 +0100 Subject: [PATCH 065/284] Added verification to manual ERange adjustment Refs #7860 --- .../IndirectSymmetrise.h | 1 + .../src/IndirectSymmetrise.cpp | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h index 0deb19860033..10a9ad3b6c62 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSymmetrise.h @@ -69,6 +69,7 @@ namespace CustomInterfaces void plotRawInput(const QString &workspaceName); void updateMiniPlots(); void replotNewSpectrum(QtProperty *prop, double value); + void verifyERange(QtProperty *prop, double value); void updateRangeSelectors(QtProperty *prop, double value); void preview(); void previewAlgDone(bool error); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 9795d593c893..2d741e12f40b 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -132,6 +132,8 @@ namespace CustomInterfaces // SIGNAL/SLOT CONNECTIONS // Update range selctors when a property is changed connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRangeSelectors(QtProperty*, double))); + // Verify an energy range when it is updated + connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(verifyERange(QtProperty*, double))); // Plot a new spectrum when the user changes the value of the preview spectrum connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(replotNewSpectrum(QtProperty*, double))); // Plot miniplot when file has finished loading @@ -277,6 +279,42 @@ namespace CustomInterfaces updateMiniPlots(); } + /** + * Verifies that the E Range is valid. + * + * Resets the last property changed to it's default if not. + * + * @param prop QtProperty changed + * @param value Value it was changed to (unused) + */ + void IndirectSymmetrise::verifyERange(QtProperty *prop, double value) + { + UNUSED_ARG(value); + + double eMin = m_dblManager->value(m_properties["EMin"]); + double eMax = m_dblManager->value(m_properties["EMax"]); + + // First check that the raw curve has been plotted + if(!m_curves["SymmRawPlot"]) + return; + + // Get the range of the plotted raw curve + auto axisRange = getCurveRange("SymmRawPlot"); + + if(prop == m_properties["EMin"]) + { + // If range is invalid reset EMin to range/10 + if(eMin > eMax) + m_dblManager->setValue(m_properties["EMin"], axisRange.second/10); + } + else if(prop == m_properties["EMax"]) + { + // If range is invalid reset EMax to range + if(eMin > eMax) + m_dblManager->setValue(m_properties["EMax"], axisRange.second); + } + } + /** * Handles a request to preview the symmetrise. * From 184069aad8f63c5d1f530e52ce0df61c0b0fb854 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 6 Oct 2014 10:41:29 +0100 Subject: [PATCH 066/284] Restrict XRange to be a positive value Refs #7860 --- .../CustomInterfaces/src/IndirectSymmetrise.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 2d741e12f40b..15beded33f59 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -270,10 +270,18 @@ namespace CustomInterfaces /** * Redraws mini plots when user changes previw range or spectrum. + * + * @param prop QtProperty that was changed + * @param value Value it was changed to */ void IndirectSymmetrise::replotNewSpectrum(QtProperty *prop, double value) { - UNUSED_ARG(value); + if(prop == m_properties["PreviewRange"]) + { + // If preview range was set negative then set it to the absolute value of the value it was set to + if(value < 0) + m_dblManager->setValue(m_properties["PreviewRange"], fabs(value)); + } if((prop == m_properties["PreviewSpec"]) || (prop == m_properties["PreviewRange"])) updateMiniPlots(); From 0ea7c4f2c2b09075c5654225e1ad5f64036916b3 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 6 Oct 2014 11:34:20 +0100 Subject: [PATCH 067/284] Added better validation of EMin and EMax Refs #7860 --- .../src/IndirectSymmetrise.cpp | 52 +++++++++++++------ 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 15beded33f59..69a7bb6ffdfa 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -130,9 +130,7 @@ namespace CustomInterfaces m_plots["SymmPreviewPlot"]->replot(); // SIGNAL/SLOT CONNECTIONS - // Update range selctors when a property is changed - connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRangeSelectors(QtProperty*, double))); - // Verify an energy range when it is updated + // Validate the E range when it is changed connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(verifyERange(QtProperty*, double))); // Plot a new spectrum when the user changes the value of the preview spectrum connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(replotNewSpectrum(QtProperty*, double))); @@ -290,8 +288,6 @@ namespace CustomInterfaces /** * Verifies that the E Range is valid. * - * Resets the last property changed to it's default if not. - * * @param prop QtProperty changed * @param value Value it was changed to (unused) */ @@ -302,25 +298,44 @@ namespace CustomInterfaces double eMin = m_dblManager->value(m_properties["EMin"]); double eMax = m_dblManager->value(m_properties["EMax"]); - // First check that the raw curve has been plotted - if(!m_curves["SymmRawPlot"]) - return; - - // Get the range of the plotted raw curve - auto axisRange = getCurveRange("SymmRawPlot"); - if(prop == m_properties["EMin"]) { - // If range is invalid reset EMin to range/10 + // If the value of EMin is negative try negating it to get a valid range + if(eMin < 0) + { + eMin = -eMin; + m_dblManager->setValue(m_properties["EMin"], eMin); + return; + } + + // If range is still invalid reset EMin to half EMax if(eMin > eMax) - m_dblManager->setValue(m_properties["EMin"], axisRange.second/10); + { + m_dblManager->setValue(m_properties["EMin"], eMax/2); + return; + } } else if(prop == m_properties["EMax"]) { - // If range is invalid reset EMax to range + // If the value of EMax is negative try negating it to get a valid range + if(eMax < 0) + { + eMax = -eMax; + m_dblManager->setValue(m_properties["EMax"], eMax); + return; + } + + // If range is invalid reset EMax to double EMin if(eMin > eMax) - m_dblManager->setValue(m_properties["EMax"], axisRange.second); + { + m_dblManager->setValue(m_properties["EMax"], eMin*2); + return; + } } + + // If we get this far then the E range is valid + // Update the range selectors with the new values. + updateRangeSelectors(prop, value); } /** @@ -407,9 +422,14 @@ namespace CustomInterfaces /** * Updates position of XCut range selectors when used changed value of XCut. + * + * @param prop QtProperty changed + * @param value Value it was changed to (unused) */ void IndirectSymmetrise::updateRangeSelectors(QtProperty *prop, double value) { + value = fabs(value); + if(prop == m_properties["EMin"]) { m_rangeSelectors["NegativeE_Raw"]->setMaximum(-value); From dedb36ae4b17d6a1d2f8ae7f815da7292f0e0192 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 6 Oct 2014 11:51:52 +0100 Subject: [PATCH 068/284] Add preview spectra validation Refs #7860 --- .../src/IndirectSymmetrise.cpp | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp index 69a7bb6ffdfa..6caef16805e2 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSymmetrise.cpp @@ -95,7 +95,7 @@ namespace CustomInterfaces // Indicators for negative and positive X range values on X axis // The user can use these to move the X range - // Note that the max and min of the negative range selector corespond to the opposit X value + // Note that the max and min of the negative range selector corespond to the opposite X value // i.e. RS min is X max m_rangeSelectors["NegativeE_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"]); m_rangeSelectors["PositiveE_Raw"] = new MantidWidgets::RangeSelector(m_plots["SymmRawPlot"]); @@ -274,13 +274,42 @@ namespace CustomInterfaces */ void IndirectSymmetrise::replotNewSpectrum(QtProperty *prop, double value) { + // Validate the preview range if(prop == m_properties["PreviewRange"]) { // If preview range was set negative then set it to the absolute value of the value it was set to if(value < 0) + { m_dblManager->setValue(m_properties["PreviewRange"], fabs(value)); + return; + } + } + + // Validate the preview spectra + if(prop == m_properties["PreviewSpec"]) + { + // Get the range of possible spectra numbers + QString workspaceName = m_uiForm.symm_dsInput->getCurrentDataName(); + MatrixWorkspace_sptr sampleWS = AnalysisDataService::Instance().retrieveWS(workspaceName.toStdString()); + int minSpectrumRange = sampleWS->getSpectrum(0)->getSpectrumNo(); + int maxSpectrumRange = sampleWS->getSpectrum(sampleWS->getNumberHistograms()-1)->getSpectrumNo(); + + // If entered value is lower then set spectra number to lowest valid value + if(value < minSpectrumRange) + { + m_dblManager->setValue(m_properties["PreviewSpec"], minSpectrumRange); + return; + } + + // If entered value is higer then set spectra number to highest valid value + if(value > maxSpectrumRange) + { + m_dblManager->setValue(m_properties["PreviewSpec"], maxSpectrumRange); + return; + } } + // If we get this far then properties are valid so update mini plots if((prop == m_properties["PreviewSpec"]) || (prop == m_properties["PreviewRange"])) updateMiniPlots(); } From bdecbc8f291bf5d99080117c514be2548aa7fbad Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 6 Oct 2014 12:08:47 +0100 Subject: [PATCH 069/284] Fixed default spectra range issue, added more unit tests Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 8 ++ .../plugins/algorithms/SymmetriseTest.py | 79 +++++++++++++++---- 2 files changed, 72 insertions(+), 15 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 0cb5b9f05c99..47fb46f2afb0 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -213,6 +213,8 @@ def _setup(self): """ Get the algorithm properties and validate them. """ + from IndirectCommon import CheckHistZero + self._sample = self.getPropertyValue('Sample') self._x_min = math.fabs(self.getProperty('XMin').value) @@ -223,6 +225,12 @@ def _setup(self): self._save = self.getProperty('Save').value self._spectra_range = self.getProperty('SpectraRange').value + # If the user did not enter a spectra range, use the spectra range of the workspace + if len(self._spectra_range) == 0: + num_sample_spectra, _ = CheckHistZero(self._sample) + min_spectra_number = mtd[self._sample].getSpectrum(0).getSpectrumNo() + max_spectra_number = mtd[self._sample].getSpectrum(num_sample_spectra - 1).getSpectrumNo() + self._spectra_range = [min_spectra_number, max_spectra_number] self._output_workspace = self.getPropertyValue('OutputWorkspace') self._props_output_workspace = self.getPropertyValue('OutputPropertiesTable') diff --git a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py index 73a5f9316157..fb1d14c7db12 100644 --- a/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py +++ b/Code/Mantid/Framework/PythonInterface/test/python/plugins/algorithms/SymmetriseTest.py @@ -4,37 +4,86 @@ from mantid.api import * +def _rayleigh(x, sigma): + return (x / sigma ** 2) * np.exp(-x ** 2 / (2 * sigma ** 2)) + + +def _generate_sample_ws(ws_name): + data_x = np.arange(0, 10, 0.01) + data_y = _rayleigh(data_x, 1) + + CreateWorkspace(DataX=data_x, DataY=data_y, OutputWorkspace=ws_name) + ScaleX(InputWorkspace=ws_name, Factor=-1, Operation="Add", OutputWorkspace=ws_name) # centre the peak over 0 + + return mtd[ws_name] + + class SymmetriseTest(unittest.TestCase): def setUp(self): - self._sample_ws = self._generate_sample_ws('symm_test_sample_ws') + self._sample_ws = _generate_sample_ws('symm_test_sample_ws') def test_basic(self): - symm_test_out_ws = Symmetrise(Sample=self._sample_ws, XMin=0.05, XMax=0.2) + """ + Tests a very minimal execution. + """ + symm_test_out_ws = Symmetrise(Sample=self._sample_ws, + XMin=0.05, XMax=0.2) + + def test_with_spectra_range(self): + """ + Tests running with a given spectra range. + """ + symm_test_out_ws = Symmetrise(Sample=self._sample_ws, + XMin=0.05, XMax=0.2, + SpectraRange=[1, 1]) - def test_failure_lower_range(self): + def test_failure_xmin_out_of_range(self): """ Tests validation on entering an XMin value lower than the smallest value in the X range. """ - self.assertRaises(RuntimeError, Symmetrise, Sample=self._sample_ws, OutputWOrkspace='__Symmetrise_TestWS', XMin=-5, XMax=0.2) + self.assertRaises(RuntimeError, Symmetrise, + Sample=self._sample_ws, + OutputWOrkspace='__Symmetrise_TestWS', + XMin=-5, XMax=0.2) - def test_failure_upper_range(self): + def test_failure_xmax_out_of_range(self): """ Tests validation on entering an XMax value greater than the largest value in the X range. """ - self.assertRaises(RuntimeError, Symmetrise, Sample=self._sample_ws, OutputWOrkspace='__Symmetrise_TestWS', XMin=0.05, XMax=15) - - def _rayleigh(self, x, sigma): - return (x / sigma ** 2) * np.exp(-x ** 2 / (2 * sigma ** 2)) + self.assertRaises(RuntimeError, Symmetrise, + Sample=self._sample_ws, + OutputWOrkspace='__Symmetrise_TestWS', + XMin=0.05, XMax=15) - def _generate_sample_ws(self, ws_name): - data_x = np.arange(0, 10, 0.01) - data_y = self._rayleigh(data_x, 1) + def test_failure_invalid_x_range(self): + """ + Tests validation on entering an XMax value lower then XMin. + """ + self.assertRaises(RuntimeError, Symmetrise, + Sample=self._sample_ws, + OutputWOrkspace='__Symmetrise_TestWS', + XMin=0.2, XMax=0.1) - CreateWorkspace(DataX=data_x, DataY=data_y, OutputWorkspace=ws_name) - ScaleX(InputWorkspace=ws_name, Factor=-1, Operation="Add", OutputWorkspace=ws_name) # centre the peak over 0 + def test_failure_spectra_range_lower(self): + """ + Tests validation on entering a minimum spectra number lower then that of the workspace. + """ + self.assertRaises(RuntimeError, Symmetrise, + Sample=self._sample_ws, + OutputWOrkspace='__Symmetrise_TestWS', + XMin=0.05, XMax=0.2, + SpectraRange=[0, 1]) - return mtd[ws_name] + def test_failure_spectra_range_upper(self): + """ + Tests validation on entering a maximum spectra number higher then that of the workspace. + """ + self.assertRaises(RuntimeError, Symmetrise, + Sample=self._sample_ws, + OutputWOrkspace='__Symmetrise_TestWS', + XMin=0.05, XMax=0.2, + SpectraRange=[1, 2]) if __name__ == '__main__': From facf7dc75ab97d6f47109bb7a902b7c00c734d2d Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 7 Oct 2014 10:06:22 +0100 Subject: [PATCH 070/284] Added slot to update run button, reset when tab switched Refs #10306 --- .../IndirectDataReduction.h | 20 +- .../IndirectDataReductionTab.h | 2 + .../src/IndirectConvertToEnergy.cpp | 11 +- .../src/IndirectDataReduction.cpp | 215 +++++++++--------- 4 files changed, 120 insertions(+), 128 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.h index d772b475a258..06e0856a287e 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.h @@ -84,16 +84,16 @@ namespace MantidQt void userSelectInstrument(const QString& name); void openDirectoryDialog(); void showMessageBox(const QString& message); /// Slot showing a message box to the user + void updateRunButton(bool enabled = true, QString message = "Run", QString tooltip = ""); private: - void loadSettings(); void readSettings(); void saveSettings(); + void setDefaultInstrument(const QString & name); void instrumentSelectChanged(const QString& name); - ///// Find path to instrument's _Definition.xml file (and check there is a parameter file). - //QString getIDFPath(const QString& prefix); - /// set and show an instrument-specific widget + + /// Set and show an instrument-specific widget void setInstSpecificWidget(const std::string & parameterName, QCheckBox * checkBox, QCheckBox::ToggleState defaultState); virtual void closeEvent(QCloseEvent* close); @@ -106,15 +106,11 @@ namespace MantidQt /// Runner for insturment load algorithm MantidQt::API::AlgorithmRunner* m_algRunner; - //All indirect tabs - IndirectDataReductionTab* m_tab_convert_to_energy; - IndirectDataReductionTab* m_tab_sqw; - IndirectDataReductionTab* m_tab_diagnostics; - IndirectDataReductionTab* m_tab_calibration; - IndirectDataReductionTab* m_tab_trans; - IndirectDataReductionTab* m_tab_moments; + // All indirect tabs + std::map m_tabs; - Poco::NObserver m_changeObserver; ///< Poco observer for changes in user directory settings + /// Poco observer for changes in user directory settings + Poco::NObserver m_changeObserver; QString m_dataDir; ///< default data search directory QString m_saveDir; ///< default data save directory }; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h index e5bed025214c..9a7443b076cf 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h @@ -158,6 +158,8 @@ namespace CustomInterfaces void showMessageBox(const QString& message); /// Run a python script void runAsPythonScript(const QString & code, bool no_output); + /// Update the Run button on the IDR main window + void updateRunButton(bool enabled = true, QString message = "Run", QString tooltip = ""); private: /// Overidden by child class. diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectConvertToEnergy.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectConvertToEnergy.cpp index a98585c4673a..7cf597b1e8d4 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectConvertToEnergy.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectConvertToEnergy.cpp @@ -778,8 +778,7 @@ namespace CustomInterfaces */ void IndirectConvertToEnergy::pbRunEditing() { - m_uiForm.pbRun->setEnabled(false); - m_uiForm.pbRun->setText("Editing..."); + emit updateRunButton(false, "Editing...", "Run numbers are curently being edited."); } /** @@ -787,7 +786,7 @@ namespace CustomInterfaces */ void IndirectConvertToEnergy::pbRunFinding() { - m_uiForm.pbRun->setText("Finding files..."); + emit updateRunButton(false, "Finding files...", "Searchig for data files for the run numbers entered..."); m_uiForm.ind_runFiles->setEnabled(false); } @@ -798,13 +797,13 @@ namespace CustomInterfaces { if(!m_uiForm.ind_runFiles->isValid()) { - m_uiForm.pbRun->setText("Invalid Run"); + emit updateRunButton(false, "Invalid Run(s)", "Cannot find data files for some of the run numbers enetered."); } else { - m_uiForm.pbRun->setText("Run"); - m_uiForm.pbRun->setEnabled(true); + emit updateRunButton(); } + m_uiForm.ind_runFiles->setEnabled(true); } diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp index ed47aa0f798b..afc1f0f629d9 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp @@ -60,7 +60,7 @@ IndirectDataReduction::IndirectDataReduction(QWidget *parent) : */ IndirectDataReduction::~IndirectDataReduction() { - //Make sure no algos are sunning after the window has been closed + //Make sure no algos are running after the window has been closed m_algRunner->cancelRunningAlgorithm(); saveSettings(); @@ -74,7 +74,9 @@ void IndirectDataReduction::helpClicked() { QString tabName = m_uiForm.tabWidget->tabText( m_uiForm.tabWidget->currentIndex()); + QString url = "http://www.mantidproject.org/Indirect:"; + if ( tabName == "Energy Transfer" ) url += "EnergyTransfer"; else if ( tabName == "Calibration" ) @@ -87,6 +89,7 @@ void IndirectDataReduction::helpClicked() url += "Transmission"; else if (tabName == "Moments") url += "Moments"; + QDesktopServices::openUrl(QUrl(url)); } @@ -97,18 +100,7 @@ void IndirectDataReduction::helpClicked() void IndirectDataReduction::runClicked() { QString tabName = m_uiForm.tabWidget->tabText(m_uiForm.tabWidget->currentIndex()); - if ( tabName == "Energy Transfer" ) - m_tab_convert_to_energy->runTab(); - else if ( tabName == "Calibration" ) - m_tab_calibration->runTab(); - else if ( tabName == "Diagnostics" ) - m_tab_diagnostics->runTab(); - else if ( tabName == "S(Q, w)" ) - m_tab_sqw->runTab(); - else if (tabName == "Transmission") - m_tab_trans->runTab(); - else if(tabName == "Moments") - m_tab_moments->runTab(); + m_tabs[tabName]->runTab(); } /** @@ -118,51 +110,38 @@ void IndirectDataReduction::initLayout() { m_uiForm.setupUi(this); - m_tab_convert_to_energy = new IndirectConvertToEnergy(m_uiForm, this); - m_tab_sqw = new IndirectSqw(m_uiForm, this); - m_tab_diagnostics = new IndirectDiagnostics(m_uiForm, this); - m_tab_calibration = new IndirectCalibration(m_uiForm, this); - m_tab_trans = new IndirectTransmission(m_uiForm, this); - m_tab_moments = new IndirectMoments(m_uiForm, this); + // Do not allow running until setup and instrument laoding are done + updateRunButton(false, "Loading UI", "Initialising user interface components..."); - // Assume we get a incompatiable instrument to start with - m_uiForm.pbRun->setEnabled(false); + // Create the tabs + m_tabs["Energy Transfer"] = new IndirectConvertToEnergy(m_uiForm, this); + m_tabs["Calibration"] = new IndirectCalibration(m_uiForm, this); + m_tabs["Diagnostics"] = new IndirectDiagnostics(m_uiForm, this); + m_tabs["Transmission"] = new IndirectTransmission(m_uiForm, this); + m_tabs["S(Q, w)"] = new IndirectSqw(m_uiForm, this); + m_tabs["Moments"] = new IndirectMoments(m_uiForm, this); - // Signal / Slot Connections Set Up Here - - // signal/slot connections to respond to changes in instrument selection combo boxes + // Signal/slot connections to respond to changes in instrument selection combo boxes connect(m_uiForm.cbInst, SIGNAL(instrumentSelectionChanged(const QString&)), this, SLOT(userSelectInstrument(const QString&))); - // connect "?" (Help) Button + // Connect "?" (Help) Button connect(m_uiForm.pbHelp, SIGNAL(clicked()), this, SLOT(helpClicked())); - // connect the "Run" button + // Connect the "Run" button connect(m_uiForm.pbRun, SIGNAL(clicked()), this, SLOT(runClicked())); - // connect the "Manage User Directories" Button + // Connect the "Manage User Directories" Button connect(m_uiForm.pbManageDirectories, SIGNAL(clicked()), this, SLOT(openDirectoryDialog())); - // ignals for tabs running Python - connect(m_tab_convert_to_energy, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); - connect(m_tab_sqw, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); - connect(m_tab_calibration, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); - connect(m_tab_diagnostics, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); - connect(m_tab_trans, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); - connect(m_tab_moments, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); - - // ignals for tabs showing mesage boxes - connect(m_tab_convert_to_energy, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); - connect(m_tab_sqw, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); - connect(m_tab_calibration, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); - connect(m_tab_diagnostics, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); - connect(m_tab_trans, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); - connect(m_tab_moments, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); - - // Run any tab setup code - m_tab_convert_to_energy->setupTab(); - m_tab_sqw->setupTab(); - m_tab_diagnostics->setupTab(); - m_tab_calibration->setupTab(); - m_tab_trans->setupTab(); - m_tab_moments->setupTab(); + // Reset the Run button state when the tab is changed + connect(m_uiForm.tabWidget, SIGNAL(currentChanged(int)), this, SLOT(updateRunButton())); + + // Connect tab signals and run any setup code + for(auto it = m_tabs.begin(); it != m_tabs.end(); ++it) + { + connect(it->second, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); + connect(it->second, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&))); + connect(it->second, SIGNAL(updateRunButton(bool, QString, QString)), this, SLOT(updateRunButton(bool, QString, QString))); + it->second->setupTab(); + } } /** @@ -175,38 +154,8 @@ void IndirectDataReduction::initLocalPython() // select starting instrument readSettings(); - if ( m_curInterfaceSetup == "" ) - { + if(m_curInterfaceSetup == "") userSelectInstrument(m_uiForm.cbInst->currentText()); - } -} - -/** - * Read settings from the persistent store - */ -void IndirectDataReduction::readSettings() -{ - QSettings settings; - settings.beginGroup(m_settingsGroup); - QString instrName = settings.value("instrument-name", "").toString(); - settings.endGroup(); - - setDefaultInstrument(instrName); -} - -/** - * Save settings to a persistent storage - */ -void IndirectDataReduction::saveSettings() -{ - QSettings settings; - settings.beginGroup(m_settingsGroup); - QString instrName; - - instrName = m_uiForm.cbInst->currentText(); - - settings.setValue("instrument-name", instrName); - settings.endGroup(); } /** @@ -237,7 +186,7 @@ void IndirectDataReduction::instrumentSelectChanged(const QString& name) { g_log.error("Instument loading failed!"); m_uiForm.cbInst->setEnabled(true); - m_uiForm.pbRun->setEnabled(true); + updateRunButton(false, "No Instrument", "No instrument is currently loaded."); return; } @@ -267,14 +216,14 @@ void IndirectDataReduction::instrumentLoadingDone(bool error) { g_log.error("Instument loading failed! (this can be caused by having both direct and indirect interfaces open)"); m_uiForm.cbInst->setEnabled(true); - m_uiForm.pbRun->setEnabled(true); + updateRunButton(false, "No Instrument", "No instrument is currently loaded."); return; } performInstSpecific(); setIDFValues(curInstPrefix); - m_uiForm.pbRun->setEnabled(true); + updateRunButton(); m_uiForm.cbInst->setEnabled(true); } @@ -284,7 +233,7 @@ void IndirectDataReduction::instrumentLoadingDone(bool error) */ void IndirectDataReduction::userSelectInstrument(const QString& prefix) { - if ( prefix != m_curInterfaceSetup ) + if(prefix != m_curInterfaceSetup) { // Remove the old empty instrument workspace if it is there std::string ws_name = "__empty_" + m_curInterfaceSetup.toStdString(); @@ -294,7 +243,7 @@ void IndirectDataReduction::userSelectInstrument(const QString& prefix) dataStore.remove(ws_name); } - m_uiForm.pbRun->setEnabled(false); + updateRunButton(false, "Loading Inst.", "Loading the selected instrument..."); m_uiForm.cbInst->setEnabled(false); instrumentSelectChanged(prefix); } @@ -308,19 +257,19 @@ void IndirectDataReduction::openDirectoryDialog() } /** -* This function holds any steps that must be performed on the selection of an instrument, -* for example loading values from the Instrument Definition File (IDF). -* @param prefix :: The selected instruments prefix in Mantid. -*/ + * This function holds any steps that must be performed on the selection of an instrument, + * for example loading values from the Instrument Definition File (IDF). + * @param prefix :: The selected instruments prefix in Mantid. + */ void IndirectDataReduction::setIDFValues(const QString & prefix) { - dynamic_cast(m_tab_convert_to_energy)->setIDFValues(prefix); + dynamic_cast(m_tabs["Energy Transfer"])->setIDFValues(prefix); } /** -* This function holds any steps that must be performed on the layout that are specific -* to the currently selected instrument. -*/ + * This function holds any steps that must be performed on the layout that are specific + * to the currently selected instrument. + */ void IndirectDataReduction::performInstSpecific() { setInstSpecificWidget("cm-1-convert-choice", m_uiForm.ckCm1Units, QCheckBox::Off); @@ -328,14 +277,14 @@ void IndirectDataReduction::performInstSpecific() } /** -* This function either shows or hides the given QCheckBox, based on the named property -* inside the instrument param file. When hidden, the default state will be used to -* reset to the "unused" state of the checkbox. -* -* @param parameterName :: The name of the property to look for inside the current inst param file. -* @param checkBox :: The checkbox to set the state of, and to either hide or show based on the current inst. -* @param defaultState :: The state to which the checkbox will be set upon hiding it. -*/ + * This function either shows or hides the given QCheckBox, based on the named property + * inside the instrument param file. When hidden, the default state will be used to + * reset to the "unused" state of the checkbox. + * + * @param parameterName :: The name of the property to look for inside the current inst param file. + * @param checkBox :: The checkbox to set the state of, and to either hide or show based on the current inst. + * @param defaultState :: The state to which the checkbox will be set upon hiding it. + */ void IndirectDataReduction::setInstSpecificWidget(const std::string & parameterName, QCheckBox * checkBox, QCheckBox::ToggleState defaultState) { // Get access to instrument specific parameters via the loaded empty workspace. @@ -362,32 +311,42 @@ void IndirectDataReduction::setInstSpecificWidget(const std::string & parameterN } } +/** + * Remove the Poco observer on the config service when the interfaces is closed. + * + * @param close CLose event (unused) + */ void IndirectDataReduction::closeEvent(QCloseEvent* close) { - (void) close; + UNUSED_ARG(close); Mantid::Kernel::ConfigService::Instance().removeObserver(m_changeObserver); } +/** + * Reloads settings if the default sata search or save directories have been changed. + */ void IndirectDataReduction::handleDirectoryChange(Mantid::Kernel::ConfigValChangeNotification_ptr pNf) { std::string key = pNf->key(); - if ( key == "datasearch.directories" || key == "defaultsave.directory" ) - { - loadSettings(); - } + if(key == "datasearch.directories" || key == "defaultsave.directory") + readSettings(); } -void IndirectDataReduction::loadSettings() +/** + * Read Qt settings for the interface. + */ +void IndirectDataReduction::readSettings() { - // set values of m_dataDir and m_saveDir + // Set values of m_dataDir and m_saveDir m_dataDir = QString::fromStdString(Mantid::Kernel::ConfigService::Instance().getString("datasearch.directories")); - m_dataDir.replace(" ",""); + m_dataDir.replace(" ", ""); if(m_dataDir.length() > 0) m_dataDir = m_dataDir.split(";", QString::SkipEmptyParts)[0]; m_saveDir = QString::fromStdString(Mantid::Kernel::ConfigService::Instance().getString("defaultsave.directory")); QSettings settings; + // Load settings for MWRunFile widgets settings.beginGroup(m_settingsGroup + "DataFiles"); settings.setValue("last_directory", m_dataDir); @@ -404,6 +363,28 @@ void IndirectDataReduction::loadSettings() m_uiForm.moment_dsInput->readSettings(settings.group()); m_uiForm.sqw_dsSampleInput->readSettings(settings.group()); settings.endGroup(); + + // Load the last used instrument + settings.beginGroup(m_settingsGroup); + QString instrName = settings.value("instrument-name", "").toString(); + settings.endGroup(); + + setDefaultInstrument(instrName); +} + +/** + * Save settings to a persistent storage + */ +void IndirectDataReduction::saveSettings() +{ + QSettings settings; + settings.beginGroup(m_settingsGroup); + QString instrName; + + instrName = m_uiForm.cbInst->currentText(); + + settings.setValue("instrument-name", instrName); + settings.endGroup(); } /** @@ -416,3 +397,17 @@ void IndirectDataReduction::showMessageBox(const QString& message) { showInformationBox(message); } + +/** + * Slot to allow setting the state of the Run button. + * + * @param enabled If the button is clickable + * @param message Message shown on the button + * @parm tooltip Tooltip shown when hovering over button + */ +void IndirectDataReduction::updateRunButton(bool enabled, QString message, QString tooltip) +{ + m_uiForm.pbRun->setEnabled(enabled); + m_uiForm.pbRun->setText(message); + m_uiForm.pbRun->setToolTip(tooltip); +} From 4023bc425e91ebae1190df14098ea5f643f68498 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 7 Oct 2014 10:22:51 +0100 Subject: [PATCH 071/284] Disable the rRun button when tab is already running Refs #10306 --- .../IndirectDataReductionTab.h | 9 ++++-- .../src/IndirectDataReductionTab.cpp | 29 ++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h index 9a7443b076cf..f2fae505f012 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReductionTab.h @@ -127,6 +127,9 @@ namespace CustomInterfaces /// Tree of the properties std::map m_propTrees; + /// If algorithms are currently running on this tab + bool m_tabRunning; + /// Internal list of the properties QMap m_properties; @@ -153,6 +156,8 @@ namespace CustomInterfaces /// Validator for positive double inputs QDoubleValidator *m_valPosDbl; + Ui::IndirectDataReduction m_uiForm; + signals: /// Send signal to parent window to show a message box to user void showMessageBox(const QString& message); @@ -169,8 +174,8 @@ namespace CustomInterfaces /// Overidden by child class. virtual bool validate() = 0; - protected: - Ui::IndirectDataReduction m_uiForm; + private slots: + void tabExecutionComplete(bool error); }; } // namespace CustomInterfaces diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp index 437dd8812226..a9c913ada173 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp @@ -20,8 +20,11 @@ namespace CustomInterfaces */ IndirectDataReductionTab::IndirectDataReductionTab(Ui::IndirectDataReduction& uiForm, QObject* parent) : QObject(parent), m_plots(), m_curves(), m_rangeSelectors(), + m_tabRunning(false), m_properties(), - m_dblManager(new QtDoublePropertyManager()), m_blnManager(new QtBoolPropertyManager()), m_grpManager(new QtGroupPropertyManager()), + m_dblManager(new QtDoublePropertyManager()), + m_blnManager(new QtBoolPropertyManager()), + m_grpManager(new QtGroupPropertyManager()), m_dblEdFac(new DoubleEditorFactory()), m_uiForm(uiForm) { @@ -36,6 +39,8 @@ namespace CustomInterfaces m_valPosDbl->setBottom(tolerance); connect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(algorithmFinished(bool))); + connect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(tabExecutionComplete(bool))); + connect(&m_pythonRunner, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool))); } @@ -49,9 +54,15 @@ namespace CustomInterfaces void IndirectDataReductionTab::runTab() { if(validate()) + { + m_tabRunning = true; + emit updateRunButton(false, "Running...", "Running data reduction..."); run(); + } else + { g_log.warning("Failed to validate indirect tab input!"); + } } void IndirectDataReductionTab::setupTab() @@ -64,6 +75,22 @@ namespace CustomInterfaces validate(); } + /** + * Slot used to update the run button when an algorithm that was strted by the Run button complete. + * + * @parm error Unused + */ + void IndirectDataReductionTab::tabExecutionComplete(bool error) + { + UNUSED_ARG(error); + + if(m_tabRunning) + { + m_tabRunning = false; + emit updateRunButton(); + } + } + /** * Run the load algorithm with the supplied filename and spectrum range * From 718d34808e6a6326430a308402d5675fc1246b77 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Tue, 7 Oct 2014 17:14:17 +0100 Subject: [PATCH 072/284] refs #9989 Crude fix allowing monitors loading when the later are placed after the detectors. Ignoring different time channels, if any are in the file. --- .../Framework/DataHandling/src/LoadISISNexus2.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index 401cca9753e1..856998251548 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -132,6 +133,9 @@ namespace Mantid //Pull out the monitor blocks, if any exist size_t nmons(0); + std::vector mon_spectra_num; + int64_t max_spectra_num(LONG_MIN); + int64_t min_spectra_num(LONG_MAX); for(std::vector::const_iterator it = entry.groups().begin(); it != entry.groups().end(); ++it) { @@ -139,7 +143,12 @@ namespace Mantid { NXInt index = entry.openNXInt(std::string(it->nxname) + "/spectrum_index"); index.load(); - m_monitors[*index()] = it->nxname; + int64_t ind = *index(); + m_monitors[ind ] = it->nxname; + mon_spectra_num.push_back(ind); + + if (ind > max_spectra_num)max_spectra_num=ind; + if (ind < min_spectra_num)min_spectra_num=ind; ++nmons; } } @@ -166,6 +175,8 @@ namespace Mantid m_numberOfPeriodsInFile = m_numberOfPeriods = data.dim0(); m_numberOfSpectraInFile = m_numberOfSpectra = nsp1[0]; m_numberOfChannelsInFile = m_numberOfChannels = data.dim2(); + if(max_spectra_num > m_numberOfSpectra) + m_numberOfSpectra += mon_spectra_num.size(); if( nmons > 0 && m_numberOfSpectra == static_cast(data.dim1()) ) { From b77cff67a3621caf021209b9ceda85d24e3db4b1 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Tue, 7 Oct 2014 18:07:07 +0100 Subject: [PATCH 073/284] refs #9989 new property to load monitors --- .../inc/MantidDataHandling/LoadRaw3.h | 2 +- .../DataHandling/src/LoadEventNexus.cpp | 2 +- .../DataHandling/src/LoadISISNexus2.cpp | 23 +++++++++++++++++++ .../Framework/DataHandling/src/LoadRaw3.cpp | 2 +- 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRaw3.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRaw3.h index 1203d8d98bfd..a74ae830e539 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRaw3.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRaw3.h @@ -21,7 +21,7 @@ namespace Mantid Loads an file in ISIS RAW format and stores it in a 2D workspace (Workspace2D class). LoadRaw is an algorithm and LoadRawHelper class and - overrides the init() & exec() methods. + overrides the init() & exec() methods. LoadRaw3 uses less memory by only loading up the datablocks as required. Copyright © 2007-9 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory diff --git a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp index cbbf619213de..506300ffdf71 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp @@ -194,7 +194,7 @@ namespace Mantid } } - // Check for cancelled algorithm + // Check for canceled algorithm if (alg->getCancel()) { return; diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index 856998251548..4b88cd81c1d9 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -7,6 +7,7 @@ #include "MantidKernel/ArrayProperty.h" #include "MantidKernel/BoundedValidator.h" #include "MantidKernel/ConfigService.h" +#include "MantidKernel/ListValidator.h" #include "MantidKernel/LogParser.h" #include "MantidKernel/LogFilter.h" #include "MantidKernel/TimeSeriesProperty.h" @@ -83,6 +84,28 @@ namespace Mantid declareProperty(new ArrayProperty("SpectrumList")); declareProperty("EntryNumber", (int64_t)0, mustBePositive, "The particular entry number to read (default: Load all workspaces and creates a workspace group)"); + + declareProperty(new PropertyWithValue("LoadMonitorsSeparately", false, Direction::Input), + "If true, loads monitors and puts them into separate workspace"); + + std::vector monitorOptions; + monitorOptions.push_back("Include"); + monitorOptions.push_back("Exclude"); + monitorOptions.push_back("Separate"); + std::map monitorOptionsAliases; + monitorOptionsAliases["1"] = "Separate"; + monitorOptionsAliases["0"] = "Exclude"; + declareProperty("LoadMonitors","Exclude", boost::make_shared(monitorOptions,monitorOptionsAliases), + "Option to control the loading of monitors.\n" + "Allowed options are Include,Exclude, Separate.\n" + "Include:Include option would load monitors with the workspace. If the time binning for the monitors is different from the\n" + "binning of the detectors this option is equivalent to Separate option\n" + "Exclude:The default is Exclude option excludes monitors from the output workspace.\n" + "Separate:The Separate option loads monitors into a separate workspace called OutputWorkspace_monitor.\n" + "Defined aliases:\n" + "1: Equivalent to Separate.\n" + "0: Equivalent to Exclude.\n"); + } /** Executes the algorithm. Reading in the file and creating and populating diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp index 59989f261980..696403d6c32e 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp @@ -74,7 +74,7 @@ namespace Mantid "Allowed options are Include,Exclude, Separate.\n" "Include:The default is Include option which loads the monitors into the output workspace.\n" "Exclude:The Exclude option excludes monitors from the output workspace.\n" - "Separate:The Separate option loads monitors into a separate workspace called OutputWorkspace_Monitor.\n" + "Separate:The Separate option loads monitors into a separate workspace called OutputWorkspace_monitor.\n" "Defined aliases:\n" "1: Equivalent to Separate.\n" "0: Equivalent to Exclude.\n"); From 492991c5556949a413eb3aa3b851a342fa397933 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Wed, 8 Oct 2014 09:11:11 +0100 Subject: [PATCH 074/284] refs #9989 Make LoadRaw monitor loading options transferable to provide common code for LoadRaw3 and LoadISISNexus --- .../inc/MantidDataHandling/LoadRaw3.h | 6 --- .../inc/MantidDataHandling/LoadRawHelper.h | 43 +++++++++++-------- .../Framework/DataHandling/src/LoadRaw3.cpp | 36 ++-------------- .../DataHandling/src/LoadRawHelper.cpp | 32 ++++++++++++++ 4 files changed, 61 insertions(+), 56 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRaw3.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRaw3.h index a74ae830e539..326f4830d43e 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRaw3.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRaw3.h @@ -71,12 +71,6 @@ namespace Mantid /// returns true if the given spectrum is a monitor bool isMonitor(const std::vector& monitorIndexes,specid_t spectrumNum); - /// returns true if the Exclude Monitor option(property) selected - bool isExcludeMonitors(const std::string &monitorOption); - /// returns true if the Separate Monitor Option selected - bool isSeparateMonitors(const std::string &monitorOption); - /// returns true if the Include Monitor Option selected - bool isIncludeMonitors(const std::string &monitorOption); /// validate workspace sizes void validateWorkspaceSizes( bool bexcludeMonitors ,bool bseparateMonitors, diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h index 70178fc433c2..752b3dc0a8f9 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h @@ -27,31 +27,31 @@ namespace Mantid { /** @class LoadRawHelper DataHandling/LoadRawHelper.h - Helper class for LoadRaw algorithms. + Helper class for LoadRaw algorithms. - @author Sofia Antony, ISIS,RAL - @date 14/04/2010 + @author Sofia Antony, ISIS,RAL + @date 14/04/2010 - Copyright © 2007-9 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + Copyright © 2007-9 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory - This file is part of Mantid. + This file is part of Mantid. - Mantid 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. + Mantid 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. - Mantid 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. + Mantid 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, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . - File change history is stored at: . - Code Documentation is available at: + File change history is stored at: . + Code Documentation is available at: */ class DLLExport LoadRawHelper: public API::IFileLoader { @@ -74,6 +74,15 @@ namespace Mantid /// Returns a confidence value that this algorithm can load a file virtual int confidence(Kernel::FileDescriptor & descriptor) const; + /// returns true if the Exclude Monitor option(property) selected + static bool isExcludeMonitors(const std::string &monitorOption); + /// returns true if the Separate Monitor Option selected + static bool isSeparateMonitors(const std::string &monitorOption); + /// returns true if the Include Monitor Option selected + static bool isIncludeMonitors(const std::string &monitorOption); + + + protected: /// Overwrites Algorithm method. void init(); diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp index 696403d6c32e..4c70948539df 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp @@ -102,13 +102,13 @@ namespace Mantid if (monitorOption=="0") monitorOption = "Exclude"; - bool bincludeMonitors = isIncludeMonitors(monitorOption); + bool bincludeMonitors = LoadRawHelper::isIncludeMonitors(monitorOption); bool bseparateMonitors = false; bool bexcludeMonitors = false; if (!bincludeMonitors) { - bseparateMonitors = isSeparateMonitors(monitorOption); - bexcludeMonitors = isExcludeMonitors(monitorOption); + bseparateMonitors = LoadRawHelper::isSeparateMonitors(monitorOption); + bexcludeMonitors = LoadRawHelper::isExcludeMonitors(monitorOption); } // @@ -577,36 +577,6 @@ namespace Mantid } } - /** This method checks the value of LoadMonitors property and returns true or false - * @return true if Exclude Monitors option is selected,otherwise false - */ - bool LoadRaw3::isExcludeMonitors(const std::string &monitorOption) - { - bool bExclude; - monitorOption.compare("Exclude") ? (bExclude = false) : (bExclude = true); - return bExclude; - } - - /**This method checks the value of LoadMonitors property and returns true or false - * @return true if Include Monitors option is selected,otherwise false - */ - bool LoadRaw3::isIncludeMonitors(const std::string &monitorOption) - { - bool bExclude; - monitorOption.compare("Include") ? (bExclude = false) : (bExclude = true); - - return bExclude; - } - - /** This method checks the value of LoadMonitors property and returns true or false - * @return true if Separate Monitors option is selected,otherwise false - */ - bool LoadRaw3::isSeparateMonitors(const std::string &monitorOption) - { - bool bSeparate; - monitorOption.compare("Separate") ? (bSeparate = false) : (bSeparate = true); - return bSeparate; - } /** This method checks given spectrum is a monitor * @param monitorIndexes :: a vector holding the list of monitors diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp index 6b5a1c179df6..0e87a26eb333 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp @@ -1289,5 +1289,37 @@ namespace Mantid return true; } + /** This method checks the value of LoadMonitors property and returns true or false + * @return true if Exclude Monitors option is selected,otherwise false + */ + bool LoadRawHelper::isExcludeMonitors(const std::string &monitorOption) + { + bool bExclude; + monitorOption.compare("Exclude") ? (bExclude = false) : (bExclude = true); + return bExclude; + } + + /**This method checks the value of LoadMonitors property and returns true or false + * @return true if Include Monitors option is selected,otherwise false + */ + bool LoadRawHelper::isIncludeMonitors(const std::string &monitorOption) + { + bool bExclude; + monitorOption.compare("Include") ? (bExclude = false) : (bExclude = true); + + return bExclude; + } + + /** This method checks the value of LoadMonitors property and returns true or false + * @return true if Separate Monitors option is selected,otherwise false + */ + bool LoadRawHelper::isSeparateMonitors(const std::string &monitorOption) + { + bool bSeparate; + monitorOption.compare("Separate") ? (bSeparate = false) : (bSeparate = true); + return bSeparate; + } + + } // namespace DataHandling } // namespace Mantid From eec972f34e9be0bec19f1ff444b32aaaefe4b3e9 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 8 Oct 2014 14:24:27 +0100 Subject: [PATCH 075/284] Modified existing MSGDiffRed algorith for Vesuvio Refs #10323 --- .../MSGDiffractionReduction.py | 7 +++++++ Code/Mantid/instrument/VESUVIO_Parameters.xml | 21 +++++++++++++++++++ .../Inelastic/IndirectDiffractionReduction.py | 17 +++++++++++++-- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/MSGDiffractionReduction.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/MSGDiffractionReduction.py index f85252698ceb..ed75174e90ee 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/MSGDiffractionReduction.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/MSGDiffractionReduction.py @@ -19,6 +19,9 @@ def PyInit(self): self.declareProperty(name='SumFiles', defaultValue=False, doc='Enabled to sum spectra from each input file.') + self.declareProperty(name='IndividualGrouping', defaultValue=False, + doc='Do not group results into a single spectra.') + self.declareProperty(name='Instrument', defaultValue='IRIS', validator=StringListValidator(['IRIS', 'OSIRIS', 'TOSCA', 'VESUVIO']), doc='Instrument used for run') @@ -77,6 +80,7 @@ def PyExec(self): input_files = self.getProperty('InputFiles').value sum_files = self.getProperty('SumFiles').value + individual_grouping = self.getProperty('IndividualGrouping').value instrument_name = self.getPropertyValue('Instrument') mode = self.getPropertyValue('Mode') detector_range = self.getProperty('DetectorRange').value @@ -93,6 +97,9 @@ def PyExec(self): reducer.set_sum_files(sum_files) reducer.set_save_formats(save_formats) + if individual_grouping: + reducer.set_grouping_policy('Individual') + for in_file in input_files: reducer.append_data_file(in_file) diff --git a/Code/Mantid/instrument/VESUVIO_Parameters.xml b/Code/Mantid/instrument/VESUVIO_Parameters.xml index d1fcdc31ad6a..1ac00f2294d0 100644 --- a/Code/Mantid/instrument/VESUVIO_Parameters.xml +++ b/Code/Mantid/instrument/VESUVIO_Parameters.xml @@ -132,6 +132,27 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Code/Mantid/scripts/Inelastic/IndirectDiffractionReduction.py b/Code/Mantid/scripts/Inelastic/IndirectDiffractionReduction.py index fafc71c22180..f41533106ec1 100644 --- a/Code/Mantid/scripts/Inelastic/IndirectDiffractionReduction.py +++ b/Code/Mantid/scripts/Inelastic/IndirectDiffractionReduction.py @@ -2,12 +2,14 @@ from msg_reducer import MSGReducer import inelastic_indirect_reduction_steps as steps + class MSGDiffractionReducer(MSGReducer): """Reducer for Diffraction on IRIS and TOSCA. """ def __init__(self): super(MSGDiffractionReducer, self).__init__() + self._grouping_policy = 'All' def _setup_steps(self): self.append_step(steps.IdentifyBadDetectors( @@ -36,11 +38,11 @@ def _setup_steps(self): self.append_step(steps.RebinToFirstSpectrum()) step = steps.Grouping() - step.set_grouping_policy("All") + step.set_grouping_policy(self._grouping_policy) self.append_step(step) # The "SaveItem" step saves the files in the requested formats. - if (len(self._save_formats) > 0): + if len(self._save_formats) > 0: step = steps.SaveItem() step.set_formats(self._save_formats) self.append_step(step) @@ -48,6 +50,17 @@ def _setup_steps(self): step = steps.Naming() self.append_step(step) + def set_grouping_policy(self, policy): + """ + Sets the grouping policy for the result data. + + @parm policy New grouping policy + """ + if not isinstance(policy, str): + raise ValueError('Grouping policy must be a string') + + self._grouping_policy = policy + def getStringProperty(workspace, property): """This function is used in the interface. From 9ab7bfb1df9963f243a324fcc990bd249c76dd19 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Wed, 8 Oct 2014 15:28:46 +0100 Subject: [PATCH 076/284] refs #9909 Load detectors with the data works though incorrectly for different number of monitors --- .../inc/MantidDataHandling/LoadISISNexus2.h | 4 +- .../DataHandling/src/LoadISISNexus2.cpp | 192 +++++++++++++----- 2 files changed, 139 insertions(+), 57 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h index 9181a2be9b27..ea497530d610 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h @@ -192,8 +192,10 @@ namespace Mantid static double dblSqrt(double in); // C++ interface to the NXS file - ::NeXus::File * m_cppFile; + boost::scoped_ptr<::NeXus::File> m_cppFile; + bool findSpectraDetRangeInFile(NeXus::NXEntry &entry,boost::shared_array &spectrum_index,int64_t ndets,int64_t n_vms_compat_spectra, + std::map &monitors,bool excludeMonitors,bool separateMonitors,bool &spectraExcluded); }; } // namespace DataHandling diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index 4b88cd81c1d9..f9c2b77e4df6 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -3,6 +3,7 @@ //---------------------------------------------------------------------- #include "MantidDataHandling/LoadISISNexus2.h" #include "MantidDataHandling/LoadEventNexus.h" +#include "MantidDataHandling/LoadRawHelper.h" #include "MantidKernel/ArrayProperty.h" #include "MantidKernel/BoundedValidator.h" @@ -85,9 +86,6 @@ namespace Mantid declareProperty("EntryNumber", (int64_t)0, mustBePositive, "The particular entry number to read (default: Load all workspaces and creates a workspace group)"); - declareProperty(new PropertyWithValue("LoadMonitorsSeparately", false, Direction::Input), - "If true, loads monitors and puts them into separate workspace"); - std::vector monitorOptions; monitorOptions.push_back("Include"); monitorOptions.push_back("Exclude"); @@ -95,16 +93,17 @@ namespace Mantid std::map monitorOptionsAliases; monitorOptionsAliases["1"] = "Separate"; monitorOptionsAliases["0"] = "Exclude"; - declareProperty("LoadMonitors","Exclude", boost::make_shared(monitorOptions,monitorOptionsAliases), - "Option to control the loading of monitors.\n" - "Allowed options are Include,Exclude, Separate.\n" - "Include:Include option would load monitors with the workspace. If the time binning for the monitors is different from the\n" - "binning of the detectors this option is equivalent to Separate option\n" - "Exclude:The default is Exclude option excludes monitors from the output workspace.\n" - "Separate:The Separate option loads monitors into a separate workspace called OutputWorkspace_monitor.\n" - "Defined aliases:\n" - "1: Equivalent to Separate.\n" - "0: Equivalent to Exclude.\n"); + declareProperty("LoadMonitors","Include", boost::make_shared(monitorOptions,monitorOptionsAliases), + "Option to control the loading of monitors.\n" + "Allowed options are Include,Exclude, Separate.\n" + "Include:The default is Include option would load monitors with the workspace if monitors spectra are within the range of loaded detectors.\n" + "If the time binning for the monitors is different from the\n" + "binning of the detectors this option is equivalent to the Separate option\n" + "Exclude:Exclude option excludes monitors from the output workspace.\n" + "Separate:Separate option loads monitors into a separate workspace called: OutputWorkspace_monitors.\n" + "Defined aliases:\n" + "1: Equivalent to Separate.\n" + "0: Equivalent to Exclude.\n"); } @@ -116,12 +115,31 @@ namespace Mantid */ void LoadISISNexus2::exec() { + + //********************************************************************** + // process primary monitor options + std::string monitorOption = getProperty("LoadMonitors"); + if (monitorOption =="1") + monitorOption = "Separate"; + if (monitorOption=="0") + monitorOption = "Exclude"; + + bool bincludeMonitors = LoadRawHelper::isIncludeMonitors(monitorOption); + bool bseparateMonitors = false; + bool bexcludeMonitors = false; + if (!bincludeMonitors) + { + bseparateMonitors = LoadRawHelper::isSeparateMonitors(monitorOption); + bexcludeMonitors = LoadRawHelper::isExcludeMonitors(monitorOption); + } + //********************************************************************** + m_filename = getPropertyValue("Filename"); // Create the root Nexus class NXRoot root(m_filename); // "Open" the same file but with the C++ interface - m_cppFile = new ::NeXus::File(root.m_fileID); + m_cppFile.reset( new ::NeXus::File(root.m_fileID)); // Open the raw data group 'raw_data_1' NXEntry entry = root.openEntry("raw_data_1"); @@ -154,58 +172,41 @@ namespace Mantid NXInt spec = entry.openNXInt("isis_vms_compat/SPEC"); spec.load(); - //Pull out the monitor blocks, if any exist size_t nmons(0); - std::vector mon_spectra_num; - int64_t max_spectra_num(LONG_MIN); - int64_t min_spectra_num(LONG_MAX); - for(std::vector::const_iterator it = entry.groups().begin(); - it != entry.groups().end(); ++it) + if (bincludeMonitors) { - if (it->nxclass == "NXmonitor") // Count monitors + //Pull out the monitor blocks, if any exist + for(std::vector::const_iterator it = entry.groups().begin(); + it != entry.groups().end(); ++it) { - NXInt index = entry.openNXInt(std::string(it->nxname) + "/spectrum_index"); - index.load(); - int64_t ind = *index(); - m_monitors[ind ] = it->nxname; - mon_spectra_num.push_back(ind); - - if (ind > max_spectra_num)max_spectra_num=ind; - if (ind < min_spectra_num)min_spectra_num=ind; - ++nmons; + if (it->nxclass == "NXmonitor") // Count monitors + { + NXInt index = entry.openNXInt(std::string(it->nxname) + "/spectrum_index"); + index.load(); + int64_t ind = *index(); + m_monitors[ind ] = it->nxname; + + ++nmons; + } } } if( ndets == 0 && nmons == 0 ) { - g_log.error() << "Invalid NeXus structure, cannot find detector or monitor blocks."; - throw std::runtime_error("Inconsistent NeXus file structure."); - } - - if( ndets == 0 ) - { - - //Grab the number of channels - NXInt chans = entry.openNXInt(m_monitors.begin()->second + "/data"); - m_numberOfPeriodsInFile = m_numberOfPeriods = chans.dim0(); - m_numberOfSpectraInFile = m_numberOfSpectra = nmons; - m_numberOfChannelsInFile = m_numberOfChannels = chans.dim2(); - } - else - { - NXData nxData = entry.openNXData("detector_1"); - NXInt data = nxData.openIntData(); - m_numberOfPeriodsInFile = m_numberOfPeriods = data.dim0(); - m_numberOfSpectraInFile = m_numberOfSpectra = nsp1[0]; - m_numberOfChannelsInFile = m_numberOfChannels = data.dim2(); - if(max_spectra_num > m_numberOfSpectra) - m_numberOfSpectra += mon_spectra_num.size(); - - if( nmons > 0 && m_numberOfSpectra == static_cast(data.dim1()) ) + if (bexcludeMonitors) { - m_monitors.clear(); + g_log.warning() << "Nothing to do. No detectors found and no monitor loading requested"; + return; + } + else + { + g_log.error() << "Invalid NeXus structure, cannot find detector or monitor blocks."; + throw std::runtime_error("Inconsistent NeXus file structure."); } } + bool spectraExcluded(false); + bseparateMonitors=findSpectraDetRangeInFile(entry,m_spec,ndets,nsp1[0],m_monitors,bexcludeMonitors,bseparateMonitors,spectraExcluded); + const size_t x_length = m_numberOfChannels + 1; // Check input is consistent with the file, throwing if not @@ -245,7 +246,7 @@ namespace Mantid // Load logs and sample information m_cppFile->openPath(entry.path()); - local_workspace->loadSampleAndLogInfoNexus(m_cppFile); + local_workspace->loadSampleAndLogInfoNexus(m_cppFile.get()); // Load logs and sample information further information... See maintenance ticket #8697 loadSampleData(local_workspace, entry); @@ -988,5 +989,84 @@ namespace Mantid return sqrt(in); } + bool LoadISISNexus2::findSpectraDetRangeInFile(NXEntry &entry,boost::shared_array &spectrum_index,int64_t ndets,int64_t n_vms_compat_spectra, + std::map &monitors,bool excludeMonitors,bool separateMonitors,bool &spectraExcluded) + { + spectraExcluded = false; + size_t nmons = monitors.size(); + + //Grab the number of channels + NXInt chans = entry.openNXInt(m_monitors.begin()->second + "/data"); + + int nMonitorPeriods = chans.dim0(); + size_t nMonitorChannels = chans.dim2(); + m_numberOfPeriodsInFile = m_numberOfPeriods = nMonitorPeriods ; + m_numberOfSpectraInFile = m_numberOfSpectra = nmons; + m_numberOfChannelsInFile = m_numberOfChannels = nMonitorChannels; + + if( ndets == 0 ) + { + separateMonitors = true; + return separateMonitors; + } + + NXData nxData = entry.openNXData("detector_1"); + NXInt data = nxData.openIntData(); + + m_numberOfPeriodsInFile = m_numberOfPeriods = data.dim0(); + m_numberOfChannelsInFile = m_numberOfChannels = data.dim2(); + if ((m_numberOfPeriodsInFile !=nMonitorPeriods) || (m_numberOfChannelsInFile!=nMonitorChannels)) + { + if(!separateMonitors) + { + g_log.warning()<<" Performing separate loading as can not load spectra and monitors in the single workspace:\n" ; + g_log.warning()<<" Monitors data contain :"<( n_vms_compat_spectra )&& !separateMonitors) + { + // workspace contain the same number of bins for spectra and monitors. Total number of spectra in workspace will be equal to + // n_vms_compat_spectra + m_numberOfSpectraInFile = m_numberOfSpectra; + m_numberOfSpectra=n_vms_compat_spectra; + return separateMonitors; + } + + + //Now check if monitors expand the spectra range + + // We assume again that this spectrum list increases monotonically + int64_t min_index = spectrum_index[0]; + int64_t max_index = spectrum_index[ndets-1]; + std::map remaining_monitors; + for(auto it = monitors.begin(); it!=monitors.end(); it++) + { + if(it->first>=min_index && it->first <=max_index) + { + if(excludeMonitors || separateMonitors) + { + m_numberOfSpectra--; + spectraExcluded = true; + spectrum_index[it->first]=-1; + } + } + else + { + remaining_monitors.insert(*it); + m_numberOfSpectra++; + } + } + monitors.swap(remaining_monitors); + return separateMonitors; + + } + + } // namespace DataHandling } // namespace Mantid From e31757fedad009457665cd2d3c12d27bd61afb94 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Wed, 8 Oct 2014 18:58:21 +0100 Subject: [PATCH 077/284] refs #9989 Load monitors "Exclude&Separate" works for main workspace though unit tests are needed and prospective include LoadNexusMonitors for "Separate" option --- .../inc/MantidDataHandling/LoadISISNexus2.h | 6 +- .../DataHandling/src/LoadISISNexus2.cpp | 182 +++++++++++------- 2 files changed, 111 insertions(+), 77 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h index ea497530d610..8d8b54862d36 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h @@ -102,7 +102,7 @@ namespace Mantid /// Overwrites Algorithm method void exec(); // Validate the optional input properties - void checkOptionalProperties(); + void checkOptionalProperties(const std::set &ExcludedSpectra); /// Prepare a vector of SpectraBlock structures to simplify loading size_t prepareSpectraBlocks(); /// Run LoadInstrument as a ChildAlgorithm @@ -126,7 +126,7 @@ namespace Mantid // Validate multi-period logs void validateMultiPeriodLogs(Mantid::API::MatrixWorkspace_sptr); // build the list of spectra numbers to load and include in the spectra list - void buildSpectraInd2SpectraNumMap(const std::vector &spec_list); + void buildSpectraInd2SpectraNumMap(const std::vector &spec_list,const std::set &ExcludedSpectra); /// The name and path of the input file @@ -195,7 +195,7 @@ namespace Mantid boost::scoped_ptr<::NeXus::File> m_cppFile; bool findSpectraDetRangeInFile(NeXus::NXEntry &entry,boost::shared_array &spectrum_index,int64_t ndets,int64_t n_vms_compat_spectra, - std::map &monitors,bool excludeMonitors,bool separateMonitors,bool &spectraExcluded); + std::map &monitors,bool excludeMonitors,bool separateMonitors,std::set &ExcludedSpectra); }; } // namespace DataHandling diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index f9c2b77e4df6..a261fe5059ed 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -173,24 +173,24 @@ namespace Mantid spec.load(); size_t nmons(0); - if (bincludeMonitors) + + + //Pull out the monitor blocks, if any exist + for(std::vector::const_iterator it = entry.groups().begin(); + it != entry.groups().end(); ++it) { - //Pull out the monitor blocks, if any exist - for(std::vector::const_iterator it = entry.groups().begin(); - it != entry.groups().end(); ++it) + if (it->nxclass == "NXmonitor") // Count monitors { - if (it->nxclass == "NXmonitor") // Count monitors - { - NXInt index = entry.openNXInt(std::string(it->nxname) + "/spectrum_index"); - index.load(); - int64_t ind = *index(); - m_monitors[ind ] = it->nxname; + NXInt index = entry.openNXInt(std::string(it->nxname) + "/spectrum_index"); + index.load(); + int64_t ind = *index(); + m_monitors[ind ] = it->nxname; - ++nmons; - } + ++nmons; } } + if( ndets == 0 && nmons == 0 ) { if (bexcludeMonitors) @@ -204,13 +204,13 @@ namespace Mantid throw std::runtime_error("Inconsistent NeXus file structure."); } } - bool spectraExcluded(false); - bseparateMonitors=findSpectraDetRangeInFile(entry,m_spec,ndets,nsp1[0],m_monitors,bexcludeMonitors,bseparateMonitors,spectraExcluded); + std::set ExcluedSpectra; + bseparateMonitors=findSpectraDetRangeInFile(entry,m_spec,ndets,nsp1[0],m_monitors,bexcludeMonitors,bseparateMonitors,ExcluedSpectra); const size_t x_length = m_numberOfChannels + 1; - // Check input is consistent with the file, throwing if not - checkOptionalProperties(); + // Check input is consistent with the file, throwing if not, exclude spectra selected at findSpectraDetRangeInFile; + checkOptionalProperties(ExcluedSpectra); // Fill up m_spectraBlocks size_t total_specs = prepareSpectraBlocks(); @@ -332,36 +332,6 @@ namespace Mantid }; } - /** - build the list of spectra to load and include into spectra-detectors map - @param spec_list -- list of spectra to load - **/ - void LoadISISNexus2::buildSpectraInd2SpectraNumMap(const std::vector &spec_list) - { - - int64_t ic(0); - - if(spec_list.size()>0) - { - auto start_point = spec_list.begin(); - for(auto it =start_point ;it!=spec_list.end();it++) - { - ic = it-start_point; - m_specInd2specNum_map.insert(std::pair(ic,static_cast(*it))); - } - } - else - { - if(m_range_supplied) - { - ic = m_specInd2specNum_map.size(); - for(int64_t i=m_spec_min;i(i-m_spec_min+ic,static_cast(i))); - - } - } - } - /** Check for a set of synthetic logs associated with multi-period log data. Raise warnings where necessary. @@ -385,11 +355,19 @@ namespace Mantid /** * Check the validity of the optional properties of the algorithm and identify if partial data should be loaded. + * @param SpectraExclued :: set of spectra ID-s to exclude from spectra list to load */ - void LoadISISNexus2::checkOptionalProperties() + void LoadISISNexus2::checkOptionalProperties(const std::set &SpectraExcluded) { // optional properties specify that only some spectra have to be loaded - m_load_selected_spectra = false; + size_t numSpectraExclued=0; + if (!SpectraExcluded.empty()) + { + m_load_selected_spectra = true; + numSpectraExclued = SpectraExcluded.size(); + } + + // m_spec_min = getProperty("SpectrumMin"); m_spec_max = getProperty("SpectrumMax"); @@ -415,11 +393,11 @@ namespace Mantid throw std::invalid_argument("Inconsistent range properties. SpectrumMin is larger than SpectrumMax."); } - if( static_cast(m_spec_max) > m_numberOfSpectra ) + if( static_cast(m_spec_max) > m_numberOfSpectra+numSpectraExclued ) { - std::string err="Inconsistent range property. SpectrumMax is larger than number of spectra: "+boost::lexical_cast(m_numberOfSpectra ); - throw std::invalid_argument(err); - } + std::string err="Inconsistent range property. SpectrumMax is larger than number of spectra: "+boost::lexical_cast(m_numberOfSpectra+numSpectraExclued ); + throw std::invalid_argument(err); + } // Check the entry number m_entrynumber = getProperty("EntryNumber"); @@ -442,9 +420,9 @@ namespace Mantid // Sort the list so that we can check it's range std::sort(spec_list.begin(), spec_list.end()); - if( spec_list.back() > static_cast(m_numberOfSpectra) ) + if( spec_list.back() > static_cast(m_numberOfSpectra+numSpectraExclued) ) { - std::string err="A spectra number in the spectra list exceeds total number of "+boost::lexical_cast(m_numberOfSpectra )+ " spectra "; + std::string err="A spectra number in the spectra list exceeds total number of "+boost::lexical_cast(m_numberOfSpectra+numSpectraExclued )+ " spectra "; throw std::invalid_argument(err); } @@ -455,6 +433,7 @@ namespace Mantid { throw std::invalid_argument("Negative SpectraList property encountered."); } + range_check in_range(m_spec_min, m_spec_max); if( m_range_supplied ) { @@ -463,7 +442,11 @@ namespace Mantid if (spec_list.size()>0) { for(int64_t i=m_spec_min;i(i)); + { + specid_t spec_num = static_cast(i); + if (SpectraExcluded.find(spec_num)==SpectraExcluded.end() ) + spec_list.push_back(spec_num); + } // Sort the list so that lower spectra indexes correspond to smaller spectra ID-s std::sort(spec_list.begin(), spec_list.end()); @@ -474,12 +457,53 @@ namespace Mantid { m_range_supplied = true; } + // if (m_load_selected_spectra) { - buildSpectraInd2SpectraNumMap(spec_list); + buildSpectraInd2SpectraNumMap(spec_list,SpectraExcluded); } } + /** + build the list of spectra to load and include into spectra-detectors map + @param spec_list -- list of spectra numbers to load + @param SpectraExcluded set of the spectra ID-s to exclude from loading + **/ + void LoadISISNexus2::buildSpectraInd2SpectraNumMap(const std::vector &spec_list,const std::set &SpectraExcluded) + { + + int64_t ic(0); + + if(spec_list.size()>0) + { + auto start_point = spec_list.begin(); + for(auto it =start_point ;it!=spec_list.end();it++) + { + ic = it-start_point; + m_specInd2specNum_map.insert(std::pair(ic,static_cast(*it))); + } + } + else + { + if(m_range_supplied) + { + ic = 0; + int64_t max_range = m_spec_max+SpectraExcluded.size()+1; + for(int64_t i=m_spec_min;i(i); + if(SpectraExcluded.find(spectra)==SpectraExcluded.end()) + { + m_specInd2specNum_map.insert(std::pair(ic,spectra)); + ic++; + } + } + + } + } + } + + namespace { @@ -990,19 +1014,24 @@ namespace Mantid } bool LoadISISNexus2::findSpectraDetRangeInFile(NXEntry &entry,boost::shared_array &spectrum_index,int64_t ndets,int64_t n_vms_compat_spectra, - std::map &monitors,bool excludeMonitors,bool separateMonitors,bool &spectraExcluded) + std::map &monitors,bool excludeMonitors,bool separateMonitors,std::set &ExcludedSpectra) { - spectraExcluded = false; + ExcludedSpectra.clear(); size_t nmons = monitors.size(); //Grab the number of channels - NXInt chans = entry.openNXInt(m_monitors.begin()->second + "/data"); + int nMonitorPeriods(0); + size_t nMonitorChannels(0); + if (nmons>0) + { + NXInt chans = entry.openNXInt(m_monitors.begin()->second + "/data"); - int nMonitorPeriods = chans.dim0(); - size_t nMonitorChannels = chans.dim2(); - m_numberOfPeriodsInFile = m_numberOfPeriods = nMonitorPeriods ; - m_numberOfSpectraInFile = m_numberOfSpectra = nmons; - m_numberOfChannelsInFile = m_numberOfChannels = nMonitorChannels; + nMonitorPeriods = chans.dim0(); + nMonitorChannels = chans.dim2(); + m_numberOfPeriodsInFile = m_numberOfPeriods = nMonitorPeriods ; + m_numberOfSpectraInFile = m_numberOfSpectra = nmons; + m_numberOfChannelsInFile = m_numberOfChannels = nMonitorChannels; + } if( ndets == 0 ) { @@ -1015,7 +1044,7 @@ namespace Mantid m_numberOfPeriodsInFile = m_numberOfPeriods = data.dim0(); m_numberOfChannelsInFile = m_numberOfChannels = data.dim2(); - if ((m_numberOfPeriodsInFile !=nMonitorPeriods) || (m_numberOfChannelsInFile!=nMonitorChannels)) + if (((m_numberOfPeriodsInFile !=nMonitorPeriods) || (m_numberOfChannelsInFile!=nMonitorChannels)) && nmons>0) { if(!separateMonitors) { @@ -1029,7 +1058,10 @@ namespace Mantid - if(m_numberOfSpectra+nmons ==static_cast( n_vms_compat_spectra )&& !separateMonitors) + bool removeMonitors = excludeMonitors || separateMonitors; + + + if(m_numberOfSpectra+nmons ==static_cast( n_vms_compat_spectra )&& !removeMonitors) { // workspace contain the same number of bins for spectra and monitors. Total number of spectra in workspace will be equal to // n_vms_compat_spectra @@ -1038,28 +1070,30 @@ namespace Mantid return separateMonitors; } - - //Now check if monitors expand the spectra range - + //Now check if monitors expand or shrink the workspace's spectra range + // We assume again that this spectrum list increases monotonically int64_t min_index = spectrum_index[0]; int64_t max_index = spectrum_index[ndets-1]; + std::map remaining_monitors; for(auto it = monitors.begin(); it!=monitors.end(); it++) { if(it->first>=min_index && it->first <=max_index) { - if(excludeMonitors || separateMonitors) + if(removeMonitors) { m_numberOfSpectra--; - spectraExcluded = true; - spectrum_index[it->first]=-1; + ExcludedSpectra.insert(static_cast(it->first)); } } else { - remaining_monitors.insert(*it); - m_numberOfSpectra++; + if(!removeMonitors) + { + remaining_monitors.insert(*it); + m_numberOfSpectra++; + } } } monitors.swap(remaining_monitors); From 23863776bab89d3e9133805e1a02907a383eac7e Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Thu, 9 Oct 2014 10:22:44 +0100 Subject: [PATCH 078/284] refs #9989 Unit test for LoadMonitorsSeparately option and some small niceness to the code, which performs this operation (comments, var names, code duplication). --- .../inc/MantidDataHandling/LoadRawHelper.h | 2 +- .../DataHandling/src/LoadISISNexus2.cpp | 51 ++++---- .../Framework/DataHandling/src/LoadRaw3.cpp | 19 +-- .../DataHandling/src/LoadRawHelper.cpp | 25 ++++ .../DataHandling/test/LoadISISNexusTest.h | 113 ++++++++++++++++++ 5 files changed, 170 insertions(+), 40 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h index 752b3dc0a8f9..fafd84121516 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h @@ -82,7 +82,7 @@ namespace Mantid static bool isIncludeMonitors(const std::string &monitorOption); - + static void ProcessLoadMonitorOptions(bool &bincludeMonitors,bool &bseparateMonitors,bool &bexcludeMonitors,API::Algorithm *pAlgo); protected: /// Overwrites Algorithm method. void init(); diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index a261fe5059ed..4f784d33ab61 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -117,23 +117,11 @@ namespace Mantid { //********************************************************************** - // process primary monitor options - std::string monitorOption = getProperty("LoadMonitors"); - if (monitorOption =="1") - monitorOption = "Separate"; - if (monitorOption=="0") - monitorOption = "Exclude"; - - bool bincludeMonitors = LoadRawHelper::isIncludeMonitors(monitorOption); - bool bseparateMonitors = false; - bool bexcludeMonitors = false; - if (!bincludeMonitors) - { - bseparateMonitors = LoadRawHelper::isSeparateMonitors(monitorOption); - bexcludeMonitors = LoadRawHelper::isExcludeMonitors(monitorOption); - } - //********************************************************************** + // process load monitor options request + bool bincludeMonitors,bseparateMonitors, bexcludeMonitors; + LoadRawHelper::ProcessLoadMonitorOptions(bincludeMonitors,bseparateMonitors, bexcludeMonitors,this); + //********************************************************************** m_filename = getPropertyValue("Filename"); // Create the root Nexus class NXRoot root(m_filename); @@ -204,13 +192,13 @@ namespace Mantid throw std::runtime_error("Inconsistent NeXus file structure."); } } - std::set ExcluedSpectra; - bseparateMonitors=findSpectraDetRangeInFile(entry,m_spec,ndets,nsp1[0],m_monitors,bexcludeMonitors,bseparateMonitors,ExcluedSpectra); + std::set ExcluedMonitorsSpectra; + bseparateMonitors=findSpectraDetRangeInFile(entry,m_spec,ndets,nsp1[0],m_monitors,bexcludeMonitors,bseparateMonitors,ExcluedMonitorsSpectra); const size_t x_length = m_numberOfChannels + 1; // Check input is consistent with the file, throwing if not, exclude spectra selected at findSpectraDetRangeInFile; - checkOptionalProperties(ExcluedSpectra); + checkOptionalProperties(ExcluedMonitorsSpectra); // Fill up m_spectraBlocks size_t total_specs = prepareSpectraBlocks(); @@ -311,6 +299,7 @@ namespace Mantid m_tof_data.reset(); m_spec.reset(); m_monitors.clear(); + m_specInd2specNum_map.clear(); } // Function object for remove_if STL algorithm @@ -1012,11 +1001,27 @@ namespace Mantid { return sqrt(in); } - + /**Method takes input parameters which describe monitor loading and analyze them against spectra/monitor information in the file. + * The result is the option if monitors can be loaded together with spectra or mast be treated separately + * and additional information on how to treat monitor spectra. + * + *@param entry :: entry to the NeXus file, opened at root folder + *@param spectrum_index :: array of spectra indexes of the data present in the file + *@param ndets :: size of the spectrum index array + *@param n_vms_compat_spectra :: number of data entries containing common time bins (e.g. all spectra, or all spectra and monitors or some spectra (this is not fully supported) + *@param monitors :: map connecting monitor spectra ID against monitor group name in the file. + *@param excludeMonitors :: input property indicating if it is requested to exclude monitors from the target workspace + *@param separateMonitors :: input property indicating if it is requested to load monitors separately (and exclude them from target data workspace this way) + * + *@param MonitorSpectra :: output property containing the list of monitors which should be loaded separately. + *@return excludeMonitors :: indicator if monitors should or mast be excluded from the main data workspace if they can not be loaded with the data + * (contain different number of time channels) + * + */ bool LoadISISNexus2::findSpectraDetRangeInFile(NXEntry &entry,boost::shared_array &spectrum_index,int64_t ndets,int64_t n_vms_compat_spectra, - std::map &monitors,bool excludeMonitors,bool separateMonitors,std::set &ExcludedSpectra) + std::map &monitors,bool excludeMonitors,bool separateMonitors,std::set &MonitorSpectra) { - ExcludedSpectra.clear(); + MonitorSpectra.clear(); size_t nmons = monitors.size(); //Grab the number of channels @@ -1084,7 +1089,7 @@ namespace Mantid if(removeMonitors) { m_numberOfSpectra--; - ExcludedSpectra.insert(static_cast(it->first)); + MonitorSpectra.insert(static_cast(it->first)); } } else diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp index 4c70948539df..4305719e5c43 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp @@ -95,22 +95,9 @@ namespace Mantid bool bLoadlogFiles = getProperty("LoadLogFiles"); - // process monitor option - std::string monitorOption = getProperty("LoadMonitors"); - if (monitorOption =="1") - monitorOption = "Separate"; - if (monitorOption=="0") - monitorOption = "Exclude"; - - bool bincludeMonitors = LoadRawHelper::isIncludeMonitors(monitorOption); - bool bseparateMonitors = false; - bool bexcludeMonitors = false; - if (!bincludeMonitors) - { - bseparateMonitors = LoadRawHelper::isSeparateMonitors(monitorOption); - bexcludeMonitors = LoadRawHelper::isExcludeMonitors(monitorOption); - } - // + bool bincludeMonitors,bseparateMonitors, bexcludeMonitors; + LoadRawHelper::ProcessLoadMonitorOptions(bincludeMonitors,bseparateMonitors, bexcludeMonitors,this); + std::string title; //read workspace title from raw file diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp index 0e87a26eb333..95897381a5b9 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp @@ -1319,7 +1319,32 @@ namespace Mantid monitorOption.compare("Separate") ? (bSeparate = false) : (bSeparate = true); return bSeparate; } + /**The method to interpret LoadMonitors property options and convert then into boolean values + * @param bincludeMonitors :: if monitors requested to be included with workspace + * @param bseparateMonitors :: if monitors requested to be loaded separately from the workspace + * @param bexcludeMonitors :: if monitors should not be loaded at all. + * @param pAlgo :: pointer to the algorithm, which has LoadMonitors property. + */ + void LoadRawHelper::ProcessLoadMonitorOptions(bool &bincludeMonitors,bool &bseparateMonitors,bool &bexcludeMonitors,API::Algorithm *pAlgo) + { + // process monitor option + std::string monitorOption = pAlgo->getProperty("LoadMonitors"); + if (monitorOption =="1") + monitorOption = "Separate"; + if (monitorOption=="0") + monitorOption = "Exclude"; + + bincludeMonitors = LoadRawHelper::isIncludeMonitors(monitorOption); + bseparateMonitors = false; + bexcludeMonitors = false; + if (!bincludeMonitors) + { + bseparateMonitors = LoadRawHelper::isSeparateMonitors(monitorOption); + bexcludeMonitors = LoadRawHelper::isExcludeMonitors(monitorOption); + } + // + } } // namespace DataHandling } // namespace Mantid diff --git a/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h b/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h index 7124eec12d54..bae2a9591039 100644 --- a/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h +++ b/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h @@ -67,6 +67,8 @@ class LoadISISNexusTest : public CxxTest::TestSuite } public: + + void testExec() { Mantid::API::FrameworkManager::Instance(); @@ -451,6 +453,117 @@ class LoadISISNexusTest : public CxxTest::TestSuite TS_ASSERT_THROWS_NOTHING( v1.initialize() ); TS_ASSERT_THROWS( v1.execute(), Exception::NotImplementedError) } + void testExecMonExcluded() + { + Mantid::API::FrameworkManager::Instance(); + LoadISISNexus2 ld; + ld.initialize(); + ld.setPropertyValue("Filename","LOQ49886.nxs"); + ld.setPropertyValue("OutputWorkspace","outWS"); + ld.setPropertyValue("LoadMonitors","0"); // should read "exclude" + TS_ASSERT_THROWS_NOTHING(ld.execute()); + TS_ASSERT(ld.isExecuted()); + + MatrixWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS("outWS"); + TS_ASSERT_EQUALS(ws->blocksize(),5); + TS_ASSERT_EQUALS(ws->getNumberHistograms(),17790); + + // Two monitors which form two first spectra are excluded by load separately + + // spectrum with ID 5 is now spectrum N 3 as 2 monitors + TS_ASSERT_EQUALS(ws->readY(5-2)[1],1.); + TS_ASSERT_EQUALS(ws->getSpectrum(5-2)->getSpectrumNo(),6); + TS_ASSERT_EQUALS(*(ws->getSpectrum(5-2)->getDetectorIDs().begin()), 6); + // spectrum with ID 7 is now spectrum N 4 + TS_ASSERT_EQUALS(ws->readY(6-2)[0],1.); + TS_ASSERT_EQUALS(ws->getSpectrum(6-2)->getSpectrumNo(),7); + TS_ASSERT_EQUALS(*(ws->getSpectrum(6-2)->getDetectorIDs().begin()), 7); + // + TS_ASSERT_EQUALS(ws->readY(9-2)[3],1.); + // spectrum with ID 9 is now spectrum N 6 + TS_ASSERT_EQUALS(ws->getSpectrum(8-2)->getSpectrumNo(),9); + TS_ASSERT_EQUALS(*(ws->getSpectrum(8-2)->getDetectorIDs().begin()), 9); + // spectrum with ID 14 is now spectrum N 11 + TS_ASSERT_EQUALS(ws->readY(13-2)[1],1.); + TS_ASSERT_EQUALS(ws->getSpectrum(13-2)->getSpectrumNo(),14); + TS_ASSERT_EQUALS(*(ws->getSpectrum(13-2)->getDetectorIDs().begin()), 14); + // spectrum with ID 18 is now spectrum N 15 + TS_ASSERT_EQUALS(ws->readY(17-2)[1],2.); + TS_ASSERT_EQUALS(ws->getSpectrum(17-2)->getSpectrumNo(),18); + TS_ASSERT_EQUALS(*(ws->getSpectrum(17-2)->getDetectorIDs().begin()), 18); + // spectrum with ID 19 is now spectrum N 16 + TS_ASSERT_EQUALS(ws->readY(18-2)[1],1.); + TS_ASSERT_EQUALS(ws->getSpectrum(18-2)->getSpectrumNo(),19); + TS_ASSERT_EQUALS(*(ws->getSpectrum(18-2)->getDetectorIDs().begin()), 19); + + + TS_ASSERT_EQUALS(ws->readY(33-2)[2],1.); + TS_ASSERT_EQUALS(ws->getSpectrum(33-2)->getSpectrumNo(),34); + TS_ASSERT_EQUALS(*(ws->getSpectrum(33-2)->getDetectorIDs().begin()), 34); + // + TS_ASSERT_EQUALS(ws->readY(34-2)[1],1.); + TS_ASSERT_EQUALS(ws->getSpectrum(34-2)->getSpectrumNo(),35); + TS_ASSERT_EQUALS(*(ws->getSpectrum(34-2)->getDetectorIDs().begin()), 35); + + TS_ASSERT_EQUALS(ws->readY(37-2)[3],1.); + TS_ASSERT_EQUALS(ws->readY(37-2)[4],1.); + TS_ASSERT_EQUALS(ws->getSpectrum(37-2)->getSpectrumNo(),38); + TS_ASSERT_EQUALS(*(ws->getSpectrum(37-2)->getDetectorIDs().begin()), 38); + + + TS_ASSERT_EQUALS(ws->getSpectrum(1234-2)->getDetectorIDs().size(), 1); + TS_ASSERT_EQUALS(*(ws->getSpectrum(1234-2)->getDetectorIDs().begin()), 1235); + + TS_ASSERT_EQUALS(ws->getSpectrum(1234-2)->getSpectrumNo(), 1235 ); + TS_ASSERT(ws->getSpectrum(1234-2)->hasDetectorID(1235) ); + + const std::vector< Property* >& logs = ws->run().getLogData(); + TS_ASSERT_EQUALS(logs.size(), 62); + + std::string header = ws->run().getPropertyValueAsType("run_header"); + TS_ASSERT_EQUALS(86, header.size()); + TS_ASSERT_EQUALS("LOQ 49886 Team LOQ Quiet Count, ISIS Off, N 28-APR-2009 09:20:29 0.00", header); + + TimeSeriesProperty* slog = dynamic_cast*>(ws->run().getLogData("icp_event")); + TS_ASSERT(slog); + std::string str = slog->value(); + TS_ASSERT_EQUALS(str.size(),1023); + TS_ASSERT_EQUALS(str.substr(0,37),"2009-Apr-28 09:20:29 CHANGE_PERIOD 1"); + + slog = dynamic_cast*>(ws->run().getLogData("icp_debug")); + TS_ASSERT(slog); + TS_ASSERT_EQUALS(slog->size(),50); + + TimeSeriesProperty* ilog = dynamic_cast*>(ws->run().getLogData("total_counts")); + TS_ASSERT(ilog); + TS_ASSERT_EQUALS(ilog->size(),172); + + ilog = dynamic_cast*>(ws->run().getLogData("period")); + TS_ASSERT(ilog); + TS_ASSERT_EQUALS(ilog->size(),172); + + TimeSeriesProperty *dlog = dynamic_cast*>(ws->run().getLogData("proton_charge")); + TS_ASSERT(dlog); + TS_ASSERT_EQUALS(dlog->size(),172); + + + TimeSeriesProperty* blog = dynamic_cast*>(ws->run().getLogData("period 1")); + TS_ASSERT(blog); + TS_ASSERT_EQUALS(blog->size(),1); + + blog = dynamic_cast*>(ws->run().getLogData("running")); + TS_ASSERT(blog); + TS_ASSERT_EQUALS(blog->size(),6); + + TS_ASSERT_EQUALS(ws->sample().getName(),"PMMA_SAN25_1.5%_TRANS_150"); + + Property *l_property = ws->run().getLogData( "run_number" ); + TS_ASSERT_EQUALS( l_property->value(), "49886" ); + AnalysisDataService::Instance().remove("outWS"); + } + + + }; //------------------------------------------------------------------------------ From f0092432761e177c4f3bcebe8c3fbfaefa44f9f3 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Thu, 9 Oct 2014 10:42:00 +0100 Subject: [PATCH 079/284] refs #9989 Fixing unit test --- Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h b/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h index bae2a9591039..1b4b5e4fc369 100644 --- a/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h +++ b/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h @@ -479,7 +479,8 @@ class LoadISISNexusTest : public CxxTest::TestSuite TS_ASSERT_EQUALS(ws->getSpectrum(6-2)->getSpectrumNo(),7); TS_ASSERT_EQUALS(*(ws->getSpectrum(6-2)->getDetectorIDs().begin()), 7); // - TS_ASSERT_EQUALS(ws->readY(9-2)[3],1.); + TS_ASSERT_EQUALS(ws->readY(8-2)[3],1.); + // spectrum with ID 9 is now spectrum N 6 TS_ASSERT_EQUALS(ws->getSpectrum(8-2)->getSpectrumNo(),9); TS_ASSERT_EQUALS(*(ws->getSpectrum(8-2)->getDetectorIDs().begin()), 9); From 1597485ebe8b4dade55cded2288ea1c1d2e336fa Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Thu, 9 Oct 2014 10:46:54 +0100 Subject: [PATCH 080/284] refs #9989 Unix compilation error --- .../DataHandling/inc/MantidDataHandling/LoadISISNexus2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h index 8d8b54862d36..36551826d4ad 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h @@ -192,7 +192,7 @@ namespace Mantid static double dblSqrt(double in); // C++ interface to the NXS file - boost::scoped_ptr<::NeXus::File> m_cppFile; + boost::scoped_ptr< ::NeXus::File> m_cppFile; bool findSpectraDetRangeInFile(NeXus::NXEntry &entry,boost::shared_array &spectrum_index,int64_t ndets,int64_t n_vms_compat_spectra, std::map &monitors,bool excludeMonitors,bool separateMonitors,std::set &ExcludedSpectra); From 294cfddc9fdb82f7bc18d582d062cac0c1923c1f Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Thu, 9 Oct 2014 10:53:21 +0100 Subject: [PATCH 081/284] refs #9989 doxygen error --- Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index 4f784d33ab61..2289e4fb65cb 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -344,7 +344,7 @@ namespace Mantid /** * Check the validity of the optional properties of the algorithm and identify if partial data should be loaded. - * @param SpectraExclued :: set of spectra ID-s to exclude from spectra list to load + * @param SpectraExcluded :: set of spectra ID-s to exclude from spectra list to load */ void LoadISISNexus2::checkOptionalProperties(const std::set &SpectraExcluded) { From d756244389c7af7897b4e70ec131b6a77245c47c Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 9 Oct 2014 11:26:07 +0100 Subject: [PATCH 082/284] Corrected naming, do not sum when only one file given Refs #10323 --- .../IndirectDiffractionReduction.ui | 767 +++++++++--------- .../src/IndirectDiffractionReduction.cpp | 9 + Code/Mantid/instrument/VESUVIO_Parameters.xml | 4 + 3 files changed, 406 insertions(+), 374 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiffractionReduction.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiffractionReduction.ui index 24ddd75627be..c439e8803cf6 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiffractionReduction.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiffractionReduction.ui @@ -7,437 +7,456 @@ 0 0 495 - 370 + 433 Indirect Diffraction - - - - - Instrument - - - - - - - 0 - 0 - - - - - TOF Indirect Geometry Spectroscopy - TOF Indirect Geometry Diffraction - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Reflection - - - - - - - - 0 - 0 - - - - - - - - - - - Input - - - - 6 + + + + + Instrument - - - - - - - 0 - 41 - - - - Run Numbers - - - true - - - + + + + + + 0 + 0 + + + + + TOF Indirect Geometry Spectroscopy + TOF Indirect Geometry Diffraction + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Reflection + + + + + + + + 0 + 0 + + + + + + + + + + + Input + + + + 6 + + + + + + + + 0 + 41 + + + + Run Numbers + + + true + + + + + + + Sum Files + + + + + + + + + + + Spectra Min + + + + + + + + + + Spectra Max + + + + + + + + + + + + + + + + 0 + 0 + + + + 0 + + + + + 0 + 0 + + + + + 0 + - - - Sum Files + + + Calibration + + + 6 + + + + + + 0 + 0 + + + + Cal File + + + false + + + false + + + + .cal + + + + + + + + true + + + + 0 + 0 + + + + Vanadium Runs + + + true + + + + - - - - - - - Spectra Min - - - - - - + + + + + 0 + 0 + + + + + 0 + - - - Spectra Max + + + Rebin in D-Spacing (optional) + + + 6 + + + 6 + + + + + Start: + + + + + + + + + + color: rgb(170, 0, 0); + + + * + + + + + + + Width: + + + + + + + + + + color: rgb(170, 0, 0); + + + * + + + + + + + End: + + + + + + + + + + color: rgb(170, 0, 0); + + + * + + + + - - - - - - - - - - - - 0 - 0 - - - - 0 - - - - - 0 - 0 - + + + + + + + Options - - - 0 - + - - - Calibration + + + <html><head/><body><p>When enabled spectra are not grouped and the output workspace will contain one spectrum per detector.</p></body></html> + + + Use Individual Grouping - - - 6 - - - - - - 0 - 0 - - - - Cal File - - - false - - - false - - - - .cal - - - - - - - - true - - - - 0 - 0 - - - - Vanadium Runs - - - true - - - - - - - - 0 - 0 - + + + + + Output - + - 0 + 6 - - - Rebin in D-Spacing (optional) + + + Plot Type: - - - 6 + + + + + + + None - - 6 + + + + Spectra - - - - Start: - - - - - - - - - - color: rgb(170, 0, 0); - - - * - - - - - - - Width: - - - - - - - - - - color: rgb(170, 0, 0); - - - * - - - - - - - End: - - - - - - - - - - color: rgb(170, 0, 0); - - - * - - - - + - - - - - - Output - - - - 6 + + + + + Select which file formats the data should be saved in. + + Save Formats + + + + 6 + + + + + GSS + + + + + + + Nexus + + + + + + + ASCII (DAT) + + + + + + + + - + + + true + + + + 0 + 0 + + + + + 20 + 20 + + - Plot Type: + ? - - - - None - - - - - Spectra - - - + + + Qt::Horizontal + + + + 40 + 20 + + + - - - - - - - Select which file formats the data should be saved in. - - - Save Formats - - - - 6 - - + - GSS + Run - - - Nexus + + + Qt::Horizontal - + + + 40 + 20 + + + - + - ASCII (DAT) + Manage Directories - - - - - - - - true - - - - 0 - 0 - - - - - 20 - 20 - - - - ? - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Run - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Manage Directories - - - - - - + + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiffractionReduction.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiffractionReduction.cpp index 0c49bcf0c373..4250658fffdd 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiffractionReduction.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiffractionReduction.cpp @@ -129,6 +129,8 @@ void IndirectDiffractionReduction::runGenericReduction(QString instName, QString if(!rebinStart.isEmpty() && !rebinWidth.isEmpty() && !rebinEnd.isEmpty()) rebin = rebinStart + "," + rebinWidth + "," + rebinEnd; + bool individualGrouping = m_uiForm.ckIndividualGrouping->isChecked(); + // Get detector range std::vector detRange; detRange.push_back(m_uiForm.set_leSpecMin->text().toLong()); @@ -138,6 +140,7 @@ void IndirectDiffractionReduction::runGenericReduction(QString instName, QString IAlgorithm_sptr msgDiffReduction = AlgorithmManager::Instance().create("MSGDiffractionReduction"); msgDiffReduction->initialize(); + // Get save formats std::vector saveFormats; if(m_uiForm.ckGSS->isChecked()) saveFormats.push_back("gss"); if(m_uiForm.ckNexus->isChecked()) saveFormats.push_back("nxs"); @@ -150,6 +153,7 @@ void IndirectDiffractionReduction::runGenericReduction(QString instName, QString msgDiffReduction->setProperty("InputFiles", m_uiForm.dem_rawFiles->getFilenames().join(",").toStdString()); msgDiffReduction->setProperty("DetectorRange", detRange); msgDiffReduction->setProperty("RebinParam", rebin.toStdString()); + msgDiffReduction->setProperty("IndividualGrouping", individualGrouping); msgDiffReduction->setProperty("SaveFormats", saveFormats); msgDiffReduction->setProperty("OutputWorkspaceGroup", "IndirectDiffraction_Workspaces"); @@ -530,6 +534,11 @@ void IndirectDiffractionReduction::runFilesFound() m_uiForm.pbRun->setText("Run"); else m_uiForm.pbRun->setText("Invalid Run"); + + // Disable sum files if only one file is given + int fileCount = m_uiForm.dem_rawFiles->getFilenames().size(); + if(fileCount < 2) + m_uiForm.dem_ckSumFiles->setChecked(false); } } diff --git a/Code/Mantid/instrument/VESUVIO_Parameters.xml b/Code/Mantid/instrument/VESUVIO_Parameters.xml index 1ac00f2294d0..9d2fbcaab635 100644 --- a/Code/Mantid/instrument/VESUVIO_Parameters.xml +++ b/Code/Mantid/instrument/VESUVIO_Parameters.xml @@ -153,6 +153,10 @@ + + + + From 87a745864ca0afef98a5e9e20a833bff8843f629 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Thu, 9 Oct 2014 17:48:36 +0100 Subject: [PATCH 083/284] refs #9989 Preparing LoadRawHelper for use with LoadISISNexus2 + changes intended to make logic of LoadISISNexus2 simpler --- .../inc/MantidDataHandling/LoadISISNexus2.h | 53 ++-- .../inc/MantidDataHandling/LoadRawHelper.h | 83 +++--- .../DataHandling/src/LoadISISNexus2.cpp | 120 ++++---- .../Framework/DataHandling/src/LoadRaw3.cpp | 12 +- .../DataHandling/src/LoadRawBin0.cpp | 78 ++--- .../DataHandling/src/LoadRawHelper.cpp | 34 +-- .../DataHandling/src/LoadRawSpectrum0.cpp | 272 +++++++++--------- .../DataHandling/test/LoadISISNexusTest.h | 1 + 8 files changed, 340 insertions(+), 313 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h index 36551826d4ad..f7882de3d306 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h @@ -96,6 +96,25 @@ namespace Mantid int64_t last; ///< last spectrum number of the block bool isMonitor; ///< is the data in a monitor group }; + + /// The structure describes parameters of a single time-block written in the nexus file + struct DataBlock + { + /// The number of data periods + int numberOfPeriods; + /// The number of time channels per spectrum (N histogram bins -1) + std::size_t numberOfChannels; + /// The number of spectra + std::size_t numberOfSpectra; + + DataBlock():numberOfPeriods(0),numberOfChannels(0),numberOfSpectra(0){} + + DataBlock(const NeXus::NXInt &data): + numberOfPeriods(data.dim0()), + numberOfChannels(data.dim2()), + numberOfSpectra (data.dim1()) + {}; + }; private: /// Overwrites Algorithm method. void init(); @@ -106,25 +125,25 @@ namespace Mantid /// Prepare a vector of SpectraBlock structures to simplify loading size_t prepareSpectraBlocks(); /// Run LoadInstrument as a ChildAlgorithm - void runLoadInstrument(DataObjects::Workspace2D_sptr); + void runLoadInstrument(DataObjects::Workspace2D_sptr &); /// Load in details about the run - void loadRunDetails(DataObjects::Workspace2D_sptr local_workspace, Mantid::NeXus::NXEntry & entry); + void loadRunDetails(DataObjects::Workspace2D_sptr &local_workspace, Mantid::NeXus::NXEntry & entry); /// Parse an ISO formatted date-time string into separate date and time strings void parseISODateTime(const std::string & datetime_iso, std::string & date, std::string & time) const; /// Load in details about the sample - void loadSampleData(DataObjects::Workspace2D_sptr, Mantid::NeXus::NXEntry & entry); + void loadSampleData(DataObjects::Workspace2D_sptr &, Mantid::NeXus::NXEntry & entry); /// Load log data from the nexus file - void loadLogs(DataObjects::Workspace2D_sptr ws, Mantid::NeXus::NXEntry & entry); + void loadLogs(DataObjects::Workspace2D_sptr &ws, Mantid::NeXus::NXEntry & entry); // Load a given period into the workspace - void loadPeriodData(int64_t period, Mantid::NeXus::NXEntry & entry, DataObjects::Workspace2D_sptr local_workspace); + void loadPeriodData(int64_t period, Mantid::NeXus::NXEntry & entry, DataObjects::Workspace2D_sptr &local_workspace); // Load a data block void loadBlock(Mantid::NeXus::NXDataSetTyped & data, int64_t blocksize, int64_t period, int64_t start, - int64_t &hist, int64_t& spec_num, DataObjects::Workspace2D_sptr localWorkspace); + int64_t &hist, int64_t& spec_num, DataObjects::Workspace2D_sptr &localWorkspace); // Create period logs - void createPeriodLogs(int64_t period, DataObjects::Workspace2D_sptr local_workspace); + void createPeriodLogs(int64_t period, DataObjects::Workspace2D_sptr &local_workspace); // Validate multi-period logs - void validateMultiPeriodLogs(Mantid::API::MatrixWorkspace_sptr); + void validateMultiPeriodLogs(Mantid::API::MatrixWorkspace_sptr ); // build the list of spectra numbers to load and include in the spectra list void buildSpectraInd2SpectraNumMap(const std::vector &spec_list,const std::set &ExcludedSpectra); @@ -136,18 +155,12 @@ namespace Mantid /// The sample name read from Nexus std::string m_samplename; - /// The number of spectra - std::size_t m_numberOfSpectra; - /// The number of spectra in the raw file - std::size_t m_numberOfSpectraInFile; - /// The number of periods - int m_numberOfPeriods; - /// The number of periods in the raw file - int m_numberOfPeriodsInFile; - /// The number of time channels per spectrum - std::size_t m_numberOfChannels; - /// The number of time channels per spectrum in the raw file - std::size_t m_numberOfChannelsInFile; + // the description of the data block, containing in the file. May include monitors and detectors with the same time binning + DataBlock m_detFileDataInfo; + // the description of single time-range data block, obtained from detectors + DataBlock m_detBlockInfo; + // the description of single time-range data block, obtained from monitors + DataBlock m_monBlockInfo; /// Is there a detector block bool m_have_detector; diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h index fafd84121516..0db15d00eca9 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h @@ -27,32 +27,32 @@ namespace Mantid { /** @class LoadRawHelper DataHandling/LoadRawHelper.h - Helper class for LoadRaw algorithms. + Helper class for LoadRaw algorithms. - @author Sofia Antony, ISIS,RAL - @date 14/04/2010 + @author Sofia Antony, ISIS,RAL + @date 14/04/2010 - Copyright © 2007-9 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + Copyright © 2007-9 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory - This file is part of Mantid. + This file is part of Mantid. - Mantid 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. + Mantid 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. - Mantid 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. + Mantid 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, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . - File change history is stored at: . - Code Documentation is available at: - */ + File change history is stored at: . + Code Documentation is available at: + */ class DLLExport LoadRawHelper: public API::IFileLoader { public: @@ -83,6 +83,28 @@ namespace Mantid static void ProcessLoadMonitorOptions(bool &bincludeMonitors,bool &bseparateMonitors,bool &bexcludeMonitors,API::Algorithm *pAlgo); + ///creates monitor workspace + static void createMonitorWorkspace(DataObjects::Workspace2D_sptr& monws_sptr, + DataObjects::Workspace2D_sptr& ws_sptr,API::WorkspaceGroup_sptr& mongrp_sptr, + const int64_t mwsSpecs,const int64_t nwsSpecs,const int64_t numberOfPeriods,const int64_t lenthIn,std::string title,API::Algorithm *pAlg); + /// creates shared pointer to group workspace + static API::WorkspaceGroup_sptr createGroupWorkspace(); + + ///creates shared pointer to workspace from parent workspace + static DataObjects::Workspace2D_sptr createWorkspace(DataObjects::Workspace2D_sptr ws_sptr, + int64_t nVectors=-1,int64_t xLengthIn=-1,int64_t yLengthIn=-1); + + /// overloaded method to create shared pointer to workspace + static DataObjects::Workspace2D_sptr createWorkspace(int64_t nVectors,int64_t xlengthIn,int64_t ylengthIn,const std::string& title); + + /// sets the workspace property + static void setWorkspaceProperty(const std::string & propertyName,const std::string& title, + API::WorkspaceGroup_sptr grpws_sptr,DataObjects::Workspace2D_sptr ws_sptr,int64_t numberOfPeriods,bool bMonitor,API::Algorithm *pAlg); + + /// overloaded method to set the workspace property + static void setWorkspaceProperty(DataObjects::Workspace2D_sptr ws_sptr,API::WorkspaceGroup_sptr grpws_sptr,const int64_t period,bool bmonitors,API::Algorithm *pAlg); + + protected: /// Overwrites Algorithm method. void init(); @@ -104,19 +126,6 @@ namespace Mantid bool readData(FILE* file,int histToRead); bool readData(FILE* file,int64_t histToRead); - ///creates shared pointer to workspace from parent workspace - DataObjects::Workspace2D_sptr createWorkspace(DataObjects::Workspace2D_sptr ws_sptr, - int64_t nVectors=-1,int64_t xLengthIn=-1,int64_t yLengthIn=-1); - - /// overloaded method to create shared pointer to workspace - DataObjects::Workspace2D_sptr createWorkspace(int64_t nVectors,int64_t xlengthIn,int64_t ylengthIn,const std::string& title); - ///creates monitor workspace - void createMonitorWorkspace(DataObjects::Workspace2D_sptr& monws_sptr, - DataObjects::Workspace2D_sptr& ws_sptr,API::WorkspaceGroup_sptr& mongrp_sptr, - const int64_t mwsSpecs,const int64_t nwsSpecs,const int64_t numberOfPeriods,const int64_t lenthIn,std::string title); - - /// creates shared pointer to group workspace - API::WorkspaceGroup_sptr createGroupWorkspace(); //Constructs the time channel (X) vector(s) std::vector > getTimeChannels(const int64_t& regimes, const int64_t& lengthIn); @@ -135,16 +144,10 @@ namespace Mantid ///gets the monitor spectrum list from the workspace std::vector getmonitorSpectrumList(const API::SpectrumDetectorMapping& mapping); - /// sets the workspace property - void setWorkspaceProperty(const std::string & propertyName,const std::string& title, - API::WorkspaceGroup_sptr grpws_sptr,DataObjects::Workspace2D_sptr ws_sptr,int64_t numberOfPeriods,bool bMonitor); - - /// overloaded method to set the workspace property - void setWorkspaceProperty(DataObjects::Workspace2D_sptr ws_sptr,API::WorkspaceGroup_sptr grpws_sptr,const int64_t period,bool bmonitors); /// This method sets the raw file data to workspace vectors void setWorkspaceData(DataObjects::Workspace2D_sptr newWorkspace,const std::vector >& - timeChannelsVec,int64_t wsIndex,specid_t nspecNum,int64_t noTimeRegimes,int64_t lengthIn,int64_t binStart); + timeChannelsVec,int64_t wsIndex,specid_t nspecNum,int64_t noTimeRegimes,int64_t lengthIn,int64_t binStart); /// ISISRAW class instance which does raw file reading. Shared pointer to prevent memory leak when an exception is thrown. @@ -170,10 +173,10 @@ namespace Mantid specid_t calculateWorkspaceSize(); /// calculate workspace sizes if separate or exclude monitors are selected void calculateWorkspacesizes(const std::vector& monitorSpecList, - specid_t& normalwsSpecs, specid_t& monitorwsSpecs); + specid_t& normalwsSpecs, specid_t& monitorwsSpecs); /// load the specra void loadSpectra(FILE* file,const int& period, const int& m_total_specs, - DataObjects::Workspace2D_sptr ws_sptr,std::vector >); + DataObjects::Workspace2D_sptr ws_sptr,std::vector >); /// Has the spectrum_list property been set? bool m_list; diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index 2289e4fb65cb..a529e3ebaf08 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -49,8 +49,8 @@ namespace Mantid /// Empty default constructor LoadISISNexus2::LoadISISNexus2() : - m_filename(), m_instrument_name(), m_samplename(), m_numberOfSpectra(0), m_numberOfSpectraInFile(0), - m_numberOfPeriods(0), m_numberOfPeriodsInFile(0), m_numberOfChannels(0), m_numberOfChannelsInFile(0), + m_filename(), m_instrument_name(), m_samplename(), + m_detFileDataInfo(),m_detBlockInfo(),m_monBlockInfo(), m_have_detector(false),m_range_supplied(true), m_spec_min(0), m_spec_max(EMPTY_INT()), m_load_selected_spectra(false),m_specInd2specNum_map(),m_spec2det_map(), m_entrynumber(0), m_tof_data(), m_proton_charge(0.), @@ -195,17 +195,17 @@ namespace Mantid std::set ExcluedMonitorsSpectra; bseparateMonitors=findSpectraDetRangeInFile(entry,m_spec,ndets,nsp1[0],m_monitors,bexcludeMonitors,bseparateMonitors,ExcluedMonitorsSpectra); - const size_t x_length = m_numberOfChannels + 1; + const size_t x_length = m_detBlockInfo.numberOfChannels + 1; // Check input is consistent with the file, throwing if not, exclude spectra selected at findSpectraDetRangeInFile; checkOptionalProperties(ExcluedMonitorsSpectra); // Fill up m_spectraBlocks size_t total_specs = prepareSpectraBlocks(); - m_progress = boost::shared_ptr(new Progress(this, 0.0, 1.0, total_specs * m_numberOfPeriods)); + m_progress = boost::shared_ptr(new Progress(this, 0.0, 1.0, total_specs * m_detFileDataInfo.numberOfPeriods)); DataObjects::Workspace2D_sptr local_workspace = boost::dynamic_pointer_cast - (WorkspaceFactory::Instance().create("Workspace2D", total_specs, x_length, m_numberOfChannels)); + (WorkspaceFactory::Instance().create("Workspace2D", total_specs, x_length, m_detFileDataInfo.numberOfChannels)); // Set the units on the workspace to TOF & Counts local_workspace->getAxis(0)->unit() = UnitFactory::Instance().create("TOF"); local_workspace->setYUnit("Counts"); @@ -259,7 +259,7 @@ namespace Mantid createPeriodLogs(firstentry, local_workspace); - if( m_numberOfPeriods > 1 && m_entrynumber == 0 ) + if( m_detFileDataInfo.numberOfPeriods > 1 && m_entrynumber == 0 ) { WorkspaceGroup_sptr wksp_group(new WorkspaceGroup); @@ -269,7 +269,7 @@ namespace Mantid const std::string base_name = getPropertyValue("OutputWorkspace") + "_"; const std::string prop_name = "OutputWorkspace_"; - for( int p = 1; p <= m_numberOfPeriods; ++p ) + for( int p = 1; p <= m_detFileDataInfo.numberOfPeriods; ++p ) { std::ostringstream os; os << p; @@ -288,11 +288,20 @@ namespace Mantid setProperty(prop_name + os.str(), boost::static_pointer_cast(local_workspace)); } // The group is the root property value - setProperty("OutputWorkspace", boost::dynamic_pointer_cast(wksp_group)); + if(!bseparateMonitors) + setProperty("OutputWorkspace", boost::dynamic_pointer_cast(wksp_group)); } else { - setProperty("OutputWorkspace", boost::dynamic_pointer_cast(local_workspace)); + if(!bseparateMonitors) + setProperty("OutputWorkspace", boost::dynamic_pointer_cast(local_workspace)); + } + + //*************************************************************************************************** + // Workspace or group of workspaces without monitors is loaded. Now we are loading monitors separately. + if(bseparateMonitors) + { + } // Clear off the member variable containers @@ -372,7 +381,7 @@ namespace Mantid if( m_spec_max == EMPTY_INT() ) - m_spec_max = m_numberOfSpectra; + m_spec_max = m_detBlockInfo.numberOfSpectra; else m_load_selected_spectra = true; @@ -382,20 +391,20 @@ namespace Mantid throw std::invalid_argument("Inconsistent range properties. SpectrumMin is larger than SpectrumMax."); } - if( static_cast(m_spec_max) > m_numberOfSpectra+numSpectraExclued ) + if( static_cast(m_spec_max) > m_detBlockInfo.numberOfSpectra+numSpectraExclued ) { - std::string err="Inconsistent range property. SpectrumMax is larger than number of spectra: "+boost::lexical_cast(m_numberOfSpectra+numSpectraExclued ); + std::string err="Inconsistent range property. SpectrumMax is larger than number of spectra: "+boost::lexical_cast(m_detFileDataInfo.numberOfSpectra+numSpectraExclued ); throw std::invalid_argument(err); } // Check the entry number m_entrynumber = getProperty("EntryNumber"); - if( static_cast(m_entrynumber) > m_numberOfPeriods || m_entrynumber < 0 ) + if( static_cast(m_entrynumber) > m_detBlockInfo.numberOfPeriods || m_entrynumber < 0 ) { - std::string err="Invalid entry number entered. File contains "+boost::lexical_cast(m_numberOfPeriods )+ " period. "; + std::string err="Invalid entry number entered. File contains "+boost::lexical_cast(m_detBlockInfo.numberOfPeriods)+ " period. "; throw std::invalid_argument(err); } - if( m_numberOfPeriods == 1 ) + if(m_detBlockInfo.numberOfPeriods== 1 ) { m_entrynumber = 1; } @@ -409,9 +418,9 @@ namespace Mantid // Sort the list so that we can check it's range std::sort(spec_list.begin(), spec_list.end()); - if( spec_list.back() > static_cast(m_numberOfSpectra+numSpectraExclued) ) + if( spec_list.back() > static_cast(m_detBlockInfo.numberOfSpectra+numSpectraExclued) ) { - std::string err="A spectra number in the spectra list exceeds total number of "+boost::lexical_cast(m_numberOfSpectra+numSpectraExclued )+ " spectra "; + std::string err="A spectra number in the spectra list exceeds total number of "+boost::lexical_cast(m_detBlockInfo.numberOfSpectra+numSpectraExclued )+ " spectra "; throw std::invalid_argument(err); } @@ -620,7 +629,7 @@ namespace Mantid * @param entry :: The opened root entry node for accessing the monitor and data nodes * @param local_workspace :: The workspace to place the data in */ - void LoadISISNexus2::loadPeriodData(int64_t period, NXEntry & entry, DataObjects::Workspace2D_sptr local_workspace) + void LoadISISNexus2::loadPeriodData(int64_t period, NXEntry & entry, DataObjects::Workspace2D_sptr &local_workspace) { int64_t hist_index = 0; int64_t period_index(period - 1); @@ -637,7 +646,7 @@ namespace Mantid m_progress->report("Loading monitor"); mondata.load(1,static_cast(period-1)); // TODO this is just wrong MantidVec& Y = local_workspace->dataY(hist_index); - Y.assign(mondata(),mondata() + m_numberOfChannels); + Y.assign(mondata(),mondata() + m_monBlockInfo.numberOfChannels); MantidVec& E = local_workspace->dataE(hist_index); std::transform(Y.begin(), Y.end(), E.begin(), dblSqrt); @@ -706,7 +715,7 @@ namespace Mantid * @param period :: period number * @param local_workspace :: workspace to add period log data to. */ - void LoadISISNexus2::createPeriodLogs(int64_t period, DataObjects::Workspace2D_sptr local_workspace) + void LoadISISNexus2::createPeriodLogs(int64_t period, DataObjects::Workspace2D_sptr &local_workspace) { m_logCreator->addPeriodLogs(static_cast(period), local_workspace->mutableRun()); } @@ -724,18 +733,19 @@ namespace Mantid */ void LoadISISNexus2::loadBlock(NXDataSetTyped & data, int64_t blocksize, int64_t period, int64_t start, int64_t &hist, int64_t& spec_num, - DataObjects::Workspace2D_sptr local_workspace) + DataObjects::Workspace2D_sptr &local_workspace) { data.load(static_cast(blocksize), static_cast(period), static_cast(start)); // TODO this is just wrong int *data_start = data(); - int *data_end = data_start + m_numberOfChannels; + int *data_end = data_start + m_detBlockInfo.numberOfChannels; int64_t final(hist + blocksize); while( hist < final ) { m_progress->report("Loading data"); MantidVec& Y = local_workspace->dataY(hist); Y.assign(data_start, data_end); - data_start += m_numberOfChannels; data_end += m_numberOfChannels; + data_start += m_detBlockInfo.numberOfChannels; + data_end += m_detBlockInfo.numberOfChannels; MantidVec& E = local_workspace->dataE(hist); std::transform(Y.begin(), Y.end(), E.begin(), dblSqrt); // Populate the workspace. Loop starts from 1, hence i-1 @@ -757,7 +767,7 @@ namespace Mantid } /// Run the Child Algorithm LoadInstrument (or LoadInstrumentFromNexus) - void LoadISISNexus2::runLoadInstrument(DataObjects::Workspace2D_sptr localWorkspace) + void LoadISISNexus2::runLoadInstrument(DataObjects::Workspace2D_sptr &localWorkspace) { IAlgorithm_sptr loadInst = createChildAlgorithm("LoadInstrument"); @@ -816,7 +826,7 @@ namespace Mantid * @param local_workspace :: The workspace to load the run information in to * @param entry :: The Nexus entry */ - void LoadISISNexus2::loadRunDetails(DataObjects::Workspace2D_sptr local_workspace, NXEntry & entry) + void LoadISISNexus2::loadRunDetails(DataObjects::Workspace2D_sptr &local_workspace, NXEntry & entry) { API::Run & runDetails = local_workspace->mutableRun(); // Charge is stored as a float @@ -859,9 +869,9 @@ namespace Mantid runDetails.addProperty("run_header", std::string(header, header + 86)); // Data details on run not the workspace - runDetails.addProperty("nspectra", static_cast(m_numberOfSpectraInFile)); - runDetails.addProperty("nchannels", static_cast(m_numberOfChannelsInFile)); - runDetails.addProperty("nperiods", static_cast(m_numberOfPeriodsInFile)); + runDetails.addProperty("nspectra", static_cast(m_detFileDataInfo.numberOfSpectra)); + runDetails.addProperty("nchannels", static_cast(m_detFileDataInfo.numberOfChannels)); + runDetails.addProperty("nperiods", static_cast(m_detFileDataInfo.numberOfPeriods)); // RPB struct info NXInt rpb_int = vms_compat.openNXInt("IRPB"); @@ -932,7 +942,7 @@ namespace Mantid * @param local_workspace :: The workspace to load the logs to. * @param entry :: The Nexus entry */ - void LoadISISNexus2::loadSampleData(DataObjects::Workspace2D_sptr local_workspace, NXEntry & entry) + void LoadISISNexus2::loadSampleData(DataObjects::Workspace2D_sptr &local_workspace, NXEntry & entry) { /// Sample geometry NXInt spb = entry.openNXInt("isis_vms_compat/SPB"); @@ -958,7 +968,7 @@ namespace Mantid * @param ws :: The workspace to load the logs to. * @param entry :: Nexus entry */ - void LoadISISNexus2::loadLogs(DataObjects::Workspace2D_sptr ws, NXEntry & entry) + void LoadISISNexus2::loadLogs(DataObjects::Workspace2D_sptr &ws, NXEntry & entry) { IAlgorithm_sptr alg = createChildAlgorithm("LoadNexusLogs", 0.0, 0.5); alg->setPropertyValue("Filename", this->getProperty("Filename")); @@ -993,7 +1003,7 @@ namespace Mantid ws->populateInstrumentParameters(); // Make log creator object and add the run status log - m_logCreator.reset(new ISISRunLogs(ws->run(), m_numberOfPeriods)); + m_logCreator.reset(new ISISRunLogs(ws->run(), m_detBlockInfo.numberOfPeriods)); m_logCreator->addStatusLog(ws->mutableRun()); } @@ -1031,52 +1041,50 @@ namespace Mantid { NXInt chans = entry.openNXInt(m_monitors.begin()->second + "/data"); - nMonitorPeriods = chans.dim0(); - nMonitorChannels = chans.dim2(); - m_numberOfPeriodsInFile = m_numberOfPeriods = nMonitorPeriods ; - m_numberOfSpectraInFile = m_numberOfSpectra = nmons; - m_numberOfChannelsInFile = m_numberOfChannels = nMonitorChannels; + m_monBlockInfo = DataBlock(chans); + m_monBlockInfo.numberOfSpectra = nmons; // each monitor is in separate group so number of spectra is equal to number of groups. + // at this stage let's set up all other detector information to monitors + m_detFileDataInfo = m_monBlockInfo; + m_detBlockInfo = m_monBlockInfo; } if( ndets == 0 ) { - separateMonitors = true; + separateMonitors = false; // load monitors in the main workspace. No detectors return separateMonitors; } + // detectors are present in the file NXData nxData = entry.openNXData("detector_1"); NXInt data = nxData.openIntData(); - m_numberOfPeriodsInFile = m_numberOfPeriods = data.dim0(); - m_numberOfChannelsInFile = m_numberOfChannels = data.dim2(); - if (((m_numberOfPeriodsInFile !=nMonitorPeriods) || (m_numberOfChannelsInFile!=nMonitorChannels)) && nmons>0) + m_detBlockInfo = DataBlock(data); + m_detFileDataInfo = m_detBlockInfo; + if (((m_detBlockInfo.numberOfPeriods!=m_monBlockInfo.numberOfPeriods) || (m_detBlockInfo.numberOfChannels!=m_monBlockInfo.numberOfChannels)) && nmons>0) { + // detectors and monitors have different characteristics. Can be loaded only to separate workspaces. if(!separateMonitors) { g_log.warning()<<" Performing separate loading as can not load spectra and monitors in the single workspace:\n" ; - g_log.warning()<<" Monitors data contain :"<( n_vms_compat_spectra )&& !removeMonitors) + // workspace contain the same number of bins for spectra and monitors. Total number of spectra in workspace will be equal to + // n_vms_compat_spectra + if(!removeMonitors) { - // workspace contain the same number of bins for spectra and monitors. Total number of spectra in workspace will be equal to - // n_vms_compat_spectra - m_numberOfSpectraInFile = m_numberOfSpectra; - m_numberOfSpectra=n_vms_compat_spectra; - return separateMonitors; + m_detFileDataInfo.numberOfSpectra = n_vms_compat_spectra; + if(m_detBlockInfo.numberOfSpectra+nmons ==static_cast( n_vms_compat_spectra )) + return separateMonitors; } //Now check if monitors expand or shrink the workspace's spectra range - + // We assume again that this spectrum list increases monotonically int64_t min_index = spectrum_index[0]; int64_t max_index = spectrum_index[ndets-1]; @@ -1088,16 +1096,18 @@ namespace Mantid { if(removeMonitors) { - m_numberOfSpectra--; MonitorSpectra.insert(static_cast(it->first)); + m_detBlockInfo.numberOfSpectra--; } + } else { if(!removeMonitors) { remaining_monitors.insert(*it); - m_numberOfSpectra++; + m_detBlockInfo.numberOfSpectra++; + } } } diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp index 4305719e5c43..812d7336ba51 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRaw3.cpp @@ -159,7 +159,7 @@ namespace Mantid if (bincludeMonitors) { - setWorkspaceProperty("OutputWorkspace", title, ws_grp, localWorkspace,m_numberOfPeriods, false); + setWorkspaceProperty("OutputWorkspace", title, ws_grp, localWorkspace,m_numberOfPeriods, false,this); } else { @@ -181,13 +181,13 @@ namespace Mantid if(normalwsSpecs > 0) { localWorkspace = createWorkspace(localWorkspace,normalwsSpecs,m_lengthIn,m_lengthIn-1); - setWorkspaceProperty("OutputWorkspace", title, ws_grp, localWorkspace,m_numberOfPeriods,false); + setWorkspaceProperty("OutputWorkspace", title, ws_grp, localWorkspace,m_numberOfPeriods,false,this); } //now create monitor workspace if separateMonitors selected if (bseparateMonitors) { createMonitorWorkspace(monitorWorkspace,localWorkspace,monitorws_grp,monitorwsSpecs, - normalwsSpecs,m_numberOfPeriods,m_lengthIn,title); + normalwsSpecs,m_numberOfPeriods,m_lengthIn,title,this); } } @@ -285,18 +285,18 @@ namespace Mantid if(normalwsSpecs > 0) { // declare and set monitor workspace for each period - setWorkspaceProperty(monitorWorkspace, monitorws_grp, period, true); + setWorkspaceProperty(monitorWorkspace, monitorws_grp, period, true,this); } else { localWorkspace = monitorWorkspace; } // declare and set output workspace for each period - setWorkspaceProperty(localWorkspace, ws_grp, period, false); + setWorkspaceProperty(localWorkspace, ws_grp, period, false,this); } else { - setWorkspaceProperty(localWorkspace, ws_grp, period, false); + setWorkspaceProperty(localWorkspace, ws_grp, period, false,this); } // progress for workspace groups setProg ( static_cast(period) / static_cast(m_numberOfPeriods - 1) ); diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRawBin0.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRawBin0.cpp index a1db683630ff..5c5d402850c8 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRawBin0.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRawBin0.cpp @@ -65,31 +65,31 @@ void LoadRawBin0::init() */ void LoadRawBin0::exec() { - // Retrieve the filename from the properties - m_filename = getPropertyValue("Filename"); + // Retrieve the filename from the properties + m_filename = getPropertyValue("Filename"); - bool bLoadlogFiles = getProperty("LoadLogFiles"); + bool bLoadlogFiles = getProperty("LoadLogFiles"); - //open the raw file - FILE* file=openRawFile(m_filename); + //open the raw file + FILE* file=openRawFile(m_filename); - // Need to check that the file is not a text file as the ISISRAW routines don't deal with these very well, i.e - // reading continues until a bad_alloc is encountered. - if( isAscii(file) ) - { - g_log.error() << "File \"" << m_filename << "\" is not a valid RAW file.\n"; - throw std::invalid_argument("Incorrect file type encountered."); - } - std::string title; - readTitle(file,title); + // Need to check that the file is not a text file as the ISISRAW routines don't deal with these very well, i.e + // reading continues until a bad_alloc is encountered. + if( isAscii(file) ) + { + g_log.error() << "File \"" << m_filename << "\" is not a valid RAW file.\n"; + throw std::invalid_argument("Incorrect file type encountered."); + } + std::string title; + readTitle(file,title); - readworkspaceParameters(m_numberOfSpectra,m_numberOfPeriods,m_lengthIn,m_noTimeRegimes); + readworkspaceParameters(m_numberOfSpectra,m_numberOfPeriods,m_lengthIn,m_noTimeRegimes); - /// - setOptionalProperties(); + /// + setOptionalProperties(); - // to validate the optional parameters, if set - checkOptionalProperties(); + // to validate the optional parameters, if set + checkOptionalProperties(); // Calculate the size of a workspace, given its number of periods & spectra to read m_total_specs = calculateWorkspaceSize(); @@ -114,7 +114,7 @@ void LoadRawBin0::exec() setProtonCharge(run); WorkspaceGroup_sptr ws_grp = createGroupWorkspace(); - setWorkspaceProperty("OutputWorkspace", title, ws_grp, localWorkspace,m_numberOfPeriods, false); + setWorkspaceProperty("OutputWorkspace", title, ws_grp, localWorkspace,m_numberOfPeriods, false,this); // Loop over the number of periods in the raw file, putting each period in a separate workspace for (int period = 0; period < m_numberOfPeriods; ++period) @@ -147,14 +147,14 @@ void LoadRawBin0::exec() { progress(m_prog, "Reading raw file data..."); //readData(file, histToRead); - //read spectrum - if (!readData(file, histToRead)) - { - throw std::runtime_error("Error reading raw file"); - } - int64_t binStart=0; - setWorkspaceData(localWorkspace, m_timeChannelsVec, wsIndex, i, m_noTimeRegimes,1,binStart); - ++wsIndex; + //read spectrum + if (!readData(file, histToRead)) + { + throw std::runtime_error("Error reading raw file"); + } + int64_t binStart=0; + setWorkspaceData(localWorkspace, m_timeChannelsVec, wsIndex, i, m_noTimeRegimes,1,binStart); + ++wsIndex; if (m_numberOfPeriods == 1) { @@ -166,19 +166,19 @@ void LoadRawBin0::exec() } } - else - { - skipData(file, histToRead); - } + else + { + skipData(file, histToRead); + } } - - if(m_numberOfPeriods>1) - { - setWorkspaceProperty(localWorkspace, ws_grp, period, false); - // progress for workspace groups - m_prog = static_cast(period) / static_cast(m_numberOfPeriods - 1); - } + + if(m_numberOfPeriods>1) + { + setWorkspaceProperty(localWorkspace, ws_grp, period, false,this); + // progress for workspace groups + m_prog = static_cast(period) / static_cast(m_numberOfPeriods - 1); + } } // loop over periods // Clean up diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp index 95897381a5b9..f6d2f88132ab 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp @@ -237,11 +237,11 @@ namespace Mantid *@param numberOfPeriods :: total number of periods from raw file *@param lengthIn :: size of workspace vectors *@param title :: title of the workspace - + *@param pAlg :: pointer to the algorithm, this method works with. */ void LoadRawHelper::createMonitorWorkspace(DataObjects::Workspace2D_sptr& monws_sptr,DataObjects::Workspace2D_sptr& normalws_sptr, WorkspaceGroup_sptr& mongrp_sptr,const int64_t mwsSpecs,const int64_t nwsSpecs, - const int64_t numberOfPeriods,const int64_t lengthIn,const std::string title) + const int64_t numberOfPeriods,const int64_t lengthIn,const std::string title,API::Algorithm *pAlg) { try { @@ -262,31 +262,31 @@ namespace Mantid } if(!monws_sptr) return ; - std::string wsName= getPropertyValue("OutputWorkspace"); + std::string wsName= pAlg->getPropertyValue("OutputWorkspace"); // if the normal output workspace size>0 then set the workspace as "MonitorWorkspace" // otherwise set the workspace as "OutputWorkspace" if (nwsSpecs> 0) { std::string monitorwsName = wsName + "_monitors"; - declareProperty(new WorkspaceProperty ("MonitorWorkspace", monitorwsName, + pAlg->declareProperty(new WorkspaceProperty ("MonitorWorkspace", monitorwsName, Direction::Output)); - setWorkspaceProperty("MonitorWorkspace", title, mongrp_sptr, monws_sptr,numberOfPeriods, true); + setWorkspaceProperty("MonitorWorkspace", title, mongrp_sptr, monws_sptr,numberOfPeriods, true,pAlg); } else { //if only monitors range selected //then set the monitor workspace as the outputworkspace - setWorkspaceProperty("OutputWorkspace", title, mongrp_sptr, monws_sptr,numberOfPeriods, false); + setWorkspaceProperty("OutputWorkspace", title, mongrp_sptr, monws_sptr,numberOfPeriods, false,pAlg); } } catch(std::out_of_range& ) { - g_log.debug()<<"Error in creating monitor workspace"<getLogger().debug()<<"Error in creating monitor workspace"<getLogger().debug()<<"Error in creating monitor workspace"<getProperty("OutputWorkspace"); std::stringstream suffix; suffix << (period + 1); if (bmonitors) @@ -328,8 +328,8 @@ namespace Mantid outputWorkspace = "OutputWorkspace"; } outws = outputWorkspace + "_" + suffix.str(); - declareProperty(new WorkspaceProperty (outws, wsName, Direction::Output)); - setProperty(outws, boost::static_pointer_cast(ws_sptr)); + pAlg->declareProperty(new WorkspaceProperty (outws, wsName, Direction::Output)); + pAlg->setProperty(outws, boost::static_pointer_cast(ws_sptr)); grpws_sptr->addWorkspace( ws_sptr ); } @@ -338,14 +338,14 @@ namespace Mantid * @param title :: title of the workspace * @param grpws_sptr :: shared pointer to group workspace * @param ws_sptr :: shared pointer to workspace - * @param numberOfPeriods :: numer periods in the raw file + * @param numberOfPeriods :: number periods in the raw file * @param bMonitor to identify the workspace is an output workspace or monitor workspace */ void LoadRawHelper::setWorkspaceProperty(const std::string& propertyName, const std::string& title, - WorkspaceGroup_sptr grpws_sptr, DataObjects::Workspace2D_sptr ws_sptr,int64_t numberOfPeriods, bool bMonitor) + WorkspaceGroup_sptr grpws_sptr, DataObjects::Workspace2D_sptr ws_sptr,int64_t numberOfPeriods, bool bMonitor,API::Algorithm *pAlg) { UNUSED_ARG(bMonitor); - Property *ws = getProperty("OutputWorkspace"); + Property *ws = pAlg->getProperty("OutputWorkspace"); if(!ws) return; if(!grpws_sptr) return; if(!ws_sptr)return; @@ -353,11 +353,11 @@ namespace Mantid ws_sptr->getAxis(0)->unit() = UnitFactory::Instance().create("TOF"); if (numberOfPeriods > 1) { - setProperty(propertyName, boost::dynamic_pointer_cast(grpws_sptr)); + pAlg->setProperty(propertyName, boost::dynamic_pointer_cast(grpws_sptr)); } else { - setProperty(propertyName, boost::dynamic_pointer_cast(ws_sptr)); + pAlg->setProperty(propertyName, boost::dynamic_pointer_cast(ws_sptr)); } } diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRawSpectrum0.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRawSpectrum0.cpp index 888e0d29496e..a79ee46b980e 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRawSpectrum0.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRawSpectrum0.cpp @@ -19,155 +19,155 @@ namespace Mantid { - namespace DataHandling - { - // Register the algorithm into the algorithm factory - DECLARE_ALGORITHM(LoadRawSpectrum0) - - - using namespace Kernel; - using namespace API; - - /// Constructor - LoadRawSpectrum0::LoadRawSpectrum0() : - m_filename(), m_numberOfSpectra(0), - m_specTimeRegimes(), m_prog(0.0) - { - } - - LoadRawSpectrum0::~LoadRawSpectrum0() - { - } - - /// Initialisation method. - void LoadRawSpectrum0::init() - { - LoadRawHelper::init(); - - } - - /** Executes the algorithm. Reading in the file and creating and populating - * the output workspace - * - * @throw Exception::FileError If the RAW file cannot be found/opened - * @throw std::invalid_argument If the optional properties are set to invalid values - */ - void LoadRawSpectrum0::exec() - { - // Retrieve the filename from the properties - m_filename = getPropertyValue("Filename"); - - bool bLoadlogFiles = getProperty("LoadLogFiles"); - - //open the raw file + namespace DataHandling + { + // Register the algorithm into the algorithm factory + DECLARE_ALGORITHM(LoadRawSpectrum0) + + + using namespace Kernel; + using namespace API; + + /// Constructor + LoadRawSpectrum0::LoadRawSpectrum0() : + m_filename(), m_numberOfSpectra(0), + m_specTimeRegimes(), m_prog(0.0) + { + } + + LoadRawSpectrum0::~LoadRawSpectrum0() + { + } + + /// Initialisation method. + void LoadRawSpectrum0::init() + { + LoadRawHelper::init(); + + } + + /** Executes the algorithm. Reading in the file and creating and populating + * the output workspace + * + * @throw Exception::FileError If the RAW file cannot be found/opened + * @throw std::invalid_argument If the optional properties are set to invalid values + */ + void LoadRawSpectrum0::exec() + { + // Retrieve the filename from the properties + m_filename = getPropertyValue("Filename"); + + bool bLoadlogFiles = getProperty("LoadLogFiles"); + + //open the raw file FILE* file=openRawFile(m_filename); - // Need to check that the file is not a text file as the ISISRAW routines don't deal with these very well, i.e - // reading continues until a bad_alloc is encountered. - if( isAscii(file) ) - { - g_log.error() << "File \"" << m_filename << "\" is not a valid RAW file.\n"; - throw std::invalid_argument("Incorrect file type encountered."); - } + // Need to check that the file is not a text file as the ISISRAW routines don't deal with these very well, i.e + // reading continues until a bad_alloc is encountered. + if( isAscii(file) ) + { + g_log.error() << "File \"" << m_filename << "\" is not a valid RAW file.\n"; + throw std::invalid_argument("Incorrect file type encountered."); + } - std::string title; - readTitle(file,title); + std::string title; + readTitle(file,title); readworkspaceParameters(m_numberOfSpectra,m_numberOfPeriods,m_lengthIn,m_noTimeRegimes); - // Calculate the size of a workspace, given its number of periods & spectra to read - const int64_t total_specs = 1; + // Calculate the size of a workspace, given its number of periods & spectra to read + const int64_t total_specs = 1; - // Get the time channel array(s) and store in a vector inside a shared pointer - std::vector > timeChannelsVec = - getTimeChannels(m_noTimeRegimes, m_lengthIn); + // Get the time channel array(s) and store in a vector inside a shared pointer + std::vector > timeChannelsVec = + getTimeChannels(m_noTimeRegimes, m_lengthIn); - double histTotal = static_cast(total_specs * m_numberOfPeriods); - int64_t histCurrent = -1; + double histTotal = static_cast(total_specs * m_numberOfPeriods); + int64_t histCurrent = -1; - // Create the 2D workspace for the output - DataObjects::Workspace2D_sptr localWorkspace =createWorkspace(total_specs, m_lengthIn,m_lengthIn-1,title); - - Run& run = localWorkspace->mutableRun(); + // Create the 2D workspace for the output + DataObjects::Workspace2D_sptr localWorkspace =createWorkspace(total_specs, m_lengthIn,m_lengthIn-1,title); + + Run& run = localWorkspace->mutableRun(); - if(bLoadlogFiles) - { - runLoadLog(m_filename,localWorkspace, 0.0, 0.0); + if(bLoadlogFiles) + { + runLoadLog(m_filename,localWorkspace, 0.0, 0.0); const int period_number = 1; createPeriodLogs(period_number, localWorkspace); - } - // Set the total proton charge for this run - setProtonCharge(run); - - WorkspaceGroup_sptr wsgrp_sptr = createGroupWorkspace(); - setWorkspaceProperty("OutputWorkspace", title, wsgrp_sptr, localWorkspace,m_numberOfPeriods, false); - - // Loop over the number of periods in the raw file, putting each period in a separate workspace - for (int period = 0; period < m_numberOfPeriods; ++period) - { - if (period > 0) - { - localWorkspace = boost::dynamic_pointer_cast( - WorkspaceFactory::Instance().create(localWorkspace)); - - if(bLoadlogFiles) - { - //remove previous period data - std::stringstream prevPeriod; - prevPeriod << "PERIOD " << (period); - Run& runObj = localWorkspace->mutableRun(); - runObj.removeLogData(prevPeriod.str()); + } + // Set the total proton charge for this run + setProtonCharge(run); + + WorkspaceGroup_sptr wsgrp_sptr = createGroupWorkspace(); + setWorkspaceProperty("OutputWorkspace", title, wsgrp_sptr, localWorkspace,m_numberOfPeriods, false,this); + + // Loop over the number of periods in the raw file, putting each period in a separate workspace + for (int period = 0; period < m_numberOfPeriods; ++period) + { + if (period > 0) + { + localWorkspace = boost::dynamic_pointer_cast( + WorkspaceFactory::Instance().create(localWorkspace)); + + if(bLoadlogFiles) + { + //remove previous period data + std::stringstream prevPeriod; + prevPeriod << "PERIOD " << (period); + Run& runObj = localWorkspace->mutableRun(); + runObj.removeLogData(prevPeriod.str()); runObj.removeLogData("current_period"); - //add current period data + //add current period data int period_number = static_cast(period+1); createPeriodLogs(period_number, localWorkspace); - } - //skip all spectra except the first one in each period - for(int i=1;i<=m_numberOfSpectra;++i) - { - skipData(file, i+ (period-1)*(m_numberOfSpectra+1) ); - } - } - - int64_t wsIndex = 0; - // for each period read first spectrum - int64_t histToRead = period*(m_numberOfSpectra+1); - - progress(m_prog, "Reading raw file data..."); - //isisRaw->readData(file, histToRead); - //readData(file, histToRead); - //read spectrum - if (!readData(file, histToRead)) - { - throw std::runtime_error("Error reading raw file"); - } - - //set the workspace data - setWorkspaceData(localWorkspace, timeChannelsVec, wsIndex, 0, m_noTimeRegimes,m_lengthIn,1); - - if (m_numberOfPeriods == 1) - { - if (++histCurrent % 100 == 0) - { - m_prog = double(histCurrent) / histTotal; - } - interruption_point(); - } - if(m_numberOfPeriods>1) - { - setWorkspaceProperty(localWorkspace, wsgrp_sptr, period, false); - // progress for workspace groups - m_prog = static_cast(period) / static_cast(m_numberOfPeriods - 1); - } - - } // loop over periods - - // Clean up - reset(); - fclose(file); - - } - - - } + } + //skip all spectra except the first one in each period + for(int i=1;i<=m_numberOfSpectra;++i) + { + skipData(file, i+ (period-1)*(m_numberOfSpectra+1) ); + } + } + + int64_t wsIndex = 0; + // for each period read first spectrum + int64_t histToRead = period*(m_numberOfSpectra+1); + + progress(m_prog, "Reading raw file data..."); + //isisRaw->readData(file, histToRead); + //readData(file, histToRead); + //read spectrum + if (!readData(file, histToRead)) + { + throw std::runtime_error("Error reading raw file"); + } + + //set the workspace data + setWorkspaceData(localWorkspace, timeChannelsVec, wsIndex, 0, m_noTimeRegimes,m_lengthIn,1); + + if (m_numberOfPeriods == 1) + { + if (++histCurrent % 100 == 0) + { + m_prog = double(histCurrent) / histTotal; + } + interruption_point(); + } + if(m_numberOfPeriods>1) + { + setWorkspaceProperty(localWorkspace, wsgrp_sptr, period, false,this); + // progress for workspace groups + m_prog = static_cast(period) / static_cast(m_numberOfPeriods - 1); + } + + } // loop over periods + + // Clean up + reset(); + fclose(file); + + } + + + } } diff --git a/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h b/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h index 1b4b5e4fc369..5f17b3feaa9d 100644 --- a/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h +++ b/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h @@ -464,6 +464,7 @@ class LoadISISNexusTest : public CxxTest::TestSuite TS_ASSERT_THROWS_NOTHING(ld.execute()); TS_ASSERT(ld.isExecuted()); + MatrixWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS("outWS"); TS_ASSERT_EQUALS(ws->blocksize(),5); TS_ASSERT_EQUALS(ws->getNumberHistograms(),17790); From da40d52c8c56ccbef7f5973f98891316ad05737d Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Fri, 10 Oct 2014 15:33:36 +0100 Subject: [PATCH 084/284] refs #9989 Include&Exclude monitors seems work fine (with groups too) --- .../inc/MantidDataHandling/LoadISISNexus2.h | 37 +-- .../DataHandling/src/LoadISISNexus2.cpp | 281 +++++++++++------- 2 files changed, 189 insertions(+), 129 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h index f7882de3d306..198d0dce7fc7 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h @@ -100,19 +100,25 @@ namespace Mantid /// The structure describes parameters of a single time-block written in the nexus file struct DataBlock { - /// The number of data periods + // The number of data periods int numberOfPeriods; - /// The number of time channels per spectrum (N histogram bins -1) + // The number of time channels per spectrum (N histogram bins -1) std::size_t numberOfChannels; - /// The number of spectra - std::size_t numberOfSpectra; + // The number of spectra + size_t numberOfSpectra; + // minimal spectra Id (by default 1, undefined -- max_value) + int64_t spectraID_min; + // maximal spectra Id (by default 1, undefined -- 0) + int64_t spectraID_max; - DataBlock():numberOfPeriods(0),numberOfChannels(0),numberOfSpectra(0){} + DataBlock():numberOfPeriods(0),numberOfChannels(0),numberOfSpectra(0),spectraID_min(std::numeric_limits::max()),spectraID_max(0){} DataBlock(const NeXus::NXInt &data): numberOfPeriods(data.dim0()), numberOfChannels(data.dim2()), - numberOfSpectra (data.dim1()) + numberOfSpectra (data.dim1()), + spectraID_min(1), + spectraID_max(numberOfSpectra) {}; }; private: @@ -145,7 +151,7 @@ namespace Mantid // Validate multi-period logs void validateMultiPeriodLogs(Mantid::API::MatrixWorkspace_sptr ); // build the list of spectra numbers to load and include in the spectra list - void buildSpectraInd2SpectraNumMap(const std::vector &spec_list,const std::set &ExcludedSpectra); + void buildSpectraInd2SpectraNumMap(bool range_supplied,int64_t range_min,int64_t range_max,const std::vector &spec_list,const std::set &ExcludedSpectra); /// The name and path of the input file @@ -155,22 +161,19 @@ namespace Mantid /// The sample name read from Nexus std::string m_samplename; - // the description of the data block, containing in the file. May include monitors and detectors with the same time binning - DataBlock m_detFileDataInfo; - // the description of single time-range data block, obtained from detectors + // the description of the data block in the file to load. + // the description of single time-range data block, obtained from detectors DataBlock m_detBlockInfo; // the description of single time-range data block, obtained from monitors DataBlock m_monBlockInfo; + // description of the block to be loaded may include monitors and detectors with the same time binning if the detectors and monitors are loaded together + // in single workspace or equal to the detectorBlock if monitors are excluded + // or monBlockInfo if only monitors are loaded. + DataBlock m_loadBlockInfo; + /// Is there a detector block bool m_have_detector; - - /// Have the spectrum_min/max properties been set? - bool m_range_supplied; - /// The value of the SpectrumMin property - int64_t m_spec_min; - /// The value of the SpectrumMax property - int64_t m_spec_max; /// if true, a spectra list or range of spectra is supplied bool m_load_selected_spectra; /// map of spectra Index to spectra Number (spectraID) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index a529e3ebaf08..6b45d8219b40 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -50,8 +50,8 @@ namespace Mantid /// Empty default constructor LoadISISNexus2::LoadISISNexus2() : m_filename(), m_instrument_name(), m_samplename(), - m_detFileDataInfo(),m_detBlockInfo(),m_monBlockInfo(), - m_have_detector(false),m_range_supplied(true), m_spec_min(0), m_spec_max(EMPTY_INT()), + m_detBlockInfo(),m_monBlockInfo(),m_loadBlockInfo(), + m_have_detector(false), m_load_selected_spectra(false),m_specInd2specNum_map(),m_spec2det_map(), m_entrynumber(0), m_tof_data(), m_proton_charge(0.), m_spec(), m_monitors(), m_logCreator(), m_progress() @@ -161,7 +161,7 @@ namespace Mantid spec.load(); size_t nmons(0); - + //Pull out the monitor blocks, if any exist for(std::vector::const_iterator it = entry.groups().begin(); @@ -202,10 +202,10 @@ namespace Mantid // Fill up m_spectraBlocks size_t total_specs = prepareSpectraBlocks(); - m_progress = boost::shared_ptr(new Progress(this, 0.0, 1.0, total_specs * m_detFileDataInfo.numberOfPeriods)); + m_progress = boost::shared_ptr(new Progress(this, 0.0, 1.0, total_specs * m_detBlockInfo.numberOfPeriods)); DataObjects::Workspace2D_sptr local_workspace = boost::dynamic_pointer_cast - (WorkspaceFactory::Instance().create("Workspace2D", total_specs, x_length, m_detFileDataInfo.numberOfChannels)); + (WorkspaceFactory::Instance().create("Workspace2D", total_specs, x_length, m_detBlockInfo.numberOfChannels)); // Set the units on the workspace to TOF & Counts local_workspace->getAxis(0)->unit() = UnitFactory::Instance().create("TOF"); local_workspace->setYUnit("Counts"); @@ -259,7 +259,7 @@ namespace Mantid createPeriodLogs(firstentry, local_workspace); - if( m_detFileDataInfo.numberOfPeriods > 1 && m_entrynumber == 0 ) + if( m_detBlockInfo.numberOfPeriods > 1 && m_entrynumber == 0 ) { WorkspaceGroup_sptr wksp_group(new WorkspaceGroup); @@ -269,7 +269,7 @@ namespace Mantid const std::string base_name = getPropertyValue("OutputWorkspace") + "_"; const std::string prop_name = "OutputWorkspace_"; - for( int p = 1; p <= m_detFileDataInfo.numberOfPeriods; ++p ) + for( int p = 1; p <= m_detBlockInfo.numberOfPeriods; ++p ) { std::ostringstream os; os << p; @@ -301,7 +301,8 @@ namespace Mantid // Workspace or group of workspaces without monitors is loaded. Now we are loading monitors separately. if(bseparateMonitors) { - + // debug!!! + setProperty("OutputWorkspace", boost::dynamic_pointer_cast(local_workspace)); } // Clear off the member variable containers @@ -359,52 +360,66 @@ namespace Mantid { // optional properties specify that only some spectra have to be loaded size_t numSpectraExclued=0; + bool range_supplied(false); + if (!SpectraExcluded.empty()) { + range_supplied = true; m_load_selected_spectra = true; - numSpectraExclued = SpectraExcluded.size(); } - + + int64_t spec_min(0); + int64_t spec_max(EMPTY_INT()); // - m_spec_min = getProperty("SpectrumMin"); - m_spec_max = getProperty("SpectrumMax"); + spec_min = getProperty("SpectrumMin"); + spec_max = getProperty("SpectrumMax"); - if( m_spec_min == 0 && m_spec_max == EMPTY_INT() ) + + // default spectra ID-s would not work if spectraID_min!=1 + if(m_loadBlockInfo.spectraID_min!=1) { - m_range_supplied = false; + range_supplied = true; + m_load_selected_spectra = true; } - if( m_spec_min == 0 ) - m_spec_min = 1; + + if( spec_min == 0 ) + spec_min = m_loadBlockInfo.spectraID_min; else + { + range_supplied = true; m_load_selected_spectra = true; + } - if( m_spec_max == EMPTY_INT() ) - m_spec_max = m_detBlockInfo.numberOfSpectra; + if( spec_max == EMPTY_INT() ) + spec_max = m_loadBlockInfo.spectraID_max; else + { + range_supplied = true; m_load_selected_spectra = true; + } // Sanity check for min/max - if( m_spec_min > m_spec_max ) + if( spec_min > spec_max ) { throw std::invalid_argument("Inconsistent range properties. SpectrumMin is larger than SpectrumMax."); } - if( static_cast(m_spec_max) > m_detBlockInfo.numberOfSpectra+numSpectraExclued ) + if( spec_max > m_loadBlockInfo.spectraID_max) { - std::string err="Inconsistent range property. SpectrumMax is larger than number of spectra: "+boost::lexical_cast(m_detFileDataInfo.numberOfSpectra+numSpectraExclued ); - throw std::invalid_argument(err); - } + std::string err="Inconsistent range property. SpectrumMax is larger than number of spectra: "+boost::lexical_cast(m_loadBlockInfo.spectraID_max ); + throw std::invalid_argument(err); + } // Check the entry number m_entrynumber = getProperty("EntryNumber"); - if( static_cast(m_entrynumber) > m_detBlockInfo.numberOfPeriods || m_entrynumber < 0 ) + if( static_cast(m_entrynumber) > m_loadBlockInfo.numberOfPeriods || m_entrynumber < 0 ) { - std::string err="Invalid entry number entered. File contains "+boost::lexical_cast(m_detBlockInfo.numberOfPeriods)+ " period. "; + std::string err="Invalid entry number entered. File contains "+boost::lexical_cast(m_loadBlockInfo.numberOfPeriods)+ " period. "; throw std::invalid_argument(err); } - if(m_detBlockInfo.numberOfPeriods== 1 ) + if(m_loadBlockInfo.numberOfPeriods== 1 ) { m_entrynumber = 1; } @@ -418,47 +433,49 @@ namespace Mantid // Sort the list so that we can check it's range std::sort(spec_list.begin(), spec_list.end()); - if( spec_list.back() > static_cast(m_detBlockInfo.numberOfSpectra+numSpectraExclued) ) + if( spec_list.back() > m_loadBlockInfo.spectraID_max ) { - std::string err="A spectra number in the spectra list exceeds total number of "+boost::lexical_cast(m_detBlockInfo.numberOfSpectra+numSpectraExclued )+ " spectra "; + std::string err="A spectra number in the spectra list exceeds maximal spectra ID: "+boost::lexical_cast(m_loadBlockInfo.spectraID_max )+ " in the file "; throw std::invalid_argument(err); } - - //Check no negative numbers have been passed - std::vector::iterator itr = - std::find_if(spec_list.begin(), spec_list.end(), std::bind2nd(std::less(), 0)); - if( itr != spec_list.end() ) + if( spec_list.front() < m_loadBlockInfo.spectraID_min ) { - throw std::invalid_argument("Negative SpectraList property encountered."); + std::string err="A spectra number in the spectra list smaller then minimal spectra ID: "+boost::lexical_cast(m_loadBlockInfo.spectraID_min )+ " in the file"; + throw std::invalid_argument(err); } - range_check in_range(m_spec_min, m_spec_max); - if( m_range_supplied ) + + range_check in_range(spec_min, spec_max); + if(range_supplied ) { spec_list.erase(remove_if(spec_list.begin(), spec_list.end(), in_range), spec_list.end()); // combine spectra numbers from ranges and the list if (spec_list.size()>0) { - for(int64_t i=m_spec_min;i(i); + // remove excluded spectra now rather then inserting it here and removing later if (SpectraExcluded.find(spec_num)==SpectraExcluded.end() ) - spec_list.push_back(spec_num); + spec_list.push_back(spec_num); } // Sort the list so that lower spectra indexes correspond to smaller spectra ID-s std::sort(spec_list.begin(), spec_list.end()); - + // supplied range converted into the list, so no more supplied range + range_supplied =false; } } - } - else - { - m_range_supplied = true; + } // if (m_load_selected_spectra) { - buildSpectraInd2SpectraNumMap(spec_list,SpectraExcluded); + buildSpectraInd2SpectraNumMap(range_supplied,spec_min,spec_max,spec_list,SpectraExcluded); + } + else // may be just range supplied and the range have to start from 1 to use defaults in spectra num to spectra ID map! + { + m_loadBlockInfo.spectraID_max=spec_max; + m_loadBlockInfo.numberOfSpectra = m_loadBlockInfo.spectraID_max-m_loadBlockInfo.spectraID_min+1; } } @@ -467,32 +484,38 @@ namespace Mantid @param spec_list -- list of spectra numbers to load @param SpectraExcluded set of the spectra ID-s to exclude from loading **/ - void LoadISISNexus2::buildSpectraInd2SpectraNumMap(const std::vector &spec_list,const std::set &SpectraExcluded) + void LoadISISNexus2::buildSpectraInd2SpectraNumMap(bool range_supplied,int64_t range_min,int64_t range_max, + const std::vector &spec_list,const std::set &SpectraExcluded) { int64_t ic(0); if(spec_list.size()>0) { + ic = 0; auto start_point = spec_list.begin(); for(auto it =start_point ;it!=spec_list.end();it++) { - ic = it-start_point; - m_specInd2specNum_map.insert(std::pair(ic,static_cast(*it))); + + specid_t spec_num = static_cast(*it); + if (SpectraExcluded.find(spec_num)==SpectraExcluded.end() ) + { + m_specInd2specNum_map.insert(std::pair(ic,spec_num)); + ic++; + } } } else { - if(m_range_supplied) + if(range_supplied) { ic = 0; - int64_t max_range = m_spec_max+SpectraExcluded.size()+1; - for(int64_t i=m_spec_min;i(i); - if(SpectraExcluded.find(spectra)==SpectraExcluded.end()) + specid_t spec_num = static_cast(i); + if (SpectraExcluded.find(spec_num)==SpectraExcluded.end() ) { - m_specInd2specNum_map.insert(std::pair(ic,spectra)); + m_specInd2specNum_map.insert(std::pair(ic,spec_num)); ic++; } } @@ -558,10 +581,11 @@ namespace Mantid return m_specInd2specNum_map.size(); } - + // here we are only if ranges are not supplied + // // put in the spectra range, possibly breaking it into parts by monitors - int64_t first = m_spec_min; - for(int64_t hist = first; hist < m_spec_max; ++hist) + int64_t first = m_loadBlockInfo.spectraID_min; + for(int64_t hist = first; hist < m_loadBlockInfo.spectraID_max; ++hist) { if ( m_monitors.find( hist ) != m_monitors.end() ) { @@ -574,14 +598,15 @@ namespace Mantid first = hist + 1; } } - if ( first == m_spec_max && m_monitors.find( first ) != m_monitors.end() ) + int64_t spec_max = m_loadBlockInfo.spectraID_max; + if ( first == spec_max && m_monitors.find( first ) != m_monitors.end() ) { - m_spectraBlocks.push_back( SpectraBlock( first, m_spec_max, true ) ); - includedMonitors.push_back( m_spec_max ); + m_spectraBlocks.push_back( SpectraBlock( first, spec_max, true ) ); + includedMonitors.push_back( spec_max ); } else { - m_spectraBlocks.push_back( SpectraBlock( first, m_spec_max, false ) ); + m_spectraBlocks.push_back( SpectraBlock( first, spec_max, false ) ); } // sort and check for overlapping @@ -737,7 +762,7 @@ namespace Mantid { data.load(static_cast(blocksize), static_cast(period), static_cast(start)); // TODO this is just wrong int *data_start = data(); - int *data_end = data_start + m_detBlockInfo.numberOfChannels; + int *data_end = data_start + m_loadBlockInfo.numberOfChannels; int64_t final(hist + blocksize); while( hist < final ) { @@ -869,9 +894,9 @@ namespace Mantid runDetails.addProperty("run_header", std::string(header, header + 86)); // Data details on run not the workspace - runDetails.addProperty("nspectra", static_cast(m_detFileDataInfo.numberOfSpectra)); - runDetails.addProperty("nchannels", static_cast(m_detFileDataInfo.numberOfChannels)); - runDetails.addProperty("nperiods", static_cast(m_detFileDataInfo.numberOfPeriods)); + runDetails.addProperty("nspectra", static_cast(m_loadBlockInfo.numberOfSpectra)); + runDetails.addProperty("nchannels", static_cast(m_loadBlockInfo.numberOfChannels)); + runDetails.addProperty("nperiods", static_cast(m_loadBlockInfo.numberOfPeriods)); // RPB struct info NXInt rpb_int = vms_compat.openNXInt("IRPB"); @@ -1011,27 +1036,27 @@ namespace Mantid { return sqrt(in); } - /**Method takes input parameters which describe monitor loading and analyze them against spectra/monitor information in the file. - * The result is the option if monitors can be loaded together with spectra or mast be treated separately - * and additional information on how to treat monitor spectra. - * - *@param entry :: entry to the NeXus file, opened at root folder - *@param spectrum_index :: array of spectra indexes of the data present in the file - *@param ndets :: size of the spectrum index array - *@param n_vms_compat_spectra :: number of data entries containing common time bins (e.g. all spectra, or all spectra and monitors or some spectra (this is not fully supported) - *@param monitors :: map connecting monitor spectra ID against monitor group name in the file. - *@param excludeMonitors :: input property indicating if it is requested to exclude monitors from the target workspace - *@param separateMonitors :: input property indicating if it is requested to load monitors separately (and exclude them from target data workspace this way) - * - *@param MonitorSpectra :: output property containing the list of monitors which should be loaded separately. - *@return excludeMonitors :: indicator if monitors should or mast be excluded from the main data workspace if they can not be loaded with the data - * (contain different number of time channels) - * + /**Method takes input parameters which describe monitor loading and analyze them against spectra/monitor block information in the file. + * The result is the option if monitors can be loaded together with spectra or mast be treated separately + * and additional information on how to treat monitor spectra. + * + *@param entry :: entry to the NeXus file, opened at root folder + *@param spectrum_index :: array of spectra indexes of the data present in the file + *@param ndets :: size of the spectrum index array + *@param n_vms_compat_spectra :: number of data entries containing common time bins (e.g. all spectra, or all spectra and monitors or some spectra (this is not fully supported) + *@param monitors :: map connecting monitor spectra ID against monitor group name in the file. + *@param excludeMonitors :: input property indicating if it is requested to exclude monitors from the target workspace + *@param separateMonitors :: input property indicating if it is requested to load monitors separately (and exclude them from target data workspace this way) + * + *@param OvelapMonitorSpectra :: output property containing the list of monitors ID for monitors, which are also included with spectra. + *@return excludeMonitors :: indicator if monitors should or mast be excluded from the main data workspace if they can not be loaded with the data + * (contain different number of time channels) + * */ bool LoadISISNexus2::findSpectraDetRangeInFile(NXEntry &entry,boost::shared_array &spectrum_index,int64_t ndets,int64_t n_vms_compat_spectra, - std::map &monitors,bool excludeMonitors,bool separateMonitors,std::set &MonitorSpectra) + std::map &monitors,bool excludeMonitors,bool separateMonitors,std::set &OvelapMonitorSpectra) { - MonitorSpectra.clear(); + OvelapMonitorSpectra.clear(); size_t nmons = monitors.size(); //Grab the number of channels @@ -1043,14 +1068,26 @@ namespace Mantid m_monBlockInfo = DataBlock(chans); m_monBlockInfo.numberOfSpectra = nmons; // each monitor is in separate group so number of spectra is equal to number of groups. - // at this stage let's set up all other detector information to monitors - m_detFileDataInfo = m_monBlockInfo; - m_detBlockInfo = m_monBlockInfo; + + // identify monitor ID range. + for(auto it = monitors.begin(); it!=monitors.end(); it++) + { + int64_t mon_id = static_cast(it->first); + if(m_monBlockInfo.spectraID_min>mon_id )m_monBlockInfo.spectraID_min=mon_id; + if(m_monBlockInfo.spectraID_max(nmons)) + { + g_log.warning()<<" non-consequent monitor ID-s in the monitor block. Unexpected situation for the loader\n"; + } + // at this stage we assume that the only going to load monitors + m_loadBlockInfo = m_monBlockInfo; + } if( ndets == 0 ) { - separateMonitors = false; // load monitors in the main workspace. No detectors + separateMonitors = false; // only monitors in the main workspace. No detectors. Will be loaded in the main workspace return separateMonitors; } @@ -1059,59 +1096,79 @@ namespace Mantid NXInt data = nxData.openIntData(); m_detBlockInfo = DataBlock(data); - m_detFileDataInfo = m_detBlockInfo; + // We assume again that this spectrum list ID increase monotonically + m_detBlockInfo.spectraID_min = spectrum_index[0]; + m_detBlockInfo.spectraID_max = spectrum_index[ndets-1]; + if(m_detBlockInfo.spectraID_max-m_detBlockInfo.spectraID_min+1!=static_cast(m_detBlockInfo.numberOfSpectra)) + { + g_log.warning()<<" non-consequent spectra ID-s in the detectors block. Unexpected situation for the loader\n"; + } + + + m_loadBlockInfo = m_detBlockInfo; + + + // now we are analyzing what is actually going or can be loaded + + bool removeMonitors = excludeMonitors || separateMonitors; if (((m_detBlockInfo.numberOfPeriods!=m_monBlockInfo.numberOfPeriods) || (m_detBlockInfo.numberOfChannels!=m_monBlockInfo.numberOfChannels)) && nmons>0) { // detectors and monitors have different characteristics. Can be loaded only to separate workspaces. - if(!separateMonitors) + if(!removeMonitors) { g_log.warning()<<" Performing separate loading as can not load spectra and monitors in the single workspace:\n" ; g_log.warning()<<" Monitors data contain :"<( n_vms_compat_spectra )) - return separateMonitors; + m_loadBlockInfo.numberOfSpectra =totNumOfSpectra; + m_loadBlockInfo.spectraID_min = spectraID_min; + m_loadBlockInfo.spectraID_max = spectraID_max; + } + if (separateMonitors) + m_loadBlockInfo = m_detBlockInfo; + + + // verify integrity of the monitor and detector information + + if((totNumOfSpectra ==static_cast( n_vms_compat_spectra )) && (spectraID_max-spectraID_min+1 ==static_cast(n_vms_compat_spectra))) + { + // all information written in the file is correct, there are no spurious spectra and detectors & monitors form continuous block on HDD + return separateMonitors; } - //Now check if monitors expand or shrink the workspace's spectra range - // We assume again that this spectrum list increases monotonically - int64_t min_index = spectrum_index[0]; - int64_t max_index = spectrum_index[ndets-1]; + // something is wrong and we need to analyze spectra map. Currently we can identify and manage the case when all monitor's spectra are written together with detectors + //make settings for this situation + m_detBlockInfo.numberOfSpectra -= m_monBlockInfo.numberOfSpectra; + m_loadBlockInfo.numberOfSpectra-= m_monBlockInfo.numberOfSpectra; std::map remaining_monitors; - for(auto it = monitors.begin(); it!=monitors.end(); it++) + if(removeMonitors) { - if(it->first>=min_index && it->first <=max_index) + for(auto it = monitors.begin(); it!=monitors.end(); it++) { - if(removeMonitors) - { - MonitorSpectra.insert(static_cast(it->first)); - m_detBlockInfo.numberOfSpectra--; + if(it->first>=m_detBlockInfo.spectraID_min && it->first <=m_detBlockInfo.spectraID_max) + { //monitors ID-s are included with spectra ID-s -- let's try not to load it twice. + OvelapMonitorSpectra.insert(static_cast(it->first)); } - - } - else - { - if(!removeMonitors) + else { remaining_monitors.insert(*it); - m_detBlockInfo.numberOfSpectra++; - } } } monitors.swap(remaining_monitors); + + return separateMonitors; } From 10c743471f93ded9d13285196ba8fb393e5022db Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Fri, 10 Oct 2014 15:53:17 +0100 Subject: [PATCH 085/284] refs #9989 Doxygen errors and compiler warnings --- .../inc/MantidDataHandling/LoadRawHelper.h | 6 +++--- .../Framework/DataHandling/src/LoadISISNexus2.cpp | 8 +++++--- .../Framework/DataHandling/src/LoadRawHelper.cpp | 10 ++++++---- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h index 0db15d00eca9..e4d7e0c37833 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h @@ -86,7 +86,7 @@ namespace Mantid ///creates monitor workspace static void createMonitorWorkspace(DataObjects::Workspace2D_sptr& monws_sptr, DataObjects::Workspace2D_sptr& ws_sptr,API::WorkspaceGroup_sptr& mongrp_sptr, - const int64_t mwsSpecs,const int64_t nwsSpecs,const int64_t numberOfPeriods,const int64_t lenthIn,std::string title,API::Algorithm *pAlg); + const int64_t mwsSpecs,const int64_t nwsSpecs,const int64_t numberOfPeriods,const int64_t lenthIn,std::string title,API::Algorithm *const pAlg); /// creates shared pointer to group workspace static API::WorkspaceGroup_sptr createGroupWorkspace(); @@ -99,10 +99,10 @@ namespace Mantid /// sets the workspace property static void setWorkspaceProperty(const std::string & propertyName,const std::string& title, - API::WorkspaceGroup_sptr grpws_sptr,DataObjects::Workspace2D_sptr ws_sptr,int64_t numberOfPeriods,bool bMonitor,API::Algorithm *pAlg); + API::WorkspaceGroup_sptr grpws_sptr,DataObjects::Workspace2D_sptr ws_sptr,int64_t numberOfPeriods,bool bMonitor,API::Algorithm * const pAlg); /// overloaded method to set the workspace property - static void setWorkspaceProperty(DataObjects::Workspace2D_sptr ws_sptr,API::WorkspaceGroup_sptr grpws_sptr,const int64_t period,bool bmonitors,API::Algorithm *pAlg); + static void setWorkspaceProperty(DataObjects::Workspace2D_sptr ws_sptr,API::WorkspaceGroup_sptr grpws_sptr,const int64_t period,bool bmonitors,API::Algorithm *const pAlg); protected: diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index 6b45d8219b40..741b1a38b85f 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -359,7 +359,6 @@ namespace Mantid void LoadISISNexus2::checkOptionalProperties(const std::set &SpectraExcluded) { // optional properties specify that only some spectra have to be loaded - size_t numSpectraExclued=0; bool range_supplied(false); if (!SpectraExcluded.empty()) @@ -481,8 +480,11 @@ namespace Mantid } /** build the list of spectra to load and include into spectra-detectors map - @param spec_list -- list of spectra numbers to load - @param SpectraExcluded set of the spectra ID-s to exclude from loading + @param range_supplied -- if true specifies that the range of values provided below have to be processed rather then spectra list + @param range_min -- min value for spectra-ID to load + @param range_max -- max value for spectra-ID to load + @param spec_list -- list of spectra numbers to load + @param SpectraExcluded -- set of the spectra ID-s to exclude from loading **/ void LoadISISNexus2::buildSpectraInd2SpectraNumMap(bool range_supplied,int64_t range_min,int64_t range_max, const std::vector &spec_list,const std::set &SpectraExcluded) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp index f6d2f88132ab..45bd59f35d76 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp @@ -275,7 +275,7 @@ namespace Mantid else { //if only monitors range selected - //then set the monitor workspace as the outputworkspace + //then set the monitor workspace as the output workspace setWorkspaceProperty("OutputWorkspace", title, mongrp_sptr, monws_sptr,numberOfPeriods, false,pAlg); } @@ -305,9 +305,10 @@ namespace Mantid * @param grpws_sptr :: shared pointer to group workspace * @param period period number * @param bmonitors :: boolean flag to name the workspaces + * @param pAlg :: pointer to algorithm this method works with. */ void LoadRawHelper::setWorkspaceProperty(DataObjects::Workspace2D_sptr ws_sptr, WorkspaceGroup_sptr grpws_sptr, - const int64_t period, bool bmonitors,API::Algorithm *pAlg) + const int64_t period, bool bmonitors, API::Algorithm *const pAlg) { if(!ws_sptr) return; if(!grpws_sptr) return; @@ -340,9 +341,10 @@ namespace Mantid * @param ws_sptr :: shared pointer to workspace * @param numberOfPeriods :: number periods in the raw file * @param bMonitor to identify the workspace is an output workspace or monitor workspace + * @param pAlg :: pointer to algorithm this method works with. */ void LoadRawHelper::setWorkspaceProperty(const std::string& propertyName, const std::string& title, - WorkspaceGroup_sptr grpws_sptr, DataObjects::Workspace2D_sptr ws_sptr,int64_t numberOfPeriods, bool bMonitor,API::Algorithm *pAlg) + WorkspaceGroup_sptr grpws_sptr, DataObjects::Workspace2D_sptr ws_sptr,int64_t numberOfPeriods, bool bMonitor, API::Algorithm *const pAlg) { UNUSED_ARG(bMonitor); Property *ws = pAlg->getProperty("OutputWorkspace"); @@ -364,7 +366,7 @@ namespace Mantid /** This method sets the raw file data to workspace vectors * @param newWorkspace :: shared pointer to the workspace * @param timeChannelsVec :: vector holding the X data - * @param wsIndex variable used for indexing the ouputworkspace + * @param wsIndex variable used for indexing the output workspace * @param nspecNum spectrum number * @param noTimeRegimes :: regime no. * @param lengthIn :: length of the workspace From b87d6c18e408a5dd172e33f941ad30118a9f67bc Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Fri, 10 Oct 2014 15:58:49 +0100 Subject: [PATCH 086/284] refs #9989 C++ check and doxygen warnings --- .../DataHandling/inc/MantidDataHandling/LoadRawHelper.h | 4 ++-- Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp | 3 --- Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp | 2 +- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h index e4d7e0c37833..96fd62201711 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadRawHelper.h @@ -82,7 +82,7 @@ namespace Mantid static bool isIncludeMonitors(const std::string &monitorOption); - static void ProcessLoadMonitorOptions(bool &bincludeMonitors,bool &bseparateMonitors,bool &bexcludeMonitors,API::Algorithm *pAlgo); + static void ProcessLoadMonitorOptions(bool &bincludeMonitors,bool &bseparateMonitors,bool &bexcludeMonitors,API::Algorithm *const pAlgo); ///creates monitor workspace static void createMonitorWorkspace(DataObjects::Workspace2D_sptr& monws_sptr, DataObjects::Workspace2D_sptr& ws_sptr,API::WorkspaceGroup_sptr& mongrp_sptr, @@ -174,7 +174,7 @@ namespace Mantid /// calculate workspace sizes if separate or exclude monitors are selected void calculateWorkspacesizes(const std::vector& monitorSpecList, specid_t& normalwsSpecs, specid_t& monitorwsSpecs); - /// load the specra + /// load the spectra void loadSpectra(FILE* file,const int& period, const int& m_total_specs, DataObjects::Workspace2D_sptr ws_sptr,std::vector >); diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index 741b1a38b85f..bca6fb88f82f 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -1061,9 +1061,6 @@ namespace Mantid OvelapMonitorSpectra.clear(); size_t nmons = monitors.size(); - //Grab the number of channels - int nMonitorPeriods(0); - size_t nMonitorChannels(0); if (nmons>0) { NXInt chans = entry.openNXInt(m_monitors.begin()->second + "/data"); diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp index 45bd59f35d76..0e0a4290d86e 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp @@ -241,7 +241,7 @@ namespace Mantid */ void LoadRawHelper::createMonitorWorkspace(DataObjects::Workspace2D_sptr& monws_sptr,DataObjects::Workspace2D_sptr& normalws_sptr, WorkspaceGroup_sptr& mongrp_sptr,const int64_t mwsSpecs,const int64_t nwsSpecs, - const int64_t numberOfPeriods,const int64_t lengthIn,const std::string title,API::Algorithm *pAlg) + const int64_t numberOfPeriods,const int64_t lengthIn,const std::string title,API::Algorithm *const pAlg) { try { From 8aae8cf51fe80a0b27a8c2bc95f52392d3e473a8 Mon Sep 17 00:00:00 2001 From: Mathieu Doucet Date: Fri, 10 Oct 2014 14:50:53 -0400 Subject: [PATCH 087/284] Re #10342 Add option to mask detector side --- .../reduction/sans/hfir_options_script.py | 11 ++++ .../widgets/sans/hfir_instrument.py | 23 +++++++ .../Interface/ui/sans/hfir_instrument.ui | 66 +++++++++++++++++++ .../Interface/ui/sans/ui_hfir_instrument.py | 40 +++++++++-- 4 files changed, 135 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/scripts/Interface/reduction_gui/reduction/sans/hfir_options_script.py b/Code/Mantid/scripts/Interface/reduction_gui/reduction/sans/hfir_options_script.py index 2e417b07acb1..32ad19dd2778 100644 --- a/Code/Mantid/scripts/Interface/reduction_gui/reduction/sans/hfir_options_script.py +++ b/Code/Mantid/scripts/Interface/reduction_gui/reduction/sans/hfir_options_script.py @@ -38,6 +38,9 @@ class ReductionOptions(BaseScriptElement): n_q_bins = 100 n_sub_pix = 1 log_binning = False + + # Mask side + masked_side = None # Masking class RectangleMask(object): @@ -116,6 +119,9 @@ def to_script(self): script += "IQxQy(nbins=%g)\n" % self.n_q_bins # Mask + # Detector plane + if self.masked_side is not None: + script += "MaskDetectorSide('%s')\n" % str(self.masked_side) # Edges if (self.top != 0 or self.bottom != 0 or self.left != 0 or self.right != 0): script += "Mask(nx_low=%d, nx_high=%d, ny_low=%d, ny_high=%d)\n" % (self.left, self.right, self.bottom, self.top) @@ -182,6 +188,8 @@ def to_xml(self): xml += " %g\n" % self.bottom xml += " %g\n" % self.left xml += " %g\n" % self.right + + xml += " %s\n" % str(self.masked_side) xml += " \n" for item in self.shapes: @@ -265,6 +273,8 @@ def from_xml(self, xml_str): self.right = BaseScriptElement.getIntElement(mask_dom, "mask_right", default=ReductionOptions.right) self.left = BaseScriptElement.getIntElement(mask_dom, "mask_left", default=ReductionOptions.left) + self.masked_side = BaseScriptElement.getStringElement(mask_dom, "mask_side", default=ReductionOptions.masked_side) + self.shapes = [] shapes_dom_list = mask_dom.getElementsByTagName("Shapes") if len(shapes_dom_list)>0: @@ -409,6 +419,7 @@ def reset(self): self.detector_ids = [] self.mask_file = '' self.use_mask_file = ReductionOptions.use_mask_file + self.masked_side = None self.use_data_directory = ReductionOptions.use_data_directory self.output_directory = ReductionOptions.output_directory diff --git a/Code/Mantid/scripts/Interface/reduction_gui/widgets/sans/hfir_instrument.py b/Code/Mantid/scripts/Interface/reduction_gui/widgets/sans/hfir_instrument.py index 32b5983d9cae..4f44d963b0f7 100644 --- a/Code/Mantid/scripts/Interface/reduction_gui/widgets/sans/hfir_instrument.py +++ b/Code/Mantid/scripts/Interface/reduction_gui/widgets/sans/hfir_instrument.py @@ -138,6 +138,14 @@ def initialize_content(self): self.connect(self._summary.scale_chk, QtCore.SIGNAL("clicked(bool)"), self._scale_clicked) self._scale_clicked(self._summary.scale_chk.isChecked()) + # If we are not in debug/expert mode, hide some advanced options + if not self._settings.debug: + self._summary.mask_side_layout.deleteLater() + self._summary.mask_side_label.hide() + self._summary.mask_side_none_radio.hide() + self._summary.mask_side_front_radio.hide() + self._summary.mask_side_back_radio.hide() + if not self._in_mantidplot: self._summary.dark_plot_button.hide() self._summary.scale_data_plot_button.hide() @@ -340,6 +348,13 @@ def set_state(self, state): self._mask_checked(state.use_mask_file) self._masked_detectors = state.detector_ids self.mask_reload = True + + if state.masked_side == 'Front': + self._summary.mask_side_front_radio.setChecked(True) + elif state.masked_side == 'Back': + self._summary.mask_side_back_radio.setChecked(True) + else: + self._summary.mask_side_none_radio.setChecked(True) def _prepare_field(self, is_enabled, stored_value, chk_widget, edit_widget, suppl_value=None, suppl_edit=None): #to_display = str(stored_value) if is_enabled else '' @@ -400,6 +415,14 @@ def get_state(self): m.n_sub_pix = util._check_and_get_int_line_edit(self._summary.n_sub_pix_edit) m.log_binning = self._summary.log_binning_radio.isChecked() + # Detector side masking + if self._summary.mask_side_front_radio.isChecked(): + m.masked_side = 'Front' + elif self._summary.mask_side_back_radio.isChecked(): + m.masked_side = 'Back' + else: + m.masked_side = None + # Mask detector IDs m.use_mask_file = self._summary.mask_check.isChecked() m.mask_file = unicode(self._summary.mask_edit.text()) diff --git a/Code/Mantid/scripts/Interface/ui/sans/hfir_instrument.ui b/Code/Mantid/scripts/Interface/ui/sans/hfir_instrument.ui index 68d7d79351d6..3ec86accdd4a 100644 --- a/Code/Mantid/scripts/Interface/ui/sans/hfir_instrument.ui +++ b/Code/Mantid/scripts/Interface/ui/sans/hfir_instrument.ui @@ -1052,6 +1052,72 @@ Values can be selected by hand by checking the boxes below. + + + + + + + 0 + 0 + + + + + 150 + 0 + + + + Mask detector side + + + + + + + Select to keep both sides of the detector active [default]. + + + None + + + + + + + Select to mask the front panel of the detector. + + + Front + + + + + + + Select to mask the back panel of the detector. + + + Back + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + diff --git a/Code/Mantid/scripts/Interface/ui/sans/ui_hfir_instrument.py b/Code/Mantid/scripts/Interface/ui/sans/ui_hfir_instrument.py index d9193459baae..93b22de1ce87 100644 --- a/Code/Mantid/scripts/Interface/ui/sans/ui_hfir_instrument.py +++ b/Code/Mantid/scripts/Interface/ui/sans/ui_hfir_instrument.py @@ -2,7 +2,7 @@ # Form implementation generated from reading ui file 'ui/sans/hfir_instrument.ui' # -# Created: Thu Jun 27 16:46:08 2013 +# Created: Fri Oct 10 11:46:57 2014 # by: PyQt4 UI code generator 4.7.4 # # WARNING! All changes made in this file will be lost! @@ -398,6 +398,29 @@ def setupUi(self, Frame): self.verticalLayout_2.setObjectName("verticalLayout_2") self.verticalLayout_3 = QtGui.QVBoxLayout() self.verticalLayout_3.setObjectName("verticalLayout_3") + self.mask_side_layout = QtGui.QHBoxLayout() + self.mask_side_layout.setObjectName("mask_side_layout") + self.mask_side_label = QtGui.QLabel(self.groupBox) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.mask_side_label.sizePolicy().hasHeightForWidth()) + self.mask_side_label.setSizePolicy(sizePolicy) + self.mask_side_label.setMinimumSize(QtCore.QSize(150, 0)) + self.mask_side_label.setObjectName("mask_side_label") + self.mask_side_layout.addWidget(self.mask_side_label) + self.mask_side_none_radio = QtGui.QRadioButton(self.groupBox) + self.mask_side_none_radio.setObjectName("mask_side_none_radio") + self.mask_side_layout.addWidget(self.mask_side_none_radio) + self.mask_side_front_radio = QtGui.QRadioButton(self.groupBox) + self.mask_side_front_radio.setObjectName("mask_side_front_radio") + self.mask_side_layout.addWidget(self.mask_side_front_radio) + self.mask_side_back_radio = QtGui.QRadioButton(self.groupBox) + self.mask_side_back_radio.setObjectName("mask_side_back_radio") + self.mask_side_layout.addWidget(self.mask_side_back_radio) + spacerItem9 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.mask_side_layout.addItem(spacerItem9) + self.verticalLayout_3.addLayout(self.mask_side_layout) self.label_5 = QtGui.QLabel(self.groupBox) font = QtGui.QFont() font.setFamily("Bitstream Charter") @@ -428,13 +451,13 @@ def setupUi(self, Frame): self.mask_plot_button = QtGui.QPushButton(self.groupBox) self.mask_plot_button.setObjectName("mask_plot_button") self.horizontalLayout.addWidget(self.mask_plot_button) - spacerItem9 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem9) + spacerItem10 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + self.horizontalLayout.addItem(spacerItem10) self.verticalLayout_3.addLayout(self.horizontalLayout) self.verticalLayout_2.addLayout(self.verticalLayout_3) self.verticalLayout_4.addWidget(self.groupBox) - spacerItem10 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.verticalLayout_4.addItem(spacerItem10) + spacerItem11 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.verticalLayout_4.addItem(spacerItem11) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.verticalLayout.addWidget(self.scrollArea) @@ -501,6 +524,13 @@ def retranslateUi(self, Frame): self.label_10.setText(QtGui.QApplication.translate("Frame", "Wavelength spread [ratio]", None, QtGui.QApplication.UnicodeUTF8)) self.wavelength_spread_edit.setToolTip(QtGui.QApplication.translate("Frame", "Enter the value of the neutron wavelength spread.", None, QtGui.QApplication.UnicodeUTF8)) self.groupBox.setTitle(QtGui.QApplication.translate("Frame", "Mask", None, QtGui.QApplication.UnicodeUTF8)) + self.mask_side_label.setText(QtGui.QApplication.translate("Frame", "Mask detector side", None, QtGui.QApplication.UnicodeUTF8)) + self.mask_side_none_radio.setToolTip(QtGui.QApplication.translate("Frame", "Select to keep both sides of the detector active [default].", None, QtGui.QApplication.UnicodeUTF8)) + self.mask_side_none_radio.setText(QtGui.QApplication.translate("Frame", "None", None, QtGui.QApplication.UnicodeUTF8)) + self.mask_side_front_radio.setToolTip(QtGui.QApplication.translate("Frame", "Select to mask the front panel of the detector.", None, QtGui.QApplication.UnicodeUTF8)) + self.mask_side_front_radio.setText(QtGui.QApplication.translate("Frame", "Front", None, QtGui.QApplication.UnicodeUTF8)) + self.mask_side_back_radio.setToolTip(QtGui.QApplication.translate("Frame", "Select to mask the back panel of the detector.", None, QtGui.QApplication.UnicodeUTF8)) + self.mask_side_back_radio.setText(QtGui.QApplication.translate("Frame", "Back", None, QtGui.QApplication.UnicodeUTF8)) self.label_5.setText(QtGui.QApplication.translate("Frame", "Choose a file to set your mask. Note that only the mask information, not the data, will be used in the reduction.\n" "The data is only used to help you setting the mask.\n" "The mask information is saved separately so that your data file will NOT be modified.", None, QtGui.QApplication.UnicodeUTF8)) From 3f35bb777a57a6db4ecd8d4aa2249335b4cc5d15 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Fri, 10 Oct 2014 20:02:53 +0100 Subject: [PATCH 088/284] refs #9989 Kind of works --- .../inc/MantidDataHandling/LoadISISNexus2.h | 17 ++- .../DataHandling/src/LoadISISNexus2.cpp | 134 ++++++++++++------ .../DataHandling/src/LoadRawHelper.cpp | 2 +- .../DataHandling/test/LoadISISNexusTest.h | 69 +++++++++ 4 files changed, 172 insertions(+), 50 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h index 198d0dce7fc7..fe9acf88471f 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadISISNexus2.h @@ -91,10 +91,13 @@ namespace Mantid struct SpectraBlock { /// Constructor - initialize the block - SpectraBlock(int64_t f,int64_t l,bool m):first(f),last(l),isMonitor(m){} + SpectraBlock(int64_t f,int64_t l,bool is_mon,const std::string &monname): + first(f),last(l),isMonitor(is_mon),monName(monname){} + int64_t first; ///< first spectrum number of the block int64_t last; ///< last spectrum number of the block bool isMonitor; ///< is the data in a monitor group + std::string monName; }; /// The structure describes parameters of a single time-block written in the nexus file @@ -117,8 +120,8 @@ namespace Mantid numberOfPeriods(data.dim0()), numberOfChannels(data.dim2()), numberOfSpectra (data.dim1()), - spectraID_min(1), - spectraID_max(numberOfSpectra) + spectraID_min(std::numeric_limits::max()), + spectraID_max(0) {}; }; private: @@ -127,9 +130,9 @@ namespace Mantid /// Overwrites Algorithm method void exec(); // Validate the optional input properties - void checkOptionalProperties(const std::set &ExcludedSpectra); + void checkOptionalProperties(const std::map &ExcludedMonitors); /// Prepare a vector of SpectraBlock structures to simplify loading - size_t prepareSpectraBlocks(); + size_t prepareSpectraBlocks(std::map &monitors, const std::map &specInd2specNum_map,const DataBlock &LoadBlock); /// Run LoadInstrument as a ChildAlgorithm void runLoadInstrument(DataObjects::Workspace2D_sptr &); /// Load in details about the run @@ -151,7 +154,7 @@ namespace Mantid // Validate multi-period logs void validateMultiPeriodLogs(Mantid::API::MatrixWorkspace_sptr ); // build the list of spectra numbers to load and include in the spectra list - void buildSpectraInd2SpectraNumMap(bool range_supplied,int64_t range_min,int64_t range_max,const std::vector &spec_list,const std::set &ExcludedSpectra); + void buildSpectraInd2SpectraNumMap(bool range_supplied,int64_t range_min,int64_t range_max,const std::vector &spec_list,const std::map &ExcludedMonitors); /// The name and path of the input file @@ -211,7 +214,7 @@ namespace Mantid boost::scoped_ptr< ::NeXus::File> m_cppFile; bool findSpectraDetRangeInFile(NeXus::NXEntry &entry,boost::shared_array &spectrum_index,int64_t ndets,int64_t n_vms_compat_spectra, - std::map &monitors,bool excludeMonitors,bool separateMonitors,std::set &ExcludedSpectra); + std::map &monitors,bool excludeMonitors,bool separateMonitors,std::map &ExcludedMonitors); }; } // namespace DataHandling diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index bca6fb88f82f..7dee72182d39 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -192,15 +192,15 @@ namespace Mantid throw std::runtime_error("Inconsistent NeXus file structure."); } } - std::set ExcluedMonitorsSpectra; + std::map ExcluedMonitorsSpectra; bseparateMonitors=findSpectraDetRangeInFile(entry,m_spec,ndets,nsp1[0],m_monitors,bexcludeMonitors,bseparateMonitors,ExcluedMonitorsSpectra); - const size_t x_length = m_detBlockInfo.numberOfChannels + 1; + size_t x_length = m_detBlockInfo.numberOfChannels + 1; // Check input is consistent with the file, throwing if not, exclude spectra selected at findSpectraDetRangeInFile; checkOptionalProperties(ExcluedMonitorsSpectra); // Fill up m_spectraBlocks - size_t total_specs = prepareSpectraBlocks(); + size_t total_specs = prepareSpectraBlocks(m_monitors,m_specInd2specNum_map,m_loadBlockInfo); m_progress = boost::shared_ptr(new Progress(this, 0.0, 1.0, total_specs * m_detBlockInfo.numberOfPeriods)); @@ -301,8 +301,48 @@ namespace Mantid // Workspace or group of workspaces without monitors is loaded. Now we are loading monitors separately. if(bseparateMonitors) { - // debug!!! setProperty("OutputWorkspace", boost::dynamic_pointer_cast(local_workspace)); + if(m_detBlockInfo.numberOfPeriods>1) + { + g_log.error()<<" Separate monitor workspace loading have not been implemented for multiperiod workspaces. Performed separate monitors loading\n"; + } + else + { + std::string wsName = getProperty("OutputWorkspace"); + if(m_monBlockInfo.numberOfSpectra==0) + { + g_log.information()<<" no monitors to load for workspace: "< + (WorkspaceFactory::Instance().create(local_workspace, m_monBlockInfo.numberOfSpectra,x_length,m_monBlockInfo.numberOfChannels)); + + m_spectraBlocks.clear(); + m_specInd2specNum_map.clear(); + std::vector dummyS1; + std::map dummySpectr; + buildSpectraInd2SpectraNumMap(true,m_monBlockInfo.spectraID_min,m_monBlockInfo.spectraID_max,dummyS1,dummySpectr); + // lo + prepareSpectraBlocks(m_monitors,m_specInd2specNum_map,m_monBlockInfo); + + NXFloat timeBins = entry.openNXFloat("monitor_1/time_of_flight"); + timeBins.load(); + m_tof_data.reset(new MantidVec(timeBins(), timeBins() + x_length)); + + + + int64_t firstentry = (m_entrynumber > 0) ? m_entrynumber : 1; + loadPeriodData(firstentry, entry, monitor_workspace); + + + std::string monitorwsName = wsName + "_monitors"; + declareProperty(new WorkspaceProperty ("MonitorWorkspace", monitorwsName,Direction::Output)); + setProperty("MonitorWorkspace", boost::static_pointer_cast(monitor_workspace)); + } + } + } // Clear off the member variable containers @@ -356,7 +396,7 @@ namespace Mantid * Check the validity of the optional properties of the algorithm and identify if partial data should be loaded. * @param SpectraExcluded :: set of spectra ID-s to exclude from spectra list to load */ - void LoadISISNexus2::checkOptionalProperties(const std::set &SpectraExcluded) + void LoadISISNexus2::checkOptionalProperties(const std::map &SpectraExcluded) { // optional properties specify that only some spectra have to be loaded bool range_supplied(false); @@ -487,7 +527,7 @@ namespace Mantid @param SpectraExcluded -- set of the spectra ID-s to exclude from loading **/ void LoadISISNexus2::buildSpectraInd2SpectraNumMap(bool range_supplied,int64_t range_min,int64_t range_max, - const std::vector &spec_list,const std::set &SpectraExcluded) + const std::vector &spec_list,const std::map &SpectraExcluded) { int64_t ic(0); @@ -547,68 +587,84 @@ namespace Mantid * in a separate block. * @return :: Number of spectra to load. */ - size_t LoadISISNexus2::prepareSpectraBlocks() + size_t LoadISISNexus2::prepareSpectraBlocks(std::map &monitors, const std::map &specInd2specNum_map,const DataBlock &LoadBlock) { std::vector includedMonitors; // fill in the data block descriptor vector - if ( ! m_specInd2specNum_map.empty() ) + if ( ! specInd2specNum_map.empty() ) { - auto itSpec= m_specInd2specNum_map.begin(); + auto itSpec= specInd2specNum_map.begin(); int64_t hist = itSpec->second; - SpectraBlock block(hist,hist,false); + SpectraBlock block(hist,hist,false,""); itSpec++; - for(; itSpec != m_specInd2specNum_map.end(); ++itSpec) + for(; itSpec != specInd2specNum_map.end(); ++itSpec) { // try to put all consecutive numbers in same block - bool isMonitor = m_monitors.find( hist ) != m_monitors.end(); + + auto it_mon = monitors.find( hist ); + bool isMonitor = it_mon != monitors.end(); if ( isMonitor || itSpec->second!= hist + 1 ) { + + if ( isMonitor ) + { + includedMonitors.push_back( hist ); + block.monName = it_mon->second; + } + block.last = hist; block.isMonitor = isMonitor; m_spectraBlocks.push_back( block ); - if ( isMonitor ) includedMonitors.push_back( hist ); - block = SpectraBlock(itSpec ->second,itSpec ->second,false); + + block = SpectraBlock(itSpec ->second,itSpec ->second,false,""); } hist = itSpec ->second; } + // push the last block - hist = m_specInd2specNum_map.rbegin()->second; + hist = specInd2specNum_map.rbegin()->second; block.last = hist; - if ( m_monitors.find( hist ) != m_monitors.end() ) + + auto it_mon = monitors.find( hist ); + if (it_mon != monitors.end() ) { includedMonitors.push_back( hist ); block.isMonitor = true; + block.monName = it_mon->second; } m_spectraBlocks.push_back( block ); - return m_specInd2specNum_map.size(); + return specInd2specNum_map.size(); } + // here we are only if ranges are not supplied // // put in the spectra range, possibly breaking it into parts by monitors - int64_t first = m_loadBlockInfo.spectraID_min; - for(int64_t hist = first; hist < m_loadBlockInfo.spectraID_max; ++hist) + int64_t first = LoadBlock.spectraID_min; + for(int64_t hist = first; hist < LoadBlock.spectraID_max; ++hist) { - if ( m_monitors.find( hist ) != m_monitors.end() ) + auto it_mon = monitors.find( hist ); + if ( it_mon != monitors.end() ) { if ( hist != first ) { - m_spectraBlocks.push_back( SpectraBlock( first, hist - 1, false ) ); + m_spectraBlocks.push_back( SpectraBlock(first,hist - 1,false,"") ); } - m_spectraBlocks.push_back( SpectraBlock( hist, hist, true) ); + m_spectraBlocks.push_back( SpectraBlock( hist, hist, true,it_mon->second) ); includedMonitors.push_back( hist ); first = hist + 1; } } - int64_t spec_max = m_loadBlockInfo.spectraID_max; - if ( first == spec_max && m_monitors.find( first ) != m_monitors.end() ) + int64_t spec_max = LoadBlock.spectraID_max; + auto it_mon = monitors.find( first); + if ( first == spec_max && it_mon != monitors.end() ) { - m_spectraBlocks.push_back( SpectraBlock( first, spec_max, true ) ); + m_spectraBlocks.push_back( SpectraBlock( first, spec_max, true, it_mon->second ) ); includedMonitors.push_back( spec_max ); } else { - m_spectraBlocks.push_back( SpectraBlock( first, spec_max, false ) ); + m_spectraBlocks.push_back( SpectraBlock(first,spec_max,false,"") ); } // sort and check for overlapping @@ -617,22 +673,18 @@ namespace Mantid std::sort( m_spectraBlocks.begin(), m_spectraBlocks.end(), compareSpectraBlocks ); } - // remove monitors that weren't requested - if ( m_monitors.size() != includedMonitors.size() ) + // remove monitors that have been used + if ( monitors.size() != includedMonitors.size() ) { - if ( includedMonitors.empty() ) - { - m_monitors.clear(); - } - else + if ( !includedMonitors.empty() ) { - for(auto it = m_monitors.begin(); it != m_monitors.end(); ) + for(auto it = monitors.begin(); it != monitors.end(); ) { - if ( std::find( includedMonitors.begin(), includedMonitors.end(), it->first ) == includedMonitors.end() ) + if ( std::find( includedMonitors.begin(), includedMonitors.end(), it->first ) != includedMonitors.end() ) { auto it1 = it; ++it; - m_monitors.erase( it1 ); + monitors.erase( it1 ); } else { @@ -666,9 +718,7 @@ namespace Mantid { if ( block->isMonitor ) { - auto it = m_monitors.find( block->first ); - assert( it != m_monitors.end() ); - NXData monitor = entry.openNXData(it->second); + NXData monitor = entry.openNXData(block->monName); NXInt mondata = monitor.openIntData(); m_progress->report("Loading monitor"); mondata.load(1,static_cast(period-1)); // TODO this is just wrong @@ -1056,9 +1106,9 @@ namespace Mantid * */ bool LoadISISNexus2::findSpectraDetRangeInFile(NXEntry &entry,boost::shared_array &spectrum_index,int64_t ndets,int64_t n_vms_compat_spectra, - std::map &monitors,bool excludeMonitors,bool separateMonitors,std::set &OvelapMonitorSpectra) + std::map &monitors,bool excludeMonitors,bool separateMonitors,std::map &OvelapMonitors) { - OvelapMonitorSpectra.clear(); + OvelapMonitors.clear(); size_t nmons = monitors.size(); if (nmons>0) @@ -1157,7 +1207,7 @@ namespace Mantid { if(it->first>=m_detBlockInfo.spectraID_min && it->first <=m_detBlockInfo.spectraID_max) { //monitors ID-s are included with spectra ID-s -- let's try not to load it twice. - OvelapMonitorSpectra.insert(static_cast(it->first)); + OvelapMonitors.insert(*it); } else { diff --git a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp index 0e0a4290d86e..fc8579dc9bd4 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadRawHelper.cpp @@ -170,7 +170,7 @@ namespace Mantid run.addLogData( new PropertyWithValue("run_number", run_num) ); } /**reads workspace dimensions,number of periods etc from raw data - * @param numberOfSpectra :: number of spectrums + * @param numberOfSpectra :: number of spectra * @param numberOfPeriods :: number of periods * @param lengthIn :: size of workspace vectors * @param noTimeRegimes :: number of time regime. diff --git a/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h b/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h index 5f17b3feaa9d..9335317a294e 100644 --- a/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h +++ b/Code/Mantid/Framework/DataHandling/test/LoadISISNexusTest.h @@ -68,6 +68,75 @@ class LoadISISNexusTest : public CxxTest::TestSuite public: + void testExecMonSeparated() + { + Mantid::API::FrameworkManager::Instance(); + LoadISISNexus2 ld; + ld.initialize(); + ld.setPropertyValue("Filename","LOQ49886.nxs"); + ld.setPropertyValue("OutputWorkspace","outWS"); + ld.setPropertyValue("LoadMonitors","1"); // should read "Separate" + TS_ASSERT_THROWS_NOTHING(ld.execute()); + TS_ASSERT(ld.isExecuted()); + + + MatrixWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS("outWS"); + MatrixWorkspace_sptr mon_ws = AnalysisDataService::Instance().retrieveWS("outWS_monitors"); + + TS_ASSERT_EQUALS(ws->blocksize(),5); + TS_ASSERT_EQUALS(ws->getNumberHistograms(),17790); + + TS_ASSERT_EQUALS(mon_ws->blocksize(),5); + TS_ASSERT_EQUALS(mon_ws->getNumberHistograms(),2); + + // Two monitors which form two first spectra are excluded by load separately + + // spectrum with ID 5 is now spectrum N 3 as 2 monitors + TS_ASSERT_EQUALS(ws->readY(5-2)[1],1.); + TS_ASSERT_EQUALS(ws->getSpectrum(5-2)->getSpectrumNo(),6); + TS_ASSERT_EQUALS(*(ws->getSpectrum(5-2)->getDetectorIDs().begin()), 6); + // spectrum with ID 7 is now spectrum N 4 + TS_ASSERT_EQUALS(ws->readY(6-2)[0],1.); + TS_ASSERT_EQUALS(ws->getSpectrum(6-2)->getSpectrumNo(),7); + TS_ASSERT_EQUALS(*(ws->getSpectrum(6-2)->getDetectorIDs().begin()), 7); + // + TS_ASSERT_EQUALS(ws->readY(8-2)[3],1.); + + TS_ASSERT_EQUALS(mon_ws->readX(0)[0],5.); + TS_ASSERT_EQUALS(mon_ws->readX(0)[1],4005.); + TS_ASSERT_EQUALS(mon_ws->readX(0)[2],8005.); + + // these spectra are not loaded as above so their values are different (occasionally 0) + TS_ASSERT_EQUALS(mon_ws->readY(0)[1],0); + TS_ASSERT_EQUALS(mon_ws->readY(1)[0],0.); + TS_ASSERT_EQUALS(mon_ws->readY(0)[3],0.); + + + + const std::vector< Property* >& logs = mon_ws->run().getLogData(); + TS_ASSERT_EQUALS(logs.size(), 62); + + std::string header = mon_ws->run().getPropertyValueAsType("run_header"); + TS_ASSERT_EQUALS(86, header.size()); + TS_ASSERT_EQUALS("LOQ 49886 Team LOQ Quiet Count, ISIS Off, N 28-APR-2009 09:20:29 0.00", header); + + TimeSeriesProperty* slog = dynamic_cast*>(mon_ws->run().getLogData("icp_event")); + TS_ASSERT(slog); + std::string str = slog->value(); + TS_ASSERT_EQUALS(str.size(),1023); + TS_ASSERT_EQUALS(str.substr(0,37),"2009-Apr-28 09:20:29 CHANGE_PERIOD 1"); + + slog = dynamic_cast*>(mon_ws->run().getLogData("icp_debug")); + TS_ASSERT(slog); + TS_ASSERT_EQUALS(slog->size(),50); + + AnalysisDataService::Instance().remove("outWS"); + AnalysisDataService::Instance().remove("outWS_monitors"); + } + + + + void testExec() { From 8dae714e806ff0c9bbd44ab951e6dc6c87c04237 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Fri, 10 Oct 2014 20:09:45 +0100 Subject: [PATCH 089/284] refs #9989 Doxygen errors --- Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index 7dee72182d39..22b91386c338 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -1100,7 +1100,7 @@ namespace Mantid *@param excludeMonitors :: input property indicating if it is requested to exclude monitors from the target workspace *@param separateMonitors :: input property indicating if it is requested to load monitors separately (and exclude them from target data workspace this way) * - *@param OvelapMonitorSpectra :: output property containing the list of monitors ID for monitors, which are also included with spectra. + *@param OvelapMonitors :: output property containing the list of monitors ID for monitors, which are also included with spectra. *@return excludeMonitors :: indicator if monitors should or mast be excluded from the main data workspace if they can not be loaded with the data * (contain different number of time channels) * From 862b30f67c561bc5892adc577b7f8c03ac9472a1 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Sat, 11 Oct 2014 15:35:56 +0100 Subject: [PATCH 090/284] refs #9989 Should fix SANS2D data loading --- Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index 22b91386c338..83c6ca915498 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -195,7 +195,7 @@ namespace Mantid std::map ExcluedMonitorsSpectra; bseparateMonitors=findSpectraDetRangeInFile(entry,m_spec,ndets,nsp1[0],m_monitors,bexcludeMonitors,bseparateMonitors,ExcluedMonitorsSpectra); - size_t x_length = m_detBlockInfo.numberOfChannels + 1; + size_t x_length = m_loadBlockInfo.numberOfChannels + 1; // Check input is consistent with the file, throwing if not, exclude spectra selected at findSpectraDetRangeInFile; checkOptionalProperties(ExcluedMonitorsSpectra); @@ -205,7 +205,7 @@ namespace Mantid m_progress = boost::shared_ptr(new Progress(this, 0.0, 1.0, total_specs * m_detBlockInfo.numberOfPeriods)); DataObjects::Workspace2D_sptr local_workspace = boost::dynamic_pointer_cast - (WorkspaceFactory::Instance().create("Workspace2D", total_specs, x_length, m_detBlockInfo.numberOfChannels)); + (WorkspaceFactory::Instance().create("Workspace2D", total_specs, x_length, m_loadBlockInfo.numberOfChannels)); // Set the units on the workspace to TOF & Counts local_workspace->getAxis(0)->unit() = UnitFactory::Instance().create("TOF"); local_workspace->setYUnit("Counts"); From 1bad2767406af308561cd8c11ffaa6d988cb2e64 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Mon, 13 Oct 2014 10:58:42 +0100 Subject: [PATCH 091/284] refs #9989 Setup monitor workspace attached to data ws and little code improvements. --- .../Framework/DataHandling/src/LoadISISNexus2.cpp | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp index 83c6ca915498..8e8fe0ca6bc4 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus2.cpp @@ -318,20 +318,18 @@ namespace Mantid x_length = m_monBlockInfo.numberOfChannels+1; DataObjects::Workspace2D_sptr monitor_workspace = boost::dynamic_pointer_cast (WorkspaceFactory::Instance().create(local_workspace, m_monBlockInfo.numberOfSpectra,x_length,m_monBlockInfo.numberOfChannels)); + local_workspace->setMonitorWorkspace(monitor_workspace); m_spectraBlocks.clear(); m_specInd2specNum_map.clear(); std::vector dummyS1; - std::map dummySpectr; - buildSpectraInd2SpectraNumMap(true,m_monBlockInfo.spectraID_min,m_monBlockInfo.spectraID_max,dummyS1,dummySpectr); + // at the moment here we clear this map to enable possibility to load monitors from the spectra block (wiring table bug). + // if monitor's spectra present in the detectors block due to this bug should be read from monitors, this map should be dealt with properly. + ExcluedMonitorsSpectra.clear(); + buildSpectraInd2SpectraNumMap(true,m_monBlockInfo.spectraID_min,m_monBlockInfo.spectraID_max,dummyS1,ExcluedMonitorsSpectra); // lo prepareSpectraBlocks(m_monitors,m_specInd2specNum_map,m_monBlockInfo); - NXFloat timeBins = entry.openNXFloat("monitor_1/time_of_flight"); - timeBins.load(); - m_tof_data.reset(new MantidVec(timeBins(), timeBins() + x_length)); - - int64_t firstentry = (m_entrynumber > 0) ? m_entrynumber : 1; loadPeriodData(firstentry, entry, monitor_workspace); From 959eee237ae7693bfb1804b8f4ae53bd3ab05ef2 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Mon, 13 Oct 2014 13:17:47 +0100 Subject: [PATCH 092/284] refs #10332 This should fix it. --- .../Framework/MDAlgorithms/src/ConvertToMDParent.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp b/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp index a8a64f5f1f36..5abd653a6a1d 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp @@ -188,6 +188,17 @@ namespace Mantid if(oldInstrName==currentWSInstrumentName) { + // a direct mode instrument can be unchanged but incident energy can be different. + // It is cheap operation so we should always replace incident energy on the target workspace + try + { + double Ei = InWS2D->run().getPropertyValueAsType("Ei"); + TargTableWS->logs()->addProperty("Ei",Ei,true); + } + catch(Kernel::Exception::NotFoundError &) + {} + + if(!updateMasks) return TargTableWS; //Target workspace with preprocessed detectors exists and seems is correct one. // We still need to update masked detectors information From 53155ca651682bb3433aadea099d2fc079abbf70 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 13 Oct 2014 16:17:13 +0100 Subject: [PATCH 093/284] Added more realistic monitor data to IPF Refs #10323 --- Code/Mantid/instrument/VESUVIO_Parameters.xml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/instrument/VESUVIO_Parameters.xml b/Code/Mantid/instrument/VESUVIO_Parameters.xml index 9d2fbcaab635..d45c5accb8c3 100644 --- a/Code/Mantid/instrument/VESUVIO_Parameters.xml +++ b/Code/Mantid/instrument/VESUVIO_Parameters.xml @@ -137,20 +137,23 @@ + + + - + - + - + - + From 4a2b39b4814b13443bb652f17e8da89b375e1da8 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Mon, 13 Oct 2014 16:27:10 +0100 Subject: [PATCH 094/284] refs #10332 Throw on missing Ei at workspace in Direct mode --- .../Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp b/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp index 5abd653a6a1d..7286bf79e626 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp @@ -196,7 +196,11 @@ namespace Mantid TargTableWS->logs()->addProperty("Ei",Ei,true); } catch(Kernel::Exception::NotFoundError &) - {} + { + Emode = Kernel::DeltaEMode().fromString(dEModeRequested); + if(Emode==Kernel::DeltaEMode::Direct) + throw(std::invalid_argument("Input neutron's energy has to be attached to the workspace as Ei number log in direct inelastic mode")); + } if(!updateMasks) return TargTableWS; From f841acf595c0a2ce5a2a420aae6fccc7552ce99b Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 13 Oct 2014 16:46:26 +0100 Subject: [PATCH 095/284] Added option to plot contour when using ind. groups Disable individual grouping for OSIRIS diffonly Refs #10323 --- .../IndirectDiffractionReduction.h | 1 + .../src/IndirectDiffractionReduction.cpp | 59 ++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiffractionReduction.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiffractionReduction.h index 924729afa2e0..2631379786e7 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiffractionReduction.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiffractionReduction.h @@ -38,6 +38,7 @@ public slots: void runFilesChanged(); void runFilesFinding(); void runFilesFound(); + void individualGroupingToggled(int state); private: virtual void initLayout(); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiffractionReduction.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiffractionReduction.cpp index 4250658fffdd..c14a5e509879 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiffractionReduction.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiffractionReduction.cpp @@ -102,13 +102,22 @@ void IndirectDiffractionReduction::plotResults(bool error) QString instName = m_uiForm.cbInst->currentText(); QString mode = m_uiForm.cbReflection->currentText(); - QString pyInput = "from mantidplot import plotSpectrum\n"; - if(m_uiForm.cbPlotType->currentText() == "Spectra") + QString plotType = m_uiForm.cbPlotType->currentText(); + + QString pyInput = "from mantidplot import plotSpectrum, plot2D\n"; + + if(plotType == "Spectra" || plotType == "Both") { for(auto it = m_plotWorkspaces.begin(); it != m_plotWorkspaces.end(); ++it) pyInput += "plotSpectrum('" + *it + "', 0)\n"; } + if(plotType == "Contour" || plotType == "Both") + { + for(auto it = m_plotWorkspaces.begin(); it != m_plotWorkspaces.end(); ++it) + pyInput += "plot2D('" + *it + "')\n"; + } + runPythonCode(pyInput); } @@ -344,15 +353,26 @@ void IndirectDiffractionReduction::reflectionSelected(int) // Hide options that the current instrument config cannot process if(instrumentName == "OSIRIS" && reflection == "diffonly") { + // Disable individual grouping + m_uiForm.ckIndividualGrouping->setToolTip("OSIRIS cannot group detectors individually in diffonly mode"); + m_uiForm.ckIndividualGrouping->setEnabled(false); + m_uiForm.ckIndividualGrouping->setChecked(false); + + // Disable sum files m_uiForm.dem_ckSumFiles->setToolTip("OSIRIS cannot sum files in diffonly mode"); m_uiForm.dem_ckSumFiles->setEnabled(false); m_uiForm.dem_ckSumFiles->setChecked(false); } else { + // Re-enable sum files m_uiForm.dem_ckSumFiles->setToolTip(""); m_uiForm.dem_ckSumFiles->setEnabled(true); m_uiForm.dem_ckSumFiles->setChecked(true); + + // Re-enable individual grouping + m_uiForm.ckIndividualGrouping->setToolTip(""); + m_uiForm.ckIndividualGrouping->setEnabled(true); } } @@ -404,6 +424,9 @@ void IndirectDiffractionReduction::initLayout() m_uiForm.leRebinWidth->setValidator(m_valDbl); m_uiForm.leRebinEnd->setValidator(m_valDbl); + // Update the list of plot options when individual grouping is toggled + connect(m_uiForm.ckIndividualGrouping, SIGNAL(stateChanged(int)), this, SLOT(individualGroupingToggled(int))); + loadSettings(); // Update invalid rebinning markers @@ -541,5 +564,37 @@ void IndirectDiffractionReduction::runFilesFound() m_uiForm.dem_ckSumFiles->setChecked(false); } +/** + * Handles the user toggling the individual grouping check box. + * + * @param state The selection state of the check box + */ +void IndirectDiffractionReduction::individualGroupingToggled(int state) +{ + int itemCount = m_uiForm.cbPlotType->count(); + + switch(state) + { + case Qt::Unchecked: + if(itemCount == 4) + { + m_uiForm.cbPlotType->removeItem(3); + m_uiForm.cbPlotType->removeItem(2); + } + break; + + case Qt::Checked: + if(itemCount == 2) + { + m_uiForm.cbPlotType->insertItem(2, "Contour"); + m_uiForm.cbPlotType->insertItem(3, "Both"); + } + break; + + default: + return; + } +} + } } From f36f3ad3d88b4800e71c3d106e465de44ba47035 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Mon, 13 Oct 2014 17:08:04 +0100 Subject: [PATCH 096/284] refs #10332 Allow incident energy to be defined as eFixed log name --- .../MDAlgorithms/src/ConvertToMDParent.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp b/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp index 7286bf79e626..25dad222e6b5 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp @@ -190,16 +190,25 @@ namespace Mantid { // a direct mode instrument can be unchanged but incident energy can be different. // It is cheap operation so we should always replace incident energy on the target workspace - try + bool hasEi= InWS2D->run().hasProperty("Ei"); + bool hasEfix=InWS2D->run().hasProperty("eFixed"); + if (hasEi||hasEfix) { - double Ei = InWS2D->run().getPropertyValueAsType("Ei"); + + double Ei; + if (hasEi) Ei=InWS2D->run().getPropertyValueAsType("Ei"); + if (hasEfix) Ei=InWS2D->run().getPropertyValueAsType("eFixed"); + TargTableWS->logs()->addProperty("Ei",Ei,true); } - catch(Kernel::Exception::NotFoundError &) + else { Emode = Kernel::DeltaEMode().fromString(dEModeRequested); if(Emode==Kernel::DeltaEMode::Direct) - throw(std::invalid_argument("Input neutron's energy has to be attached to the workspace as Ei number log in direct inelastic mode")); + throw(std::invalid_argument("Input neutron's energy has to be present at the workspace as Ei or eFixed number log in Direct inelastic mode")); + if(Emode==Kernel::DeltaEMode::Indirect && !hasEfix) + throw(std::invalid_argument("Input neutron's energy has to be present at the workspace as eFixed number log in Indirect inelastic mode")); + } From c58c25b5803352e62aa8a4ddfcc5584c83604a05 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Mon, 13 Oct 2014 17:38:57 +0100 Subject: [PATCH 097/284] refs #10332 Allow different spelling for eFixed --- Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp | 2 +- .../Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp b/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp index 25dad222e6b5..7c2123566755 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp @@ -191,7 +191,7 @@ namespace Mantid // a direct mode instrument can be unchanged but incident energy can be different. // It is cheap operation so we should always replace incident energy on the target workspace bool hasEi= InWS2D->run().hasProperty("Ei"); - bool hasEfix=InWS2D->run().hasProperty("eFixed"); + bool hasEfix=InWS2D->run().hasProperty("eFixed") || InWS2D->run().hasProperty("Efixed"); if (hasEi||hasEfix) { diff --git a/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h b/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h index 5ca43c8ba0ae..3f555afd1bde 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h @@ -137,6 +137,7 @@ class ConvertToMDMinMaxLocalTest : public CxxTest::TestSuite Mantid::API::FrameworkManager::Instance(); ConvertToMDMinMaxLocal alg; Mantid::API::MatrixWorkspace_sptr ws=MakeWorkspace(-2.5,0.05,true,0,5); + WorkspaceCreationHelper::storeWS(WSName,ws); TS_ASSERT_THROWS_NOTHING( alg.initialize() ) From 041b9000ccd443fbf0ef459b4edf05896d926b37 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Mon, 13 Oct 2014 17:39:50 +0100 Subject: [PATCH 098/284] refs #10332 Test failure if Ei is not defined on source workspace Always fail in direct or indirect mode. --- .../Framework/MDAlgorithms/test/ConvertToMDComponentsTest.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDComponentsTest.h b/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDComponentsTest.h index 6c1ca26e4114..958d745759d7 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDComponentsTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDComponentsTest.h @@ -124,6 +124,11 @@ class ConvertToMDComponentsTest : public CxxTest::TestSuite TS_ASSERT_EQUALS(9,TableWS6->rowCount()); TS_ASSERT_EQUALS(4,TableWS5->rowCount()); + // Trow on running the test again if the workspace does not have energy attached. + ws2DNew->mutableRun().removeProperty("Ei"); + TSM_ASSERT_THROWS("WS has to have input energy for indirect methods despite the table workspace is already calculated",pAlg->preprocessDetectorsPositions(ws2DNew),std::invalid_argument); + + } void testUpdateMasksSkipped() From addd9b9a849c34450b60244f37cfd06f030e2fa9 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Mon, 13 Oct 2014 17:43:45 +0100 Subject: [PATCH 099/284] refs #10332 Fix min-max which now correctly changed (the previous values were related to 60mEv incident energy (Shame!) --- .../Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h b/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h index 3f555afd1bde..273ba8533da3 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h @@ -149,8 +149,8 @@ class ConvertToMDMinMaxLocalTest : public CxxTest::TestSuite TS_ASSERT( alg.isExecuted() ); // Check the results - TS_ASSERT_EQUALS("0.53808,-2.5",alg.getPropertyValue("MinValues")); - TS_ASSERT_EQUALS("0.55285,2.5",alg.getPropertyValue("MaxValues")); + TS_ASSERT_EQUALS("0.250462,-2.5",alg.getPropertyValue("MinValues")); + TS_ASSERT_EQUALS("0.34787,2.5",alg.getPropertyValue("MaxValues")); // Remove workspace from the data service. Mantid::API::AnalysisDataService::Instance().remove(WSName); } From 85569c2d992b0977898dc266f4b6fe1eac68cbc2 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Mon, 13 Oct 2014 18:12:58 +0100 Subject: [PATCH 100/284] refs #10332 Remove unnecessary check in indirect mode As indirect instrument would not easily change --- .../Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp | 6 +++--- .../MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp b/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp index 7c2123566755..c91bfedbcd0c 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/ConvertToMDParent.cpp @@ -191,7 +191,7 @@ namespace Mantid // a direct mode instrument can be unchanged but incident energy can be different. // It is cheap operation so we should always replace incident energy on the target workspace bool hasEi= InWS2D->run().hasProperty("Ei"); - bool hasEfix=InWS2D->run().hasProperty("eFixed") || InWS2D->run().hasProperty("Efixed"); + bool hasEfix= InWS2D->run().hasProperty("eFixed"); if (hasEi||hasEfix) { @@ -206,8 +206,8 @@ namespace Mantid Emode = Kernel::DeltaEMode().fromString(dEModeRequested); if(Emode==Kernel::DeltaEMode::Direct) throw(std::invalid_argument("Input neutron's energy has to be present at the workspace as Ei or eFixed number log in Direct inelastic mode")); - if(Emode==Kernel::DeltaEMode::Indirect && !hasEfix) - throw(std::invalid_argument("Input neutron's energy has to be present at the workspace as eFixed number log in Indirect inelastic mode")); + //if(Emode==Kernel::DeltaEMode::Indirect && !hasEfix) + // throw(std::invalid_argument("Input neutron's energy has to be present at the workspace as eFixed number log in Indirect inelastic mode")); } diff --git a/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h b/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h index 273ba8533da3..3f555afd1bde 100644 --- a/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h +++ b/Code/Mantid/Framework/MDAlgorithms/test/ConvertToMDMinMaxLocalTest.h @@ -149,8 +149,8 @@ class ConvertToMDMinMaxLocalTest : public CxxTest::TestSuite TS_ASSERT( alg.isExecuted() ); // Check the results - TS_ASSERT_EQUALS("0.250462,-2.5",alg.getPropertyValue("MinValues")); - TS_ASSERT_EQUALS("0.34787,2.5",alg.getPropertyValue("MaxValues")); + TS_ASSERT_EQUALS("0.53808,-2.5",alg.getPropertyValue("MinValues")); + TS_ASSERT_EQUALS("0.55285,2.5",alg.getPropertyValue("MaxValues")); // Remove workspace from the data service. Mantid::API::AnalysisDataService::Instance().remove(WSName); } From aa8e31ccde0f65f781e0f683914b89688dc9a1ae Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Mon, 13 Oct 2014 19:18:15 +0100 Subject: [PATCH 101/284] refs #10332 Should fix MergeMD doctest it was producing incorrect results!!! --- Code/Mantid/docs/source/algorithms/MergeMD-v1.rst | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/docs/source/algorithms/MergeMD-v1.rst b/Code/Mantid/docs/source/algorithms/MergeMD-v1.rst index 7847a044b08c..f8ed3e5798b8 100644 --- a/Code/Mantid/docs/source/algorithms/MergeMD-v1.rst +++ b/Code/Mantid/docs/source/algorithms/MergeMD-v1.rst @@ -69,13 +69,12 @@ Usage **************************************************************** workspace 1 has 2 dimensions with 18231 points and 18231 events with d1 min_max=0.0:5.0, d2 min_max=-10.0:10.0 - workspace 2 has 2 dimensions with 15606 points and 15606 events + workspace 2 has 2 dimensions with 18360 points and 18360 events with d1 min_max=0.0:10.0, d2 min_max=-5.0:15.0 **************************************************************** - Merged WS has 2 dimensions with 33837 points and 33837 events + Merged WS has 2 dimensions with 36591 points and 36591 events with d1 min_max=0.0:10.0, d2 min_max=-10.0:15.0 **************************************************************** - .. categories:: From 431c55684b1e8a5f0c447107372ec5730b89ae88 Mon Sep 17 00:00:00 2001 From: Anders Markvardsen Date: Tue, 14 Oct 2014 09:19:00 +0100 Subject: [PATCH 102/284] Fix TabulatedFunction Shift parameter. re #10288 Update code doc to reflect change Updating fitting table output --- .../scripts/SANS/ISISCommandInterface.py | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/Code/Mantid/scripts/SANS/ISISCommandInterface.py b/Code/Mantid/scripts/SANS/ISISCommandInterface.py index c94dcc85e0bb..f3cd45cac67a 100644 --- a/Code/Mantid/scripts/SANS/ISISCommandInterface.py +++ b/Code/Mantid/scripts/SANS/ISISCommandInterface.py @@ -560,56 +560,56 @@ def _fitRescaleAndShift(rAnds, frontData, rearData): Fit rear data to FRONTnew(Q) = ( FRONT(Q) + SHIFT )xRESCALE, FRONT(Q) is the frontData argument. Returns scale and shift + Note SHIFT is shift of a constant back, not the Shift parameter in + TabulatedFunction. + @param rAnds: A DetectorBank -> _RescaleAndShift structure @param frontData: Reduced front data @param rearData: Reduced rear data """ if rAnds.fitScale==False and rAnds.fitShift==False: return rAnds.scale, rAnds.shift - #TODO: we should allow the user to add constraints? + if rAnds.fitScale==False: if rAnds.qRangeUserSelected: Fit(InputWorkspace=rearData, Function='name=TabulatedFunction, Workspace="'+str(frontData)+'"' - +";name=FlatBackground", Ties='f0.Scaling='+str(rAnds.scale), + +";name=FlatBackground", + Ties='f0.Scaling='+str(rAnds.scale)+',f0.Shift=0.0', Output="__fitRescaleAndShift", StartX=rAnds.qMin, EndX=rAnds.qMax) else: Fit(InputWorkspace=rearData, Function='name=TabulatedFunction, Workspace="'+str(frontData)+'"' - +";name=FlatBackground", Ties='f0.Scaling='+str(rAnds.scale), + +";name=FlatBackground", + Ties='f0.Scaling='+str(rAnds.scale)+',f0.Shift=0.0', Output="__fitRescaleAndShift") elif rAnds.fitShift==False: if rAnds.qRangeUserSelected: - function_input = 'name=TabulatedFunction, Workspace="'+str(frontData)+'"' +";name=FlatBackground" - ties = 'f1.A0='+str(rAnds.shift*rAnds.scale) - logger.warning('function input ' + str(function_input)) - Fit(InputWorkspace=rearData, Function='name=TabulatedFunction, Workspace="'+str(frontData)+'"' - +";name=FlatBackground", Ties='f1.A0='+str(rAnds.shift*rAnds.scale), + +";name=FlatBackground", + Ties='f1.A0='+str(rAnds.shift*rAnds.scale)+',f0.Shift=0.0', Output="__fitRescaleAndShift", StartX=rAnds.qMin, EndX=rAnds.qMax) else: Fit(InputWorkspace=rearData, Function='name=TabulatedFunction, Workspace="'+str(frontData)+'"' - +";name=FlatBackground", Ties='f1.A0='+str(rAnds.shift*rAnds.scale), + +";name=FlatBackground", + Ties='f1.A0='+str(rAnds.shift*rAnds.scale)+',f0.Shift=0.0', Output="__fitRescaleAndShift") else: if rAnds.qRangeUserSelected: Fit(InputWorkspace=rearData, Function='name=TabulatedFunction, Workspace="'+str(frontData)+'"' - +";name=FlatBackground", + +";name=FlatBackground", Ties=',f0.Shift=0.0', Output="__fitRescaleAndShift", StartX=rAnds.qMin, EndX=rAnds.qMax) else: Fit(InputWorkspace=rearData, Function='name=TabulatedFunction, Workspace="'+str(frontData)+'"' - +";name=FlatBackground",Output="__fitRescaleAndShift") + +";name=FlatBackground", Ties=',f0.Shift=0.0', Output="__fitRescaleAndShift") param = mtd['__fitRescaleAndShift_Parameters'] - row1 = param.row(0).items() - row2 = param.row(1).items() - row3 = param.row(2).items() - scale = row1[1][1] - chiSquared = row3[1][1] + scale = param.row(0).items()[1][1] + chiSquared = param.row(3).items()[1][1] fitSuccess = True if not chiSquared > 0: @@ -622,7 +622,7 @@ def _fitRescaleAndShift(rAnds, frontData, rearData): if fitSuccess == False: return rAnds.scale, rAnds.shift - shift = row2[1][1] / scale + shift = param.row(2).items()[1][1] / scale delete_workspaces('__fitRescaleAndShift_Parameters') delete_workspaces('__fitRescaleAndShift_NormalisedCovarianceMatrix') From 40d7c14d9d5a6d626098c48a653cae8f4ed5a4eb Mon Sep 17 00:00:00 2001 From: John Hill Date: Tue, 14 Oct 2014 13:51:19 +0100 Subject: [PATCH 103/284] Refs #10194 faster save, output verified with DAWN software --- .../inc/MantidDataHandling/SaveNXTomo.h | 32 +- .../Framework/DataHandling/src/SaveNXTomo.cpp | 645 ++++++++++-------- 2 files changed, 377 insertions(+), 300 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 464f8d839495..13ccba3bb236 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -4,9 +4,10 @@ //--------------------------------------------------- // Includes //--------------------------------------------------- -//#include "MantidNexus/NexusClasses.h" -//#include -//#include +#include "vector" +#include "MantidGeometry/Instrument/RectangularDetector.h" + +using Mantid::Geometry::RectangularDetector; namespace Mantid { @@ -15,7 +16,7 @@ namespace Mantid /** * Saves a workspace into a NeXus/HDF5 NXTomo file. - * File format is defined here: http://download.nexusformat.org/sphinx/classes/applications/NXtomo.html + * File format is defined here: http://download.nexusformat.org/sphinx/classes/applications/NXtomo.html * * Required properties: *
      @@ -53,7 +54,7 @@ namespace Mantid /// Virtual dtor virtual ~SaveNXTomo() {} - /// Algorithm's name for identification overriding a virtual method + /// Algorithm's name for identification overriding a virtual method virtual const std::string name() const { return "SaveNXTomo"; } ///Summary of algorithms purpose @@ -71,22 +72,31 @@ namespace Mantid /// Execution code void exec(); - /// Save all data to file + /// Save all data to file + + /// Save batch of images to the file + + /// Fetch all rectangular Detector objects defined for an instrument + std::vector getRectangularDetectors(Geometry::Instrument_const_sptr &instrument); + + /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument + void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); - /// Save batch of images to the file + // Number of rows to + size_t m_numberOfRows; ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change - size_t m_nBins; + //size_t m_nBins; /// The filename of the output file - std::string m_filename; + std::string m_filename; // Some constants to be written for masked values. /// Value for data if pixel is masked static const double MASK_FLAG; /// Value for error if pixel is masked static const double MASK_ERROR; - /// file format version - static const std::string NXTOMO_VER; + /// file format version + static const std::string NXTOMO_VER; }; } // namespace DataHandling diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index 51c5f256d435..7b79819b9826 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -2,309 +2,376 @@ #include "MantidAPI/WorkspaceValidators.h" #include "MantidDataHandling/FindDetectorsPar.h" #include "MantidDataHandling/SaveNXTomo.h" +#include "MantidGeometry/IComponent.h" #include "MantidKernel/MantidVersion.h" #include "MantidNexus/NexusClasses.h" namespace Mantid { - namespace DataHandling - { - // Register the algorithm into the algorithm factory - DECLARE_ALGORITHM(SaveNXTomo) - - using namespace Kernel; - using namespace API; - - const double SaveNXTomo::MASK_FLAG = std::numeric_limits::quiet_NaN(); - const double SaveNXTomo::MASK_ERROR = 0.0; - const std::string SaveNXTomo::NXTOMO_VER = "2.0"; - - SaveNXTomo::SaveNXTomo() : API::Algorithm() - { - } - - /** - * Initialise the algorithm - */ - void SaveNXTomo::init() - { - auto wsValidator = boost::make_shared() ; - //wsValidator->add(boost::make_shared("DeltaE")); - wsValidator->add(); - wsValidator->add(); - - declareProperty(new WorkspaceProperty ("InputWorkspace", - "", Direction::Input, wsValidator), - "The name of the workspace to save."); - - declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), - "The name of the NXTomo file to write, as a full or relative path"); - } - - /** - * Execute the algorithm - */ - void SaveNXTomo::exec() - { - // Retrieve the input workspace - const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); - - const std::string workspaceID = inputWS->id(); - - if ((workspaceID.find("Workspace2D") == std::string::npos) && - (workspaceID.find("RebinnedOutput") == std::string::npos)) - throw Exception::NotImplementedError("SaveNexusProcessed passed invalid workspaces. Must be Workspace2D, EventWorkspace, ITableWorkspace, or OffsetsWorkspace."); + namespace DataHandling + { + // Register the algorithm into the algorithm factory + DECLARE_ALGORITHM(SaveNXTomo) + + using namespace Kernel; + using namespace API; + using Geometry::RectangularDetector; + + const double SaveNXTomo::MASK_FLAG = std::numeric_limits::quiet_NaN(); + const double SaveNXTomo::MASK_ERROR = 0.0; + const std::string SaveNXTomo::NXTOMO_VER = "2.0"; + + SaveNXTomo::SaveNXTomo() : API::Algorithm() + { + m_filename = ""; + m_numberOfRows = 32; + } + + /** + * Initialise the algorithm + */ + void SaveNXTomo::init() + { + auto wsValidator = boost::make_shared() ; + //wsValidator->add(boost::make_shared("DeltaE")); + wsValidator->add(); + wsValidator->add(); + + declareProperty(new WorkspaceProperty ("InputWorkspace", "", Direction::Input, wsValidator), + "The name of the workspace to save."); + + declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), + "The name of the NXTomo file to write, as a full or relative path"); + + declareProperty(new PropertyWithValue("Row chunk size", 32, Kernel::Direction::Input), + "Please use an evenly divisible number smaller than the image height"); + } + + /** + * Execute the algorithm + */ + void SaveNXTomo::exec() + { + // Retrieve the input workspace + const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); + + m_numberOfRows = getProperty("Row chunk size"); + + const std::string workspaceID = inputWS->id(); + + if ((workspaceID.find("Workspace2D") == std::string::npos) && + (workspaceID.find("RebinnedOutput") == std::string::npos)) + throw Exception::NotImplementedError("SaveNXTomo passed invalid workspaces. Must be Workspace2D"); + + // Do the full check for common binning + if (!WorkspaceHelpers::commonBoundaries(inputWS)) + { + g_log.error("The input workspace must have common bins"); + throw std::invalid_argument("The input workspace must have common bins"); + } + + // Number of spectra + const int nHist = static_cast(inputWS->getNumberHistograms()); + // Number of energy bins + //this->m_nBins = inputWS->blocksize(); + + // Get a pointer to the sample + //Geometry::IComponent_const_sptr sample = + // inputWS->getInstrument()->getSample(); + + // Retrieve the filename from the properties + this->m_filename = getPropertyValue("Filename"); + + // Dimensions for axis in nxTomo file. + std::vector dims_array; + dims_array.push_back(inputWS->blocksize()); // Number of bins + + // Populate the array + getDimensionsFromDetector(getRectangularDetectors(inputWS->getInstrument()), dims_array); + + // Create the file. + ::NeXus::File nxFile(this->m_filename, NXACC_CREATE5); + + // Make the top level entry (and open it) + nxFile.makeGroup("entry1", "NXentry", true); + + // Make a sub-group for the entry to work with DAWN software (and open it) + nxFile.makeGroup("tomo_entry", "NXsubentry", true); + + // Title + nxFile.writeData("title", this->m_filename); + + // Start Time; Format ISO8601 | unused but part of NXtomo schema + //nxFile.writeData("start_time", ); + + // End Time; Format ISO8601 | unused but part of NXtomo schema + //nxFile.writeData("end_time", ); + + // Definition name and version + nxFile.writeData("definition", "NXtomo"); + nxFile.openData("definition"); + nxFile.putAttr("version", NXTOMO_VER); + nxFile.closeData(); + + // Originating program name and version + nxFile.writeData("program_name", "mantid"); + nxFile.openData("program_name"); + nxFile.putAttr("version", Mantid::Kernel::MantidVersion::version()); + nxFile.closeData(); + + // ****************************************** + // NXinstrument + nxFile.makeGroup("instrument", "NXinstrument", true); + // Write the instrument name | could add short_name attribute to name + nxFile.writeData("name", inputWS->getInstrument()->getName()); + + // detector group - diamond example file contains {data,distance,image_key,x_pixel_size,y_pixel_size} Only adding image_key for now, 0 filled. + nxFile.makeGroup("detector", "NXdetector", true); + std::vector imageKeys(dims_array[0],0); + nxFile.writeData("image_key", imageKeys); + // Create link to image_key + nxFile.openData("image_key"); + NXlink imageKeyLink = nxFile.getDataID(); + nxFile.closeData(); + nxFile.closeGroup(); + + // source group // from diamond file contains {current,energy,name,probe,type} - probe = [neutron | x-ray | electron] + + nxFile.closeGroup(); // NXinstrument + + // ****************************************** + // NXsample + nxFile.makeGroup("sample", "NXsample", true); + // TODO: Write sample info + // name + + std::vector rotationAngles(dims_array[0]); + // Initialise rotations - if unknown, fill with equal steps from 0 to 180 over all frames. + // TODO: collect and use actual rotation values + + double step = static_cast(180/dims_array[0]); + rotationAngles[0] = step; + + for(auto it = rotationAngles.begin()+1; it != rotationAngles.end(); ++it) + { + *it = (*(it-1)) + step; + } + + nxFile.writeData("rotation_angle", rotationAngles); + + // Create a link object for rotation_angle to use later + nxFile.openData("rotation_angle"); + NXlink rotationLink = nxFile.getDataID(); + nxFile.closeData(); + // x_translation + // y_translation + // z_translation + nxFile.closeGroup(); // NXsample + + // ****************************************** + // Make the NXmonitor group - Holds base beam intensity for each image + // If information is not present, set as 1 + + std::vector intensity(dims_array[0],1); + nxFile.makeGroup("control", "NXmonitor", true); + nxFile.writeData("data", intensity); + nxFile.closeGroup(); // NXmonitor + + nxFile.makeGroup("data", "NXdata", true); + + nxFile.makeLink(rotationLink); + + nxFile.makeData("data", ::NeXus::FLOAT64, dims_array, false); + nxFile.makeData("error", ::NeXus::FLOAT64, dims_array, false); + + std::vector slabStart; + std::vector slabSize; + + // What size slabs are we going to write + slabSize.push_back(dims_array[0]); + slabSize.push_back((int64_t)dims_array[1]); + slabSize.push_back((int64_t)m_numberOfRows); + + // Init start to first row + slabStart.push_back(0); + slabStart.push_back(0); + slabStart.push_back(0); + + // define the data and error vectors for masked detectors + std::vector masked_data (dims_array[0], MASK_FLAG); + std::vector masked_error (dims_array[0], MASK_ERROR); + + // Create a progress reporting object + Progress progress(this,0,1,100); + const int progStep = (int)(ceil(nHist/100.0)); + Geometry::IDetector_const_sptr det; - // Do the full check for common binning - if (!WorkspaceHelpers::commonBoundaries(inputWS)) - { - g_log.error("The input workspace must have common bins"); - throw std::invalid_argument("The input workspace must have common bins"); - } - - // Number of spectra - const int nHist = static_cast(inputWS->getNumberHistograms()); - // Number of energy bins - this->m_nBins = inputWS->blocksize(); - - // Get a pointer to the sample - Geometry::IComponent_const_sptr sample = - inputWS->getInstrument()->getSample(); - - // Retrieve the filename from the properties - this->m_filename = getPropertyValue("Filename"); - - // Create some arrays for the nexus api to use - std::vector array_dims; - array_dims.push_back((int)nHist); - array_dims.push_back((int)m_nBins); - - // Create the file. - ::NeXus::File nxFile(this->m_filename, NXACC_CREATE5); - - // Make the top level entry (and open it) - nxFile.makeGroup("entry1", "NXentry", true); + double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; + double *errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - // Make a sub-group for the entry to work with DAWN software (and open it) - nxFile.makeGroup("tomo_entry", "NXsubentry", true); + int currY = 0; + int rowIndForSlab = 0; // as we're creating slabs of multiple rows, this says which y index we're at in current slab - // Title - nxFile.writeData("title", this->m_filename); - - // Start Time; Format ISO8601 | unused but part of NXtomo schema - //nxFile.writeData("start_time", ); - - // End Time; Format ISO8601 | unused but part of NXtomo schema - //nxFile.writeData("end_time", ); - - // Definition name and version - nxFile.writeData("definition", "NXtomo"); - nxFile.openData("definition"); - nxFile.putAttr("version", NXTOMO_VER); - nxFile.closeData(); - - // Originating program name and version - nxFile.writeData("program_name", "mantid"); - nxFile.openData("program_name"); - nxFile.putAttr("version", Mantid::Kernel::MantidVersion::version()); - nxFile.closeData(); - - // ****************************************** - // NXinstrument - nxFile.makeGroup("instrument", "NXinstrument", true); - // Write the instrument name | could add short_name attribute to name - nxFile.writeData("name", inputWS->getInstrument()->getName()); - - // detector group - diamond example file contains {data,distance,image_key,x_pixel_size,y_pixel_size} Only adding image_key for now, 0 filled. - nxFile.makeGroup("detector", "NXdetector", true); - std::vector imageKey(array_dims[1],0); - nxFile.writeData("image_key", imageKey); - nxFile.closeGroup(); - - // source group // from diamond file contains {current,energy,name,probe,type} - probe = neutron | x-ray | electron - - - nxFile.closeGroup(); // NXinstrument - - // ****************************************** - // NXsample - nxFile.makeGroup("sample", "NXsample", true); - // TODO: Write sample info - // name - // nxFile.writeData("rotation_angle", 0.0); - // x_translation - // y_translation - // z_translation - nxFile.closeGroup(); // NXsample - - // ****************************************** - // Make the NXmonitor group - Holds base beam intensity for each image - // If information is not present, set as 1 - - std::vector intensity(array_dims[1],1); - nxFile.makeGroup("control", "NXmonitor", true); - nxFile.writeData("data", intensity); - nxFile.closeGroup(); // NXmonitor - - // ****************************************** - // Make the NXdata group - nxFile.makeGroup("data", "NXdata", true); - - // Energy bins - // Get the Energy Axis (X) of the first spectra (they are all the same - checked above) - const MantidVec& X = inputWS->readX(0); - nxFile.writeData("energy", X); - nxFile.openData("energy"); - nxFile.putAttr("units", "meV"); - nxFile.closeData(); - - nxFile.makeData("data", ::NeXus::FLOAT64, array_dims, false); - nxFile.makeData("error", ::NeXus::FLOAT64, array_dims, false); - - // Add the axes attributes to the data - //nxFile.openData("data"); - //nxFile.putAttr("signal", 1); - //nxFile.putAttr("axes", "polar:energy"); - //nxFile.closeData(); - - std::vector slab_start; - std::vector slab_size; - - // What size slabs are we going to write... - slab_size.push_back(1); - slab_size.push_back((int64_t)m_nBins); - - // And let's start at the beginning - slab_start.push_back(0); - slab_start.push_back(0); - - // define the data and error vectors for masked detectors - std::vector masked_data (m_nBins, MASK_FLAG); - std::vector masked_error (m_nBins, MASK_ERROR); - - // Create a progress reporting object - Progress progress(this,0,1,100); - const int progStep = (int)(ceil(nHist/100.0)); - Geometry::IDetector_const_sptr det; - // Loop over spectra - for (int i = 0; i < nHist; i++) - { + // Loop over detectors + for (size_t i = 0; i < nHist; ++i) + { try - { // detector exist - det = inputWS->getDetector(i); - // Check that we aren't writing a monitor... - if (!det->isMonitor()) + { + // detector exist + //det = inputWS->getDetector(i); + // Check that we aren't writing a monitor + //if (!det->isMonitor()) + //{ + //Geometry::IDetector_const_sptr det = inputWS->getDetector(i); + + // Figure out where this pixel is supposed to be going and set the correct slab start. + const MantidVec *y = &inputWS->readY(i); + + if(i!=0 && (i)%dims_array[1] == 0){ // When this iteration matches end of a row + currY += 1; + } + size_t currX = (i) - (currY*dims_array[1]); + + const MantidVec & thisY = inputWS->readY(i); + // No masking - Set the data and error as is + for(int j=0; jisMasked()) + // { + dataArr[currInd] = thisY.at(j); + errorArr[currInd] = inputWS->readE(i).at(j); + //} + //else + //{ + // dataArr[currInd] = masked_data[j]; + // errorArr[currInd] = masked_error[j]; + //} + } + + // If end of the row has been reached, check for end of slab and write data/error + if(((i+1)%dims_array[2]) == 0) { - Geometry::IDetector_const_sptr det = inputWS->getDetector(i); - - if (!det->isMasked()) - { - // no masking... - // Open the data - nxFile.openData("data"); - slab_start[0] = i; - nxFile.putSlab(const_cast (inputWS->readY(i)), - slab_start, slab_size); - // Close the data - nxFile.closeData(); + rowIndForSlab += 1; - // Open the error - nxFile.openData("error"); - //MantidVec& tmparr = const_cast(inputWS->dataE(i)); - //nxFile.putSlab((void*)(&(tmparr[0])), slab_start, slab_size); - nxFile.putSlab(const_cast (inputWS->readE(i)), - slab_start, slab_size); - // Close the error + // if a slab has been collected. Put it into the file + if(rowIndForSlab >= m_numberOfRows) + { + slabStart[2] = currY-(rowIndForSlab-1); + + // Write Data + nxFile.openData("data"); + nxFile.putSlab(dataArr, slabStart, slabSize); nxFile.closeData(); - } - else - { - // Write a masked value... - // Open the data - nxFile.openData("data"); - slab_start[0] = i; - nxFile.putSlab(masked_data, slab_start, slab_size); - // Close the data - nxFile.closeData(); - - // Open the error - nxFile.openData("error"); - nxFile.putSlab(masked_error, slab_start, slab_size); - // Close the error + // Write Error + nxFile.openData("error"); + nxFile.putSlab(errorArr, slabStart, slabSize); nxFile.closeData(); + + // Reset slab index count + rowIndForSlab = 0; } - } - } - catch(Exception::NotFoundError&) - { - // Catch if no detector. Next line tests whether this happened - test placed - // outside here because Mac Intel compiler doesn't like 'continue' in a catch - // in an openmp block. - } - // If no detector found, skip onto the next spectrum - if ( !det ) continue; - - // make regular progress reports and check for canceling the algorithm - if ( i % progStep == 0 ) - { - progress.report(); - } - } - // execute the ChildAlgorithm to calculate the detector's parameters; - /* IAlgorithm_sptr spCalcDetPar = this->createChildAlgorithm("FindDetectorsPar", 0, 1, true, 1); - - spCalcDetPar->initialize(); - spCalcDetPar->setPropertyValue("InputWorkspace", inputWS->getName()); - std::string parFileName = this->getPropertyValue("ParFile"); - if(!(parFileName.empty()||parFileName=="not_used.par")){ - spCalcDetPar->setPropertyValue("ParFile",parFileName); - } - spCalcDetPar->execute();*/ - - // - //FindDetectorsPar * pCalcDetPar = dynamic_cast(spCalcDetPar.get()); - //if(!pCalcDetPar){ // "can not get pointer to FindDetectorsPar algorithm" - // throw(std::bad_cast()); - //} - /* const std::vector & azimuthal = pCalcDetPar->getAzimuthal(); - const std::vector & polar = pCalcDetPar->getPolar(); - const std::vector & azimuthal_width = pCalcDetPar->getAzimWidth(); - const std::vector & polar_width = pCalcDetPar->getPolarWidth(); - const std::vector & secondary_flightpath= pCalcDetPar->getFlightPath();*/ - - - //// Write the Polar (2Theta) angles - //nxFile.writeData("polar", polar); - - //// Write the Azimuthal (phi) angles - //nxFile.writeData("azimuthal", azimuthal); - - //// Now the widths... - //nxFile.writeData("polar_width", polar_width); - //nxFile.writeData("azimuthal_width", azimuthal_width); - - //// Secondary flight path - //nxFile.writeData("distance", secondary_flightpath); - - nxFile.closeGroup(); // NXdata - - nxFile.closeGroup(); // tomo_entry sub-group - - nxFile.closeGroup(); // Top level NXentry - - // Validate the file against the schema - - } - - //void someRoutineToAddDataToExisting() - //{ - // //TODO: - //} - - } // namespace DataHandling + } + } + catch(Exception::NotFoundError&) + { + /*Catch if no detector. Next line tests whether this happened - test placed + outside here because Mac Intel compiler doesn't like 'continue' in a catch + in an openmp block.*/ + } + // If no detector found, skip onto the next spectrum + if ( !det ) continue; + + // Make regular progress reports and check for canceling the algorithm + if ( i % progStep == 0 ) + { + progress.report(); + } + } + + // Create a link object for the data + nxFile.openData("data"); + NXlink dataLink = nxFile.getDataID(); + nxFile.closeData(); + + nxFile.closeGroup(); // Close Data group + + // Put a link to the data in instrument/detector + nxFile.openGroup("instrument","NXinstrument"); + nxFile.openGroup("detector","NXdetector"); + nxFile.makeLink(dataLink); + nxFile.closeGroup(); + nxFile.closeGroup(); + + + nxFile.closeGroup(); // tomo_entry sub-group + nxFile.closeGroup(); // Top level NXentry + + // Clean up memory + delete [] dataArr; + delete [] errorArr; + } + + /** + * Find all RectangularDetector objects in an instrument + * @param instrument instrument to search for detectors in + * @returns vector of all Rectangular Detectors + */ + std::vector SaveNXTomo::getRectangularDetectors(Geometry::Instrument_const_sptr &instrument) + { + std::vector> components; + instrument->getChildren(components,true); + + std::vector rectDetectors; + + for(auto it = components.begin(); it != components.end(); ++it) + { + // for all components, compare to RectangularDetector - if it is one, add it to detectors list. + const Geometry::IComponent* c = dynamic_cast(&(**it)); + + if(const RectangularDetector* r = dynamic_cast(c)) + { + rectDetectors.push_back(*(dynamic_cast(&(**it)))); + } + } + + return rectDetectors; + } + + /** + * Populates the dimensions vector with number of files, x and y sizes from a specified rectangular detector + * @param rectDetectors List of rectangular detectors to get axis sizes from + * @param dims_array vector which is populated with the different dimension values for the nxTomo file + * @param useDetectorIndex index of the detector to select from the list, default = 0 + * + * @throw runtime_error Thrown if there are no rectangular detectors + */ + void SaveNXTomo::getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) + { + // Add number of pixels in X and Y from instrument definition + // Throws if no rectangular detector is present. + + if(rectDetectors.size() != 0) + { + // Assume the first rect detector is the desired one. + dims_array.push_back(rectDetectors[useDetectorIndex].xpixels()); + dims_array.push_back(rectDetectors[useDetectorIndex].ypixels()); + } + else + { + // Incorrect workspace : requires the x/y pixel count from the instrument definition + g_log.error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); + throw std::runtime_error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); + } + } + + //void someRoutineToAddDataToExisting() + //{ + // //TODO: + //} + + } // namespace DataHandling } // namespace Mantid -// TODO: don't allow a multi-file -// Follow mtd conventions -// Add comments / function descriptions etc \ No newline at end of file From 5ccf1e5ec712d21726107ef76d04dfe507729e9b Mon Sep 17 00:00:00 2001 From: John Hill Date: Tue, 14 Oct 2014 15:06:33 +0100 Subject: [PATCH 104/284] Refs #10194 attempting to fix build error --- .../inc/MantidDataHandling/SaveNXTomo.h | 8 +- .../Framework/DataHandling/src/SaveNXTomo.cpp | 187 +++++++++--------- 2 files changed, 96 insertions(+), 99 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 13ccba3bb236..219aca172721 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -7,8 +7,6 @@ #include "vector" #include "MantidGeometry/Instrument/RectangularDetector.h" -using Mantid::Geometry::RectangularDetector; - namespace Mantid { namespace DataHandling @@ -77,12 +75,12 @@ namespace Mantid /// Save batch of images to the file /// Fetch all rectangular Detector objects defined for an instrument - std::vector getRectangularDetectors(Geometry::Instrument_const_sptr &instrument); + std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument - void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); + void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); - // Number of rows to + // Number of rows to size_t m_numberOfRows; ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index 7b79819b9826..38d35ca0737b 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -24,7 +24,7 @@ namespace Mantid SaveNXTomo::SaveNXTomo() : API::Algorithm() { m_filename = ""; - m_numberOfRows = 32; + m_numberOfRows = 32; } /** @@ -38,13 +38,13 @@ namespace Mantid wsValidator->add(); declareProperty(new WorkspaceProperty ("InputWorkspace", "", Direction::Input, wsValidator), - "The name of the workspace to save."); + "The name of the workspace to save."); declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), "The name of the NXTomo file to write, as a full or relative path"); - declareProperty(new PropertyWithValue("Row chunk size", 32, Kernel::Direction::Input), - "Please use an evenly divisible number smaller than the image height"); + declareProperty(new PropertyWithValue("Row chunk size", 32, Kernel::Direction::Input), + "Please use an evenly divisible number smaller than the image height"); } /** @@ -55,7 +55,7 @@ namespace Mantid // Retrieve the input workspace const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); - m_numberOfRows = getProperty("Row chunk size"); + m_numberOfRows = getProperty("Row chunk size"); const std::string workspaceID = inputWS->id(); @@ -71,7 +71,7 @@ namespace Mantid } // Number of spectra - const int nHist = static_cast(inputWS->getNumberHistograms()); + const size_t nHist = inputWS->getNumberHistograms(); // Number of energy bins //this->m_nBins = inputWS->blocksize(); @@ -84,7 +84,7 @@ namespace Mantid // Dimensions for axis in nxTomo file. std::vector dims_array; - dims_array.push_back(inputWS->blocksize()); // Number of bins + dims_array.push_back(inputWS->blocksize()); // Number of bins // Populate the array getDimensionsFromDetector(getRectangularDetectors(inputWS->getInstrument()), dims_array); @@ -188,9 +188,9 @@ namespace Mantid std::vector slabSize; // What size slabs are we going to write - slabSize.push_back(dims_array[0]); - slabSize.push_back((int64_t)dims_array[1]); - slabSize.push_back((int64_t)m_numberOfRows); + slabSize.push_back(dims_array[0]); + slabSize.push_back((int64_t)dims_array[1]); + slabSize.push_back((int64_t)m_numberOfRows); // Init start to first row slabStart.push_back(0); @@ -203,91 +203,90 @@ namespace Mantid // Create a progress reporting object Progress progress(this,0,1,100); - const int progStep = (int)(ceil(nHist/100.0)); + const size_t progStep = static_cast(ceil(nHist/100.0)); Geometry::IDetector_const_sptr det; - - double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - double *errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; + + double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; + double *errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - int currY = 0; - int rowIndForSlab = 0; // as we're creating slabs of multiple rows, this says which y index we're at in current slab + int currY = 0; + size_t rowIndForSlab = 0; // as we're creating slabs of multiple rows, this says which y index we're at in current slab // Loop over detectors for (size_t i = 0; i < nHist; ++i) { - try - { - // detector exist - //det = inputWS->getDetector(i); - // Check that we aren't writing a monitor - //if (!det->isMonitor()) - //{ - //Geometry::IDetector_const_sptr det = inputWS->getDetector(i); - - // Figure out where this pixel is supposed to be going and set the correct slab start. - const MantidVec *y = &inputWS->readY(i); - - if(i!=0 && (i)%dims_array[1] == 0){ // When this iteration matches end of a row - currY += 1; - } - size_t currX = (i) - (currY*dims_array[1]); - - const MantidVec & thisY = inputWS->readY(i); - // No masking - Set the data and error as is - for(int j=0; jisMasked()) - // { - dataArr[currInd] = thisY.at(j); - errorArr[currInd] = inputWS->readE(i).at(j); - //} - //else - //{ - // dataArr[currInd] = masked_data[j]; - // errorArr[currInd] = masked_error[j]; - //} - } + try + { + // detector exist + //det = inputWS->getDetector(i); + // Check that we aren't writing a monitor + //if (!det->isMonitor()) + //{ + //Geometry::IDetector_const_sptr det = inputWS->getDetector(i); + + // Figure out where this pixel is supposed to be going and set the correct slab start. + + if(i!=0 && (i)%dims_array[1] == 0){ // When this iteration matches end of a row + currY += 1; + } + size_t currX = (i) - (currY*dims_array[1]); + + const MantidVec & thisY = inputWS->readY(i); + // No masking - Set the data and error as is + for(int j=0; jisMasked()) + // { + dataArr[currInd] = thisY.at(j); + errorArr[currInd] = inputWS->readE(i).at(j); + //} + //else + //{ + // dataArr[currInd] = masked_data[j]; + // errorArr[currInd] = masked_error[j]; + //} + } - // If end of the row has been reached, check for end of slab and write data/error - if(((i+1)%dims_array[2]) == 0) - { - rowIndForSlab += 1; - - // if a slab has been collected. Put it into the file - if(rowIndForSlab >= m_numberOfRows) - { - slabStart[2] = currY-(rowIndForSlab-1); - - // Write Data - nxFile.openData("data"); - nxFile.putSlab(dataArr, slabStart, slabSize); - nxFile.closeData(); - // Write Error - nxFile.openData("error"); - nxFile.putSlab(errorArr, slabStart, slabSize); - nxFile.closeData(); - - // Reset slab index count - rowIndForSlab = 0; - } - } - } - catch(Exception::NotFoundError&) - { - /*Catch if no detector. Next line tests whether this happened - test placed - outside here because Mac Intel compiler doesn't like 'continue' in a catch - in an openmp block.*/ - } - // If no detector found, skip onto the next spectrum - if ( !det ) continue; - - // Make regular progress reports and check for canceling the algorithm - if ( i % progStep == 0 ) - { - progress.report(); - } + // If end of the row has been reached, check for end of slab and write data/error + if(((i+1)%dims_array[2]) == 0) + { + rowIndForSlab += 1; + + // if a slab has been collected. Put it into the file + if(rowIndForSlab >= m_numberOfRows) + { + slabStart[2] = currY-(rowIndForSlab-1); + + // Write Data + nxFile.openData("data"); + nxFile.putSlab(dataArr, slabStart, slabSize); + nxFile.closeData(); + // Write Error + nxFile.openData("error"); + nxFile.putSlab(errorArr, slabStart, slabSize); + nxFile.closeData(); + + // Reset slab index count + rowIndForSlab = 0; + } + } + } + catch(Exception::NotFoundError&) + { + /*Catch if no detector. Next line tests whether this happened - test placed + outside here because Mac Intel compiler doesn't like 'continue' in a catch + in an openmp block.*/ + } + // If no detector found, skip onto the next spectrum + if ( !det ) continue; + + // Make regular progress reports and check for canceling the algorithm + if ( i % progStep == 0 ) + { + progress.report(); + } } // Create a link object for the data @@ -308,9 +307,9 @@ namespace Mantid nxFile.closeGroup(); // tomo_entry sub-group nxFile.closeGroup(); // Top level NXentry - // Clean up memory - delete [] dataArr; - delete [] errorArr; + // Clean up memory + delete [] dataArr; + delete [] errorArr; } /** @@ -318,7 +317,7 @@ namespace Mantid * @param instrument instrument to search for detectors in * @returns vector of all Rectangular Detectors */ - std::vector SaveNXTomo::getRectangularDetectors(Geometry::Instrument_const_sptr &instrument) + std::vector SaveNXTomo::getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument) { std::vector> components; instrument->getChildren(components,true); @@ -329,8 +328,8 @@ namespace Mantid { // for all components, compare to RectangularDetector - if it is one, add it to detectors list. const Geometry::IComponent* c = dynamic_cast(&(**it)); - - if(const RectangularDetector* r = dynamic_cast(c)) + + if(dynamic_cast(c)) { rectDetectors.push_back(*(dynamic_cast(&(**it)))); } From db50fb13f4e5d90908f5985bc679c4cb16066e32 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 14 Oct 2014 15:13:30 +0100 Subject: [PATCH 105/284] Convert Y axis to value for increment refs #10324 --- .../MantidQtSpectrumViewer/SpectrumDisplay.h | 11 ++++--- .../SpectrumViewer/src/SVConnections.cpp | 16 ++++++---- .../SpectrumViewer/src/SpectrumDisplay.cpp | 29 +++++++++++++++---- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h index 1023476010ca..1def9ccdeb2b 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h +++ b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h @@ -95,8 +95,11 @@ class EXPORT_OPT_MANTIDQT_SPECTRUMVIEWER SpectrumDisplay /// Set vertical graph with data from the array at the specified x value void SetVGraph( double x ); + QPoint GetPlotTransform( QPair values ); + QPair GetPlotInvTransform( QPoint point ); + protected: - SpectrumPlotItem* spectrum_plot_item; + SpectrumPlotItem* spectrum_plot_item; private: /// Check if the DataSource has been changed under us @@ -112,13 +115,13 @@ class EXPORT_OPT_MANTIDQT_SPECTRUMVIEWER SpectrumDisplay std::vector negative_color_table; std::vector intensity_table; - SpectrumDataSource* data_source; + SpectrumDataSource* data_source; DataArray* data_array; QwtPlot* spectrum_plot; - ISliderHandler* slider_handler; - IRangeHandler* range_handler; + ISliderHandler* slider_handler; + IRangeHandler* range_handler; GraphDisplay* h_graph_display; GraphDisplay* v_graph_display; diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp index daa4f1203634..ca7b898b8fea 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp @@ -308,31 +308,35 @@ bool SVConnections::eventFilter(QObject *object, QEvent *event) if (m_picker_x < 0) return false; if (m_picker_y < 0) return false; - // temporary variables so we can step back to previous state + // Convert Y position to values so that a change of 1 corresponds to a change in spec. no by 1 + QPair newPositionData = spectrum_display->GetPlotInvTransform(QPoint(m_picker_x, m_picker_y)); int newX = m_picker_x; - int newY = m_picker_y; QKeyEvent *keyEvent = dynamic_cast(event); int key = keyEvent->key(); switch (key) { case Qt::Key_Up: - newY += -1; + newPositionData.second++; break; case Qt::Key_Down: - newY += 1; + newPositionData.second--; break; case Qt::Key_Left: - newX += -1; + newX--; break; case Qt::Key_Right: - newX += 1; + newX++; break; default: // this is not the event we were looking for return false; } + // Convert Y position back to pixel position + QPoint newPoint = spectrum_display->GetPlotTransform(newPositionData); + int newY = newPoint.y(); + // see if we should react if (newX < 0) return false; if (newY < 0) return false; diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp index 0b5caea9fdbf..203bcddd3cd1 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp @@ -352,6 +352,24 @@ void SpectrumDisplay::SetIntensity( double control_parameter ) } +QPoint SpectrumDisplay::GetPlotTransform( QPair values ) +{ + double x = spectrum_plot->transform( QwtPlot::xBottom, values.first ); + double y = spectrum_plot->transform( QwtPlot::yLeft, values.second ); + + return QPoint(x, y); +} + + +QPair SpectrumDisplay::GetPlotInvTransform( QPoint point ) +{ + double x = spectrum_plot->invTransform( QwtPlot::xBottom, point.x() ); + double y = spectrum_plot->invTransform( QwtPlot::yLeft, point.y() ); + + return qMakePair(x,y); +} + + /** * Extract data from horizontal and vertical cuts across the image and * show those as graphs in the horizontal and vertical graphs and show @@ -369,15 +387,14 @@ QPair SpectrumDisplay::SetPointedAtPoint( QPoint point, int /*mou return qMakePair(0.0,0.0); } - double x = spectrum_plot->invTransform( QwtPlot::xBottom, point.x() ); - double y = spectrum_plot->invTransform( QwtPlot::yLeft, point.y() ); + QPair transPoints = GetPlotInvTransform(point); - SetHGraph( y ); - SetVGraph( x ); + SetHGraph( transPoints.second ); + SetVGraph( transPoints.first ); - ShowInfoList( x, y ); + ShowInfoList( transPoints.first, transPoints.second ); - return qMakePair(x,y); + return transPoints; } /* From f05ab53faa0bfe56ec2db7dca9a271c129829ba5 Mon Sep 17 00:00:00 2001 From: John Hill Date: Tue, 14 Oct 2014 15:48:16 +0100 Subject: [PATCH 106/284] Refs #10194 attempting to fix build error --- .../inc/MantidDataHandling/SaveNXTomo.h | 5 ++- .../Framework/DataHandling/src/SaveNXTomo.cpp | 38 +++++++++++++------ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 219aca172721..92b1d63c4244 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -78,11 +78,14 @@ namespace Mantid std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument - void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); + void getDimensionsFromDetector(const std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); // Number of rows to size_t m_numberOfRows; + // Include error data in the written file + bool m_includeError; + ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change //size_t m_nBins; /// The filename of the output file diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index 38d35ca0737b..c648698319e8 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -24,6 +24,7 @@ namespace Mantid SaveNXTomo::SaveNXTomo() : API::Algorithm() { m_filename = ""; + m_includeError = false; m_numberOfRows = 32; } @@ -45,6 +46,9 @@ namespace Mantid declareProperty(new PropertyWithValue("Row chunk size", 32, Kernel::Direction::Input), "Please use an evenly divisible number smaller than the image height"); + + declareProperty(new PropertyWithValue("Include error", false, Kernel::Direction::Input), + "Write the error values to NXTomo file?"); } /** @@ -56,6 +60,7 @@ namespace Mantid const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); m_numberOfRows = getProperty("Row chunk size"); + m_includeError = getProperty("Include error"); const std::string workspaceID = inputWS->id(); @@ -182,7 +187,8 @@ namespace Mantid nxFile.makeLink(rotationLink); nxFile.makeData("data", ::NeXus::FLOAT64, dims_array, false); - nxFile.makeData("error", ::NeXus::FLOAT64, dims_array, false); + if(m_includeError) + nxFile.makeData("error", ::NeXus::FLOAT64, dims_array, false); std::vector slabStart; std::vector slabSize; @@ -199,15 +205,18 @@ namespace Mantid // define the data and error vectors for masked detectors std::vector masked_data (dims_array[0], MASK_FLAG); - std::vector masked_error (dims_array[0], MASK_ERROR); + if(m_includeError) + std::vector masked_error (dims_array[0], MASK_ERROR); // Create a progress reporting object Progress progress(this,0,1,100); - const size_t progStep = static_cast(ceil(nHist/100.0)); + const size_t progStep = static_cast(ceil(static_cast(nHist)/100.0)); Geometry::IDetector_const_sptr det; double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - double *errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; + double *errorArr; + if(m_includeError) + errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; int currY = 0; size_t rowIndForSlab = 0; // as we're creating slabs of multiple rows, this says which y index we're at in current slab @@ -240,12 +249,14 @@ namespace Mantid // if(!det->isMasked()) // { dataArr[currInd] = thisY.at(j); - errorArr[currInd] = inputWS->readE(i).at(j); + if(m_includeError) + errorArr[currInd] = inputWS->readE(i).at(j); //} //else //{ // dataArr[currInd] = masked_data[j]; - // errorArr[currInd] = masked_error[j]; + // if(m_includeError) + // errorArr[currInd] = masked_error[j]; //} } @@ -264,10 +275,12 @@ namespace Mantid nxFile.putSlab(dataArr, slabStart, slabSize); nxFile.closeData(); // Write Error - nxFile.openData("error"); - nxFile.putSlab(errorArr, slabStart, slabSize); - nxFile.closeData(); - + if(m_includeError) + { + nxFile.openData("error"); + nxFile.putSlab(errorArr, slabStart, slabSize); + nxFile.closeData(); + } // Reset slab index count rowIndForSlab = 0; } @@ -309,7 +322,8 @@ namespace Mantid // Clean up memory delete [] dataArr; - delete [] errorArr; + if(m_includeError) + delete [] errorArr; } /** @@ -346,7 +360,7 @@ namespace Mantid * * @throw runtime_error Thrown if there are no rectangular detectors */ - void SaveNXTomo::getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) + void SaveNXTomo::getDimensionsFromDetector(const std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) { // Add number of pixels in X and Y from instrument definition // Throws if no rectangular detector is present. From c86e82908c83165e9dceee47bea1f82ed3214a38 Mon Sep 17 00:00:00 2001 From: John Hill Date: Tue, 14 Oct 2014 17:05:33 +0100 Subject: [PATCH 107/284] Refs #10194 attempting to fix build error --- .../inc/MantidDataHandling/SaveNXTomo.h | 4 +-- .../Framework/DataHandling/src/SaveNXTomo.cpp | 29 ++++++++++--------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 92b1d63c4244..59e072ad7878 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -75,10 +75,10 @@ namespace Mantid /// Save batch of images to the file /// Fetch all rectangular Detector objects defined for an instrument - std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); + std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument - void getDimensionsFromDetector(const std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); + void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); // Number of rows to size_t m_numberOfRows; diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index c648698319e8..a1d84c7666e2 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -136,7 +136,7 @@ namespace Mantid nxFile.writeData("image_key", imageKeys); // Create link to image_key nxFile.openData("image_key"); - NXlink imageKeyLink = nxFile.getDataID(); + //NXlink imageKeyLink = nxFile.getDataID(); nxFile.closeData(); nxFile.closeGroup(); @@ -206,7 +206,7 @@ namespace Mantid // define the data and error vectors for masked detectors std::vector masked_data (dims_array[0], MASK_FLAG); if(m_includeError) - std::vector masked_error (dims_array[0], MASK_ERROR); + std::vector masked_error (dims_array[0], MASK_ERROR); // Create a progress reporting object Progress progress(this,0,1,100); @@ -214,7 +214,7 @@ namespace Mantid Geometry::IDetector_const_sptr det; double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - double *errorArr; + double *errorArr = NULL; if(m_includeError) errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; @@ -256,15 +256,19 @@ namespace Mantid //{ // dataArr[currInd] = masked_data[j]; // if(m_includeError) - // errorArr[currInd] = masked_error[j]; + // errorArr[currInd] = masked_error[j]; //} } - // If end of the row has been reached, check for end of slab and write data/error + // If end of the row has been reached, check for end of slab (or end of row count) and write data/error if(((i+1)%dims_array[2]) == 0) { rowIndForSlab += 1; + // Check if we have collected all of the rows (prior to completing a slab) - if so, write the final section + // TODO:: + + // if a slab has been collected. Put it into the file if(rowIndForSlab >= m_numberOfRows) { @@ -322,8 +326,7 @@ namespace Mantid // Clean up memory delete [] dataArr; - if(m_includeError) - delete [] errorArr; + delete [] errorArr; } /** @@ -331,12 +334,12 @@ namespace Mantid * @param instrument instrument to search for detectors in * @returns vector of all Rectangular Detectors */ - std::vector SaveNXTomo::getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument) + std::vector SaveNXTomo::getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument) { std::vector> components; instrument->getChildren(components,true); - std::vector rectDetectors; + std::vector rectDetectors; for(auto it = components.begin(); it != components.end(); ++it) { @@ -345,7 +348,7 @@ namespace Mantid if(dynamic_cast(c)) { - rectDetectors.push_back(*(dynamic_cast(&(**it)))); + rectDetectors.push_back(dynamic_cast(&(**it))); } } @@ -360,7 +363,7 @@ namespace Mantid * * @throw runtime_error Thrown if there are no rectangular detectors */ - void SaveNXTomo::getDimensionsFromDetector(const std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) + void SaveNXTomo::getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) { // Add number of pixels in X and Y from instrument definition // Throws if no rectangular detector is present. @@ -368,8 +371,8 @@ namespace Mantid if(rectDetectors.size() != 0) { // Assume the first rect detector is the desired one. - dims_array.push_back(rectDetectors[useDetectorIndex].xpixels()); - dims_array.push_back(rectDetectors[useDetectorIndex].ypixels()); + dims_array.push_back(rectDetectors[useDetectorIndex]->xpixels()); + dims_array.push_back(rectDetectors[useDetectorIndex]->ypixels()); } else { From 5c40edf6c156083df9c238dc7ecc5bcca568f568 Mon Sep 17 00:00:00 2001 From: John Hill Date: Tue, 14 Oct 2014 17:59:18 +0100 Subject: [PATCH 108/284] Refs #10194 attempting to fix build error --- .../inc/MantidDataHandling/SaveNXTomo.h | 2 +- .../Framework/DataHandling/src/SaveNXTomo.cpp | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 59e072ad7878..80e0cacbe038 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -78,7 +78,7 @@ namespace Mantid std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument - void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); + std::vector getDimensionsFromDetector(const std::vector &rectDetectors, size_t useDetectorIndex = 0); // Number of rows to size_t m_numberOfRows; diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index a1d84c7666e2..c843331981be 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -89,10 +89,12 @@ namespace Mantid // Dimensions for axis in nxTomo file. std::vector dims_array; - dims_array.push_back(inputWS->blocksize()); // Number of bins + + // Populate the array + dims_array = getDimensionsFromDetector(getRectangularDetectors(inputWS->getInstrument())); - // Populate the array - getDimensionsFromDetector(getRectangularDetectors(inputWS->getInstrument()), dims_array); + // Insert number of bins at front + dims_array.insert(dims_array.begin(), inputWS->blocksize()); // Number of bins // Create the file. ::NeXus::File nxFile(this->m_filename, NXACC_CREATE5); @@ -358,21 +360,23 @@ namespace Mantid /** * Populates the dimensions vector with number of files, x and y sizes from a specified rectangular detector * @param rectDetectors List of rectangular detectors to get axis sizes from - * @param dims_array vector which is populated with the different dimension values for the nxTomo file * @param useDetectorIndex index of the detector to select from the list, default = 0 - * + * @returns vector of both axis dimensions for specified detector + * * @throw runtime_error Thrown if there are no rectangular detectors */ - void SaveNXTomo::getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) + std::vector SaveNXTomo::getDimensionsFromDetector(const std::vector &rectDetectors, size_t useDetectorIndex) { // Add number of pixels in X and Y from instrument definition // Throws if no rectangular detector is present. + std::vector dims; + if(rectDetectors.size() != 0) { // Assume the first rect detector is the desired one. - dims_array.push_back(rectDetectors[useDetectorIndex]->xpixels()); - dims_array.push_back(rectDetectors[useDetectorIndex]->ypixels()); + dims.push_back(rectDetectors[useDetectorIndex]->xpixels()); + dims.push_back(rectDetectors[useDetectorIndex]->ypixels()); } else { @@ -380,6 +384,8 @@ namespace Mantid g_log.error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); throw std::runtime_error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); } + + return dims; } //void someRoutineToAddDataToExisting() From 6a0670ef0a13d1c10eb1c1b8a0f96ad037da207d Mon Sep 17 00:00:00 2001 From: John Hill Date: Thu, 11 Sep 2014 12:05:35 +0100 Subject: [PATCH 109/284] Refs #10194 create files --- .../Framework/DataHandling/CMakeLists.txt | 2 + .../inc/MantidDataHandling/SaveNXTomo.h | 104 + .../Framework/DataHandling/src/SaveNXTomo.cpp | 307 +++ .../AutoTestData/UsageData/GEM_Definition.vtp | 2047 +++++++++++++++++ 4 files changed, 2460 insertions(+) create mode 100644 Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h create mode 100644 Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp create mode 100644 Test/AutoTestData/UsageData/GEM_Definition.vtp diff --git a/Code/Mantid/Framework/DataHandling/CMakeLists.txt b/Code/Mantid/Framework/DataHandling/CMakeLists.txt index e0a7349e7f16..72aa94c182d8 100644 --- a/Code/Mantid/Framework/DataHandling/CMakeLists.txt +++ b/Code/Mantid/Framework/DataHandling/CMakeLists.txt @@ -128,6 +128,7 @@ set ( SRC_FILES src/SaveNXSPE.cpp src/SaveNexus.cpp src/SaveNexusProcessed.cpp + src/SaveNXTomo.cpp src/SaveParameterFile.cpp src/SavePAR.cpp src/SavePHX.cpp @@ -266,6 +267,7 @@ set ( INC_FILES inc/MantidDataHandling/SaveNXSPE.h inc/MantidDataHandling/SaveNexus.h inc/MantidDataHandling/SaveNexusProcessed.h + inc/MantidDataHandling/SaveNXTomo.h inc/MantidDataHandling/SaveParameterFile.h inc/MantidDataHandling/SavePAR.h inc/MantidDataHandling/SavePHX.h diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h new file mode 100644 index 000000000000..644ca2f8abdf --- /dev/null +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -0,0 +1,104 @@ +#ifndef MANTID_DATAHANDLING_SAVENXTOMO_H_ +#define MANTID_DATAHANDLING_SAVENXTOMO_H_ + +//--------------------------------------------------- +// Includes +//--------------------------------------------------- +//#include "MantidAPI/Algorithm.h" +//#include "MantidNexus/NexusClasses.h" +//#include "MantidAPI/MatrixWorkspace.h" +//#include "MantidAPI/Sample.h" +//#include "MantidDataObjects/Workspace2D.h" +//#include "MantidDataObjects/EventWorkspace.h" +//#include +//#include + +namespace Mantid +{ + namespace DataHandling + { + + /** + * Saves a workspace into a NeXus/HDF5 NXTomo file. + * + * Required properties: + *
        + *
      • InputWorkspace - The workspace to save.
      • + *
      • Filename - The filename for output
      • + *
      + * + * @author John R Hill, RAL + * @date 10/09/2014 + * + * This file is part of Mantid. + * + * Mantid 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. + * + * Mantid 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, see . + * + * File change history is stored at: + * Code Documentation is available at: + * + */ + + class DLLExport SaveNXTomo: public API::Algorithm + { + public: + /// Constructor + SaveNXTomo(); + /// Virtual dtor + virtual ~SaveNXTomo() + { + } + virtual const std::string name() const + { + return "SaveNXTomo"; + } + ///Summary of algorithms purpose + virtual const std::string summary() const {return "Writes a MatrixWorkspace to a file in the NXTomo format.";} + + /// Algorithm's version + virtual int version() const + { + return (1); + } + /// Algorithm's category for identification + virtual const std::string category() const + { + return "DataHandling\\Nexus;DataHandling\\Tomo;Diffraction"; + } + + private: + + /// Initialisation code + void init(); + ///Execution code + void exec(); + + ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change + //size_t nBins; + /// The filename of the output file + //std::string filename; + + // Some constants to be written for masked values. + /// Value for data if pixel is masked + //static const double MASK_FLAG; + /// Value for error if pixel is masked + //static const double MASK_ERROR; + /// file format version + //static const std::string NXSPE_VER; + }; + + } // namespace DataHandling +} // namespace Mantid + +#endif // MANTID_DATAHANDLING_SAVENXTOMO_H_ diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp new file mode 100644 index 000000000000..3a053edfa273 --- /dev/null +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -0,0 +1,307 @@ +#include "MantidDataHandling/SaveNXTomo.h" +#include "MantidAPI/FileProperty.h" +//#include "MantidKernel/ConfigService.h" +#include "MantidKernel/MantidVersion.h" +#include "MantidAPI/WorkspaceValidators.h" +//#include "MantidAPI/WorkspaceOpOverloads.h" +//#include "MantidGeometry/Instrument/Detector.h" +//#include "MantidGeometry/Instrument/ObjComponent.h" +//#include "MantidDataHandling/FindDetectorsPar.h" +// +//#include +//#include +//#include + +namespace Mantid +{ + namespace DataHandling + { + + // Register the algorithm into the algorithm factory + DECLARE_ALGORITHM(SaveNXTomo) + + using namespace Kernel; + using namespace API; + + SaveNXTomo::SaveNXTomo() : API::Algorithm() + { + } + + /** + * Initialise the algorithm + */ + void SaveNXTomo::init() + { + auto wsValidator = boost::make_shared() ; + wsValidator->add(boost::make_shared("DeltaE")); + wsValidator->add(); + wsValidator->add(); + + declareProperty(new WorkspaceProperty ("InputWorkspace", + "", Direction::Input, wsValidator), + "The name of the workspace to save."); + + declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), + "The name of the NXTomo file to write, as a full or relative path"); + } + + /** + * Execute the algorithm + */ + void SaveNXTomo::exec() + { + // Retrieve the input workspace + const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); + + // Do the full check for common binning + if (!WorkspaceHelpers::commonBoundaries(inputWS)) + { + g_log.error("The input workspace must have common bins"); + throw std::invalid_argument("The input workspace must have common bins"); + } + + // Number of spectra + const int nHist = static_cast(inputWS->getNumberHistograms()); + // Number of energy bins + this->nBins = inputWS->blocksize(); + + // Get a pointer to the sample + Geometry::IComponent_const_sptr sample = + inputWS->getInstrument()->getSample(); + + // Retrieve the filename from the properties + this->filename = getPropertyValue("Filename"); + + // Create the file. + ::NeXus::File nxFile(this->filename, NXACC_CREATE5); + + // Make the top level entry (and open it) + nxFile.makeGroup(inputWS->getName(), "NXentry", true); + + // Definition name and version + nxFile.writeData("definition", "NXSPE"); + nxFile.openData("definition"); + nxFile.putAttr("version", NXSPE_VER); + nxFile.closeData(); + + // Program name and version + nxFile.writeData("program_name", "mantid"); + nxFile.openData("program_name"); + nxFile.putAttr("version", Mantid::Kernel::MantidVersion::version()); + nxFile.closeData(); + + // Create NXSPE_info + nxFile.makeGroup("NXSPE_info", "NXcollection", true); + + // Get the value out of the property first + double efixed = getProperty("Efixed"); + if ( isEmpty(efixed) ) efixed = MASK_FLAG; + // Now lets check to see if the workspace nows better. + // TODO: Check that this is the way round we want to do it. + const API::Run & run = inputWS->run(); + if (run.hasProperty("Ei")) + { + Kernel::Property* propEi = run.getProperty("Ei"); + efixed = boost::lexical_cast(propEi->value()); + } + nxFile.writeData("fixed_energy", efixed); + nxFile.openData("fixed_energy"); + nxFile.putAttr("units", "meV"); + nxFile.closeData(); + + double psi = getProperty("Psi"); + if ( isEmpty(psi) ) psi = MASK_FLAG; + nxFile.writeData("psi", psi); + nxFile.openData("psi"); + nxFile.putAttr("units", "degrees"); + nxFile.closeData(); + + bool kikfScaling = getProperty("KiOverKfScaling"); + if (kikfScaling) + { + nxFile.writeData("ki_over_kf_scaling", 1); + } + else + { + nxFile.writeData("ki_over_kf_scaling", 0); + } + + nxFile.closeGroup(); // NXSPE_info + + // NXinstrument + nxFile.makeGroup("instrument", "NXinstrument", true); + // Write the instrument name + nxFile.writeData("name", inputWS->getInstrument()->getName()); + // and the short name + nxFile.openData("name"); + // TODO: Get the instrument short name + nxFile.putAttr("short_name", inputWS->getInstrument()->getName()); + nxFile.closeData(); + + // NXfermi_chopper + nxFile.makeGroup("fermi", "NXfermi_chopper", true); + + nxFile.writeData("energy", efixed); + nxFile.closeGroup(); // NXfermi_chopper + + nxFile.closeGroup(); // NXinstrument + + // NXsample + nxFile.makeGroup("sample", "NXsample", true); + // TODO: Write sample info +// nxFile.writeData("rotation_angle", 0.0); +// nxFile.writeData("seblock", "NONE"); +// nxFile.writeData("temperature", 300.0); + + nxFile.closeGroup(); // NXsample + + // Make the NXdata group + nxFile.makeGroup("data", "NXdata", true); + + // Energy bins + // Get the Energy Axis (X) of the first spectra (they are all the same - checked above) + const MantidVec& X = inputWS->readX(0); + nxFile.writeData("energy", X); + nxFile.openData("energy"); + nxFile.putAttr("units", "meV"); + nxFile.closeData(); + + // let's create some blank arrays in the nexus file + + std::vector array_dims; + array_dims.push_back((int)nHist); + array_dims.push_back((int)nBins); + + nxFile.makeData("data", ::NeXus::FLOAT64, array_dims, false); + nxFile.makeData("error", ::NeXus::FLOAT64, array_dims, false); + + // Add the axes attributes to the data + nxFile.openData("data"); + nxFile.putAttr("signal", 1); + nxFile.putAttr("axes", "polar:energy"); + nxFile.closeData(); + + std::vector slab_start; + std::vector slab_size; + + // What size slabs are we going to write... + slab_size.push_back(1); + slab_size.push_back((int64_t)nBins); + + // And let's start at the beginning + slab_start.push_back(0); + slab_start.push_back(0); + + // define the data and error vectors for masked detectors + std::vector masked_data (nBins, MASK_FLAG); + std::vector masked_error (nBins, MASK_ERROR); + + // Create a progress reporting object + Progress progress(this,0,1,100); + const int progStep = (int)(ceil(nHist/100.0)); + Geometry::IDetector_const_sptr det; + // Loop over spectra + for (int i = 0; i < nHist; i++) + { + try{ // detector exist + det =inputWS->getDetector(i); + // Check that we aren't writing a monitor... + if (!det->isMonitor()) + { + Geometry::IDetector_const_sptr det = inputWS->getDetector(i); + + if (!det->isMasked()) + { + // no masking... + // Open the data + nxFile.openData("data"); + slab_start[0] = i; + nxFile.putSlab(const_cast (inputWS->readY(i)), + slab_start, slab_size); + // Close the data + nxFile.closeData(); + + // Open the error + nxFile.openData("error"); + //MantidVec& tmparr = const_cast(inputWS->dataE(i)); + //nxFile.putSlab((void*)(&(tmparr[0])), slab_start, slab_size); + nxFile.putSlab(const_cast (inputWS->readE(i)), + slab_start, slab_size); + // Close the error + nxFile.closeData(); + } + else + { + // Write a masked value... + // Open the data + nxFile.openData("data"); + slab_start[0] = i; + nxFile.putSlab(masked_data, slab_start, slab_size); + // Close the data + nxFile.closeData(); + + // Open the error + nxFile.openData("error"); + nxFile.putSlab(masked_error, slab_start, slab_size); + // Close the error + nxFile.closeData(); + } + } + }catch(Exception::NotFoundError&) + { + // Catch if no detector. Next line tests whether this happened - test placed + // outside here because Mac Intel compiler doesn't like 'continue' in a catch + // in an openmp block. + } + // If no detector found, skip onto the next spectrum + if ( !det ) continue; + + // make regular progress reports and check for canceling the algorithm + if ( i % progStep == 0 ) + { + progress.report(); + } + } + // execute the ChildAlgorithm to calculate the detector's parameters; + IAlgorithm_sptr spCalcDetPar = this->createChildAlgorithm("FindDetectorsPar", 0, 1, true, 1); + + spCalcDetPar->initialize(); + spCalcDetPar->setPropertyValue("InputWorkspace", inputWS->getName()); + std::string parFileName = this->getPropertyValue("ParFile"); + if(!(parFileName.empty()||parFileName=="not_used.par")){ + spCalcDetPar->setPropertyValue("ParFile",parFileName); + } + spCalcDetPar->execute(); + + // + FindDetectorsPar * pCalcDetPar = dynamic_cast(spCalcDetPar.get()); + if(!pCalcDetPar){ // "can not get pointer to FindDetectorsPar algorithm" + throw(std::bad_cast()); + } + const std::vector & azimuthal = pCalcDetPar->getAzimuthal(); + const std::vector & polar = pCalcDetPar->getPolar(); + const std::vector & azimuthal_width = pCalcDetPar->getAzimWidth(); + const std::vector & polar_width = pCalcDetPar->getPolarWidth(); + const std::vector & secondary_flightpath= pCalcDetPar->getFlightPath(); + + + // Write the Polar (2Theta) angles + nxFile.writeData("polar", polar); + + // Write the Azimuthal (phi) angles + nxFile.writeData("azimuthal", azimuthal); + + // Now the widths... + nxFile.writeData("polar_width", polar_width); + nxFile.writeData("azimuthal_width", azimuthal_width); + + // Secondary flight path + nxFile.writeData("distance", secondary_flightpath); + + nxFile.closeGroup(); // NXdata + + nxFile.closeGroup(); // Top level NXentry + } + + } // namespace DataHandling +} // namespace Mantid diff --git a/Test/AutoTestData/UsageData/GEM_Definition.vtp b/Test/AutoTestData/UsageData/GEM_Definition.vtp new file mode 100644 index 000000000000..d6415ab3b951 --- /dev/null +++ b/Test/AutoTestData/UsageData/GEM_Definition.vtp @@ -0,0 +1,2047 @@ + + + + + -0.0101667 -0.0582343 0 -0.00533706 -0.0595284 0 -0.00533706 -0.0595284 0.001 -0.0101667 -0.0582343 0.001 -0.0101667 -0.0582343 0 -0.00533706 -0.0595284 0 -0.0025 -5.51091e-17 0 -0.00591826 -0.0390708 0 -0.00335619 -0.01961 0 -0.0101667 0.0582343 0 -0.00335619 0.01961 0 -0.00591826 0.0390708 0 -0.00533706 0.0595284 0 0.0025 -5.63338e-17 0 0.00162478 0.0200458 0 -0.000994217 0.0399391 0 -0.000994217 -0.0399391 0 0.00162478 -0.0200458 0 -0.00533706 -0.0595284 0 -0.00533706 -0.0595284 0.001 0.0025 -5.63338e-17 0.001 -0.000994217 -0.0399391 0.001 0.00162478 -0.0200458 0.001 0.0025 -5.63338e-17 0 -0.000994217 -0.0399391 0 0.00162478 -0.0200458 0 -0.0101667 -0.0582343 0.001 -0.00533706 -0.0595284 0.001 -0.0025 -5.51091e-17 0.001 -0.00591826 -0.0390708 0.001 -0.00335619 -0.01961 0.001 -0.0101667 0.0582343 0.001 -0.00335619 0.01961 0.001 -0.00591826 0.0390708 0.001 -0.00533706 0.0595284 0.001 0.0025 -5.63338e-17 0.001 0.00162478 0.0200458 0.001 -0.000994217 0.0399391 0.001 -0.000994217 -0.0399391 0.001 0.00162478 -0.0200458 0.001 -0.0101667 -0.0582343 0 -0.0101667 -0.0582343 0.001 -0.0025 -5.51091e-17 0.001 -0.00591826 -0.0390708 0.001 -0.00335619 -0.01961 0.001 -0.0025 -5.51091e-17 0 -0.00591826 -0.0390708 0 -0.00335619 -0.01961 0 -0.0025 -5.51091e-17 0 -0.0025 -5.51091e-17 0.001 -0.0101667 0.0582343 0.001 -0.00335619 0.01961 0.001 -0.00591826 0.0390708 0.001 -0.0101667 0.0582343 0 -0.00335619 0.01961 0 -0.00591826 0.0390708 0 -0.0101667 0.0582343 0 -0.00533706 0.0595284 0 -0.00533706 0.0595284 0.001 -0.0101667 0.0582343 0.001 0.0025 -5.63338e-17 0 0.0025 -5.63338e-17 0.001 -0.00533706 0.0595284 0.001 0.00162478 0.0200458 0.001 -0.000994217 0.0399391 0.001 -0.00533706 0.0595284 0 0.00162478 0.0200458 0 -0.000994217 0.0399391 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0103371 -0.0595284 0 -0.00550743 -0.0608225 0 -0.00550743 -0.0608225 0.001 -0.0103371 -0.0595284 0.001 -0.0103371 -0.0595284 0 -0.00550743 -0.0608225 0 -0.0025 -5.63338e-17 0 -0.00599422 -0.0399391 0 -0.00337522 -0.0200458 0 -0.0103371 0.0595284 0 -0.00337522 0.0200458 0 -0.00599422 0.0399391 0 -0.00550743 0.0608225 0 0.0025 -5.75584e-17 0 0.00160575 0.0204816 0 -0.00107018 0.0408073 0 -0.00107018 -0.0408073 0 0.00160575 -0.0204816 0 -0.00550743 -0.0608225 0 -0.00550743 -0.0608225 0.001 0.0025 -5.75584e-17 0.001 -0.00107018 -0.0408073 0.001 0.00160575 -0.0204816 0.001 0.0025 -5.75584e-17 0 -0.00107018 -0.0408073 0 0.00160575 -0.0204816 0 -0.0103371 -0.0595284 0.001 -0.00550743 -0.0608225 0.001 -0.0025 -5.63338e-17 0.001 -0.00599422 -0.0399391 0.001 -0.00337522 -0.0200458 0.001 -0.0103371 0.0595284 0.001 -0.00337522 0.0200458 0.001 -0.00599422 0.0399391 0.001 -0.00550743 0.0608225 0.001 0.0025 -5.75584e-17 0.001 0.00160575 0.0204816 0.001 -0.00107018 0.0408073 0.001 -0.00107018 -0.0408073 0.001 0.00160575 -0.0204816 0.001 -0.0103371 -0.0595284 0 -0.0103371 -0.0595284 0.001 -0.0025 -5.63338e-17 0.001 -0.00599422 -0.0399391 0.001 -0.00337522 -0.0200458 0.001 -0.0025 -5.63338e-17 0 -0.00599422 -0.0399391 0 -0.00337522 -0.0200458 0 -0.0025 -5.63338e-17 0 -0.0025 -5.63338e-17 0.001 -0.0103371 0.0595284 0.001 -0.00337522 0.0200458 0.001 -0.00599422 0.0399391 0.001 -0.0103371 0.0595284 0 -0.00337522 0.0200458 0 -0.00599422 0.0399391 0 -0.0103371 0.0595284 0 -0.00550743 0.0608225 0 -0.00550743 0.0608225 0.001 -0.0103371 0.0595284 0.001 0.0025 -5.75584e-17 0 0.0025 -5.75584e-17 0.001 -0.00550743 0.0608225 0.001 0.00160575 0.0204816 0.001 -0.00107018 0.0408073 0.001 -0.00550743 0.0608225 0 0.00160575 0.0204816 0 -0.00107018 0.0408073 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0118602 -0.0710976 0 -0.00703055 -0.0723917 0 -0.00703055 -0.0723917 0.001 -0.0118602 -0.0710976 0.001 -0.0118602 -0.0710976 0 -0.00703055 -0.0723917 0 -0.0025 -6.72821e-17 0 -0.00667331 -0.0477012 0 -0.00354532 -0.0239417 0 -0.0118602 0.0710976 0 -0.00354532 0.0239417 0 -0.00667331 0.0477012 0 -0.00703055 0.0723917 0 0.0025 -6.85067e-17 0 0.00143566 0.0243775 0 -0.00174927 0.0485694 0 -0.00174927 -0.0485694 0 0.00143566 -0.0243775 0 -0.00703055 -0.0723917 0 -0.00703055 -0.0723917 0.001 0.0025 -6.85067e-17 0.001 -0.00174927 -0.0485694 0.001 0.00143566 -0.0243775 0.001 0.0025 -6.85067e-17 0 -0.00174927 -0.0485694 0 0.00143566 -0.0243775 0 -0.0118602 -0.0710976 0.001 -0.00703055 -0.0723917 0.001 -0.0025 -6.72821e-17 0.001 -0.00667331 -0.0477012 0.001 -0.00354532 -0.0239417 0.001 -0.0118602 0.0710976 0.001 -0.00354532 0.0239417 0.001 -0.00667331 0.0477012 0.001 -0.00703055 0.0723917 0.001 0.0025 -6.85067e-17 0.001 0.00143566 0.0243775 0.001 -0.00174927 0.0485694 0.001 -0.00174927 -0.0485694 0.001 0.00143566 -0.0243775 0.001 -0.0118602 -0.0710976 0 -0.0118602 -0.0710976 0.001 -0.0025 -6.72821e-17 0.001 -0.00667331 -0.0477012 0.001 -0.00354532 -0.0239417 0.001 -0.0025 -6.72821e-17 0 -0.00667331 -0.0477012 0 -0.00354532 -0.0239417 0 -0.0025 -6.72821e-17 0 -0.0025 -6.72821e-17 0.001 -0.0118602 0.0710976 0.001 -0.00354532 0.0239417 0.001 -0.00667331 0.0477012 0.001 -0.0118602 0.0710976 0 -0.00354532 0.0239417 0 -0.00667331 0.0477012 0 -0.0118602 0.0710976 0 -0.00703055 0.0723917 0 -0.00703055 0.0723917 0.001 -0.0118602 0.0710976 0.001 0.0025 -6.85067e-17 0 0.0025 -6.85067e-17 0.001 -0.00703055 0.0723917 0.001 0.00143566 0.0243775 0.001 -0.00174927 0.0485694 0.001 -0.00703055 0.0723917 0 0.00143566 0.0243775 0 -0.00174927 0.0485694 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0120305 -0.0723917 0 -0.00720092 -0.0736858 0 -0.00720092 -0.0736858 0.001 -0.0120305 -0.0723917 0.001 -0.0120305 -0.0723917 0 -0.00720092 -0.0736858 0 -0.0025 -6.85067e-17 0 -0.00674927 -0.0485694 0 -0.00356434 -0.0243775 0 -0.0120305 0.0723917 0 -0.00356434 0.0243775 0 -0.00674927 0.0485694 0 -0.00720092 0.0736858 0 0.0025 -6.97314e-17 0 0.00141663 0.0248132 0 -0.00182523 0.0494376 0 -0.00182523 -0.0494376 0 0.00141663 -0.0248132 0 -0.00720092 -0.0736858 0 -0.00720092 -0.0736858 0.001 0.0025 -6.97314e-17 0.001 -0.00182523 -0.0494376 0.001 0.00141663 -0.0248132 0.001 0.0025 -6.97314e-17 0 -0.00182523 -0.0494376 0 0.00141663 -0.0248132 0 -0.0120305 -0.0723917 0.001 -0.00720092 -0.0736858 0.001 -0.0025 -6.85067e-17 0.001 -0.00674927 -0.0485694 0.001 -0.00356434 -0.0243775 0.001 -0.0120305 0.0723917 0.001 -0.00356434 0.0243775 0.001 -0.00674927 0.0485694 0.001 -0.00720092 0.0736858 0.001 0.0025 -6.97314e-17 0.001 0.00141663 0.0248132 0.001 -0.00182523 0.0494376 0.001 -0.00182523 -0.0494376 0.001 0.00141663 -0.0248132 0.001 -0.0120305 -0.0723917 0 -0.0120305 -0.0723917 0.001 -0.0025 -6.85067e-17 0.001 -0.00674927 -0.0485694 0.001 -0.00356434 -0.0243775 0.001 -0.0025 -6.85067e-17 0 -0.00674927 -0.0485694 0 -0.00356434 -0.0243775 0 -0.0025 -6.85067e-17 0 -0.0025 -6.85067e-17 0.001 -0.0120305 0.0723917 0.001 -0.00356434 0.0243775 0.001 -0.00674927 0.0485694 0.001 -0.0120305 0.0723917 0 -0.00356434 0.0243775 0 -0.00674927 0.0485694 0 -0.0120305 0.0723917 0 -0.00720092 0.0736858 0 -0.00720092 0.0736858 0.001 -0.0120305 0.0723917 0.001 0.0025 -6.97314e-17 0 0.0025 -6.97314e-17 0.001 -0.00720092 0.0736858 0.001 0.00141663 0.0248132 0.001 -0.00182523 0.0494376 0.001 -0.00720092 0.0736858 0 0.00141663 0.0248132 0 -0.00182523 0.0494376 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0121975 -0.0736599 0 -0.00736788 -0.074954 0 -0.00736788 -0.074954 0.001 -0.0121975 -0.0736599 0.001 -0.0121975 -0.0736599 0 -0.00736788 -0.074954 0 -0.0025 -6.97069e-17 0 -0.00682371 -0.0494203 0 -0.00358299 -0.0248045 0 -0.0121975 0.0736599 0 -0.00358299 0.0248045 0 -0.00682371 0.0494203 0 -0.00736788 0.074954 0 0.0025 -7.09315e-17 0 0.00139798 0.0252403 0 -0.00189967 0.0502885 0 -0.00189967 -0.0502885 0 0.00139798 -0.0252403 0 -0.00736788 -0.074954 0 -0.00736788 -0.074954 0.001 0.0025 -7.09315e-17 0.001 -0.00189967 -0.0502885 0.001 0.00139798 -0.0252403 0.001 0.0025 -7.09315e-17 0 -0.00189967 -0.0502885 0 0.00139798 -0.0252403 0 -0.0121975 -0.0736599 0.001 -0.00736788 -0.074954 0.001 -0.0025 -6.97069e-17 0.001 -0.00682371 -0.0494203 0.001 -0.00358299 -0.0248045 0.001 -0.0121975 0.0736599 0.001 -0.00358299 0.0248045 0.001 -0.00682371 0.0494203 0.001 -0.00736788 0.074954 0.001 0.0025 -7.09315e-17 0.001 0.00139798 0.0252403 0.001 -0.00189967 0.0502885 0.001 -0.00189967 -0.0502885 0.001 0.00139798 -0.0252403 0.001 -0.0121975 -0.0736599 0 -0.0121975 -0.0736599 0.001 -0.0025 -6.97069e-17 0.001 -0.00682371 -0.0494203 0.001 -0.00358299 -0.0248045 0.001 -0.0025 -6.97069e-17 0 -0.00682371 -0.0494203 0 -0.00358299 -0.0248045 0 -0.0025 -6.97069e-17 0 -0.0025 -6.97069e-17 0.001 -0.0121975 0.0736599 0.001 -0.00358299 0.0248045 0.001 -0.00682371 0.0494203 0.001 -0.0121975 0.0736599 0 -0.00358299 0.0248045 0 -0.00682371 0.0494203 0 -0.0121975 0.0736599 0 -0.00736788 0.074954 0 -0.00736788 0.074954 0.001 -0.0121975 0.0736599 0.001 0.0025 -7.09315e-17 0 0.0025 -7.09315e-17 0.001 -0.00736788 0.074954 0.001 0.00139798 0.0252403 0.001 -0.00189967 0.0502885 0.001 -0.00736788 0.074954 0 0.00139798 0.0252403 0 -0.00189967 0.0502885 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0123679 -0.074954 0 -0.00753825 -0.0762481 0 -0.00753825 -0.0762481 0.001 -0.0123679 -0.074954 0.001 -0.0123679 -0.074954 0 -0.00753825 -0.0762481 0 -0.0025 -7.09315e-17 0 -0.00689967 -0.0502885 0 -0.00360202 -0.0252403 0 -0.0123679 0.074954 0 -0.00360202 0.0252403 0 -0.00689967 0.0502885 0 -0.00753825 0.0762481 0 0.0025 -7.21562e-17 0 0.00137896 0.0256761 0 -0.00197564 0.0511568 0 -0.00197564 -0.0511568 0 0.00137896 -0.0256761 0 -0.00753825 -0.0762481 0 -0.00753825 -0.0762481 0.001 0.0025 -7.21562e-17 0.001 -0.00197564 -0.0511568 0.001 0.00137896 -0.0256761 0.001 0.0025 -7.21562e-17 0 -0.00197564 -0.0511568 0 0.00137896 -0.0256761 0 -0.0123679 -0.074954 0.001 -0.00753825 -0.0762481 0.001 -0.0025 -7.09315e-17 0.001 -0.00689967 -0.0502885 0.001 -0.00360202 -0.0252403 0.001 -0.0123679 0.074954 0.001 -0.00360202 0.0252403 0.001 -0.00689967 0.0502885 0.001 -0.00753825 0.0762481 0.001 0.0025 -7.21562e-17 0.001 0.00137896 0.0256761 0.001 -0.00197564 0.0511568 0.001 -0.00197564 -0.0511568 0.001 0.00137896 -0.0256761 0.001 -0.0123679 -0.074954 0 -0.0123679 -0.074954 0.001 -0.0025 -7.09315e-17 0.001 -0.00689967 -0.0502885 0.001 -0.00360202 -0.0252403 0.001 -0.0025 -7.09315e-17 0 -0.00689967 -0.0502885 0 -0.00360202 -0.0252403 0 -0.0025 -7.09315e-17 0 -0.0025 -7.09315e-17 0.001 -0.0123679 0.074954 0.001 -0.00360202 0.0252403 0.001 -0.00689967 0.0502885 0.001 -0.0123679 0.074954 0 -0.00360202 0.0252403 0 -0.00689967 0.0502885 0 -0.0123679 0.074954 0 -0.00753825 0.0762481 0 -0.00753825 0.0762481 0.001 -0.0123679 0.074954 0.001 0.0025 -7.21562e-17 0 0.0025 -7.21562e-17 0.001 -0.00753825 0.0762481 0.001 0.00137896 0.0256761 0.001 -0.00197564 0.0511568 0.001 -0.00753825 0.0762481 0 0.00137896 0.0256761 0 -0.00197564 0.0511568 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0125383 -0.0762481 0 -0.00770862 -0.0775422 0 -0.00770862 -0.0775422 0.001 -0.0125383 -0.0762481 0.001 -0.0125383 -0.0762481 0 -0.00770862 -0.0775422 0 -0.0025 -7.21562e-17 0 -0.00697564 -0.0511568 0 -0.00362104 -0.0256761 0 -0.0125383 0.0762481 0 -0.00362104 0.0256761 0 -0.00697564 0.0511568 0 -0.00770862 0.0775422 0 0.0025 -7.33808e-17 0 0.00135993 0.0261119 0 -0.0020516 0.052025 0 -0.0020516 -0.052025 0 0.00135993 -0.0261119 0 -0.00770862 -0.0775422 0 -0.00770862 -0.0775422 0.001 0.0025 -7.33808e-17 0.001 -0.0020516 -0.052025 0.001 0.00135993 -0.0261119 0.001 0.0025 -7.33808e-17 0 -0.0020516 -0.052025 0 0.00135993 -0.0261119 0 -0.0125383 -0.0762481 0.001 -0.00770862 -0.0775422 0.001 -0.0025 -7.21562e-17 0.001 -0.00697564 -0.0511568 0.001 -0.00362104 -0.0256761 0.001 -0.0125383 0.0762481 0.001 -0.00362104 0.0256761 0.001 -0.00697564 0.0511568 0.001 -0.00770862 0.0775422 0.001 0.0025 -7.33808e-17 0.001 0.00135993 0.0261119 0.001 -0.0020516 0.052025 0.001 -0.0020516 -0.052025 0.001 0.00135993 -0.0261119 0.001 -0.0125383 -0.0762481 0 -0.0125383 -0.0762481 0.001 -0.0025 -7.21562e-17 0.001 -0.00697564 -0.0511568 0.001 -0.00362104 -0.0256761 0.001 -0.0025 -7.21562e-17 0 -0.00697564 -0.0511568 0 -0.00362104 -0.0256761 0 -0.0025 -7.21562e-17 0 -0.0025 -7.21562e-17 0.001 -0.0125383 0.0762481 0.001 -0.00362104 0.0256761 0.001 -0.00697564 0.0511568 0.001 -0.0125383 0.0762481 0 -0.00362104 0.0256761 0 -0.00697564 0.0511568 0 -0.0125383 0.0762481 0 -0.00770862 0.0775422 0 -0.00770862 0.0775422 0.001 -0.0125383 0.0762481 0.001 0.0025 -7.33808e-17 0 0.0025 -7.33808e-17 0.001 -0.00770862 0.0775422 0.001 0.00135993 0.0261119 0.001 -0.0020516 0.052025 0.001 -0.00770862 0.0775422 0 0.00135993 0.0261119 0 -0.0020516 0.052025 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0127052 -0.0775163 0 -0.00787559 -0.0788104 0 -0.00787559 -0.0788104 0.001 -0.0127052 -0.0775163 0.001 -0.0127052 -0.0775163 0 -0.00787559 -0.0788104 0 -0.0025 -7.33563e-17 0 -0.00705008 -0.0520076 0 -0.00363969 -0.0261031 0 -0.0127052 0.0775163 0 -0.00363969 0.0261031 0 -0.00705008 0.0520076 0 -0.00787559 0.0788104 0 0.0025 -7.4581e-17 0 0.00134129 0.0265389 0 -0.00212604 0.0528759 0 -0.00212604 -0.0528759 0 0.00134129 -0.0265389 0 -0.00787559 -0.0788104 0 -0.00787559 -0.0788104 0.001 0.0025 -7.4581e-17 0.001 -0.00212604 -0.0528759 0.001 0.00134129 -0.0265389 0.001 0.0025 -7.4581e-17 0 -0.00212604 -0.0528759 0 0.00134129 -0.0265389 0 -0.0127052 -0.0775163 0.001 -0.00787559 -0.0788104 0.001 -0.0025 -7.33563e-17 0.001 -0.00705008 -0.0520076 0.001 -0.00363969 -0.0261031 0.001 -0.0127052 0.0775163 0.001 -0.00363969 0.0261031 0.001 -0.00705008 0.0520076 0.001 -0.00787559 0.0788104 0.001 0.0025 -7.4581e-17 0.001 0.00134129 0.0265389 0.001 -0.00212604 0.0528759 0.001 -0.00212604 -0.0528759 0.001 0.00134129 -0.0265389 0.001 -0.0127052 -0.0775163 0 -0.0127052 -0.0775163 0.001 -0.0025 -7.33563e-17 0.001 -0.00705008 -0.0520076 0.001 -0.00363969 -0.0261031 0.001 -0.0025 -7.33563e-17 0 -0.00705008 -0.0520076 0 -0.00363969 -0.0261031 0 -0.0025 -7.33563e-17 0 -0.0025 -7.33563e-17 0.001 -0.0127052 0.0775163 0.001 -0.00363969 0.0261031 0.001 -0.00705008 0.0520076 0.001 -0.0127052 0.0775163 0 -0.00363969 0.0261031 0 -0.00705008 0.0520076 0 -0.0127052 0.0775163 0 -0.00787559 0.0788104 0 -0.00787559 0.0788104 0.001 -0.0127052 0.0775163 0.001 0.0025 -7.4581e-17 0 0.0025 -7.4581e-17 0.001 -0.00787559 0.0788104 0.001 0.00134129 0.0265389 0.001 -0.00212604 0.0528759 0.001 -0.00787559 0.0788104 0 0.00134129 0.0265389 0 -0.00212604 0.0528759 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0128756 -0.0788104 0 -0.00804596 -0.0801045 0 -0.00804596 -0.0801045 0.001 -0.0128756 -0.0788104 0.001 -0.0128756 -0.0788104 0 -0.00804596 -0.0801045 0 -0.0025 -7.4581e-17 0 -0.00712604 -0.0528759 0 -0.00365871 -0.0265389 0 -0.0128756 0.0788104 0 -0.00365871 0.0265389 0 -0.00712604 0.0528759 0 -0.00804596 0.0801045 0 0.0025 -7.58056e-17 0 0.00132226 0.0269747 0 -0.002202 0.0537441 0 -0.002202 -0.0537441 0 0.00132226 -0.0269747 0 -0.00804596 -0.0801045 0 -0.00804596 -0.0801045 0.001 0.0025 -7.58056e-17 0.001 -0.002202 -0.0537441 0.001 0.00132226 -0.0269747 0.001 0.0025 -7.58056e-17 0 -0.002202 -0.0537441 0 0.00132226 -0.0269747 0 -0.0128756 -0.0788104 0.001 -0.00804596 -0.0801045 0.001 -0.0025 -7.4581e-17 0.001 -0.00712604 -0.0528759 0.001 -0.00365871 -0.0265389 0.001 -0.0128756 0.0788104 0.001 -0.00365871 0.0265389 0.001 -0.00712604 0.0528759 0.001 -0.00804596 0.0801045 0.001 0.0025 -7.58056e-17 0.001 0.00132226 0.0269747 0.001 -0.002202 0.0537441 0.001 -0.002202 -0.0537441 0.001 0.00132226 -0.0269747 0.001 -0.0128756 -0.0788104 0 -0.0128756 -0.0788104 0.001 -0.0025 -7.4581e-17 0.001 -0.00712604 -0.0528759 0.001 -0.00365871 -0.0265389 0.001 -0.0025 -7.4581e-17 0 -0.00712604 -0.0528759 0 -0.00365871 -0.0265389 0 -0.0025 -7.4581e-17 0 -0.0025 -7.4581e-17 0.001 -0.0128756 0.0788104 0.001 -0.00365871 0.0265389 0.001 -0.00712604 0.0528759 0.001 -0.0128756 0.0788104 0 -0.00365871 0.0265389 0 -0.00712604 0.0528759 0 -0.0128756 0.0788104 0 -0.00804596 0.0801045 0 -0.00804596 0.0801045 0.001 -0.0128756 0.0788104 0.001 0.0025 -7.58056e-17 0 0.0025 -7.58056e-17 0.001 -0.00804596 0.0801045 0.001 0.00132226 0.0269747 0.001 -0.002202 0.0537441 0.001 -0.00804596 0.0801045 0 0.00132226 0.0269747 0 -0.002202 0.0537441 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0130425 -0.0800786 0 -0.00821292 -0.0813727 0 -0.00821292 -0.0813727 0.001 -0.0130425 -0.0800786 0.001 -0.0130425 -0.0800786 0 -0.00821292 -0.0813727 0 -0.0025 -7.57811e-17 0 -0.00720048 -0.0537267 0 -0.00367736 -0.026966 0 -0.0130425 0.0800786 0 -0.00367736 0.026966 0 -0.00720048 0.0537267 0 -0.00821292 0.0813727 0 0.0025 -7.70058e-17 0 0.00130361 0.0274018 0 -0.00227644 0.054595 0 -0.00227644 -0.054595 0 0.00130361 -0.0274018 0 -0.00821292 -0.0813727 0 -0.00821292 -0.0813727 0.001 0.0025 -7.70058e-17 0.001 -0.00227644 -0.054595 0.001 0.00130361 -0.0274018 0.001 0.0025 -7.70058e-17 0 -0.00227644 -0.054595 0 0.00130361 -0.0274018 0 -0.0130425 -0.0800786 0.001 -0.00821292 -0.0813727 0.001 -0.0025 -7.57811e-17 0.001 -0.00720048 -0.0537267 0.001 -0.00367736 -0.026966 0.001 -0.0130425 0.0800786 0.001 -0.00367736 0.026966 0.001 -0.00720048 0.0537267 0.001 -0.00821292 0.0813727 0.001 0.0025 -7.70058e-17 0.001 0.00130361 0.0274018 0.001 -0.00227644 0.054595 0.001 -0.00227644 -0.054595 0.001 0.00130361 -0.0274018 0.001 -0.0130425 -0.0800786 0 -0.0130425 -0.0800786 0.001 -0.0025 -7.57811e-17 0.001 -0.00720048 -0.0537267 0.001 -0.00367736 -0.026966 0.001 -0.0025 -7.57811e-17 0 -0.00720048 -0.0537267 0 -0.00367736 -0.026966 0 -0.0025 -7.57811e-17 0 -0.0025 -7.57811e-17 0.001 -0.0130425 0.0800786 0.001 -0.00367736 0.026966 0.001 -0.00720048 0.0537267 0.001 -0.0130425 0.0800786 0 -0.00367736 0.026966 0 -0.00720048 0.0537267 0 -0.0130425 0.0800786 0 -0.00821292 0.0813727 0 -0.00821292 0.0813727 0.001 -0.0130425 0.0800786 0.001 0.0025 -7.70058e-17 0 0.0025 -7.70058e-17 0.001 -0.00821292 0.0813727 0.001 0.00130361 0.0274018 0.001 -0.00227644 0.054595 0.001 -0.00821292 0.0813727 0 0.00130361 0.0274018 0 -0.00227644 0.054595 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0132129 -0.0813727 0 -0.00838329 -0.0826668 0 -0.00838329 -0.0826668 0.001 -0.0132129 -0.0813727 0.001 -0.0132129 -0.0813727 0 -0.00838329 -0.0826668 0 -0.0025 -7.70058e-17 0 -0.00727644 -0.054595 0 -0.00369639 -0.0274018 0 -0.0132129 0.0813727 0 -0.00369639 0.0274018 0 -0.00727644 0.054595 0 -0.00838329 0.0826668 0 0.0025 -7.82304e-17 0 0.00128459 0.0278375 0 -0.0023524 0.0554632 0 -0.0023524 -0.0554632 0 0.00128459 -0.0278375 0 -0.00838329 -0.0826668 0 -0.00838329 -0.0826668 0.001 0.0025 -7.82304e-17 0.001 -0.0023524 -0.0554632 0.001 0.00128459 -0.0278375 0.001 0.0025 -7.82304e-17 0 -0.0023524 -0.0554632 0 0.00128459 -0.0278375 0 -0.0132129 -0.0813727 0.001 -0.00838329 -0.0826668 0.001 -0.0025 -7.70058e-17 0.001 -0.00727644 -0.054595 0.001 -0.00369639 -0.0274018 0.001 -0.0132129 0.0813727 0.001 -0.00369639 0.0274018 0.001 -0.00727644 0.054595 0.001 -0.00838329 0.0826668 0.001 0.0025 -7.82304e-17 0.001 0.00128459 0.0278375 0.001 -0.0023524 0.0554632 0.001 -0.0023524 -0.0554632 0.001 0.00128459 -0.0278375 0.001 -0.0132129 -0.0813727 0 -0.0132129 -0.0813727 0.001 -0.0025 -7.70058e-17 0.001 -0.00727644 -0.054595 0.001 -0.00369639 -0.0274018 0.001 -0.0025 -7.70058e-17 0 -0.00727644 -0.054595 0 -0.00369639 -0.0274018 0 -0.0025 -7.70058e-17 0 -0.0025 -7.70058e-17 0.001 -0.0132129 0.0813727 0.001 -0.00369639 0.0274018 0.001 -0.00727644 0.054595 0.001 -0.0132129 0.0813727 0 -0.00369639 0.0274018 0 -0.00727644 0.054595 0 -0.0132129 0.0813727 0 -0.00838329 0.0826668 0 -0.00838329 0.0826668 0.001 -0.0132129 0.0813727 0.001 0.0025 -7.82304e-17 0 0.0025 -7.82304e-17 0.001 -0.00838329 0.0826668 0.001 0.00128459 0.0278375 0.001 -0.0023524 0.0554632 0.001 -0.00838329 0.0826668 0 0.00128459 0.0278375 0 -0.0023524 0.0554632 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0133833 -0.0826668 0 -0.00855366 -0.0839609 0 -0.00855366 -0.0839609 0.001 -0.0133833 -0.0826668 0.001 -0.0133833 -0.0826668 0 -0.00855366 -0.0839609 0 -0.0025 -7.82304e-17 0 -0.0073524 -0.0554632 0 -0.00371541 -0.0278375 0 -0.0133833 0.0826668 0 -0.00371541 0.0278375 0 -0.0073524 0.0554632 0 -0.00855366 0.0839609 0 0.0025 -7.94551e-17 0 0.00126556 0.0282733 0 -0.00242836 0.0563315 0 -0.00242836 -0.0563315 0 0.00126556 -0.0282733 0 -0.00855366 -0.0839609 0 -0.00855366 -0.0839609 0.001 0.0025 -7.94551e-17 0.001 -0.00242836 -0.0563315 0.001 0.00126556 -0.0282733 0.001 0.0025 -7.94551e-17 0 -0.00242836 -0.0563315 0 0.00126556 -0.0282733 0 -0.0133833 -0.0826668 0.001 -0.00855366 -0.0839609 0.001 -0.0025 -7.82304e-17 0.001 -0.0073524 -0.0554632 0.001 -0.00371541 -0.0278375 0.001 -0.0133833 0.0826668 0.001 -0.00371541 0.0278375 0.001 -0.0073524 0.0554632 0.001 -0.00855366 0.0839609 0.001 0.0025 -7.94551e-17 0.001 0.00126556 0.0282733 0.001 -0.00242836 0.0563315 0.001 -0.00242836 -0.0563315 0.001 0.00126556 -0.0282733 0.001 -0.0133833 -0.0826668 0 -0.0133833 -0.0826668 0.001 -0.0025 -7.82304e-17 0.001 -0.0073524 -0.0554632 0.001 -0.00371541 -0.0278375 0.001 -0.0025 -7.82304e-17 0 -0.0073524 -0.0554632 0 -0.00371541 -0.0278375 0 -0.0025 -7.82304e-17 0 -0.0025 -7.82304e-17 0.001 -0.0133833 0.0826668 0.001 -0.00371541 0.0278375 0.001 -0.0073524 0.0554632 0.001 -0.0133833 0.0826668 0 -0.00371541 0.0278375 0 -0.0073524 0.0554632 0 -0.0133833 0.0826668 0 -0.00855366 0.0839609 0 -0.00855366 0.0839609 0.001 -0.0133833 0.0826668 0.001 0.0025 -7.94551e-17 0 0.0025 -7.94551e-17 0.001 -0.00855366 0.0839609 0.001 0.00126556 0.0282733 0.001 -0.00242836 0.0563315 0.001 -0.00855366 0.0839609 0 0.00126556 0.0282733 0 -0.00242836 0.0563315 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.010504 -0.0607966 0 -0.00567439 -0.0620907 0 -0.00567439 -0.0620907 0.001 -0.010504 -0.0607966 0.001 -0.010504 -0.0607966 0 -0.00567439 -0.0620907 0 -0.0025 -5.75339e-17 0 -0.00606866 -0.04079 0 -0.00339387 -0.0204729 0 -0.010504 0.0607966 0 -0.00339387 0.0204729 0 -0.00606866 0.04079 0 -0.00567439 0.0620907 0 0.0025 -5.87586e-17 0 0.00158711 0.0209087 0 -0.00114462 0.0416582 0 -0.00114462 -0.0416582 0 0.00158711 -0.0209087 0 -0.00567439 -0.0620907 0 -0.00567439 -0.0620907 0.001 0.0025 -5.87586e-17 0.001 -0.00114462 -0.0416582 0.001 0.00158711 -0.0209087 0.001 0.0025 -5.87586e-17 0 -0.00114462 -0.0416582 0 0.00158711 -0.0209087 0 -0.010504 -0.0607966 0.001 -0.00567439 -0.0620907 0.001 -0.0025 -5.75339e-17 0.001 -0.00606866 -0.04079 0.001 -0.00339387 -0.0204729 0.001 -0.010504 0.0607966 0.001 -0.00339387 0.0204729 0.001 -0.00606866 0.04079 0.001 -0.00567439 0.0620907 0.001 0.0025 -5.87586e-17 0.001 0.00158711 0.0209087 0.001 -0.00114462 0.0416582 0.001 -0.00114462 -0.0416582 0.001 0.00158711 -0.0209087 0.001 -0.010504 -0.0607966 0 -0.010504 -0.0607966 0.001 -0.0025 -5.75339e-17 0.001 -0.00606866 -0.04079 0.001 -0.00339387 -0.0204729 0.001 -0.0025 -5.75339e-17 0 -0.00606866 -0.04079 0 -0.00339387 -0.0204729 0 -0.0025 -5.75339e-17 0 -0.0025 -5.75339e-17 0.001 -0.010504 0.0607966 0.001 -0.00339387 0.0204729 0.001 -0.00606866 0.04079 0.001 -0.010504 0.0607966 0 -0.00339387 0.0204729 0 -0.00606866 0.04079 0 -0.010504 0.0607966 0 -0.00567439 0.0620907 0 -0.00567439 0.0620907 0.001 -0.010504 0.0607966 0.001 0.0025 -5.87586e-17 0 0.0025 -5.87586e-17 0.001 -0.00567439 0.0620907 0.001 0.00158711 0.0209087 0.001 -0.00114462 0.0416582 0.001 -0.00567439 0.0620907 0 0.00158711 0.0209087 0 -0.00114462 0.0416582 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0135503 -0.083935 0 -0.00872063 -0.0852291 0 -0.00872063 -0.0852291 0.001 -0.0135503 -0.083935 0.001 -0.0135503 -0.083935 0 -0.00872063 -0.0852291 0 -0.0025 -7.94306e-17 0 -0.00742685 -0.0563141 0 -0.00373406 -0.0282646 0 -0.0135503 0.083935 0 -0.00373406 0.0282646 0 -0.00742685 0.0563141 0 -0.00872063 0.0852291 0 0.0025 -8.06552e-17 0 0.00124691 0.0287004 0 -0.00250281 0.0571823 0 -0.00250281 -0.0571823 0 0.00124691 -0.0287004 0 -0.00872063 -0.0852291 0 -0.00872063 -0.0852291 0.001 0.0025 -8.06552e-17 0.001 -0.00250281 -0.0571823 0.001 0.00124691 -0.0287004 0.001 0.0025 -8.06552e-17 0 -0.00250281 -0.0571823 0 0.00124691 -0.0287004 0 -0.0135503 -0.083935 0.001 -0.00872063 -0.0852291 0.001 -0.0025 -7.94306e-17 0.001 -0.00742685 -0.0563141 0.001 -0.00373406 -0.0282646 0.001 -0.0135503 0.083935 0.001 -0.00373406 0.0282646 0.001 -0.00742685 0.0563141 0.001 -0.00872063 0.0852291 0.001 0.0025 -8.06552e-17 0.001 0.00124691 0.0287004 0.001 -0.00250281 0.0571823 0.001 -0.00250281 -0.0571823 0.001 0.00124691 -0.0287004 0.001 -0.0135503 -0.083935 0 -0.0135503 -0.083935 0.001 -0.0025 -7.94306e-17 0.001 -0.00742685 -0.0563141 0.001 -0.00373406 -0.0282646 0.001 -0.0025 -7.94306e-17 0 -0.00742685 -0.0563141 0 -0.00373406 -0.0282646 0 -0.0025 -7.94306e-17 0 -0.0025 -7.94306e-17 0.001 -0.0135503 0.083935 0.001 -0.00373406 0.0282646 0.001 -0.00742685 0.0563141 0.001 -0.0135503 0.083935 0 -0.00373406 0.0282646 0 -0.00742685 0.0563141 0 -0.0135503 0.083935 0 -0.00872063 0.0852291 0 -0.00872063 0.0852291 0.001 -0.0135503 0.083935 0.001 0.0025 -8.06552e-17 0 0.0025 -8.06552e-17 0.001 -0.00872063 0.0852291 0.001 0.00124691 0.0287004 0.001 -0.00250281 0.0571823 0.001 -0.00872063 0.0852291 0 0.00124691 0.0287004 0 -0.00250281 0.0571823 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0137206 -0.0852291 0 -0.008891 -0.0865232 0 -0.008891 -0.0865232 0.001 -0.0137206 -0.0852291 0.001 -0.0137206 -0.0852291 0 -0.008891 -0.0865232 0 -0.0025 -8.06552e-17 0 -0.00750281 -0.0571823 0 -0.00375309 -0.0287004 0 -0.0137206 0.0852291 0 -0.00375309 0.0287004 0 -0.00750281 0.0571823 0 -0.008891 0.0865232 0 0.0025 -8.18799e-17 0 0.00122789 0.0291362 0 -0.00257877 0.0580506 0 -0.00257877 -0.0580506 0 0.00122789 -0.0291362 0 -0.008891 -0.0865232 0 -0.008891 -0.0865232 0.001 0.0025 -8.18799e-17 0.001 -0.00257877 -0.0580506 0.001 0.00122789 -0.0291362 0.001 0.0025 -8.18799e-17 0 -0.00257877 -0.0580506 0 0.00122789 -0.0291362 0 -0.0137206 -0.0852291 0.001 -0.008891 -0.0865232 0.001 -0.0025 -8.06552e-17 0.001 -0.00750281 -0.0571823 0.001 -0.00375309 -0.0287004 0.001 -0.0137206 0.0852291 0.001 -0.00375309 0.0287004 0.001 -0.00750281 0.0571823 0.001 -0.008891 0.0865232 0.001 0.0025 -8.18799e-17 0.001 0.00122789 0.0291362 0.001 -0.00257877 0.0580506 0.001 -0.00257877 -0.0580506 0.001 0.00122789 -0.0291362 0.001 -0.0137206 -0.0852291 0 -0.0137206 -0.0852291 0.001 -0.0025 -8.06552e-17 0.001 -0.00750281 -0.0571823 0.001 -0.00375309 -0.0287004 0.001 -0.0025 -8.06552e-17 0 -0.00750281 -0.0571823 0 -0.00375309 -0.0287004 0 -0.0025 -8.06552e-17 0 -0.0025 -8.06552e-17 0.001 -0.0137206 0.0852291 0.001 -0.00375309 0.0287004 0.001 -0.00750281 0.0571823 0.001 -0.0137206 0.0852291 0 -0.00375309 0.0287004 0 -0.00750281 0.0571823 0 -0.0137206 0.0852291 0 -0.008891 0.0865232 0 -0.008891 0.0865232 0.001 -0.0137206 0.0852291 0.001 0.0025 -8.18799e-17 0 0.0025 -8.18799e-17 0.001 -0.008891 0.0865232 0.001 0.00122789 0.0291362 0.001 -0.00257877 0.0580506 0.001 -0.008891 0.0865232 0 0.00122789 0.0291362 0 -0.00257877 0.0580506 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0138876 -0.0864973 0 -0.00905796 -0.0877914 0 -0.00905796 -0.0877914 0.001 -0.0138876 -0.0864973 0.001 -0.0138876 -0.0864973 0 -0.00905796 -0.0877914 0 -0.0025 -8.18554e-17 0 -0.00757725 -0.0580332 0 -0.00377173 -0.0291274 0 -0.0138876 0.0864973 0 -0.00377173 0.0291274 0 -0.00757725 0.0580332 0 -0.00905796 0.0877914 0 0.0025 -8.308e-17 0 0.00120924 0.0295632 0 -0.00265321 0.0589015 0 -0.00265321 -0.0589015 0 0.00120924 -0.0295632 0 -0.00905796 -0.0877914 0 -0.00905796 -0.0877914 0.001 0.0025 -8.308e-17 0.001 -0.00265321 -0.0589015 0.001 0.00120924 -0.0295632 0.001 0.0025 -8.308e-17 0 -0.00265321 -0.0589015 0 0.00120924 -0.0295632 0 -0.0138876 -0.0864973 0.001 -0.00905796 -0.0877914 0.001 -0.0025 -8.18554e-17 0.001 -0.00757725 -0.0580332 0.001 -0.00377173 -0.0291274 0.001 -0.0138876 0.0864973 0.001 -0.00377173 0.0291274 0.001 -0.00757725 0.0580332 0.001 -0.00905796 0.0877914 0.001 0.0025 -8.308e-17 0.001 0.00120924 0.0295632 0.001 -0.00265321 0.0589015 0.001 -0.00265321 -0.0589015 0.001 0.00120924 -0.0295632 0.001 -0.0138876 -0.0864973 0 -0.0138876 -0.0864973 0.001 -0.0025 -8.18554e-17 0.001 -0.00757725 -0.0580332 0.001 -0.00377173 -0.0291274 0.001 -0.0025 -8.18554e-17 0 -0.00757725 -0.0580332 0 -0.00377173 -0.0291274 0 -0.0025 -8.18554e-17 0 -0.0025 -8.18554e-17 0.001 -0.0138876 0.0864973 0.001 -0.00377173 0.0291274 0.001 -0.00757725 0.0580332 0.001 -0.0138876 0.0864973 0 -0.00377173 0.0291274 0 -0.00757725 0.0580332 0 -0.0138876 0.0864973 0 -0.00905796 0.0877914 0 -0.00905796 0.0877914 0.001 -0.0138876 0.0864973 0.001 0.0025 -8.308e-17 0 0.0025 -8.308e-17 0.001 -0.00905796 0.0877914 0.001 0.00120924 0.0295632 0.001 -0.00265321 0.0589015 0.001 -0.00905796 0.0877914 0 0.00120924 0.0295632 0 -0.00265321 0.0589015 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.014058 -0.0877914 0 -0.00922833 -0.0890855 0 -0.00922833 -0.0890855 0.001 -0.014058 -0.0877914 0.001 -0.014058 -0.0877914 0 -0.00922833 -0.0890855 0 -0.0025 -8.308e-17 0 -0.00765321 -0.0589015 0 -0.00379076 -0.0295632 0 -0.014058 0.0877914 0 -0.00379076 0.0295632 0 -0.00765321 0.0589015 0 -0.00922833 0.0890855 0 0.0025 -8.43047e-17 0 0.00119022 0.029999 0 -0.00272917 0.0597697 0 -0.00272917 -0.0597697 0 0.00119022 -0.029999 0 -0.00922833 -0.0890855 0 -0.00922833 -0.0890855 0.001 0.0025 -8.43047e-17 0.001 -0.00272917 -0.0597697 0.001 0.00119022 -0.029999 0.001 0.0025 -8.43047e-17 0 -0.00272917 -0.0597697 0 0.00119022 -0.029999 0 -0.014058 -0.0877914 0.001 -0.00922833 -0.0890855 0.001 -0.0025 -8.308e-17 0.001 -0.00765321 -0.0589015 0.001 -0.00379076 -0.0295632 0.001 -0.014058 0.0877914 0.001 -0.00379076 0.0295632 0.001 -0.00765321 0.0589015 0.001 -0.00922833 0.0890855 0.001 0.0025 -8.43047e-17 0.001 0.00119022 0.029999 0.001 -0.00272917 0.0597697 0.001 -0.00272917 -0.0597697 0.001 0.00119022 -0.029999 0.001 -0.014058 -0.0877914 0 -0.014058 -0.0877914 0.001 -0.0025 -8.308e-17 0.001 -0.00765321 -0.0589015 0.001 -0.00379076 -0.0295632 0.001 -0.0025 -8.308e-17 0 -0.00765321 -0.0589015 0 -0.00379076 -0.0295632 0 -0.0025 -8.308e-17 0 -0.0025 -8.308e-17 0.001 -0.014058 0.0877914 0.001 -0.00379076 0.0295632 0.001 -0.00765321 0.0589015 0.001 -0.014058 0.0877914 0 -0.00379076 0.0295632 0 -0.00765321 0.0589015 0 -0.014058 0.0877914 0 -0.00922833 0.0890855 0 -0.00922833 0.0890855 0.001 -0.014058 0.0877914 0.001 0.0025 -8.43047e-17 0 0.0025 -8.43047e-17 0.001 -0.00922833 0.0890855 0.001 0.00119022 0.029999 0.001 -0.00272917 0.0597697 0.001 -0.00922833 0.0890855 0 0.00119022 0.029999 0 -0.00272917 0.0597697 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0142249 -0.0890596 0 -0.00939529 -0.0903537 0 -0.00939529 -0.0903537 0.001 -0.0142249 -0.0890596 0.001 -0.0142249 -0.0890596 0 -0.00939529 -0.0903537 0 -0.0025 -8.42802e-17 0 -0.00772765 -0.0597523 0 -0.0038094 -0.0299903 0 -0.0142249 0.0890596 0 -0.0038094 0.0299903 0 -0.00772765 0.0597523 0 -0.00939529 0.0903537 0 0.0025 -8.55048e-17 0 0.00117157 0.0304261 0 -0.00280361 0.0606206 0 -0.00280361 -0.0606206 0 0.00117157 -0.0304261 0 -0.00939529 -0.0903537 0 -0.00939529 -0.0903537 0.001 0.0025 -8.55048e-17 0.001 -0.00280361 -0.0606206 0.001 0.00117157 -0.0304261 0.001 0.0025 -8.55048e-17 0 -0.00280361 -0.0606206 0 0.00117157 -0.0304261 0 -0.0142249 -0.0890596 0.001 -0.00939529 -0.0903537 0.001 -0.0025 -8.42802e-17 0.001 -0.00772765 -0.0597523 0.001 -0.0038094 -0.0299903 0.001 -0.0142249 0.0890596 0.001 -0.0038094 0.0299903 0.001 -0.00772765 0.0597523 0.001 -0.00939529 0.0903537 0.001 0.0025 -8.55048e-17 0.001 0.00117157 0.0304261 0.001 -0.00280361 0.0606206 0.001 -0.00280361 -0.0606206 0.001 0.00117157 -0.0304261 0.001 -0.0142249 -0.0890596 0 -0.0142249 -0.0890596 0.001 -0.0025 -8.42802e-17 0.001 -0.00772765 -0.0597523 0.001 -0.0038094 -0.0299903 0.001 -0.0025 -8.42802e-17 0 -0.00772765 -0.0597523 0 -0.0038094 -0.0299903 0 -0.0025 -8.42802e-17 0 -0.0025 -8.42802e-17 0.001 -0.0142249 0.0890596 0.001 -0.0038094 0.0299903 0.001 -0.00772765 0.0597523 0.001 -0.0142249 0.0890596 0 -0.0038094 0.0299903 0 -0.00772765 0.0597523 0 -0.0142249 0.0890596 0 -0.00939529 0.0903537 0 -0.00939529 0.0903537 0.001 -0.0142249 0.0890596 0.001 0.0025 -8.55048e-17 0 0.0025 -8.55048e-17 0.001 -0.00939529 0.0903537 0.001 0.00117157 0.0304261 0.001 -0.00280361 0.0606206 0.001 -0.00939529 0.0903537 0 0.00117157 0.0304261 0 -0.00280361 0.0606206 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0143953 -0.0903537 0 -0.00956566 -0.0916478 0 -0.00956566 -0.0916478 0.001 -0.0143953 -0.0903537 0.001 -0.0143953 -0.0903537 0 -0.00956566 -0.0916478 0 -0.0025 -8.55048e-17 0 -0.00780361 -0.0606206 0 -0.00382843 -0.0304261 0 -0.0143953 0.0903537 0 -0.00382843 0.0304261 0 -0.00780361 0.0606206 0 -0.00956566 0.0916478 0 0.0025 -8.67295e-17 0 0.00115254 0.0308618 0 -0.00287957 0.0614888 0 -0.00287957 -0.0614888 0 0.00115254 -0.0308618 0 -0.00956566 -0.0916478 0 -0.00956566 -0.0916478 0.001 0.0025 -8.67295e-17 0.001 -0.00287957 -0.0614888 0.001 0.00115254 -0.0308618 0.001 0.0025 -8.67295e-17 0 -0.00287957 -0.0614888 0 0.00115254 -0.0308618 0 -0.0143953 -0.0903537 0.001 -0.00956566 -0.0916478 0.001 -0.0025 -8.55048e-17 0.001 -0.00780361 -0.0606206 0.001 -0.00382843 -0.0304261 0.001 -0.0143953 0.0903537 0.001 -0.00382843 0.0304261 0.001 -0.00780361 0.0606206 0.001 -0.00956566 0.0916478 0.001 0.0025 -8.67295e-17 0.001 0.00115254 0.0308618 0.001 -0.00287957 0.0614888 0.001 -0.00287957 -0.0614888 0.001 0.00115254 -0.0308618 0.001 -0.0143953 -0.0903537 0 -0.0143953 -0.0903537 0.001 -0.0025 -8.55048e-17 0.001 -0.00780361 -0.0606206 0.001 -0.00382843 -0.0304261 0.001 -0.0025 -8.55048e-17 0 -0.00780361 -0.0606206 0 -0.00382843 -0.0304261 0 -0.0025 -8.55048e-17 0 -0.0025 -8.55048e-17 0.001 -0.0143953 0.0903537 0.001 -0.00382843 0.0304261 0.001 -0.00780361 0.0606206 0.001 -0.0143953 0.0903537 0 -0.00382843 0.0304261 0 -0.00780361 0.0606206 0 -0.0143953 0.0903537 0 -0.00956566 0.0916478 0 -0.00956566 0.0916478 0.001 -0.0143953 0.0903537 0.001 0.0025 -8.67295e-17 0 0.0025 -8.67295e-17 0.001 -0.00956566 0.0916478 0.001 0.00115254 0.0308618 0.001 -0.00287957 0.0614888 0.001 -0.00956566 0.0916478 0 0.00115254 0.0308618 0 -0.00287957 0.0614888 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145623 -0.0916219 0 -0.00973263 -0.092916 0 -0.00973263 -0.092916 0.001 -0.0145623 -0.0916219 0.001 -0.0145623 -0.0916219 0 -0.00973263 -0.092916 0 -0.0025 -8.6705e-17 0 -0.00787806 -0.0614715 0 -0.00384708 -0.0308531 0 -0.0145623 0.0916219 0 -0.00384708 0.0308531 0 -0.00787806 0.0614715 0 -0.00973263 0.092916 0 0.0025 -8.79296e-17 0 0.0011339 0.0312889 0 -0.00295402 0.0623397 0 -0.00295402 -0.0623397 0 0.0011339 -0.0312889 0 -0.00973263 -0.092916 0 -0.00973263 -0.092916 0.001 0.0025 -8.79296e-17 0.001 -0.00295402 -0.0623397 0.001 0.0011339 -0.0312889 0.001 0.0025 -8.79296e-17 0 -0.00295402 -0.0623397 0 0.0011339 -0.0312889 0 -0.0145623 -0.0916219 0.001 -0.00973263 -0.092916 0.001 -0.0025 -8.6705e-17 0.001 -0.00787806 -0.0614715 0.001 -0.00384708 -0.0308531 0.001 -0.0145623 0.0916219 0.001 -0.00384708 0.0308531 0.001 -0.00787806 0.0614715 0.001 -0.00973263 0.092916 0.001 0.0025 -8.79296e-17 0.001 0.0011339 0.0312889 0.001 -0.00295402 0.0623397 0.001 -0.00295402 -0.0623397 0.001 0.0011339 -0.0312889 0.001 -0.0145623 -0.0916219 0 -0.0145623 -0.0916219 0.001 -0.0025 -8.6705e-17 0.001 -0.00787806 -0.0614715 0.001 -0.00384708 -0.0308531 0.001 -0.0025 -8.6705e-17 0 -0.00787806 -0.0614715 0 -0.00384708 -0.0308531 0 -0.0025 -8.6705e-17 0 -0.0025 -8.6705e-17 0.001 -0.0145623 0.0916219 0.001 -0.00384708 0.0308531 0.001 -0.00787806 0.0614715 0.001 -0.0145623 0.0916219 0 -0.00384708 0.0308531 0 -0.00787806 0.0614715 0 -0.0145623 0.0916219 0 -0.00973263 0.092916 0 -0.00973263 0.092916 0.001 -0.0145623 0.0916219 0.001 0.0025 -8.79296e-17 0 0.0025 -8.79296e-17 0.001 -0.00973263 0.092916 0.001 0.0011339 0.0312889 0.001 -0.00295402 0.0623397 0.001 -0.00973263 0.092916 0 0.0011339 0.0312889 0 -0.00295402 0.0623397 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0147326 -0.092916 0 -0.009903 -0.0942101 0 -0.009903 -0.0942101 0.001 -0.0147326 -0.092916 0.001 -0.0147326 -0.092916 0 -0.009903 -0.0942101 0 -0.0025 -8.79296e-17 0 -0.00795402 -0.0623397 0 -0.0038661 -0.0312889 0 -0.0147326 0.092916 0 -0.0038661 0.0312889 0 -0.00795402 0.0623397 0 -0.009903 0.0942101 0 0.0025 -8.91543e-17 0 0.00111487 0.0317247 0 -0.00302998 0.0632079 0 -0.00302998 -0.0632079 0 0.00111487 -0.0317247 0 -0.009903 -0.0942101 0 -0.009903 -0.0942101 0.001 0.0025 -8.91543e-17 0.001 -0.00302998 -0.0632079 0.001 0.00111487 -0.0317247 0.001 0.0025 -8.91543e-17 0 -0.00302998 -0.0632079 0 0.00111487 -0.0317247 0 -0.0147326 -0.092916 0.001 -0.009903 -0.0942101 0.001 -0.0025 -8.79296e-17 0.001 -0.00795402 -0.0623397 0.001 -0.0038661 -0.0312889 0.001 -0.0147326 0.092916 0.001 -0.0038661 0.0312889 0.001 -0.00795402 0.0623397 0.001 -0.009903 0.0942101 0.001 0.0025 -8.91543e-17 0.001 0.00111487 0.0317247 0.001 -0.00302998 0.0632079 0.001 -0.00302998 -0.0632079 0.001 0.00111487 -0.0317247 0.001 -0.0147326 -0.092916 0 -0.0147326 -0.092916 0.001 -0.0025 -8.79296e-17 0.001 -0.00795402 -0.0623397 0.001 -0.0038661 -0.0312889 0.001 -0.0025 -8.79296e-17 0 -0.00795402 -0.0623397 0 -0.0038661 -0.0312889 0 -0.0025 -8.79296e-17 0 -0.0025 -8.79296e-17 0.001 -0.0147326 0.092916 0.001 -0.0038661 0.0312889 0.001 -0.00795402 0.0623397 0.001 -0.0147326 0.092916 0 -0.0038661 0.0312889 0 -0.00795402 0.0623397 0 -0.0147326 0.092916 0 -0.009903 0.0942101 0 -0.009903 0.0942101 0.001 -0.0147326 0.092916 0.001 0.0025 -8.91543e-17 0 0.0025 -8.91543e-17 0.001 -0.009903 0.0942101 0.001 0.00111487 0.0317247 0.001 -0.00302998 0.0632079 0.001 -0.009903 0.0942101 0 0.00111487 0.0317247 0 -0.00302998 0.0632079 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0148996 -0.0941843 0 -0.01007 -0.0954783 0 -0.01007 -0.0954783 0.001 -0.0148996 -0.0941843 0.001 -0.0148996 -0.0941843 0 -0.01007 -0.0954783 0 -0.0025 -8.91298e-17 0 -0.00802846 -0.0631906 0 -0.00388475 -0.031716 0 -0.0148996 0.0941843 0 -0.00388475 0.031716 0 -0.00802846 0.0631906 0 -0.01007 0.0954783 0 0.0025 -9.03544e-17 0 0.00109622 0.0321518 0 -0.00310442 0.0640588 0 -0.00310442 -0.0640588 0 0.00109622 -0.0321518 0 -0.01007 -0.0954783 0 -0.01007 -0.0954783 0.001 0.0025 -9.03544e-17 0.001 -0.00310442 -0.0640588 0.001 0.00109622 -0.0321518 0.001 0.0025 -9.03544e-17 0 -0.00310442 -0.0640588 0 0.00109622 -0.0321518 0 -0.0148996 -0.0941843 0.001 -0.01007 -0.0954783 0.001 -0.0025 -8.91298e-17 0.001 -0.00802846 -0.0631906 0.001 -0.00388475 -0.031716 0.001 -0.0148996 0.0941843 0.001 -0.00388475 0.031716 0.001 -0.00802846 0.0631906 0.001 -0.01007 0.0954783 0.001 0.0025 -9.03544e-17 0.001 0.00109622 0.0321518 0.001 -0.00310442 0.0640588 0.001 -0.00310442 -0.0640588 0.001 0.00109622 -0.0321518 0.001 -0.0148996 -0.0941843 0 -0.0148996 -0.0941843 0.001 -0.0025 -8.91298e-17 0.001 -0.00802846 -0.0631906 0.001 -0.00388475 -0.031716 0.001 -0.0025 -8.91298e-17 0 -0.00802846 -0.0631906 0 -0.00388475 -0.031716 0 -0.0025 -8.91298e-17 0 -0.0025 -8.91298e-17 0.001 -0.0148996 0.0941843 0.001 -0.00388475 0.031716 0.001 -0.00802846 0.0631906 0.001 -0.0148996 0.0941843 0 -0.00388475 0.031716 0 -0.00802846 0.0631906 0 -0.0148996 0.0941843 0 -0.01007 0.0954783 0 -0.01007 0.0954783 0.001 -0.0148996 0.0941843 0.001 0.0025 -9.03544e-17 0 0.0025 -9.03544e-17 0.001 -0.01007 0.0954783 0.001 0.00109622 0.0321518 0.001 -0.00310442 0.0640588 0.001 -0.01007 0.0954783 0 0.00109622 0.0321518 0 -0.00310442 0.0640588 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0150666 -0.0954525 0 -0.0102369 -0.0967466 0 -0.0102369 -0.0967466 0.001 -0.0150666 -0.0954525 0.001 -0.0150666 -0.0954525 0 -0.0102369 -0.0967466 0 -0.0025 -9.03299e-17 0 -0.0081029 -0.0640414 0 -0.0039034 -0.032143 0 -0.0150666 0.0954525 0 -0.0039034 0.032143 0 -0.0081029 0.0640414 0 -0.0102369 0.0967466 0 0.0025 -9.15546e-17 0 0.00107758 0.0325788 0 -0.00317886 0.0649097 0 -0.00317886 -0.0649097 0 0.00107758 -0.0325788 0 -0.0102369 -0.0967466 0 -0.0102369 -0.0967466 0.001 0.0025 -9.15546e-17 0.001 -0.00317886 -0.0649097 0.001 0.00107758 -0.0325788 0.001 0.0025 -9.15546e-17 0 -0.00317886 -0.0649097 0 0.00107758 -0.0325788 0 -0.0150666 -0.0954525 0.001 -0.0102369 -0.0967466 0.001 -0.0025 -9.03299e-17 0.001 -0.0081029 -0.0640414 0.001 -0.0039034 -0.032143 0.001 -0.0150666 0.0954525 0.001 -0.0039034 0.032143 0.001 -0.0081029 0.0640414 0.001 -0.0102369 0.0967466 0.001 0.0025 -9.15546e-17 0.001 0.00107758 0.0325788 0.001 -0.00317886 0.0649097 0.001 -0.00317886 -0.0649097 0.001 0.00107758 -0.0325788 0.001 -0.0150666 -0.0954525 0 -0.0150666 -0.0954525 0.001 -0.0025 -9.03299e-17 0.001 -0.0081029 -0.0640414 0.001 -0.0039034 -0.032143 0.001 -0.0025 -9.03299e-17 0 -0.0081029 -0.0640414 0 -0.0039034 -0.032143 0 -0.0025 -9.03299e-17 0 -0.0025 -9.03299e-17 0.001 -0.0150666 0.0954525 0.001 -0.0039034 0.032143 0.001 -0.0081029 0.0640414 0.001 -0.0150666 0.0954525 0 -0.0039034 0.032143 0 -0.0081029 0.0640414 0 -0.0150666 0.0954525 0 -0.0102369 0.0967466 0 -0.0102369 0.0967466 0.001 -0.0150666 0.0954525 0.001 0.0025 -9.15546e-17 0 0.0025 -9.15546e-17 0.001 -0.0102369 0.0967466 0.001 0.00107758 0.0325788 0.001 -0.00317886 0.0649097 0.001 -0.0102369 0.0967466 0 0.00107758 0.0325788 0 -0.00317886 0.0649097 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0106744 -0.0620907 0 -0.00584477 -0.0633848 0 -0.00584477 -0.0633848 0.001 -0.0106744 -0.0620907 0.001 -0.0106744 -0.0620907 0 -0.00584477 -0.0633848 0 -0.0025 -5.87586e-17 0 -0.00614462 -0.0416582 0 -0.00341289 -0.0209087 0 -0.0106744 0.0620907 0 -0.00341289 0.0209087 0 -0.00614462 0.0416582 0 -0.00584477 0.0633848 0 0.0025 -5.99832e-17 0 0.00156808 0.0213444 0 -0.00122058 0.0425264 0 -0.00122058 -0.0425264 0 0.00156808 -0.0213444 0 -0.00584477 -0.0633848 0 -0.00584477 -0.0633848 0.001 0.0025 -5.99832e-17 0.001 -0.00122058 -0.0425264 0.001 0.00156808 -0.0213444 0.001 0.0025 -5.99832e-17 0 -0.00122058 -0.0425264 0 0.00156808 -0.0213444 0 -0.0106744 -0.0620907 0.001 -0.00584477 -0.0633848 0.001 -0.0025 -5.87586e-17 0.001 -0.00614462 -0.0416582 0.001 -0.00341289 -0.0209087 0.001 -0.0106744 0.0620907 0.001 -0.00341289 0.0209087 0.001 -0.00614462 0.0416582 0.001 -0.00584477 0.0633848 0.001 0.0025 -5.99832e-17 0.001 0.00156808 0.0213444 0.001 -0.00122058 0.0425264 0.001 -0.00122058 -0.0425264 0.001 0.00156808 -0.0213444 0.001 -0.0106744 -0.0620907 0 -0.0106744 -0.0620907 0.001 -0.0025 -5.87586e-17 0.001 -0.00614462 -0.0416582 0.001 -0.00341289 -0.0209087 0.001 -0.0025 -5.87586e-17 0 -0.00614462 -0.0416582 0 -0.00341289 -0.0209087 0 -0.0025 -5.87586e-17 0 -0.0025 -5.87586e-17 0.001 -0.0106744 0.0620907 0.001 -0.00341289 0.0209087 0.001 -0.00614462 0.0416582 0.001 -0.0106744 0.0620907 0 -0.00341289 0.0209087 0 -0.00614462 0.0416582 0 -0.0106744 0.0620907 0 -0.00584477 0.0633848 0 -0.00584477 0.0633848 0.001 -0.0106744 0.0620907 0.001 0.0025 -5.99832e-17 0 0.0025 -5.99832e-17 0.001 -0.00584477 0.0633848 0.001 0.00156808 0.0213444 0.001 -0.00122058 0.0425264 0.001 -0.00584477 0.0633848 0 0.00156808 0.0213444 0 -0.00122058 0.0425264 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0152369 -0.0967466 0 -0.0104073 -0.0980407 0 -0.0104073 -0.0980407 0.001 -0.0152369 -0.0967466 0.001 -0.0152369 -0.0967466 0 -0.0104073 -0.0980407 0 -0.0025 -9.15546e-17 0 -0.00817886 -0.0649097 0 -0.00392242 -0.0325788 0 -0.0152369 0.0967466 0 -0.00392242 0.0325788 0 -0.00817886 0.0649097 0 -0.0104073 0.0980407 0 0.0025 -9.27792e-17 0 0.00105855 0.0330146 0 -0.00325482 0.0657779 0 -0.00325482 -0.0657779 0 0.00105855 -0.0330146 0 -0.0104073 -0.0980407 0 -0.0104073 -0.0980407 0.001 0.0025 -9.27792e-17 0.001 -0.00325482 -0.0657779 0.001 0.00105855 -0.0330146 0.001 0.0025 -9.27792e-17 0 -0.00325482 -0.0657779 0 0.00105855 -0.0330146 0 -0.0152369 -0.0967466 0.001 -0.0104073 -0.0980407 0.001 -0.0025 -9.15546e-17 0.001 -0.00817886 -0.0649097 0.001 -0.00392242 -0.0325788 0.001 -0.0152369 0.0967466 0.001 -0.00392242 0.0325788 0.001 -0.00817886 0.0649097 0.001 -0.0104073 0.0980407 0.001 0.0025 -9.27792e-17 0.001 0.00105855 0.0330146 0.001 -0.00325482 0.0657779 0.001 -0.00325482 -0.0657779 0.001 0.00105855 -0.0330146 0.001 -0.0152369 -0.0967466 0 -0.0152369 -0.0967466 0.001 -0.0025 -9.15546e-17 0.001 -0.00817886 -0.0649097 0.001 -0.00392242 -0.0325788 0.001 -0.0025 -9.15546e-17 0 -0.00817886 -0.0649097 0 -0.00392242 -0.0325788 0 -0.0025 -9.15546e-17 0 -0.0025 -9.15546e-17 0.001 -0.0152369 0.0967466 0.001 -0.00392242 0.0325788 0.001 -0.00817886 0.0649097 0.001 -0.0152369 0.0967466 0 -0.00392242 0.0325788 0 -0.00817886 0.0649097 0 -0.0152369 0.0967466 0 -0.0104073 0.0980407 0 -0.0104073 0.0980407 0.001 -0.0152369 0.0967466 0.001 0.0025 -9.27792e-17 0 0.0025 -9.27792e-17 0.001 -0.0104073 0.0980407 0.001 0.00105855 0.0330146 0.001 -0.00325482 0.0657779 0.001 -0.0104073 0.0980407 0 0.00105855 0.0330146 0 -0.00325482 0.0657779 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0154039 -0.0980148 0 -0.0105743 -0.0993089 0 -0.0105743 -0.0993089 0.001 -0.0154039 -0.0980148 0.001 -0.0154039 -0.0980148 0 -0.0105743 -0.0993089 0 -0.0025 -9.27547e-17 0 -0.0082533 -0.0657606 0 -0.00394107 -0.0330059 0 -0.0154039 0.0980148 0 -0.00394107 0.0330059 0 -0.0082533 0.0657606 0 -0.0105743 0.0993089 0 0.0025 -9.39794e-17 0 0.00103991 0.0334417 0 -0.00332927 0.0666288 0 -0.00332927 -0.0666288 0 0.00103991 -0.0334417 0 -0.0105743 -0.0993089 0 -0.0105743 -0.0993089 0.001 0.0025 -9.39794e-17 0.001 -0.00332927 -0.0666288 0.001 0.00103991 -0.0334417 0.001 0.0025 -9.39794e-17 0 -0.00332927 -0.0666288 0 0.00103991 -0.0334417 0 -0.0154039 -0.0980148 0.001 -0.0105743 -0.0993089 0.001 -0.0025 -9.27547e-17 0.001 -0.0082533 -0.0657606 0.001 -0.00394107 -0.0330059 0.001 -0.0154039 0.0980148 0.001 -0.00394107 0.0330059 0.001 -0.0082533 0.0657606 0.001 -0.0105743 0.0993089 0.001 0.0025 -9.39794e-17 0.001 0.00103991 0.0334417 0.001 -0.00332927 0.0666288 0.001 -0.00332927 -0.0666288 0.001 0.00103991 -0.0334417 0.001 -0.0154039 -0.0980148 0 -0.0154039 -0.0980148 0.001 -0.0025 -9.27547e-17 0.001 -0.0082533 -0.0657606 0.001 -0.00394107 -0.0330059 0.001 -0.0025 -9.27547e-17 0 -0.0082533 -0.0657606 0 -0.00394107 -0.0330059 0 -0.0025 -9.27547e-17 0 -0.0025 -9.27547e-17 0.001 -0.0154039 0.0980148 0.001 -0.00394107 0.0330059 0.001 -0.0082533 0.0657606 0.001 -0.0154039 0.0980148 0 -0.00394107 0.0330059 0 -0.0082533 0.0657606 0 -0.0154039 0.0980148 0 -0.0105743 0.0993089 0 -0.0105743 0.0993089 0.001 -0.0154039 0.0980148 0.001 0.0025 -9.39794e-17 0 0.0025 -9.39794e-17 0.001 -0.0105743 0.0993089 0.001 0.00103991 0.0334417 0.001 -0.00332927 0.0666288 0.001 -0.0105743 0.0993089 0 0.00103991 0.0334417 0 -0.00332927 0.0666288 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0155709 -0.099283 0 -0.0107412 -0.100577 0 -0.0107412 -0.100577 0.001 -0.0155709 -0.099283 0.001 -0.0155709 -0.099283 0 -0.0107412 -0.100577 0 -0.0025 -9.39549e-17 0 -0.00832775 -0.0666114 0 -0.00395971 -0.0334329 0 -0.0155709 0.099283 0 -0.00395971 0.0334329 0 -0.00832775 0.0666114 0 -0.0107412 0.100577 0 0.0025 -9.51795e-17 0 0.00102126 0.0338687 0 -0.00340371 0.0674797 0 -0.00340371 -0.0674797 0 0.00102126 -0.0338687 0 -0.0107412 -0.100577 0 -0.0107412 -0.100577 0.001 0.0025 -9.51795e-17 0.001 -0.00340371 -0.0674797 0.001 0.00102126 -0.0338687 0.001 0.0025 -9.51795e-17 0 -0.00340371 -0.0674797 0 0.00102126 -0.0338687 0 -0.0155709 -0.099283 0.001 -0.0107412 -0.100577 0.001 -0.0025 -9.39549e-17 0.001 -0.00832775 -0.0666114 0.001 -0.00395971 -0.0334329 0.001 -0.0155709 0.099283 0.001 -0.00395971 0.0334329 0.001 -0.00832775 0.0666114 0.001 -0.0107412 0.100577 0.001 0.0025 -9.51795e-17 0.001 0.00102126 0.0338687 0.001 -0.00340371 0.0674797 0.001 -0.00340371 -0.0674797 0.001 0.00102126 -0.0338687 0.001 -0.0155709 -0.099283 0 -0.0155709 -0.099283 0.001 -0.0025 -9.39549e-17 0.001 -0.00832775 -0.0666114 0.001 -0.00395971 -0.0334329 0.001 -0.0025 -9.39549e-17 0 -0.00832775 -0.0666114 0 -0.00395971 -0.0334329 0 -0.0025 -9.39549e-17 0 -0.0025 -9.39549e-17 0.001 -0.0155709 0.099283 0.001 -0.00395971 0.0334329 0.001 -0.00832775 0.0666114 0.001 -0.0155709 0.099283 0 -0.00395971 0.0334329 0 -0.00832775 0.0666114 0 -0.0155709 0.099283 0 -0.0107412 0.100577 0 -0.0107412 0.100577 0.001 -0.0155709 0.099283 0.001 0.0025 -9.51795e-17 0 0.0025 -9.51795e-17 0.001 -0.0107412 0.100577 0.001 0.00102126 0.0338687 0.001 -0.00340371 0.0674797 0.001 -0.0107412 0.100577 0 0.00102126 0.0338687 0 -0.00340371 0.0674797 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0157412 -0.100577 0 -0.0109116 -0.101871 0 -0.0109116 -0.101871 0.001 -0.0157412 -0.100577 0.001 -0.0157412 -0.100577 0 -0.0109116 -0.101871 0 -0.0025 -9.51795e-17 0 -0.00840371 -0.0674797 0 -0.00397874 -0.0338687 0 -0.0157412 0.100577 0 -0.00397874 0.0338687 0 -0.00840371 0.0674797 0 -0.0109116 0.101871 0 0.0025 -9.64042e-17 0 0.00100223 0.0343045 0 -0.00347967 0.0683479 0 -0.00347967 -0.0683479 0 0.00100223 -0.0343045 0 -0.0109116 -0.101871 0 -0.0109116 -0.101871 0.001 0.0025 -9.64042e-17 0.001 -0.00347967 -0.0683479 0.001 0.00100223 -0.0343045 0.001 0.0025 -9.64042e-17 0 -0.00347967 -0.0683479 0 0.00100223 -0.0343045 0 -0.0157412 -0.100577 0.001 -0.0109116 -0.101871 0.001 -0.0025 -9.51795e-17 0.001 -0.00840371 -0.0674797 0.001 -0.00397874 -0.0338687 0.001 -0.0157412 0.100577 0.001 -0.00397874 0.0338687 0.001 -0.00840371 0.0674797 0.001 -0.0109116 0.101871 0.001 0.0025 -9.64042e-17 0.001 0.00100223 0.0343045 0.001 -0.00347967 0.0683479 0.001 -0.00347967 -0.0683479 0.001 0.00100223 -0.0343045 0.001 -0.0157412 -0.100577 0 -0.0157412 -0.100577 0.001 -0.0025 -9.51795e-17 0.001 -0.00840371 -0.0674797 0.001 -0.00397874 -0.0338687 0.001 -0.0025 -9.51795e-17 0 -0.00840371 -0.0674797 0 -0.00397874 -0.0338687 0 -0.0025 -9.51795e-17 0 -0.0025 -9.51795e-17 0.001 -0.0157412 0.100577 0.001 -0.00397874 0.0338687 0.001 -0.00840371 0.0674797 0.001 -0.0157412 0.100577 0 -0.00397874 0.0338687 0 -0.00840371 0.0674797 0 -0.0157412 0.100577 0 -0.0109116 0.101871 0 -0.0109116 0.101871 0.001 -0.0157412 0.100577 0.001 0.0025 -9.64042e-17 0 0.0025 -9.64042e-17 0.001 -0.0109116 0.101871 0.001 0.00100223 0.0343045 0.001 -0.00347967 0.0683479 0.001 -0.0109116 0.101871 0 0.00100223 0.0343045 0 -0.00347967 0.0683479 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0159082 -0.101845 0 -0.0110786 -0.103139 0 -0.0110786 -0.103139 0.001 -0.0159082 -0.101845 0.001 -0.0159082 -0.101845 0 -0.0110786 -0.103139 0 -0.0025 -9.63797e-17 0 -0.00847815 -0.0683306 0 -0.00399739 -0.0342958 0 -0.0159082 0.101845 0 -0.00399739 0.0342958 0 -0.00847815 0.0683306 0 -0.0110786 0.103139 0 0.0025 -9.76043e-17 0 0.000983587 0.0347316 0 -0.00355411 0.0691988 0 -0.00355411 -0.0691988 0 0.000983587 -0.0347316 0 -0.0110786 -0.103139 0 -0.0110786 -0.103139 0.001 0.0025 -9.76043e-17 0.001 -0.00355411 -0.0691988 0.001 0.000983587 -0.0347316 0.001 0.0025 -9.76043e-17 0 -0.00355411 -0.0691988 0 0.000983587 -0.0347316 0 -0.0159082 -0.101845 0.001 -0.0110786 -0.103139 0.001 -0.0025 -9.63797e-17 0.001 -0.00847815 -0.0683306 0.001 -0.00399739 -0.0342958 0.001 -0.0159082 0.101845 0.001 -0.00399739 0.0342958 0.001 -0.00847815 0.0683306 0.001 -0.0110786 0.103139 0.001 0.0025 -9.76043e-17 0.001 0.000983587 0.0347316 0.001 -0.00355411 0.0691988 0.001 -0.00355411 -0.0691988 0.001 0.000983587 -0.0347316 0.001 -0.0159082 -0.101845 0 -0.0159082 -0.101845 0.001 -0.0025 -9.63797e-17 0.001 -0.00847815 -0.0683306 0.001 -0.00399739 -0.0342958 0.001 -0.0025 -9.63797e-17 0 -0.00847815 -0.0683306 0 -0.00399739 -0.0342958 0 -0.0025 -9.63797e-17 0 -0.0025 -9.63797e-17 0.001 -0.0159082 0.101845 0.001 -0.00399739 0.0342958 0.001 -0.00847815 0.0683306 0.001 -0.0159082 0.101845 0 -0.00399739 0.0342958 0 -0.00847815 0.0683306 0 -0.0159082 0.101845 0 -0.0110786 0.103139 0 -0.0110786 0.103139 0.001 -0.0159082 0.101845 0.001 0.0025 -9.76043e-17 0 0.0025 -9.76043e-17 0.001 -0.0110786 0.103139 0.001 0.000983587 0.0347316 0.001 -0.00355411 0.0691988 0.001 -0.0110786 0.103139 0 0.000983587 0.0347316 0 -0.00355411 0.0691988 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0160752 -0.103114 0 -0.0112455 -0.104408 0 -0.0112455 -0.104408 0.001 -0.0160752 -0.103114 0.001 -0.0160752 -0.103114 0 -0.0112455 -0.104408 0 -0.0025 -9.75799e-17 0 -0.00855259 -0.0691814 0 -0.00401603 -0.0347228 0 -0.0160752 0.103114 0 -0.00401603 0.0347228 0 -0.00855259 0.0691814 0 -0.0112455 0.104408 0 0.0025 -9.88045e-17 0 0.000964941 0.0351586 0 -0.00362855 0.0700497 0 -0.00362855 -0.0700497 0 0.000964941 -0.0351586 0 -0.0112455 -0.104408 0 -0.0112455 -0.104408 0.001 0.0025 -9.88045e-17 0.001 -0.00362855 -0.0700497 0.001 0.000964941 -0.0351586 0.001 0.0025 -9.88045e-17 0 -0.00362855 -0.0700497 0 0.000964941 -0.0351586 0 -0.0160752 -0.103114 0.001 -0.0112455 -0.104408 0.001 -0.0025 -9.75799e-17 0.001 -0.00855259 -0.0691814 0.001 -0.00401603 -0.0347228 0.001 -0.0160752 0.103114 0.001 -0.00401603 0.0347228 0.001 -0.00855259 0.0691814 0.001 -0.0112455 0.104408 0.001 0.0025 -9.88045e-17 0.001 0.000964941 0.0351586 0.001 -0.00362855 0.0700497 0.001 -0.00362855 -0.0700497 0.001 0.000964941 -0.0351586 0.001 -0.0160752 -0.103114 0 -0.0160752 -0.103114 0.001 -0.0025 -9.75799e-17 0.001 -0.00855259 -0.0691814 0.001 -0.00401603 -0.0347228 0.001 -0.0025 -9.75799e-17 0 -0.00855259 -0.0691814 0 -0.00401603 -0.0347228 0 -0.0025 -9.75799e-17 0 -0.0025 -9.75799e-17 0.001 -0.0160752 0.103114 0.001 -0.00401603 0.0347228 0.001 -0.00855259 0.0691814 0.001 -0.0160752 0.103114 0 -0.00401603 0.0347228 0 -0.00855259 0.0691814 0 -0.0160752 0.103114 0 -0.0112455 0.104408 0 -0.0112455 0.104408 0.001 -0.0160752 0.103114 0.001 0.0025 -9.88045e-17 0 0.0025 -9.88045e-17 0.001 -0.0112455 0.104408 0.001 0.000964941 0.0351586 0.001 -0.00362855 0.0700497 0.001 -0.0112455 0.104408 0 0.000964941 0.0351586 0 -0.00362855 0.0700497 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0162455 -0.104408 0 -0.0114159 -0.105702 0 -0.0114159 -0.105702 0.001 -0.0162455 -0.104408 0.001 -0.0162455 -0.104408 0 -0.0114159 -0.105702 0 -0.0025 -9.88045e-17 0 -0.00862855 -0.0700497 0 -0.00403506 -0.0351586 0 -0.0162455 0.104408 0 -0.00403506 0.0351586 0 -0.00862855 0.0700497 0 -0.0114159 0.105702 0 0.0025 -1.00029e-16 0 0.000945915 0.0355944 0 -0.00370451 0.0709179 0 -0.00370451 -0.0709179 0 0.000945915 -0.0355944 0 -0.0114159 -0.105702 0 -0.0114159 -0.105702 0.001 0.0025 -1.00029e-16 0.001 -0.00370451 -0.0709179 0.001 0.000945915 -0.0355944 0.001 0.0025 -1.00029e-16 0 -0.00370451 -0.0709179 0 0.000945915 -0.0355944 0 -0.0162455 -0.104408 0.001 -0.0114159 -0.105702 0.001 -0.0025 -9.88045e-17 0.001 -0.00862855 -0.0700497 0.001 -0.00403506 -0.0351586 0.001 -0.0162455 0.104408 0.001 -0.00403506 0.0351586 0.001 -0.00862855 0.0700497 0.001 -0.0114159 0.105702 0.001 0.0025 -1.00029e-16 0.001 0.000945915 0.0355944 0.001 -0.00370451 0.0709179 0.001 -0.00370451 -0.0709179 0.001 0.000945915 -0.0355944 0.001 -0.0162455 -0.104408 0 -0.0162455 -0.104408 0.001 -0.0025 -9.88045e-17 0.001 -0.00862855 -0.0700497 0.001 -0.00403506 -0.0351586 0.001 -0.0025 -9.88045e-17 0 -0.00862855 -0.0700497 0 -0.00403506 -0.0351586 0 -0.0025 -9.88045e-17 0 -0.0025 -9.88045e-17 0.001 -0.0162455 0.104408 0.001 -0.00403506 0.0351586 0.001 -0.00862855 0.0700497 0.001 -0.0162455 0.104408 0 -0.00403506 0.0351586 0 -0.00862855 0.0700497 0 -0.0162455 0.104408 0 -0.0114159 0.105702 0 -0.0114159 0.105702 0.001 -0.0162455 0.104408 0.001 0.0025 -1.00029e-16 0 0.0025 -1.00029e-16 0.001 -0.0114159 0.105702 0.001 0.000945915 0.0355944 0.001 -0.00370451 0.0709179 0.001 -0.0114159 0.105702 0 0.000945915 0.0355944 0 -0.00370451 0.0709179 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0164125 -0.105676 0 -0.0115829 -0.10697 0 -0.0115829 -0.10697 0.001 -0.0164125 -0.105676 0.001 -0.0164125 -0.105676 0 -0.0115829 -0.10697 0 -0.0025 -1.00005e-16 0 -0.00870299 -0.0709006 0 -0.0040537 -0.0355857 0 -0.0164125 0.105676 0 -0.0040537 0.0355857 0 -0.00870299 0.0709006 0 -0.0115829 0.10697 0 0.0025 -1.01229e-16 0 0.000927269 0.0360215 0 -0.00377896 0.0717688 0 -0.00377896 -0.0717688 0 0.000927269 -0.0360215 0 -0.0115829 -0.10697 0 -0.0115829 -0.10697 0.001 0.0025 -1.01229e-16 0.001 -0.00377896 -0.0717688 0.001 0.000927269 -0.0360215 0.001 0.0025 -1.01229e-16 0 -0.00377896 -0.0717688 0 0.000927269 -0.0360215 0 -0.0164125 -0.105676 0.001 -0.0115829 -0.10697 0.001 -0.0025 -1.00005e-16 0.001 -0.00870299 -0.0709006 0.001 -0.0040537 -0.0355857 0.001 -0.0164125 0.105676 0.001 -0.0040537 0.0355857 0.001 -0.00870299 0.0709006 0.001 -0.0115829 0.10697 0.001 0.0025 -1.01229e-16 0.001 0.000927269 0.0360215 0.001 -0.00377896 0.0717688 0.001 -0.00377896 -0.0717688 0.001 0.000927269 -0.0360215 0.001 -0.0164125 -0.105676 0 -0.0164125 -0.105676 0.001 -0.0025 -1.00005e-16 0.001 -0.00870299 -0.0709006 0.001 -0.0040537 -0.0355857 0.001 -0.0025 -1.00005e-16 0 -0.00870299 -0.0709006 0 -0.0040537 -0.0355857 0 -0.0025 -1.00005e-16 0 -0.0025 -1.00005e-16 0.001 -0.0164125 0.105676 0.001 -0.0040537 0.0355857 0.001 -0.00870299 0.0709006 0.001 -0.0164125 0.105676 0 -0.0040537 0.0355857 0 -0.00870299 0.0709006 0 -0.0164125 0.105676 0 -0.0115829 0.10697 0 -0.0115829 0.10697 0.001 -0.0164125 0.105676 0.001 0.0025 -1.01229e-16 0 0.0025 -1.01229e-16 0.001 -0.0115829 0.10697 0.001 0.000927269 0.0360215 0.001 -0.00377896 0.0717688 0.001 -0.0115829 0.10697 0 0.000927269 0.0360215 0 -0.00377896 0.0717688 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0165794 -0.106944 0 -0.0117498 -0.108238 0 -0.0117498 -0.108238 0.001 -0.0165794 -0.106944 0.001 -0.0165794 -0.106944 0 -0.0117498 -0.108238 0 -0.0025 -1.01205e-16 0 -0.00877744 -0.0717514 0 -0.00407235 -0.0360128 0 -0.0165794 0.106944 0 -0.00407235 0.0360128 0 -0.00877744 0.0717514 0 -0.0117498 0.108238 0 0.0025 -1.02429e-16 0 0.000908623 0.0364485 0 -0.0038534 0.0726197 0 -0.0038534 -0.0726197 0 0.000908623 -0.0364485 0 -0.0117498 -0.108238 0 -0.0117498 -0.108238 0.001 0.0025 -1.02429e-16 0.001 -0.0038534 -0.0726197 0.001 0.000908623 -0.0364485 0.001 0.0025 -1.02429e-16 0 -0.0038534 -0.0726197 0 0.000908623 -0.0364485 0 -0.0165794 -0.106944 0.001 -0.0117498 -0.108238 0.001 -0.0025 -1.01205e-16 0.001 -0.00877744 -0.0717514 0.001 -0.00407235 -0.0360128 0.001 -0.0165794 0.106944 0.001 -0.00407235 0.0360128 0.001 -0.00877744 0.0717514 0.001 -0.0117498 0.108238 0.001 0.0025 -1.02429e-16 0.001 0.000908623 0.0364485 0.001 -0.0038534 0.0726197 0.001 -0.0038534 -0.0726197 0.001 0.000908623 -0.0364485 0.001 -0.0165794 -0.106944 0 -0.0165794 -0.106944 0.001 -0.0025 -1.01205e-16 0.001 -0.00877744 -0.0717514 0.001 -0.00407235 -0.0360128 0.001 -0.0025 -1.01205e-16 0 -0.00877744 -0.0717514 0 -0.00407235 -0.0360128 0 -0.0025 -1.01205e-16 0 -0.0025 -1.01205e-16 0.001 -0.0165794 0.106944 0.001 -0.00407235 0.0360128 0.001 -0.00877744 0.0717514 0.001 -0.0165794 0.106944 0 -0.00407235 0.0360128 0 -0.00877744 0.0717514 0 -0.0165794 0.106944 0 -0.0117498 0.108238 0 -0.0117498 0.108238 0.001 -0.0165794 0.106944 0.001 0.0025 -1.02429e-16 0 0.0025 -1.02429e-16 0.001 -0.0117498 0.108238 0.001 0.000908623 0.0364485 0.001 -0.0038534 0.0726197 0.001 -0.0117498 0.108238 0 0.000908623 0.0364485 0 -0.0038534 0.0726197 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0167464 -0.108212 0 -0.0119168 -0.109506 0 -0.0119168 -0.109506 0.001 -0.0167464 -0.108212 0.001 -0.0167464 -0.108212 0 -0.0119168 -0.109506 0 -0.0025 -1.02405e-16 0 -0.00885188 -0.0726023 0 -0.004091 -0.0364398 0 -0.0167464 0.108212 0 -0.004091 0.0364398 0 -0.00885188 0.0726023 0 -0.0119168 0.109506 0 0.0025 -1.0363e-16 0 0.000889977 0.0368756 0 -0.00392784 0.0734705 0 -0.00392784 -0.0734705 0 0.000889977 -0.0368756 0 -0.0119168 -0.109506 0 -0.0119168 -0.109506 0.001 0.0025 -1.0363e-16 0.001 -0.00392784 -0.0734705 0.001 0.000889977 -0.0368756 0.001 0.0025 -1.0363e-16 0 -0.00392784 -0.0734705 0 0.000889977 -0.0368756 0 -0.0167464 -0.108212 0.001 -0.0119168 -0.109506 0.001 -0.0025 -1.02405e-16 0.001 -0.00885188 -0.0726023 0.001 -0.004091 -0.0364398 0.001 -0.0167464 0.108212 0.001 -0.004091 0.0364398 0.001 -0.00885188 0.0726023 0.001 -0.0119168 0.109506 0.001 0.0025 -1.0363e-16 0.001 0.000889977 0.0368756 0.001 -0.00392784 0.0734705 0.001 -0.00392784 -0.0734705 0.001 0.000889977 -0.0368756 0.001 -0.0167464 -0.108212 0 -0.0167464 -0.108212 0.001 -0.0025 -1.02405e-16 0.001 -0.00885188 -0.0726023 0.001 -0.004091 -0.0364398 0.001 -0.0025 -1.02405e-16 0 -0.00885188 -0.0726023 0 -0.004091 -0.0364398 0 -0.0025 -1.02405e-16 0 -0.0025 -1.02405e-16 0.001 -0.0167464 0.108212 0.001 -0.004091 0.0364398 0.001 -0.00885188 0.0726023 0.001 -0.0167464 0.108212 0 -0.004091 0.0364398 0 -0.00885188 0.0726023 0 -0.0167464 0.108212 0 -0.0119168 0.109506 0 -0.0119168 0.109506 0.001 -0.0167464 0.108212 0.001 0.0025 -1.0363e-16 0 0.0025 -1.0363e-16 0.001 -0.0119168 0.109506 0.001 0.000889977 0.0368756 0.001 -0.00392784 0.0734705 0.001 -0.0119168 0.109506 0 0.000889977 0.0368756 0 -0.00392784 0.0734705 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0108448 -0.0633848 0 -0.00601514 -0.0646789 0 -0.00601514 -0.0646789 0.001 -0.0108448 -0.0633848 0.001 -0.0108448 -0.0633848 0 -0.00601514 -0.0646789 0 -0.0025 -5.99832e-17 0 -0.00622058 -0.0425264 0 -0.00343192 -0.0213444 0 -0.0108448 0.0633848 0 -0.00343192 0.0213444 0 -0.00622058 0.0425264 0 -0.00601514 0.0646789 0 0.0025 -6.12078e-17 0 0.00154906 0.0217802 0 -0.00129654 0.0433947 0 -0.00129654 -0.0433947 0 0.00154906 -0.0217802 0 -0.00601514 -0.0646789 0 -0.00601514 -0.0646789 0.001 0.0025 -6.12078e-17 0.001 -0.00129654 -0.0433947 0.001 0.00154906 -0.0217802 0.001 0.0025 -6.12078e-17 0 -0.00129654 -0.0433947 0 0.00154906 -0.0217802 0 -0.0108448 -0.0633848 0.001 -0.00601514 -0.0646789 0.001 -0.0025 -5.99832e-17 0.001 -0.00622058 -0.0425264 0.001 -0.00343192 -0.0213444 0.001 -0.0108448 0.0633848 0.001 -0.00343192 0.0213444 0.001 -0.00622058 0.0425264 0.001 -0.00601514 0.0646789 0.001 0.0025 -6.12078e-17 0.001 0.00154906 0.0217802 0.001 -0.00129654 0.0433947 0.001 -0.00129654 -0.0433947 0.001 0.00154906 -0.0217802 0.001 -0.0108448 -0.0633848 0 -0.0108448 -0.0633848 0.001 -0.0025 -5.99832e-17 0.001 -0.00622058 -0.0425264 0.001 -0.00343192 -0.0213444 0.001 -0.0025 -5.99832e-17 0 -0.00622058 -0.0425264 0 -0.00343192 -0.0213444 0 -0.0025 -5.99832e-17 0 -0.0025 -5.99832e-17 0.001 -0.0108448 0.0633848 0.001 -0.00343192 0.0213444 0.001 -0.00622058 0.0425264 0.001 -0.0108448 0.0633848 0 -0.00343192 0.0213444 0 -0.00622058 0.0425264 0 -0.0108448 0.0633848 0 -0.00601514 0.0646789 0 -0.00601514 0.0646789 0.001 -0.0108448 0.0633848 0.001 0.0025 -6.12078e-17 0 0.0025 -6.12078e-17 0.001 -0.00601514 0.0646789 0.001 0.00154906 0.0217802 0.001 -0.00129654 0.0433947 0.001 -0.00601514 0.0646789 0 0.00154906 0.0217802 0 -0.00129654 0.0433947 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0169168 -0.109506 0 -0.0120872 -0.1108 0 -0.0120872 -0.1108 0.001 -0.0169168 -0.109506 0.001 -0.0169168 -0.109506 0 -0.0120872 -0.1108 0 -0.0025 -1.0363e-16 0 -0.00892784 -0.0734705 0 -0.00411002 -0.0368756 0 -0.0169168 0.109506 0 -0.00411002 0.0368756 0 -0.00892784 0.0734705 0 -0.0120872 0.1108 0 0.0025 -1.04854e-16 0 0.00087095 0.0373114 0 -0.0040038 0.0743388 0 -0.0040038 -0.0743388 0 0.00087095 -0.0373114 0 -0.0120872 -0.1108 0 -0.0120872 -0.1108 0.001 0.0025 -1.04854e-16 0.001 -0.0040038 -0.0743388 0.001 0.00087095 -0.0373114 0.001 0.0025 -1.04854e-16 0 -0.0040038 -0.0743388 0 0.00087095 -0.0373114 0 -0.0169168 -0.109506 0.001 -0.0120872 -0.1108 0.001 -0.0025 -1.0363e-16 0.001 -0.00892784 -0.0734705 0.001 -0.00411002 -0.0368756 0.001 -0.0169168 0.109506 0.001 -0.00411002 0.0368756 0.001 -0.00892784 0.0734705 0.001 -0.0120872 0.1108 0.001 0.0025 -1.04854e-16 0.001 0.00087095 0.0373114 0.001 -0.0040038 0.0743388 0.001 -0.0040038 -0.0743388 0.001 0.00087095 -0.0373114 0.001 -0.0169168 -0.109506 0 -0.0169168 -0.109506 0.001 -0.0025 -1.0363e-16 0.001 -0.00892784 -0.0734705 0.001 -0.00411002 -0.0368756 0.001 -0.0025 -1.0363e-16 0 -0.00892784 -0.0734705 0 -0.00411002 -0.0368756 0 -0.0025 -1.0363e-16 0 -0.0025 -1.0363e-16 0.001 -0.0169168 0.109506 0.001 -0.00411002 0.0368756 0.001 -0.00892784 0.0734705 0.001 -0.0169168 0.109506 0 -0.00411002 0.0368756 0 -0.00892784 0.0734705 0 -0.0169168 0.109506 0 -0.0120872 0.1108 0 -0.0120872 0.1108 0.001 -0.0169168 0.109506 0.001 0.0025 -1.04854e-16 0 0.0025 -1.04854e-16 0.001 -0.0120872 0.1108 0.001 0.00087095 0.0373114 0.001 -0.0040038 0.0743388 0.001 -0.0120872 0.1108 0 0.00087095 0.0373114 0 -0.0040038 0.0743388 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0170837 -0.110775 0 -0.0122541 -0.112069 0 -0.0122541 -0.112069 0.001 -0.0170837 -0.110775 0.001 -0.0170837 -0.110775 0 -0.0122541 -0.112069 0 -0.0025 -1.0483e-16 0 -0.00900228 -0.0743214 0 -0.00412867 -0.0373027 0 -0.0170837 0.110775 0 -0.00412867 0.0373027 0 -0.00900228 0.0743214 0 -0.0122541 0.112069 0 0.0025 -1.06054e-16 0 0.000852304 0.0377384 0 -0.00407824 0.0751897 0 -0.00407824 -0.0751897 0 0.000852304 -0.0377384 0 -0.0122541 -0.112069 0 -0.0122541 -0.112069 0.001 0.0025 -1.06054e-16 0.001 -0.00407824 -0.0751897 0.001 0.000852304 -0.0377384 0.001 0.0025 -1.06054e-16 0 -0.00407824 -0.0751897 0 0.000852304 -0.0377384 0 -0.0170837 -0.110775 0.001 -0.0122541 -0.112069 0.001 -0.0025 -1.0483e-16 0.001 -0.00900228 -0.0743214 0.001 -0.00412867 -0.0373027 0.001 -0.0170837 0.110775 0.001 -0.00412867 0.0373027 0.001 -0.00900228 0.0743214 0.001 -0.0122541 0.112069 0.001 0.0025 -1.06054e-16 0.001 0.000852304 0.0377384 0.001 -0.00407824 0.0751897 0.001 -0.00407824 -0.0751897 0.001 0.000852304 -0.0377384 0.001 -0.0170837 -0.110775 0 -0.0170837 -0.110775 0.001 -0.0025 -1.0483e-16 0.001 -0.00900228 -0.0743214 0.001 -0.00412867 -0.0373027 0.001 -0.0025 -1.0483e-16 0 -0.00900228 -0.0743214 0 -0.00412867 -0.0373027 0 -0.0025 -1.0483e-16 0 -0.0025 -1.0483e-16 0.001 -0.0170837 0.110775 0.001 -0.00412867 0.0373027 0.001 -0.00900228 0.0743214 0.001 -0.0170837 0.110775 0 -0.00412867 0.0373027 0 -0.00900228 0.0743214 0 -0.0170837 0.110775 0 -0.0122541 0.112069 0 -0.0122541 0.112069 0.001 -0.0170837 0.110775 0.001 0.0025 -1.06054e-16 0 0.0025 -1.06054e-16 0.001 -0.0122541 0.112069 0.001 0.000852304 0.0377384 0.001 -0.00407824 0.0751897 0.001 -0.0122541 0.112069 0 0.000852304 0.0377384 0 -0.00407824 0.0751897 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0172507 -0.112043 0 -0.0124211 -0.113337 0 -0.0124211 -0.113337 0.001 -0.0172507 -0.112043 0.001 -0.0172507 -0.112043 0 -0.0124211 -0.113337 0 -0.0025 -1.0603e-16 0 -0.00907672 -0.0751723 0 -0.00414732 -0.0377297 0 -0.0172507 0.112043 0 -0.00414732 0.0377297 0 -0.00907672 0.0751723 0 -0.0124211 0.113337 0 0.0025 -1.07255e-16 0 0.000833658 0.0381655 0 -0.00415268 0.0760405 0 -0.00415268 -0.0760405 0 0.000833658 -0.0381655 0 -0.0124211 -0.113337 0 -0.0124211 -0.113337 0.001 0.0025 -1.07255e-16 0.001 -0.00415268 -0.0760405 0.001 0.000833658 -0.0381655 0.001 0.0025 -1.07255e-16 0 -0.00415268 -0.0760405 0 0.000833658 -0.0381655 0 -0.0172507 -0.112043 0.001 -0.0124211 -0.113337 0.001 -0.0025 -1.0603e-16 0.001 -0.00907672 -0.0751723 0.001 -0.00414732 -0.0377297 0.001 -0.0172507 0.112043 0.001 -0.00414732 0.0377297 0.001 -0.00907672 0.0751723 0.001 -0.0124211 0.113337 0.001 0.0025 -1.07255e-16 0.001 0.000833658 0.0381655 0.001 -0.00415268 0.0760405 0.001 -0.00415268 -0.0760405 0.001 0.000833658 -0.0381655 0.001 -0.0172507 -0.112043 0 -0.0172507 -0.112043 0.001 -0.0025 -1.0603e-16 0.001 -0.00907672 -0.0751723 0.001 -0.00414732 -0.0377297 0.001 -0.0025 -1.0603e-16 0 -0.00907672 -0.0751723 0 -0.00414732 -0.0377297 0 -0.0025 -1.0603e-16 0 -0.0025 -1.0603e-16 0.001 -0.0172507 0.112043 0.001 -0.00414732 0.0377297 0.001 -0.00907672 0.0751723 0.001 -0.0172507 0.112043 0 -0.00414732 0.0377297 0 -0.00907672 0.0751723 0 -0.0172507 0.112043 0 -0.0124211 0.113337 0 -0.0124211 0.113337 0.001 -0.0172507 0.112043 0.001 0.0025 -1.07255e-16 0 0.0025 -1.07255e-16 0.001 -0.0124211 0.113337 0.001 0.000833658 0.0381655 0.001 -0.00415268 0.0760405 0.001 -0.0124211 0.113337 0 0.000833658 0.0381655 0 -0.00415268 0.0760405 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0174177 -0.113311 0 -0.012588 -0.114605 0 -0.012588 -0.114605 0.001 -0.0174177 -0.113311 0.001 -0.0174177 -0.113311 0 -0.012588 -0.114605 0 -0.0025 -1.0723e-16 0 -0.00915117 -0.0760232 0 -0.00416596 -0.0381568 0 -0.0174177 0.113311 0 -0.00416596 0.0381568 0 -0.00915117 0.0760232 0 -0.012588 0.114605 0 0.0025 -1.08455e-16 0 0.000815012 0.0385926 0 -0.00422713 0.0768914 0 -0.00422713 -0.0768914 0 0.000815012 -0.0385926 0 -0.012588 -0.114605 0 -0.012588 -0.114605 0.001 0.0025 -1.08455e-16 0.001 -0.00422713 -0.0768914 0.001 0.000815012 -0.0385926 0.001 0.0025 -1.08455e-16 0 -0.00422713 -0.0768914 0 0.000815012 -0.0385926 0 -0.0174177 -0.113311 0.001 -0.012588 -0.114605 0.001 -0.0025 -1.0723e-16 0.001 -0.00915117 -0.0760232 0.001 -0.00416596 -0.0381568 0.001 -0.0174177 0.113311 0.001 -0.00416596 0.0381568 0.001 -0.00915117 0.0760232 0.001 -0.012588 0.114605 0.001 0.0025 -1.08455e-16 0.001 0.000815012 0.0385926 0.001 -0.00422713 0.0768914 0.001 -0.00422713 -0.0768914 0.001 0.000815012 -0.0385926 0.001 -0.0174177 -0.113311 0 -0.0174177 -0.113311 0.001 -0.0025 -1.0723e-16 0.001 -0.00915117 -0.0760232 0.001 -0.00416596 -0.0381568 0.001 -0.0025 -1.0723e-16 0 -0.00915117 -0.0760232 0 -0.00416596 -0.0381568 0 -0.0025 -1.0723e-16 0 -0.0025 -1.0723e-16 0.001 -0.0174177 0.113311 0.001 -0.00416596 0.0381568 0.001 -0.00915117 0.0760232 0.001 -0.0174177 0.113311 0 -0.00416596 0.0381568 0 -0.00915117 0.0760232 0 -0.0174177 0.113311 0 -0.012588 0.114605 0 -0.012588 0.114605 0.001 -0.0174177 0.113311 0.001 0.0025 -1.08455e-16 0 0.0025 -1.08455e-16 0.001 -0.012588 0.114605 0.001 0.000815012 0.0385926 0.001 -0.00422713 0.0768914 0.001 -0.012588 0.114605 0 0.000815012 0.0385926 0 -0.00422713 0.0768914 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0175846 -0.114579 0 -0.012755 -0.115873 0 -0.012755 -0.115873 0.001 -0.0175846 -0.114579 0.001 -0.0175846 -0.114579 0 -0.012755 -0.115873 0 -0.0025 -1.0843e-16 0 -0.00922561 -0.076874 0 -0.00418461 -0.0385838 0 -0.0175846 0.114579 0 -0.00418461 0.0385838 0 -0.00922561 0.076874 0 -0.012755 0.115873 0 0.0025 -1.09655e-16 0 0.000796366 0.0390196 0 -0.00430157 0.0777423 0 -0.00430157 -0.0777423 0 0.000796366 -0.0390196 0 -0.012755 -0.115873 0 -0.012755 -0.115873 0.001 0.0025 -1.09655e-16 0.001 -0.00430157 -0.0777423 0.001 0.000796366 -0.0390196 0.001 0.0025 -1.09655e-16 0 -0.00430157 -0.0777423 0 0.000796366 -0.0390196 0 -0.0175846 -0.114579 0.001 -0.012755 -0.115873 0.001 -0.0025 -1.0843e-16 0.001 -0.00922561 -0.076874 0.001 -0.00418461 -0.0385838 0.001 -0.0175846 0.114579 0.001 -0.00418461 0.0385838 0.001 -0.00922561 0.076874 0.001 -0.012755 0.115873 0.001 0.0025 -1.09655e-16 0.001 0.000796366 0.0390196 0.001 -0.00430157 0.0777423 0.001 -0.00430157 -0.0777423 0.001 0.000796366 -0.0390196 0.001 -0.0175846 -0.114579 0 -0.0175846 -0.114579 0.001 -0.0025 -1.0843e-16 0.001 -0.00922561 -0.076874 0.001 -0.00418461 -0.0385838 0.001 -0.0025 -1.0843e-16 0 -0.00922561 -0.076874 0 -0.00418461 -0.0385838 0 -0.0025 -1.0843e-16 0 -0.0025 -1.0843e-16 0.001 -0.0175846 0.114579 0.001 -0.00418461 0.0385838 0.001 -0.00922561 0.076874 0.001 -0.0175846 0.114579 0 -0.00418461 0.0385838 0 -0.00922561 0.076874 0 -0.0175846 0.114579 0 -0.012755 0.115873 0 -0.012755 0.115873 0.001 -0.0175846 0.114579 0.001 0.0025 -1.09655e-16 0 0.0025 -1.09655e-16 0.001 -0.012755 0.115873 0.001 0.000796366 0.0390196 0.001 -0.00430157 0.0777423 0.001 -0.012755 0.115873 0 0.000796366 0.0390196 0 -0.00430157 0.0777423 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0177516 -0.115847 0 -0.012922 -0.117141 0 -0.012922 -0.117141 0.001 -0.0177516 -0.115847 0.001 -0.0177516 -0.115847 0 -0.012922 -0.117141 0 -0.0025 -1.0963e-16 0 -0.00930005 -0.0777249 0 -0.00420325 -0.0390109 0 -0.0177516 0.115847 0 -0.00420325 0.0390109 0 -0.00930005 0.0777249 0 -0.012922 0.117141 0 0.0025 -1.10855e-16 0 0.00077772 0.0394467 0 -0.00437601 0.0785932 0 -0.00437601 -0.0785932 0 0.00077772 -0.0394467 0 -0.012922 -0.117141 0 -0.012922 -0.117141 0.001 0.0025 -1.10855e-16 0.001 -0.00437601 -0.0785932 0.001 0.00077772 -0.0394467 0.001 0.0025 -1.10855e-16 0 -0.00437601 -0.0785932 0 0.00077772 -0.0394467 0 -0.0177516 -0.115847 0.001 -0.012922 -0.117141 0.001 -0.0025 -1.0963e-16 0.001 -0.00930005 -0.0777249 0.001 -0.00420325 -0.0390109 0.001 -0.0177516 0.115847 0.001 -0.00420325 0.0390109 0.001 -0.00930005 0.0777249 0.001 -0.012922 0.117141 0.001 0.0025 -1.10855e-16 0.001 0.00077772 0.0394467 0.001 -0.00437601 0.0785932 0.001 -0.00437601 -0.0785932 0.001 0.00077772 -0.0394467 0.001 -0.0177516 -0.115847 0 -0.0177516 -0.115847 0.001 -0.0025 -1.0963e-16 0.001 -0.00930005 -0.0777249 0.001 -0.00420325 -0.0390109 0.001 -0.0025 -1.0963e-16 0 -0.00930005 -0.0777249 0 -0.00420325 -0.0390109 0 -0.0025 -1.0963e-16 0 -0.0025 -1.0963e-16 0.001 -0.0177516 0.115847 0.001 -0.00420325 0.0390109 0.001 -0.00930005 0.0777249 0.001 -0.0177516 0.115847 0 -0.00420325 0.0390109 0 -0.00930005 0.0777249 0 -0.0177516 0.115847 0 -0.012922 0.117141 0 -0.012922 0.117141 0.001 -0.0177516 0.115847 0.001 0.0025 -1.10855e-16 0 0.0025 -1.10855e-16 0.001 -0.012922 0.117141 0.001 0.00077772 0.0394467 0.001 -0.00437601 0.0785932 0.001 -0.012922 0.117141 0 0.00077772 0.0394467 0 -0.00437601 0.0785932 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179186 -0.117116 0 -0.0130889 -0.11841 0 -0.0130889 -0.11841 0.001 -0.0179186 -0.117116 0.001 -0.0179186 -0.117116 0 -0.0130889 -0.11841 0 -0.0025 -1.10831e-16 0 -0.00937449 -0.0785758 0 -0.0042219 -0.039438 0 -0.0179186 0.117116 0 -0.0042219 0.039438 0 -0.00937449 0.0785758 0 -0.0130889 0.11841 0 0.0025 -1.12055e-16 0 0.000759074 0.0398738 0 -0.00445045 0.079444 0 -0.00445045 -0.079444 0 0.000759074 -0.0398738 0 -0.0130889 -0.11841 0 -0.0130889 -0.11841 0.001 0.0025 -1.12055e-16 0.001 -0.00445045 -0.079444 0.001 0.000759074 -0.0398738 0.001 0.0025 -1.12055e-16 0 -0.00445045 -0.079444 0 0.000759074 -0.0398738 0 -0.0179186 -0.117116 0.001 -0.0130889 -0.11841 0.001 -0.0025 -1.10831e-16 0.001 -0.00937449 -0.0785758 0.001 -0.0042219 -0.039438 0.001 -0.0179186 0.117116 0.001 -0.0042219 0.039438 0.001 -0.00937449 0.0785758 0.001 -0.0130889 0.11841 0.001 0.0025 -1.12055e-16 0.001 0.000759074 0.0398738 0.001 -0.00445045 0.079444 0.001 -0.00445045 -0.079444 0.001 0.000759074 -0.0398738 0.001 -0.0179186 -0.117116 0 -0.0179186 -0.117116 0.001 -0.0025 -1.10831e-16 0.001 -0.00937449 -0.0785758 0.001 -0.0042219 -0.039438 0.001 -0.0025 -1.10831e-16 0 -0.00937449 -0.0785758 0 -0.0042219 -0.039438 0 -0.0025 -1.10831e-16 0 -0.0025 -1.10831e-16 0.001 -0.0179186 0.117116 0.001 -0.0042219 0.039438 0.001 -0.00937449 0.0785758 0.001 -0.0179186 0.117116 0 -0.0042219 0.039438 0 -0.00937449 0.0785758 0 -0.0179186 0.117116 0 -0.0130889 0.11841 0 -0.0130889 0.11841 0.001 -0.0179186 0.117116 0.001 0.0025 -1.12055e-16 0 0.0025 -1.12055e-16 0.001 -0.0130889 0.11841 0.001 0.000759074 0.0398738 0.001 -0.00445045 0.079444 0.001 -0.0130889 0.11841 0 0.000759074 0.0398738 0 -0.00445045 0.079444 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0180889 -0.11841 0 -0.0132593 -0.119704 0 -0.0132593 -0.119704 0.001 -0.0180889 -0.11841 0.001 -0.0180889 -0.11841 0 -0.0132593 -0.119704 0 -0.0025 -1.12055e-16 0 -0.00945045 -0.079444 0 -0.00424093 -0.0398738 0 -0.0180889 0.11841 0 -0.00424093 0.0398738 0 -0.00945045 0.079444 0 -0.0132593 0.119704 0 0.0025 -1.1328e-16 0 0.000740048 0.0403095 0 -0.00452641 0.0803123 0 -0.00452641 -0.0803123 0 0.000740048 -0.0403095 0 -0.0132593 -0.119704 0 -0.0132593 -0.119704 0.001 0.0025 -1.1328e-16 0.001 -0.00452641 -0.0803123 0.001 0.000740048 -0.0403095 0.001 0.0025 -1.1328e-16 0 -0.00452641 -0.0803123 0 0.000740048 -0.0403095 0 -0.0180889 -0.11841 0.001 -0.0132593 -0.119704 0.001 -0.0025 -1.12055e-16 0.001 -0.00945045 -0.079444 0.001 -0.00424093 -0.0398738 0.001 -0.0180889 0.11841 0.001 -0.00424093 0.0398738 0.001 -0.00945045 0.079444 0.001 -0.0132593 0.119704 0.001 0.0025 -1.1328e-16 0.001 0.000740048 0.0403095 0.001 -0.00452641 0.0803123 0.001 -0.00452641 -0.0803123 0.001 0.000740048 -0.0403095 0.001 -0.0180889 -0.11841 0 -0.0180889 -0.11841 0.001 -0.0025 -1.12055e-16 0.001 -0.00945045 -0.079444 0.001 -0.00424093 -0.0398738 0.001 -0.0025 -1.12055e-16 0 -0.00945045 -0.079444 0 -0.00424093 -0.0398738 0 -0.0025 -1.12055e-16 0 -0.0025 -1.12055e-16 0.001 -0.0180889 0.11841 0.001 -0.00424093 0.0398738 0.001 -0.00945045 0.079444 0.001 -0.0180889 0.11841 0 -0.00424093 0.0398738 0 -0.00945045 0.079444 0 -0.0180889 0.11841 0 -0.0132593 0.119704 0 -0.0132593 0.119704 0.001 -0.0180889 0.11841 0.001 0.0025 -1.1328e-16 0 0.0025 -1.1328e-16 0.001 -0.0132593 0.119704 0.001 0.000740048 0.0403095 0.001 -0.00452641 0.0803123 0.001 -0.0132593 0.119704 0 0.000740048 0.0403095 0 -0.00452641 0.0803123 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0182559 -0.119678 0 -0.0134263 -0.120972 0 -0.0134263 -0.120972 0.001 -0.0182559 -0.119678 0.001 -0.0182559 -0.119678 0 -0.0134263 -0.120972 0 -0.0025 -1.13255e-16 0 -0.0095249 -0.0802949 0 -0.00425957 -0.0403008 0 -0.0182559 0.119678 0 -0.00425957 0.0403008 0 -0.0095249 0.0802949 0 -0.0134263 0.120972 0 0.0025 -1.1448e-16 0 0.000721402 0.0407366 0 -0.00460086 0.0811632 0 -0.00460086 -0.0811632 0 0.000721402 -0.0407366 0 -0.0134263 -0.120972 0 -0.0134263 -0.120972 0.001 0.0025 -1.1448e-16 0.001 -0.00460086 -0.0811632 0.001 0.000721402 -0.0407366 0.001 0.0025 -1.1448e-16 0 -0.00460086 -0.0811632 0 0.000721402 -0.0407366 0 -0.0182559 -0.119678 0.001 -0.0134263 -0.120972 0.001 -0.0025 -1.13255e-16 0.001 -0.0095249 -0.0802949 0.001 -0.00425957 -0.0403008 0.001 -0.0182559 0.119678 0.001 -0.00425957 0.0403008 0.001 -0.0095249 0.0802949 0.001 -0.0134263 0.120972 0.001 0.0025 -1.1448e-16 0.001 0.000721402 0.0407366 0.001 -0.00460086 0.0811632 0.001 -0.00460086 -0.0811632 0.001 0.000721402 -0.0407366 0.001 -0.0182559 -0.119678 0 -0.0182559 -0.119678 0.001 -0.0025 -1.13255e-16 0.001 -0.0095249 -0.0802949 0.001 -0.00425957 -0.0403008 0.001 -0.0025 -1.13255e-16 0 -0.0095249 -0.0802949 0 -0.00425957 -0.0403008 0 -0.0025 -1.13255e-16 0 -0.0025 -1.13255e-16 0.001 -0.0182559 0.119678 0.001 -0.00425957 0.0403008 0.001 -0.0095249 0.0802949 0.001 -0.0182559 0.119678 0 -0.00425957 0.0403008 0 -0.0095249 0.0802949 0 -0.0182559 0.119678 0 -0.0134263 0.120972 0 -0.0134263 0.120972 0.001 -0.0182559 0.119678 0.001 0.0025 -1.1448e-16 0 0.0025 -1.1448e-16 0.001 -0.0134263 0.120972 0.001 0.000721402 0.0407366 0.001 -0.00460086 0.0811632 0.001 -0.0134263 0.120972 0 0.000721402 0.0407366 0 -0.00460086 0.0811632 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0184229 -0.120946 0 -0.0135932 -0.12224 0 -0.0135932 -0.12224 0.001 -0.0184229 -0.120946 0.001 -0.0184229 -0.120946 0 -0.0135932 -0.12224 0 -0.0025 -1.14455e-16 0 -0.00959934 -0.0811458 0 -0.00427822 -0.0407279 0 -0.0184229 0.120946 0 -0.00427822 0.0407279 0 -0.00959934 0.0811458 0 -0.0135932 0.12224 0 0.0025 -1.1568e-16 0 0.000702756 0.0411637 0 -0.0046753 0.082014 0 -0.0046753 -0.082014 0 0.000702756 -0.0411637 0 -0.0135932 -0.12224 0 -0.0135932 -0.12224 0.001 0.0025 -1.1568e-16 0.001 -0.0046753 -0.082014 0.001 0.000702756 -0.0411637 0.001 0.0025 -1.1568e-16 0 -0.0046753 -0.082014 0 0.000702756 -0.0411637 0 -0.0184229 -0.120946 0.001 -0.0135932 -0.12224 0.001 -0.0025 -1.14455e-16 0.001 -0.00959934 -0.0811458 0.001 -0.00427822 -0.0407279 0.001 -0.0184229 0.120946 0.001 -0.00427822 0.0407279 0.001 -0.00959934 0.0811458 0.001 -0.0135932 0.12224 0.001 0.0025 -1.1568e-16 0.001 0.000702756 0.0411637 0.001 -0.0046753 0.082014 0.001 -0.0046753 -0.082014 0.001 0.000702756 -0.0411637 0.001 -0.0184229 -0.120946 0 -0.0184229 -0.120946 0.001 -0.0025 -1.14455e-16 0.001 -0.00959934 -0.0811458 0.001 -0.00427822 -0.0407279 0.001 -0.0025 -1.14455e-16 0 -0.00959934 -0.0811458 0 -0.00427822 -0.0407279 0 -0.0025 -1.14455e-16 0 -0.0025 -1.14455e-16 0.001 -0.0184229 0.120946 0.001 -0.00427822 0.0407279 0.001 -0.00959934 0.0811458 0.001 -0.0184229 0.120946 0 -0.00427822 0.0407279 0 -0.00959934 0.0811458 0 -0.0184229 0.120946 0 -0.0135932 0.12224 0 -0.0135932 0.12224 0.001 -0.0184229 0.120946 0.001 0.0025 -1.1568e-16 0 0.0025 -1.1568e-16 0.001 -0.0135932 0.12224 0.001 0.000702756 0.0411637 0.001 -0.0046753 0.082014 0.001 -0.0135932 0.12224 0 0.000702756 0.0411637 0 -0.0046753 0.082014 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0110151 -0.0646789 0 -0.00618551 -0.065973 0 -0.00618551 -0.065973 0.001 -0.0110151 -0.0646789 0.001 -0.0110151 -0.0646789 0 -0.00618551 -0.065973 0 -0.0025 -6.12078e-17 0 -0.00629654 -0.0433947 0 -0.00345094 -0.0217802 0 -0.0110151 0.0646789 0 -0.00345094 0.0217802 0 -0.00629654 0.0433947 0 -0.00618551 0.065973 0 0.0025 -6.24325e-17 0 0.00153003 0.022216 0 -0.0013725 0.0442629 0 -0.0013725 -0.0442629 0 0.00153003 -0.022216 0 -0.00618551 -0.065973 0 -0.00618551 -0.065973 0.001 0.0025 -6.24325e-17 0.001 -0.0013725 -0.0442629 0.001 0.00153003 -0.022216 0.001 0.0025 -6.24325e-17 0 -0.0013725 -0.0442629 0 0.00153003 -0.022216 0 -0.0110151 -0.0646789 0.001 -0.00618551 -0.065973 0.001 -0.0025 -6.12078e-17 0.001 -0.00629654 -0.0433947 0.001 -0.00345094 -0.0217802 0.001 -0.0110151 0.0646789 0.001 -0.00345094 0.0217802 0.001 -0.00629654 0.0433947 0.001 -0.00618551 0.065973 0.001 0.0025 -6.24325e-17 0.001 0.00153003 0.022216 0.001 -0.0013725 0.0442629 0.001 -0.0013725 -0.0442629 0.001 0.00153003 -0.022216 0.001 -0.0110151 -0.0646789 0 -0.0110151 -0.0646789 0.001 -0.0025 -6.12078e-17 0.001 -0.00629654 -0.0433947 0.001 -0.00345094 -0.0217802 0.001 -0.0025 -6.12078e-17 0 -0.00629654 -0.0433947 0 -0.00345094 -0.0217802 0 -0.0025 -6.12078e-17 0 -0.0025 -6.12078e-17 0.001 -0.0110151 0.0646789 0.001 -0.00345094 0.0217802 0.001 -0.00629654 0.0433947 0.001 -0.0110151 0.0646789 0 -0.00345094 0.0217802 0 -0.00629654 0.0433947 0 -0.0110151 0.0646789 0 -0.00618551 0.065973 0 -0.00618551 0.065973 0.001 -0.0110151 0.0646789 0.001 0.0025 -6.24325e-17 0 0.0025 -6.24325e-17 0.001 -0.00618551 0.065973 0.001 0.00153003 0.022216 0.001 -0.0013725 0.0442629 0.001 -0.00618551 0.065973 0 0.00153003 0.022216 0 -0.0013725 0.0442629 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0185898 -0.122214 0 -0.0137602 -0.123508 0 -0.0137602 -0.123508 0.001 -0.0185898 -0.122214 0.001 -0.0185898 -0.122214 0 -0.0137602 -0.123508 0 -0.0025 -1.15656e-16 0 -0.00967378 -0.0819967 0 -0.00429686 -0.0411549 0 -0.0185898 0.122214 0 -0.00429686 0.0411549 0 -0.00967378 0.0819967 0 -0.0137602 0.123508 0 0.0025 -1.1688e-16 0 0.00068411 0.0415907 0 -0.00474974 0.0828649 0 -0.00474974 -0.0828649 0 0.00068411 -0.0415907 0 -0.0137602 -0.123508 0 -0.0137602 -0.123508 0.001 0.0025 -1.1688e-16 0.001 -0.00474974 -0.0828649 0.001 0.00068411 -0.0415907 0.001 0.0025 -1.1688e-16 0 -0.00474974 -0.0828649 0 0.00068411 -0.0415907 0 -0.0185898 -0.122214 0.001 -0.0137602 -0.123508 0.001 -0.0025 -1.15656e-16 0.001 -0.00967378 -0.0819967 0.001 -0.00429686 -0.0411549 0.001 -0.0185898 0.122214 0.001 -0.00429686 0.0411549 0.001 -0.00967378 0.0819967 0.001 -0.0137602 0.123508 0.001 0.0025 -1.1688e-16 0.001 0.00068411 0.0415907 0.001 -0.00474974 0.0828649 0.001 -0.00474974 -0.0828649 0.001 0.00068411 -0.0415907 0.001 -0.0185898 -0.122214 0 -0.0185898 -0.122214 0.001 -0.0025 -1.15656e-16 0.001 -0.00967378 -0.0819967 0.001 -0.00429686 -0.0411549 0.001 -0.0025 -1.15656e-16 0 -0.00967378 -0.0819967 0 -0.00429686 -0.0411549 0 -0.0025 -1.15656e-16 0 -0.0025 -1.15656e-16 0.001 -0.0185898 0.122214 0.001 -0.00429686 0.0411549 0.001 -0.00967378 0.0819967 0.001 -0.0185898 0.122214 0 -0.00429686 0.0411549 0 -0.00967378 0.0819967 0 -0.0185898 0.122214 0 -0.0137602 0.123508 0 -0.0137602 0.123508 0.001 -0.0185898 0.122214 0.001 0.0025 -1.1688e-16 0 0.0025 -1.1688e-16 0.001 -0.0137602 0.123508 0.001 0.00068411 0.0415907 0.001 -0.00474974 0.0828649 0.001 -0.0137602 0.123508 0 0.00068411 0.0415907 0 -0.00474974 0.0828649 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0187568 -0.123483 0 -0.0139272 -0.124777 0 -0.0139272 -0.124777 0.001 -0.0187568 -0.123483 0.001 -0.0187568 -0.123483 0 -0.0139272 -0.124777 0 -0.0025 -1.16856e-16 0 -0.00974822 -0.0828475 0 -0.00431551 -0.041582 0 -0.0187568 0.123483 0 -0.00431551 0.041582 0 -0.00974822 0.0828475 0 -0.0139272 0.124777 0 0.0025 -1.1808e-16 0 0.000665464 0.0420178 0 -0.00482418 0.0837158 0 -0.00482418 -0.0837158 0 0.000665464 -0.0420178 0 -0.0139272 -0.124777 0 -0.0139272 -0.124777 0.001 0.0025 -1.1808e-16 0.001 -0.00482418 -0.0837158 0.001 0.000665464 -0.0420178 0.001 0.0025 -1.1808e-16 0 -0.00482418 -0.0837158 0 0.000665464 -0.0420178 0 -0.0187568 -0.123483 0.001 -0.0139272 -0.124777 0.001 -0.0025 -1.16856e-16 0.001 -0.00974822 -0.0828475 0.001 -0.00431551 -0.041582 0.001 -0.0187568 0.123483 0.001 -0.00431551 0.041582 0.001 -0.00974822 0.0828475 0.001 -0.0139272 0.124777 0.001 0.0025 -1.1808e-16 0.001 0.000665464 0.0420178 0.001 -0.00482418 0.0837158 0.001 -0.00482418 -0.0837158 0.001 0.000665464 -0.0420178 0.001 -0.0187568 -0.123483 0 -0.0187568 -0.123483 0.001 -0.0025 -1.16856e-16 0.001 -0.00974822 -0.0828475 0.001 -0.00431551 -0.041582 0.001 -0.0025 -1.16856e-16 0 -0.00974822 -0.0828475 0 -0.00431551 -0.041582 0 -0.0025 -1.16856e-16 0 -0.0025 -1.16856e-16 0.001 -0.0187568 0.123483 0.001 -0.00431551 0.041582 0.001 -0.00974822 0.0828475 0.001 -0.0187568 0.123483 0 -0.00431551 0.041582 0 -0.00974822 0.0828475 0 -0.0187568 0.123483 0 -0.0139272 0.124777 0 -0.0139272 0.124777 0.001 -0.0187568 0.123483 0.001 0.0025 -1.1808e-16 0 0.0025 -1.1808e-16 0.001 -0.0139272 0.124777 0.001 0.000665464 0.0420178 0.001 -0.00482418 0.0837158 0.001 -0.0139272 0.124777 0 0.000665464 0.0420178 0 -0.00482418 0.0837158 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0189238 -0.124751 0 -0.0140941 -0.126045 0 -0.0140941 -0.126045 0.001 -0.0189238 -0.124751 0.001 -0.0189238 -0.124751 0 -0.0140941 -0.126045 0 -0.0025 -1.18056e-16 0 -0.00982266 -0.0836984 0 -0.00433416 -0.0420091 0 -0.0189238 0.124751 0 -0.00433416 0.0420091 0 -0.00982266 0.0836984 0 -0.0140941 0.126045 0 0.0025 -1.19281e-16 0 0.000646818 0.0424448 0 -0.00489862 0.0845667 0 -0.00489862 -0.0845667 0 0.000646818 -0.0424448 0 -0.0140941 -0.126045 0 -0.0140941 -0.126045 0.001 0.0025 -1.19281e-16 0.001 -0.00489862 -0.0845667 0.001 0.000646818 -0.0424448 0.001 0.0025 -1.19281e-16 0 -0.00489862 -0.0845667 0 0.000646818 -0.0424448 0 -0.0189238 -0.124751 0.001 -0.0140941 -0.126045 0.001 -0.0025 -1.18056e-16 0.001 -0.00982266 -0.0836984 0.001 -0.00433416 -0.0420091 0.001 -0.0189238 0.124751 0.001 -0.00433416 0.0420091 0.001 -0.00982266 0.0836984 0.001 -0.0140941 0.126045 0.001 0.0025 -1.19281e-16 0.001 0.000646818 0.0424448 0.001 -0.00489862 0.0845667 0.001 -0.00489862 -0.0845667 0.001 0.000646818 -0.0424448 0.001 -0.0189238 -0.124751 0 -0.0189238 -0.124751 0.001 -0.0025 -1.18056e-16 0.001 -0.00982266 -0.0836984 0.001 -0.00433416 -0.0420091 0.001 -0.0025 -1.18056e-16 0 -0.00982266 -0.0836984 0 -0.00433416 -0.0420091 0 -0.0025 -1.18056e-16 0 -0.0025 -1.18056e-16 0.001 -0.0189238 0.124751 0.001 -0.00433416 0.0420091 0.001 -0.00982266 0.0836984 0.001 -0.0189238 0.124751 0 -0.00433416 0.0420091 0 -0.00982266 0.0836984 0 -0.0189238 0.124751 0 -0.0140941 0.126045 0 -0.0140941 0.126045 0.001 -0.0189238 0.124751 0.001 0.0025 -1.19281e-16 0 0.0025 -1.19281e-16 0.001 -0.0140941 0.126045 0.001 0.000646818 0.0424448 0.001 -0.00489862 0.0845667 0.001 -0.0140941 0.126045 0 0.000646818 0.0424448 0 -0.00489862 0.0845667 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0190907 -0.126019 0 -0.0142611 -0.127313 0 -0.0142611 -0.127313 0.001 -0.0190907 -0.126019 0.001 -0.0190907 -0.126019 0 -0.0142611 -0.127313 0 -0.0025 -1.19256e-16 0 -0.00989711 -0.0845493 0 -0.0043528 -0.0424361 0 -0.0190907 0.126019 0 -0.0043528 0.0424361 0 -0.00989711 0.0845493 0 -0.0142611 0.127313 0 0.0025 -1.20481e-16 0 0.000628172 0.0428719 0 -0.00497307 0.0854175 0 -0.00497307 -0.0854175 0 0.000628172 -0.0428719 0 -0.0142611 -0.127313 0 -0.0142611 -0.127313 0.001 0.0025 -1.20481e-16 0.001 -0.00497307 -0.0854175 0.001 0.000628172 -0.0428719 0.001 0.0025 -1.20481e-16 0 -0.00497307 -0.0854175 0 0.000628172 -0.0428719 0 -0.0190907 -0.126019 0.001 -0.0142611 -0.127313 0.001 -0.0025 -1.19256e-16 0.001 -0.00989711 -0.0845493 0.001 -0.0043528 -0.0424361 0.001 -0.0190907 0.126019 0.001 -0.0043528 0.0424361 0.001 -0.00989711 0.0845493 0.001 -0.0142611 0.127313 0.001 0.0025 -1.20481e-16 0.001 0.000628172 0.0428719 0.001 -0.00497307 0.0854175 0.001 -0.00497307 -0.0854175 0.001 0.000628172 -0.0428719 0.001 -0.0190907 -0.126019 0 -0.0190907 -0.126019 0.001 -0.0025 -1.19256e-16 0.001 -0.00989711 -0.0845493 0.001 -0.0043528 -0.0424361 0.001 -0.0025 -1.19256e-16 0 -0.00989711 -0.0845493 0 -0.0043528 -0.0424361 0 -0.0025 -1.19256e-16 0 -0.0025 -1.19256e-16 0.001 -0.0190907 0.126019 0.001 -0.0043528 0.0424361 0.001 -0.00989711 0.0845493 0.001 -0.0190907 0.126019 0 -0.0043528 0.0424361 0 -0.00989711 0.0845493 0 -0.0190907 0.126019 0 -0.0142611 0.127313 0 -0.0142611 0.127313 0.001 -0.0190907 0.126019 0.001 0.0025 -1.20481e-16 0 0.0025 -1.20481e-16 0.001 -0.0142611 0.127313 0.001 0.000628172 0.0428719 0.001 -0.00497307 0.0854175 0.001 -0.0142611 0.127313 0 0.000628172 0.0428719 0 -0.00497307 0.0854175 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0192543 -0.127261 0 -0.0144246 -0.128555 0 -0.0144246 -0.128555 0.001 -0.0192543 -0.127261 0.001 -0.0192543 -0.127261 0 -0.0144246 -0.128555 0 -0.0025 -1.20432e-16 0 -0.00997003 -0.0853828 0 -0.00437107 -0.0428545 0 -0.0192543 0.127261 0 -0.00437107 0.0428545 0 -0.00997003 0.0853828 0 -0.0144246 0.128555 0 0.0025 -1.21656e-16 0 0.000609907 0.0432903 0 -0.00504599 0.086251 0 -0.00504599 -0.086251 0 0.000609907 -0.0432903 0 -0.0144246 -0.128555 0 -0.0144246 -0.128555 0.001 0.0025 -1.21656e-16 0.001 -0.00504599 -0.086251 0.001 0.000609907 -0.0432903 0.001 0.0025 -1.21656e-16 0 -0.00504599 -0.086251 0 0.000609907 -0.0432903 0 -0.0192543 -0.127261 0.001 -0.0144246 -0.128555 0.001 -0.0025 -1.20432e-16 0.001 -0.00997003 -0.0853828 0.001 -0.00437107 -0.0428545 0.001 -0.0192543 0.127261 0.001 -0.00437107 0.0428545 0.001 -0.00997003 0.0853828 0.001 -0.0144246 0.128555 0.001 0.0025 -1.21656e-16 0.001 0.000609907 0.0432903 0.001 -0.00504599 0.086251 0.001 -0.00504599 -0.086251 0.001 0.000609907 -0.0432903 0.001 -0.0192543 -0.127261 0 -0.0192543 -0.127261 0.001 -0.0025 -1.20432e-16 0.001 -0.00997003 -0.0853828 0.001 -0.00437107 -0.0428545 0.001 -0.0025 -1.20432e-16 0 -0.00997003 -0.0853828 0 -0.00437107 -0.0428545 0 -0.0025 -1.20432e-16 0 -0.0025 -1.20432e-16 0.001 -0.0192543 0.127261 0.001 -0.00437107 0.0428545 0.001 -0.00997003 0.0853828 0.001 -0.0192543 0.127261 0 -0.00437107 0.0428545 0 -0.00997003 0.0853828 0 -0.0192543 0.127261 0 -0.0144246 0.128555 0 -0.0144246 0.128555 0.001 -0.0192543 0.127261 0.001 0.0025 -1.21656e-16 0 0.0025 -1.21656e-16 0.001 -0.0144246 0.128555 0.001 0.000609907 0.0432903 0.001 -0.00504599 0.086251 0.001 -0.0144246 0.128555 0 0.000609907 0.0432903 0 -0.00504599 0.086251 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0194212 -0.12853 0 -0.0145916 -0.129824 0 -0.0145916 -0.129824 0.001 -0.0194212 -0.12853 0.001 -0.0194212 -0.12853 0 -0.0145916 -0.129824 0 -0.0025 -1.21632e-16 0 -0.0100445 -0.0862337 0 -0.00438971 -0.0432815 0 -0.0194212 0.12853 0 -0.00438971 0.0432815 0 -0.0100445 0.0862337 0 -0.0145916 0.129824 0 0.0025 -1.22857e-16 0 0.000591261 0.0437173 0 -0.00512043 0.0871019 0 -0.00512043 -0.0871019 0 0.000591261 -0.0437173 0 -0.0145916 -0.129824 0 -0.0145916 -0.129824 0.001 0.0025 -1.22857e-16 0.001 -0.00512043 -0.0871019 0.001 0.000591261 -0.0437173 0.001 0.0025 -1.22857e-16 0 -0.00512043 -0.0871019 0 0.000591261 -0.0437173 0 -0.0194212 -0.12853 0.001 -0.0145916 -0.129824 0.001 -0.0025 -1.21632e-16 0.001 -0.0100445 -0.0862337 0.001 -0.00438971 -0.0432815 0.001 -0.0194212 0.12853 0.001 -0.00438971 0.0432815 0.001 -0.0100445 0.0862337 0.001 -0.0145916 0.129824 0.001 0.0025 -1.22857e-16 0.001 0.000591261 0.0437173 0.001 -0.00512043 0.0871019 0.001 -0.00512043 -0.0871019 0.001 0.000591261 -0.0437173 0.001 -0.0194212 -0.12853 0 -0.0194212 -0.12853 0.001 -0.0025 -1.21632e-16 0.001 -0.0100445 -0.0862337 0.001 -0.00438971 -0.0432815 0.001 -0.0025 -1.21632e-16 0 -0.0100445 -0.0862337 0 -0.00438971 -0.0432815 0 -0.0025 -1.21632e-16 0 -0.0025 -1.21632e-16 0.001 -0.0194212 0.12853 0.001 -0.00438971 0.0432815 0.001 -0.0100445 0.0862337 0.001 -0.0194212 0.12853 0 -0.00438971 0.0432815 0 -0.0100445 0.0862337 0 -0.0194212 0.12853 0 -0.0145916 0.129824 0 -0.0145916 0.129824 0.001 -0.0194212 0.12853 0.001 0.0025 -1.22857e-16 0 0.0025 -1.22857e-16 0.001 -0.0145916 0.129824 0.001 0.000591261 0.0437173 0.001 -0.00512043 0.0871019 0.001 -0.0145916 0.129824 0 0.000591261 0.0437173 0 -0.00512043 0.0871019 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0195882 -0.129798 0 -0.0147586 -0.131092 0 -0.0147586 -0.131092 0.001 -0.0195882 -0.129798 0.001 -0.0195882 -0.129798 0 -0.0147586 -0.131092 0 -0.0025 -1.22832e-16 0 -0.0101189 -0.0870846 0 -0.00440836 -0.0437086 0 -0.0195882 0.129798 0 -0.00440836 0.0437086 0 -0.0101189 0.0870846 0 -0.0147586 0.131092 0 0.0025 -1.24057e-16 0 0.000572615 0.0441444 0 -0.00519487 0.0879528 0 -0.00519487 -0.0879528 0 0.000572615 -0.0441444 0 -0.0147586 -0.131092 0 -0.0147586 -0.131092 0.001 0.0025 -1.24057e-16 0.001 -0.00519487 -0.0879528 0.001 0.000572615 -0.0441444 0.001 0.0025 -1.24057e-16 0 -0.00519487 -0.0879528 0 0.000572615 -0.0441444 0 -0.0195882 -0.129798 0.001 -0.0147586 -0.131092 0.001 -0.0025 -1.22832e-16 0.001 -0.0101189 -0.0870846 0.001 -0.00440836 -0.0437086 0.001 -0.0195882 0.129798 0.001 -0.00440836 0.0437086 0.001 -0.0101189 0.0870846 0.001 -0.0147586 0.131092 0.001 0.0025 -1.24057e-16 0.001 0.000572615 0.0441444 0.001 -0.00519487 0.0879528 0.001 -0.00519487 -0.0879528 0.001 0.000572615 -0.0441444 0.001 -0.0195882 -0.129798 0 -0.0195882 -0.129798 0.001 -0.0025 -1.22832e-16 0.001 -0.0101189 -0.0870846 0.001 -0.00440836 -0.0437086 0.001 -0.0025 -1.22832e-16 0 -0.0101189 -0.0870846 0 -0.00440836 -0.0437086 0 -0.0025 -1.22832e-16 0 -0.0025 -1.22832e-16 0.001 -0.0195882 0.129798 0.001 -0.00440836 0.0437086 0.001 -0.0101189 0.0870846 0.001 -0.0195882 0.129798 0 -0.00440836 0.0437086 0 -0.0101189 0.0870846 0 -0.0195882 0.129798 0 -0.0147586 0.131092 0 -0.0147586 0.131092 0.001 -0.0195882 0.129798 0.001 0.0025 -1.24057e-16 0 0.0025 -1.24057e-16 0.001 -0.0147586 0.131092 0.001 0.000572615 0.0441444 0.001 -0.00519487 0.0879528 0.001 -0.0147586 0.131092 0 0.000572615 0.0441444 0 -0.00519487 0.0879528 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0197552 -0.131066 0 -0.0149255 -0.13236 0 -0.0149255 -0.13236 0.001 -0.0197552 -0.131066 0.001 -0.0197552 -0.131066 0 -0.0149255 -0.13236 0 -0.0025 -1.24032e-16 0 -0.0101934 -0.0879354 0 -0.004427 -0.0441357 0 -0.0197552 0.131066 0 -0.004427 0.0441357 0 -0.0101934 0.0879354 0 -0.0149255 0.13236 0 0.0025 -1.25257e-16 0 0.000553969 0.0445714 0 -0.00526932 0.0888037 0 -0.00526932 -0.0888037 0 0.000553969 -0.0445714 0 -0.0149255 -0.13236 0 -0.0149255 -0.13236 0.001 0.0025 -1.25257e-16 0.001 -0.00526932 -0.0888037 0.001 0.000553969 -0.0445714 0.001 0.0025 -1.25257e-16 0 -0.00526932 -0.0888037 0 0.000553969 -0.0445714 0 -0.0197552 -0.131066 0.001 -0.0149255 -0.13236 0.001 -0.0025 -1.24032e-16 0.001 -0.0101934 -0.0879354 0.001 -0.004427 -0.0441357 0.001 -0.0197552 0.131066 0.001 -0.004427 0.0441357 0.001 -0.0101934 0.0879354 0.001 -0.0149255 0.13236 0.001 0.0025 -1.25257e-16 0.001 0.000553969 0.0445714 0.001 -0.00526932 0.0888037 0.001 -0.00526932 -0.0888037 0.001 0.000553969 -0.0445714 0.001 -0.0197552 -0.131066 0 -0.0197552 -0.131066 0.001 -0.0025 -1.24032e-16 0.001 -0.0101934 -0.0879354 0.001 -0.004427 -0.0441357 0.001 -0.0025 -1.24032e-16 0 -0.0101934 -0.0879354 0 -0.004427 -0.0441357 0 -0.0025 -1.24032e-16 0 -0.0025 -1.24032e-16 0.001 -0.0197552 0.131066 0.001 -0.004427 0.0441357 0.001 -0.0101934 0.0879354 0.001 -0.0197552 0.131066 0 -0.004427 0.0441357 0 -0.0101934 0.0879354 0 -0.0197552 0.131066 0 -0.0149255 0.13236 0 -0.0149255 0.13236 0.001 -0.0197552 0.131066 0.001 0.0025 -1.25257e-16 0 0.0025 -1.25257e-16 0.001 -0.0149255 0.13236 0.001 0.000553969 0.0445714 0.001 -0.00526932 0.0888037 0.001 -0.0149255 0.13236 0 0.000553969 0.0445714 0 -0.00526932 0.0888037 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0199221 -0.132334 0 -0.0150925 -0.133628 0 -0.0150925 -0.133628 0.001 -0.0199221 -0.132334 0.001 -0.0199221 -0.132334 0 -0.0150925 -0.133628 0 -0.0025 -1.25232e-16 0 -0.0102678 -0.0887863 0 -0.00444565 -0.0445627 0 -0.0199221 0.132334 0 -0.00444565 0.0445627 0 -0.0102678 0.0887863 0 -0.0150925 0.133628 0 0.0025 -1.26457e-16 0 0.000535323 0.0449985 0 -0.00534376 0.0896546 0 -0.00534376 -0.0896546 0 0.000535323 -0.0449985 0 -0.0150925 -0.133628 0 -0.0150925 -0.133628 0.001 0.0025 -1.26457e-16 0.001 -0.00534376 -0.0896546 0.001 0.000535323 -0.0449985 0.001 0.0025 -1.26457e-16 0 -0.00534376 -0.0896546 0 0.000535323 -0.0449985 0 -0.0199221 -0.132334 0.001 -0.0150925 -0.133628 0.001 -0.0025 -1.25232e-16 0.001 -0.0102678 -0.0887863 0.001 -0.00444565 -0.0445627 0.001 -0.0199221 0.132334 0.001 -0.00444565 0.0445627 0.001 -0.0102678 0.0887863 0.001 -0.0150925 0.133628 0.001 0.0025 -1.26457e-16 0.001 0.000535323 0.0449985 0.001 -0.00534376 0.0896546 0.001 -0.00534376 -0.0896546 0.001 0.000535323 -0.0449985 0.001 -0.0199221 -0.132334 0 -0.0199221 -0.132334 0.001 -0.0025 -1.25232e-16 0.001 -0.0102678 -0.0887863 0.001 -0.00444565 -0.0445627 0.001 -0.0025 -1.25232e-16 0 -0.0102678 -0.0887863 0 -0.00444565 -0.0445627 0 -0.0025 -1.25232e-16 0 -0.0025 -1.25232e-16 0.001 -0.0199221 0.132334 0.001 -0.00444565 0.0445627 0.001 -0.0102678 0.0887863 0.001 -0.0199221 0.132334 0 -0.00444565 0.0445627 0 -0.0102678 0.0887863 0 -0.0199221 0.132334 0 -0.0150925 0.133628 0 -0.0150925 0.133628 0.001 -0.0199221 0.132334 0.001 0.0025 -1.26457e-16 0 0.0025 -1.26457e-16 0.001 -0.0150925 0.133628 0.001 0.000535323 0.0449985 0.001 -0.00534376 0.0896546 0.001 -0.0150925 0.133628 0 0.000535323 0.0449985 0 -0.00534376 0.0896546 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0200891 -0.133602 0 -0.0152595 -0.134896 0 -0.0152595 -0.134896 0.001 -0.0200891 -0.133602 0.001 -0.0200891 -0.133602 0 -0.0152595 -0.134896 0 -0.0025 -1.26433e-16 0 -0.0103422 -0.0896372 0 -0.0044643 -0.0449898 0 -0.0200891 0.133602 0 -0.0044643 0.0449898 0 -0.0103422 0.0896372 0 -0.0152595 0.134896 0 0.0025 -1.27657e-16 0 0.000516677 0.0454256 0 -0.0054182 0.0905054 0 -0.0054182 -0.0905054 0 0.000516677 -0.0454256 0 -0.0152595 -0.134896 0 -0.0152595 -0.134896 0.001 0.0025 -1.27657e-16 0.001 -0.0054182 -0.0905054 0.001 0.000516677 -0.0454256 0.001 0.0025 -1.27657e-16 0 -0.0054182 -0.0905054 0 0.000516677 -0.0454256 0 -0.0200891 -0.133602 0.001 -0.0152595 -0.134896 0.001 -0.0025 -1.26433e-16 0.001 -0.0103422 -0.0896372 0.001 -0.0044643 -0.0449898 0.001 -0.0200891 0.133602 0.001 -0.0044643 0.0449898 0.001 -0.0103422 0.0896372 0.001 -0.0152595 0.134896 0.001 0.0025 -1.27657e-16 0.001 0.000516677 0.0454256 0.001 -0.0054182 0.0905054 0.001 -0.0054182 -0.0905054 0.001 0.000516677 -0.0454256 0.001 -0.0200891 -0.133602 0 -0.0200891 -0.133602 0.001 -0.0025 -1.26433e-16 0.001 -0.0103422 -0.0896372 0.001 -0.0044643 -0.0449898 0.001 -0.0025 -1.26433e-16 0 -0.0103422 -0.0896372 0 -0.0044643 -0.0449898 0 -0.0025 -1.26433e-16 0 -0.0025 -1.26433e-16 0.001 -0.0200891 0.133602 0.001 -0.0044643 0.0449898 0.001 -0.0103422 0.0896372 0.001 -0.0200891 0.133602 0 -0.0044643 0.0449898 0 -0.0103422 0.0896372 0 -0.0200891 0.133602 0 -0.0152595 0.134896 0 -0.0152595 0.134896 0.001 -0.0200891 0.133602 0.001 0.0025 -1.27657e-16 0 0.0025 -1.27657e-16 0.001 -0.0152595 0.134896 0.001 0.000516677 0.0454256 0.001 -0.0054182 0.0905054 0.001 -0.0152595 0.134896 0 0.000516677 0.0454256 0 -0.0054182 0.0905054 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0111821 -0.0659471 0 -0.00635247 -0.0672412 0 -0.00635247 -0.0672412 0.001 -0.0111821 -0.0659471 0.001 -0.0111821 -0.0659471 0 -0.00635247 -0.0672412 0 -0.0025 -6.2408e-17 0 -0.00637098 -0.0442456 0 -0.00346959 -0.0222073 0 -0.0111821 0.0659471 0 -0.00346959 0.0222073 0 -0.00637098 0.0442456 0 -0.00635247 0.0672412 0 0.0025 -6.36326e-17 0 0.00151138 0.0226431 0 -0.00144695 0.0451138 0 -0.00144695 -0.0451138 0 0.00151138 -0.0226431 0 -0.00635247 -0.0672412 0 -0.00635247 -0.0672412 0.001 0.0025 -6.36326e-17 0.001 -0.00144695 -0.0451138 0.001 0.00151138 -0.0226431 0.001 0.0025 -6.36326e-17 0 -0.00144695 -0.0451138 0 0.00151138 -0.0226431 0 -0.0111821 -0.0659471 0.001 -0.00635247 -0.0672412 0.001 -0.0025 -6.2408e-17 0.001 -0.00637098 -0.0442456 0.001 -0.00346959 -0.0222073 0.001 -0.0111821 0.0659471 0.001 -0.00346959 0.0222073 0.001 -0.00637098 0.0442456 0.001 -0.00635247 0.0672412 0.001 0.0025 -6.36326e-17 0.001 0.00151138 0.0226431 0.001 -0.00144695 0.0451138 0.001 -0.00144695 -0.0451138 0.001 0.00151138 -0.0226431 0.001 -0.0111821 -0.0659471 0 -0.0111821 -0.0659471 0.001 -0.0025 -6.2408e-17 0.001 -0.00637098 -0.0442456 0.001 -0.00346959 -0.0222073 0.001 -0.0025 -6.2408e-17 0 -0.00637098 -0.0442456 0 -0.00346959 -0.0222073 0 -0.0025 -6.2408e-17 0 -0.0025 -6.2408e-17 0.001 -0.0111821 0.0659471 0.001 -0.00346959 0.0222073 0.001 -0.00637098 0.0442456 0.001 -0.0111821 0.0659471 0 -0.00346959 0.0222073 0 -0.00637098 0.0442456 0 -0.0111821 0.0659471 0 -0.00635247 0.0672412 0 -0.00635247 0.0672412 0.001 -0.0111821 0.0659471 0.001 0.0025 -6.36326e-17 0 0.0025 -6.36326e-17 0.001 -0.00635247 0.0672412 0.001 0.00151138 0.0226431 0.001 -0.00144695 0.0451138 0.001 -0.00635247 0.0672412 0 0.00151138 0.0226431 0 -0.00144695 0.0451138 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0113525 -0.0672412 0 -0.00652284 -0.0685353 0 -0.00652284 -0.0685353 0.001 -0.0113525 -0.0672412 0.001 -0.0113525 -0.0672412 0 -0.00652284 -0.0685353 0 -0.0025 -6.36326e-17 0 -0.00644695 -0.0451138 0 -0.00348862 -0.0226431 0 -0.0113525 0.0672412 0 -0.00348862 0.0226431 0 -0.00644695 0.0451138 0 -0.00652284 0.0685353 0 0.0025 -6.48573e-17 0 0.00149236 0.0230788 0 -0.00152291 0.045982 0 -0.00152291 -0.045982 0 0.00149236 -0.0230788 0 -0.00652284 -0.0685353 0 -0.00652284 -0.0685353 0.001 0.0025 -6.48573e-17 0.001 -0.00152291 -0.045982 0.001 0.00149236 -0.0230788 0.001 0.0025 -6.48573e-17 0 -0.00152291 -0.045982 0 0.00149236 -0.0230788 0 -0.0113525 -0.0672412 0.001 -0.00652284 -0.0685353 0.001 -0.0025 -6.36326e-17 0.001 -0.00644695 -0.0451138 0.001 -0.00348862 -0.0226431 0.001 -0.0113525 0.0672412 0.001 -0.00348862 0.0226431 0.001 -0.00644695 0.0451138 0.001 -0.00652284 0.0685353 0.001 0.0025 -6.48573e-17 0.001 0.00149236 0.0230788 0.001 -0.00152291 0.045982 0.001 -0.00152291 -0.045982 0.001 0.00149236 -0.0230788 0.001 -0.0113525 -0.0672412 0 -0.0113525 -0.0672412 0.001 -0.0025 -6.36326e-17 0.001 -0.00644695 -0.0451138 0.001 -0.00348862 -0.0226431 0.001 -0.0025 -6.36326e-17 0 -0.00644695 -0.0451138 0 -0.00348862 -0.0226431 0 -0.0025 -6.36326e-17 0 -0.0025 -6.36326e-17 0.001 -0.0113525 0.0672412 0.001 -0.00348862 0.0226431 0.001 -0.00644695 0.0451138 0.001 -0.0113525 0.0672412 0 -0.00348862 0.0226431 0 -0.00644695 0.0451138 0 -0.0113525 0.0672412 0 -0.00652284 0.0685353 0 -0.00652284 0.0685353 0.001 -0.0113525 0.0672412 0.001 0.0025 -6.48573e-17 0 0.0025 -6.48573e-17 0.001 -0.00652284 0.0685353 0.001 0.00149236 0.0230788 0.001 -0.00152291 0.045982 0.001 -0.00652284 0.0685353 0 0.00149236 0.0230788 0 -0.00152291 0.045982 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0115228 -0.0685353 0 -0.00669321 -0.0698294 0 -0.00669321 -0.0698294 0.001 -0.0115228 -0.0685353 0.001 -0.0115228 -0.0685353 0 -0.00669321 -0.0698294 0 -0.0025 -6.48573e-17 0 -0.00652291 -0.045982 0 -0.00350764 -0.0230788 0 -0.0115228 0.0685353 0 -0.00350764 0.0230788 0 -0.00652291 0.045982 0 -0.00669321 0.0698294 0 0.0025 -6.60819e-17 0 0.00147333 0.0235146 0 -0.00159887 0.0468503 0 -0.00159887 -0.0468503 0 0.00147333 -0.0235146 0 -0.00669321 -0.0698294 0 -0.00669321 -0.0698294 0.001 0.0025 -6.60819e-17 0.001 -0.00159887 -0.0468503 0.001 0.00147333 -0.0235146 0.001 0.0025 -6.60819e-17 0 -0.00159887 -0.0468503 0 0.00147333 -0.0235146 0 -0.0115228 -0.0685353 0.001 -0.00669321 -0.0698294 0.001 -0.0025 -6.48573e-17 0.001 -0.00652291 -0.045982 0.001 -0.00350764 -0.0230788 0.001 -0.0115228 0.0685353 0.001 -0.00350764 0.0230788 0.001 -0.00652291 0.045982 0.001 -0.00669321 0.0698294 0.001 0.0025 -6.60819e-17 0.001 0.00147333 0.0235146 0.001 -0.00159887 0.0468503 0.001 -0.00159887 -0.0468503 0.001 0.00147333 -0.0235146 0.001 -0.0115228 -0.0685353 0 -0.0115228 -0.0685353 0.001 -0.0025 -6.48573e-17 0.001 -0.00652291 -0.045982 0.001 -0.00350764 -0.0230788 0.001 -0.0025 -6.48573e-17 0 -0.00652291 -0.045982 0 -0.00350764 -0.0230788 0 -0.0025 -6.48573e-17 0 -0.0025 -6.48573e-17 0.001 -0.0115228 0.0685353 0.001 -0.00350764 0.0230788 0.001 -0.00652291 0.045982 0.001 -0.0115228 0.0685353 0 -0.00350764 0.0230788 0 -0.00652291 0.045982 0 -0.0115228 0.0685353 0 -0.00669321 0.0698294 0 -0.00669321 0.0698294 0.001 -0.0115228 0.0685353 0.001 0.0025 -6.60819e-17 0 0.0025 -6.60819e-17 0.001 -0.00669321 0.0698294 0.001 0.00147333 0.0235146 0.001 -0.00159887 0.0468503 0.001 -0.00669321 0.0698294 0 0.00147333 0.0235146 0 -0.00159887 0.0468503 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0116898 -0.0698035 0 -0.00686018 -0.0710976 0 -0.00686018 -0.0710976 0.001 -0.0116898 -0.0698035 0.001 -0.0116898 -0.0698035 0 -0.00686018 -0.0710976 0 -0.0025 -6.60574e-17 0 -0.00659735 -0.0468329 0 -0.00352629 -0.0235059 0 -0.0116898 0.0698035 0 -0.00352629 0.0235059 0 -0.00659735 0.0468329 0 -0.00686018 0.0710976 0 0.0025 -6.72821e-17 0 0.00145468 0.0239417 0 -0.00167331 0.0477012 0 -0.00167331 -0.0477012 0 0.00145468 -0.0239417 0 -0.00686018 -0.0710976 0 -0.00686018 -0.0710976 0.001 0.0025 -6.72821e-17 0.001 -0.00167331 -0.0477012 0.001 0.00145468 -0.0239417 0.001 0.0025 -6.72821e-17 0 -0.00167331 -0.0477012 0 0.00145468 -0.0239417 0 -0.0116898 -0.0698035 0.001 -0.00686018 -0.0710976 0.001 -0.0025 -6.60574e-17 0.001 -0.00659735 -0.0468329 0.001 -0.00352629 -0.0235059 0.001 -0.0116898 0.0698035 0.001 -0.00352629 0.0235059 0.001 -0.00659735 0.0468329 0.001 -0.00686018 0.0710976 0.001 0.0025 -6.72821e-17 0.001 0.00145468 0.0239417 0.001 -0.00167331 0.0477012 0.001 -0.00167331 -0.0477012 0.001 0.00145468 -0.0239417 0.001 -0.0116898 -0.0698035 0 -0.0116898 -0.0698035 0.001 -0.0025 -6.60574e-17 0.001 -0.00659735 -0.0468329 0.001 -0.00352629 -0.0235059 0.001 -0.0025 -6.60574e-17 0 -0.00659735 -0.0468329 0 -0.00352629 -0.0235059 0 -0.0025 -6.60574e-17 0 -0.0025 -6.60574e-17 0.001 -0.0116898 0.0698035 0.001 -0.00352629 0.0235059 0.001 -0.00659735 0.0468329 0.001 -0.0116898 0.0698035 0 -0.00352629 0.0235059 0 -0.00659735 0.0468329 0 -0.0116898 0.0698035 0 -0.00686018 0.0710976 0 -0.00686018 0.0710976 0.001 -0.0116898 0.0698035 0.001 0.0025 -6.72821e-17 0 0.0025 -6.72821e-17 0.001 -0.00686018 0.0710976 0.001 0.00145468 0.0239417 0.001 -0.00167331 0.0477012 0.001 -0.00686018 0.0710976 0 0.00145468 0.0239417 0 -0.00167331 0.0477012 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0126711 -0.0772575 0 -0.00784151 -0.0785516 0 -0.00784151 -0.0785516 0.001 -0.0126711 -0.0772575 0.001 -0.0126711 -0.0772575 0 -0.00784151 -0.0785516 0 -0.0025 -7.31114e-17 0 -0.00703489 -0.051834 0 -0.00363588 -0.026016 0 -0.0126711 0.0772575 0 -0.00363588 0.026016 0 -0.00703489 0.051834 0 -0.00784151 0.0785516 0 0.0025 -7.43361e-17 0 0.00134509 0.0264518 0 -0.00211085 0.0527022 0 -0.00211085 -0.0527022 0 0.00134509 -0.0264518 0 -0.00784151 -0.0785516 0 -0.00784151 -0.0785516 0.001 0.0025 -7.43361e-17 0.001 -0.00211085 -0.0527022 0.001 0.00134509 -0.0264518 0.001 0.0025 -7.43361e-17 0 -0.00211085 -0.0527022 0 0.00134509 -0.0264518 0 -0.0126711 -0.0772575 0.001 -0.00784151 -0.0785516 0.001 -0.0025 -7.31114e-17 0.001 -0.00703489 -0.051834 0.001 -0.00363588 -0.026016 0.001 -0.0126711 0.0772575 0.001 -0.00363588 0.026016 0.001 -0.00703489 0.051834 0.001 -0.00784151 0.0785516 0.001 0.0025 -7.43361e-17 0.001 0.00134509 0.0264518 0.001 -0.00211085 0.0527022 0.001 -0.00211085 -0.0527022 0.001 0.00134509 -0.0264518 0.001 -0.0126711 -0.0772575 0 -0.0126711 -0.0772575 0.001 -0.0025 -7.31114e-17 0.001 -0.00703489 -0.051834 0.001 -0.00363588 -0.026016 0.001 -0.0025 -7.31114e-17 0 -0.00703489 -0.051834 0 -0.00363588 -0.026016 0 -0.0025 -7.31114e-17 0 -0.0025 -7.31114e-17 0.001 -0.0126711 0.0772575 0.001 -0.00363588 0.026016 0.001 -0.00703489 0.051834 0.001 -0.0126711 0.0772575 0 -0.00363588 0.026016 0 -0.00703489 0.051834 0 -0.0126711 0.0772575 0 -0.00784151 0.0785516 0 -0.00784151 0.0785516 0.001 -0.0126711 0.0772575 0.001 0.0025 -7.43361e-17 0 0.0025 -7.43361e-17 0.001 -0.00784151 0.0785516 0.001 0.00134509 0.0264518 0.001 -0.00211085 0.0527022 0.001 -0.00784151 0.0785516 0 0.00134509 0.0264518 0 -0.00211085 0.0527022 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0128722 -0.0787845 0 -0.00804255 -0.0800786 0 -0.00804255 -0.0800786 0.001 -0.0128722 -0.0787845 0.001 -0.0128722 -0.0787845 0 -0.00804255 -0.0800786 0 -0.0025 -7.45565e-17 0 -0.00712452 -0.0528585 0 -0.00365833 -0.0265302 0 -0.0128722 0.0787845 0 -0.00365833 0.0265302 0 -0.00712452 0.0528585 0 -0.00804255 0.0800786 0 0.0025 -7.57811e-17 0 0.00132264 0.026966 0 -0.00220048 0.0537267 0 -0.00220048 -0.0537267 0 0.00132264 -0.026966 0 -0.00804255 -0.0800786 0 -0.00804255 -0.0800786 0.001 0.0025 -7.57811e-17 0.001 -0.00220048 -0.0537267 0.001 0.00132264 -0.026966 0.001 0.0025 -7.57811e-17 0 -0.00220048 -0.0537267 0 0.00132264 -0.026966 0 -0.0128722 -0.0787845 0.001 -0.00804255 -0.0800786 0.001 -0.0025 -7.45565e-17 0.001 -0.00712452 -0.0528585 0.001 -0.00365833 -0.0265302 0.001 -0.0128722 0.0787845 0.001 -0.00365833 0.0265302 0.001 -0.00712452 0.0528585 0.001 -0.00804255 0.0800786 0.001 0.0025 -7.57811e-17 0.001 0.00132264 0.026966 0.001 -0.00220048 0.0537267 0.001 -0.00220048 -0.0537267 0.001 0.00132264 -0.026966 0.001 -0.0128722 -0.0787845 0 -0.0128722 -0.0787845 0.001 -0.0025 -7.45565e-17 0.001 -0.00712452 -0.0528585 0.001 -0.00365833 -0.0265302 0.001 -0.0025 -7.45565e-17 0 -0.00712452 -0.0528585 0 -0.00365833 -0.0265302 0 -0.0025 -7.45565e-17 0 -0.0025 -7.45565e-17 0.001 -0.0128722 0.0787845 0.001 -0.00365833 0.0265302 0.001 -0.00712452 0.0528585 0.001 -0.0128722 0.0787845 0 -0.00365833 0.0265302 0 -0.00712452 0.0528585 0 -0.0128722 0.0787845 0 -0.00804255 0.0800786 0 -0.00804255 0.0800786 0.001 -0.0128722 0.0787845 0.001 0.0025 -7.57811e-17 0 0.0025 -7.57811e-17 0.001 -0.00804255 0.0800786 0.001 0.00132264 0.026966 0.001 -0.00220048 0.0537267 0.001 -0.00804255 0.0800786 0 0.00132264 0.026966 0 -0.00220048 0.0537267 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0143544 -0.0900431 0 -0.00952478 -0.0913372 0 -0.00952478 -0.0913372 0.001 -0.0143544 -0.0900431 0.001 -0.0143544 -0.0900431 0 -0.00952478 -0.0913372 0 -0.0025 -8.52109e-17 0 -0.00778538 -0.0604122 0 -0.00382386 -0.0303215 0 -0.0143544 0.0900431 0 -0.00382386 0.0303215 0 -0.00778538 0.0604122 0 -0.00952478 0.0913372 0 0.0025 -8.64356e-17 0 0.00115711 0.0307573 0 -0.00286134 0.0612804 0 -0.00286134 -0.0612804 0 0.00115711 -0.0307573 0 -0.00952478 -0.0913372 0 -0.00952478 -0.0913372 0.001 0.0025 -8.64356e-17 0.001 -0.00286134 -0.0612804 0.001 0.00115711 -0.0307573 0.001 0.0025 -8.64356e-17 0 -0.00286134 -0.0612804 0 0.00115711 -0.0307573 0 -0.0143544 -0.0900431 0.001 -0.00952478 -0.0913372 0.001 -0.0025 -8.52109e-17 0.001 -0.00778538 -0.0604122 0.001 -0.00382386 -0.0303215 0.001 -0.0143544 0.0900431 0.001 -0.00382386 0.0303215 0.001 -0.00778538 0.0604122 0.001 -0.00952478 0.0913372 0.001 0.0025 -8.64356e-17 0.001 0.00115711 0.0307573 0.001 -0.00286134 0.0612804 0.001 -0.00286134 -0.0612804 0.001 0.00115711 -0.0307573 0.001 -0.0143544 -0.0900431 0 -0.0143544 -0.0900431 0.001 -0.0025 -8.52109e-17 0.001 -0.00778538 -0.0604122 0.001 -0.00382386 -0.0303215 0.001 -0.0025 -8.52109e-17 0 -0.00778538 -0.0604122 0 -0.00382386 -0.0303215 0 -0.0025 -8.52109e-17 0 -0.0025 -8.52109e-17 0.001 -0.0143544 0.0900431 0.001 -0.00382386 0.0303215 0.001 -0.00778538 0.0604122 0.001 -0.0143544 0.0900431 0 -0.00382386 0.0303215 0 -0.00778538 0.0604122 0 -0.0143544 0.0900431 0 -0.00952478 0.0913372 0 -0.00952478 0.0913372 0.001 -0.0143544 0.0900431 0.001 0.0025 -8.64356e-17 0 0.0025 -8.64356e-17 0.001 -0.00952478 0.0913372 0.001 0.00115711 0.0307573 0.001 -0.00286134 0.0612804 0.001 -0.00952478 0.0913372 0 0.00115711 0.0307573 0 -0.00286134 0.0612804 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145589 -0.0915961 0 -0.00972922 -0.0928902 0 -0.00972922 -0.0928902 0.001 -0.0145589 -0.0915961 0.001 -0.0145589 -0.0915961 0 -0.00972922 -0.0928902 0 -0.0025 -8.66805e-17 0 -0.00787654 -0.0614541 0 -0.0038467 -0.0308444 0 -0.0145589 0.0915961 0 -0.0038467 0.0308444 0 -0.00787654 0.0614541 0 -0.00972922 0.0928902 0 0.0025 -8.79051e-17 0 0.00113428 0.0312802 0 -0.0029525 0.0623223 0 -0.0029525 -0.0623223 0 0.00113428 -0.0312802 0 -0.00972922 -0.0928902 0 -0.00972922 -0.0928902 0.001 0.0025 -8.79051e-17 0.001 -0.0029525 -0.0623223 0.001 0.00113428 -0.0312802 0.001 0.0025 -8.79051e-17 0 -0.0029525 -0.0623223 0 0.00113428 -0.0312802 0 -0.0145589 -0.0915961 0.001 -0.00972922 -0.0928902 0.001 -0.0025 -8.66805e-17 0.001 -0.00787654 -0.0614541 0.001 -0.0038467 -0.0308444 0.001 -0.0145589 0.0915961 0.001 -0.0038467 0.0308444 0.001 -0.00787654 0.0614541 0.001 -0.00972922 0.0928902 0.001 0.0025 -8.79051e-17 0.001 0.00113428 0.0312802 0.001 -0.0029525 0.0623223 0.001 -0.0029525 -0.0623223 0.001 0.00113428 -0.0312802 0.001 -0.0145589 -0.0915961 0 -0.0145589 -0.0915961 0.001 -0.0025 -8.66805e-17 0.001 -0.00787654 -0.0614541 0.001 -0.0038467 -0.0308444 0.001 -0.0025 -8.66805e-17 0 -0.00787654 -0.0614541 0 -0.0038467 -0.0308444 0 -0.0025 -8.66805e-17 0 -0.0025 -8.66805e-17 0.001 -0.0145589 0.0915961 0.001 -0.0038467 0.0308444 0.001 -0.00787654 0.0614541 0.001 -0.0145589 0.0915961 0 -0.0038467 0.0308444 0 -0.00787654 0.0614541 0 -0.0145589 0.0915961 0 -0.00972922 0.0928902 0 -0.00972922 0.0928902 0.001 -0.0145589 0.0915961 0.001 0.0025 -8.79051e-17 0 0.0025 -8.79051e-17 0.001 -0.00972922 0.0928902 0.001 0.00113428 0.0312802 0.001 -0.0029525 0.0623223 0.001 -0.00972922 0.0928902 0 0.00113428 0.0312802 0 -0.0029525 0.0623223 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0146883 -0.0925796 0 -0.0098587 -0.0938737 0 -0.0098587 -0.0938737 0.001 -0.0146883 -0.0925796 0.001 -0.0146883 -0.0925796 0 -0.0098587 -0.0938737 0 -0.0025 -8.76112e-17 0 -0.00793427 -0.062114 0 -0.00386116 -0.0311756 0 -0.0146883 0.0925796 0 -0.00386116 0.0311756 0 -0.00793427 0.062114 0 -0.0098587 0.0938737 0 0.0025 -8.88359e-17 0 0.00111982 0.0316114 0 -0.00301023 0.0629822 0 -0.00301023 -0.0629822 0 0.00111982 -0.0316114 0 -0.0098587 -0.0938737 0 -0.0098587 -0.0938737 0.001 0.0025 -8.88359e-17 0.001 -0.00301023 -0.0629822 0.001 0.00111982 -0.0316114 0.001 0.0025 -8.88359e-17 0 -0.00301023 -0.0629822 0 0.00111982 -0.0316114 0 -0.0146883 -0.0925796 0.001 -0.0098587 -0.0938737 0.001 -0.0025 -8.76112e-17 0.001 -0.00793427 -0.062114 0.001 -0.00386116 -0.0311756 0.001 -0.0146883 0.0925796 0.001 -0.00386116 0.0311756 0.001 -0.00793427 0.062114 0.001 -0.0098587 0.0938737 0.001 0.0025 -8.88359e-17 0.001 0.00111982 0.0316114 0.001 -0.00301023 0.0629822 0.001 -0.00301023 -0.0629822 0.001 0.00111982 -0.0316114 0.001 -0.0146883 -0.0925796 0 -0.0146883 -0.0925796 0.001 -0.0025 -8.76112e-17 0.001 -0.00793427 -0.062114 0.001 -0.00386116 -0.0311756 0.001 -0.0025 -8.76112e-17 0 -0.00793427 -0.062114 0 -0.00386116 -0.0311756 0 -0.0025 -8.76112e-17 0 -0.0025 -8.76112e-17 0.001 -0.0146883 0.0925796 0.001 -0.00386116 0.0311756 0.001 -0.00793427 0.062114 0.001 -0.0146883 0.0925796 0 -0.00386116 0.0311756 0 -0.00793427 0.062114 0 -0.0146883 0.0925796 0 -0.0098587 0.0938737 0 -0.0098587 0.0938737 0.001 -0.0146883 0.0925796 0.001 0.0025 -8.88359e-17 0 0.0025 -8.88359e-17 0.001 -0.0098587 0.0938737 0.001 0.00111982 0.0316114 0.001 -0.00301023 0.0629822 0.001 -0.0098587 0.0938737 0 0.00111982 0.0316114 0 -0.00301023 0.0629822 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0148962 -0.0941584 0 -0.0100666 -0.0954525 0 -0.0100666 -0.0954525 0.001 -0.0148962 -0.0941584 0.001 -0.0148962 -0.0941584 0 -0.0100666 -0.0954525 0 -0.0025 -8.91053e-17 0 -0.00802694 -0.0631732 0 -0.00388437 -0.0317073 0 -0.0148962 0.0941584 0 -0.00388437 0.0317073 0 -0.00802694 0.0631732 0 -0.0100666 0.0954525 0 0.0025 -9.03299e-17 0 0.0010966 0.032143 0 -0.0031029 0.0640414 0 -0.0031029 -0.0640414 0 0.0010966 -0.032143 0 -0.0100666 -0.0954525 0 -0.0100666 -0.0954525 0.001 0.0025 -9.03299e-17 0.001 -0.0031029 -0.0640414 0.001 0.0010966 -0.032143 0.001 0.0025 -9.03299e-17 0 -0.0031029 -0.0640414 0 0.0010966 -0.032143 0 -0.0148962 -0.0941584 0.001 -0.0100666 -0.0954525 0.001 -0.0025 -8.91053e-17 0.001 -0.00802694 -0.0631732 0.001 -0.00388437 -0.0317073 0.001 -0.0148962 0.0941584 0.001 -0.00388437 0.0317073 0.001 -0.00802694 0.0631732 0.001 -0.0100666 0.0954525 0.001 0.0025 -9.03299e-17 0.001 0.0010966 0.032143 0.001 -0.0031029 0.0640414 0.001 -0.0031029 -0.0640414 0.001 0.0010966 -0.032143 0.001 -0.0148962 -0.0941584 0 -0.0148962 -0.0941584 0.001 -0.0025 -8.91053e-17 0.001 -0.00802694 -0.0631732 0.001 -0.00388437 -0.0317073 0.001 -0.0025 -8.91053e-17 0 -0.00802694 -0.0631732 0 -0.00388437 -0.0317073 0 -0.0025 -8.91053e-17 0 -0.0025 -8.91053e-17 0.001 -0.0148962 0.0941584 0.001 -0.00388437 0.0317073 0.001 -0.00802694 0.0631732 0.001 -0.0148962 0.0941584 0 -0.00388437 0.0317073 0 -0.00802694 0.0631732 0 -0.0148962 0.0941584 0 -0.0100666 0.0954525 0 -0.0100666 0.0954525 0.001 -0.0148962 0.0941584 0.001 0.0025 -9.03299e-17 0 0.0025 -9.03299e-17 0.001 -0.0100666 0.0954525 0.001 0.0010966 0.032143 0.001 -0.0031029 0.0640414 0.001 -0.0100666 0.0954525 0 0.0010966 0.032143 0 -0.0031029 0.0640414 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0150257 -0.0951419 0 -0.010196 -0.096436 0 -0.010196 -0.096436 0.001 -0.0150257 -0.0951419 0.001 -0.0150257 -0.0951419 0 -0.010196 -0.096436 0 -0.0025 -9.0036e-17 0 -0.00808467 -0.0638331 0 -0.00389883 -0.0320385 0 -0.0150257 0.0951419 0 -0.00389883 0.0320385 0 -0.00808467 0.0638331 0 -0.010196 0.096436 0 0.0025 -9.12607e-17 0 0.00108214 0.0324742 0 -0.00316063 0.0647013 0 -0.00316063 -0.0647013 0 0.00108214 -0.0324742 0 -0.010196 -0.096436 0 -0.010196 -0.096436 0.001 0.0025 -9.12607e-17 0.001 -0.00316063 -0.0647013 0.001 0.00108214 -0.0324742 0.001 0.0025 -9.12607e-17 0 -0.00316063 -0.0647013 0 0.00108214 -0.0324742 0 -0.0150257 -0.0951419 0.001 -0.010196 -0.096436 0.001 -0.0025 -9.0036e-17 0.001 -0.00808467 -0.0638331 0.001 -0.00389883 -0.0320385 0.001 -0.0150257 0.0951419 0.001 -0.00389883 0.0320385 0.001 -0.00808467 0.0638331 0.001 -0.010196 0.096436 0.001 0.0025 -9.12607e-17 0.001 0.00108214 0.0324742 0.001 -0.00316063 0.0647013 0.001 -0.00316063 -0.0647013 0.001 0.00108214 -0.0324742 0.001 -0.0150257 -0.0951419 0 -0.0150257 -0.0951419 0.001 -0.0025 -9.0036e-17 0.001 -0.00808467 -0.0638331 0.001 -0.00389883 -0.0320385 0.001 -0.0025 -9.0036e-17 0 -0.00808467 -0.0638331 0 -0.00389883 -0.0320385 0 -0.0025 -9.0036e-17 0 -0.0025 -9.0036e-17 0.001 -0.0150257 0.0951419 0.001 -0.00389883 0.0320385 0.001 -0.00808467 0.0638331 0.001 -0.0150257 0.0951419 0 -0.00389883 0.0320385 0 -0.00808467 0.0638331 0 -0.0150257 0.0951419 0 -0.010196 0.096436 0 -0.010196 0.096436 0.001 -0.0150257 0.0951419 0.001 0.0025 -9.12607e-17 0 0.0025 -9.12607e-17 0.001 -0.010196 0.096436 0.001 0.00108214 0.0324742 0.001 -0.00316063 0.0647013 0.001 -0.010196 0.096436 0 0.00108214 0.0324742 0 -0.00316063 0.0647013 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0152335 -0.0967207 0 -0.0104039 -0.0980148 0 -0.0104039 -0.0980148 0.001 -0.0152335 -0.0967207 0.001 -0.0152335 -0.0967207 0 -0.0104039 -0.0980148 0 -0.0025 -9.15301e-17 0 -0.00817734 -0.0648923 0 -0.00392204 -0.0325701 0 -0.0152335 0.0967207 0 -0.00392204 0.0325701 0 -0.00817734 0.0648923 0 -0.0104039 0.0980148 0 0.0025 -9.27547e-17 0 0.00105893 0.0330059 0 -0.0032533 0.0657606 0 -0.0032533 -0.0657606 0 0.00105893 -0.0330059 0 -0.0104039 -0.0980148 0 -0.0104039 -0.0980148 0.001 0.0025 -9.27547e-17 0.001 -0.0032533 -0.0657606 0.001 0.00105893 -0.0330059 0.001 0.0025 -9.27547e-17 0 -0.0032533 -0.0657606 0 0.00105893 -0.0330059 0 -0.0152335 -0.0967207 0.001 -0.0104039 -0.0980148 0.001 -0.0025 -9.15301e-17 0.001 -0.00817734 -0.0648923 0.001 -0.00392204 -0.0325701 0.001 -0.0152335 0.0967207 0.001 -0.00392204 0.0325701 0.001 -0.00817734 0.0648923 0.001 -0.0104039 0.0980148 0.001 0.0025 -9.27547e-17 0.001 0.00105893 0.0330059 0.001 -0.0032533 0.0657606 0.001 -0.0032533 -0.0657606 0.001 0.00105893 -0.0330059 0.001 -0.0152335 -0.0967207 0 -0.0152335 -0.0967207 0.001 -0.0025 -9.15301e-17 0.001 -0.00817734 -0.0648923 0.001 -0.00392204 -0.0325701 0.001 -0.0025 -9.15301e-17 0 -0.00817734 -0.0648923 0 -0.00392204 -0.0325701 0 -0.0025 -9.15301e-17 0 -0.0025 -9.15301e-17 0.001 -0.0152335 0.0967207 0.001 -0.00392204 0.0325701 0.001 -0.00817734 0.0648923 0.001 -0.0152335 0.0967207 0 -0.00392204 0.0325701 0 -0.00817734 0.0648923 0 -0.0152335 0.0967207 0 -0.0104039 0.0980148 0 -0.0104039 0.0980148 0.001 -0.0152335 0.0967207 0.001 0.0025 -9.27547e-17 0 0.0025 -9.27547e-17 0.001 -0.0104039 0.0980148 0.001 0.00105893 0.0330059 0.001 -0.0032533 0.0657606 0.001 -0.0104039 0.0980148 0 0.00105893 0.0330059 0 -0.0032533 0.0657606 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0153596 -0.0976783 0 -0.01053 -0.0989724 0 -0.01053 -0.0989724 0.001 -0.0153596 -0.0976783 0.001 -0.0153596 -0.0976783 0 -0.01053 -0.0989724 0 -0.0025 -9.24363e-17 0 -0.00823355 -0.0655348 0 -0.00393612 -0.0328926 0 -0.0153596 0.0976783 0 -0.00393612 0.0328926 0 -0.00823355 0.0655348 0 -0.01053 0.0989724 0 0.0025 -9.3661e-17 0 0.00104485 0.0333284 0 -0.00330952 0.0664031 0 -0.00330952 -0.0664031 0 0.00104485 -0.0333284 0 -0.01053 -0.0989724 0 -0.01053 -0.0989724 0.001 0.0025 -9.3661e-17 0.001 -0.00330952 -0.0664031 0.001 0.00104485 -0.0333284 0.001 0.0025 -9.3661e-17 0 -0.00330952 -0.0664031 0 0.00104485 -0.0333284 0 -0.0153596 -0.0976783 0.001 -0.01053 -0.0989724 0.001 -0.0025 -9.24363e-17 0.001 -0.00823355 -0.0655348 0.001 -0.00393612 -0.0328926 0.001 -0.0153596 0.0976783 0.001 -0.00393612 0.0328926 0.001 -0.00823355 0.0655348 0.001 -0.01053 0.0989724 0.001 0.0025 -9.3661e-17 0.001 0.00104485 0.0333284 0.001 -0.00330952 0.0664031 0.001 -0.00330952 -0.0664031 0.001 0.00104485 -0.0333284 0.001 -0.0153596 -0.0976783 0 -0.0153596 -0.0976783 0.001 -0.0025 -9.24363e-17 0.001 -0.00823355 -0.0655348 0.001 -0.00393612 -0.0328926 0.001 -0.0025 -9.24363e-17 0 -0.00823355 -0.0655348 0 -0.00393612 -0.0328926 0 -0.0025 -9.24363e-17 0 -0.0025 -9.24363e-17 0.001 -0.0153596 0.0976783 0.001 -0.00393612 0.0328926 0.001 -0.00823355 0.0655348 0.001 -0.0153596 0.0976783 0 -0.00393612 0.0328926 0 -0.00823355 0.0655348 0 -0.0153596 0.0976783 0 -0.01053 0.0989724 0 -0.01053 0.0989724 0.001 -0.0153596 0.0976783 0.001 0.0025 -9.3661e-17 0 0.0025 -9.3661e-17 0.001 -0.01053 0.0989724 0.001 0.00104485 0.0333284 0.001 -0.00330952 0.0664031 0.001 -0.01053 0.0989724 0 0.00104485 0.0333284 0 -0.00330952 0.0664031 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0155709 -0.099283 0 -0.0107412 -0.100577 0 -0.0107412 -0.100577 0.001 -0.0155709 -0.099283 0.001 -0.0155709 -0.099283 0 -0.0107412 -0.100577 0 -0.0025 -9.39549e-17 0 -0.00832775 -0.0666114 0 -0.00395971 -0.0334329 0 -0.0155709 0.099283 0 -0.00395971 0.0334329 0 -0.00832775 0.0666114 0 -0.0107412 0.100577 0 0.0025 -9.51795e-17 0 0.00102126 0.0338687 0 -0.00340371 0.0674797 0 -0.00340371 -0.0674797 0 0.00102126 -0.0338687 0 -0.0107412 -0.100577 0 -0.0107412 -0.100577 0.001 0.0025 -9.51795e-17 0.001 -0.00340371 -0.0674797 0.001 0.00102126 -0.0338687 0.001 0.0025 -9.51795e-17 0 -0.00340371 -0.0674797 0 0.00102126 -0.0338687 0 -0.0155709 -0.099283 0.001 -0.0107412 -0.100577 0.001 -0.0025 -9.39549e-17 0.001 -0.00832775 -0.0666114 0.001 -0.00395971 -0.0334329 0.001 -0.0155709 0.099283 0.001 -0.00395971 0.0334329 0.001 -0.00832775 0.0666114 0.001 -0.0107412 0.100577 0.001 0.0025 -9.51795e-17 0.001 0.00102126 0.0338687 0.001 -0.00340371 0.0674797 0.001 -0.00340371 -0.0674797 0.001 0.00102126 -0.0338687 0.001 -0.0155709 -0.099283 0 -0.0155709 -0.099283 0.001 -0.0025 -9.39549e-17 0.001 -0.00832775 -0.0666114 0.001 -0.00395971 -0.0334329 0.001 -0.0025 -9.39549e-17 0 -0.00832775 -0.0666114 0 -0.00395971 -0.0334329 0 -0.0025 -9.39549e-17 0 -0.0025 -9.39549e-17 0.001 -0.0155709 0.099283 0.001 -0.00395971 0.0334329 0.001 -0.00832775 0.0666114 0.001 -0.0155709 0.099283 0 -0.00395971 0.0334329 0 -0.00832775 0.0666114 0 -0.0155709 0.099283 0 -0.0107412 0.100577 0 -0.0107412 0.100577 0.001 -0.0155709 0.099283 0.001 0.0025 -9.51795e-17 0 0.0025 -9.51795e-17 0.001 -0.0107412 0.100577 0.001 0.00102126 0.0338687 0.001 -0.00340371 0.0674797 0.001 -0.0107412 0.100577 0 0.00102126 0.0338687 0 -0.00340371 0.0674797 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0156935 -0.100215 0 -0.0108639 -0.101509 0 -0.0108639 -0.101509 0.001 -0.0156935 -0.100215 0.001 -0.0156935 -0.100215 0 -0.0108639 -0.101509 0 -0.0025 -9.48366e-17 0 -0.00838244 -0.0672366 0 -0.00397341 -0.0337467 0 -0.0156935 0.100215 0 -0.00397341 0.0337467 0 -0.00838244 0.0672366 0 -0.0108639 0.101509 0 0.0025 -9.60613e-17 0 0.00100756 0.0341825 0 -0.0034584 0.0681048 0 -0.0034584 -0.0681048 0 0.00100756 -0.0341825 0 -0.0108639 -0.101509 0 -0.0108639 -0.101509 0.001 0.0025 -9.60613e-17 0.001 -0.0034584 -0.0681048 0.001 0.00100756 -0.0341825 0.001 0.0025 -9.60613e-17 0 -0.0034584 -0.0681048 0 0.00100756 -0.0341825 0 -0.0156935 -0.100215 0.001 -0.0108639 -0.101509 0.001 -0.0025 -9.48366e-17 0.001 -0.00838244 -0.0672366 0.001 -0.00397341 -0.0337467 0.001 -0.0156935 0.100215 0.001 -0.00397341 0.0337467 0.001 -0.00838244 0.0672366 0.001 -0.0108639 0.101509 0.001 0.0025 -9.60613e-17 0.001 0.00100756 0.0341825 0.001 -0.0034584 0.0681048 0.001 -0.0034584 -0.0681048 0.001 0.00100756 -0.0341825 0.001 -0.0156935 -0.100215 0 -0.0156935 -0.100215 0.001 -0.0025 -9.48366e-17 0.001 -0.00838244 -0.0672366 0.001 -0.00397341 -0.0337467 0.001 -0.0025 -9.48366e-17 0 -0.00838244 -0.0672366 0 -0.00397341 -0.0337467 0 -0.0025 -9.48366e-17 0 -0.0025 -9.48366e-17 0.001 -0.0156935 0.100215 0.001 -0.00397341 0.0337467 0.001 -0.00838244 0.0672366 0.001 -0.0156935 0.100215 0 -0.00397341 0.0337467 0 -0.00838244 0.0672366 0 -0.0156935 0.100215 0 -0.0108639 0.101509 0 -0.0108639 0.101509 0.001 -0.0156935 0.100215 0.001 0.0025 -9.60613e-17 0 0.0025 -9.60613e-17 0.001 -0.0108639 0.101509 0.001 0.00100756 0.0341825 0.001 -0.0034584 0.0681048 0.001 -0.0108639 0.101509 0 0.00100756 0.0341825 0 -0.0034584 0.0681048 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0159048 -0.101819 0 -0.0110752 -0.103114 0 -0.0110752 -0.103114 0.001 -0.0159048 -0.101819 0.001 -0.0159048 -0.101819 0 -0.0110752 -0.103114 0 -0.0025 -9.63552e-17 0 -0.00847663 -0.0683132 0 -0.00399701 -0.0342871 0 -0.0159048 0.101819 0 -0.00399701 0.0342871 0 -0.00847663 0.0683132 0 -0.0110752 0.103114 0 0.0025 -9.75799e-17 0 0.000983968 0.0347228 0 -0.00355259 0.0691814 0 -0.00355259 -0.0691814 0 0.000983968 -0.0347228 0 -0.0110752 -0.103114 0 -0.0110752 -0.103114 0.001 0.0025 -9.75799e-17 0.001 -0.00355259 -0.0691814 0.001 0.000983968 -0.0347228 0.001 0.0025 -9.75799e-17 0 -0.00355259 -0.0691814 0 0.000983968 -0.0347228 0 -0.0159048 -0.101819 0.001 -0.0110752 -0.103114 0.001 -0.0025 -9.63552e-17 0.001 -0.00847663 -0.0683132 0.001 -0.00399701 -0.0342871 0.001 -0.0159048 0.101819 0.001 -0.00399701 0.0342871 0.001 -0.00847663 0.0683132 0.001 -0.0110752 0.103114 0.001 0.0025 -9.75799e-17 0.001 0.000983968 0.0347228 0.001 -0.00355259 0.0691814 0.001 -0.00355259 -0.0691814 0.001 0.000983968 -0.0347228 0.001 -0.0159048 -0.101819 0 -0.0159048 -0.101819 0.001 -0.0025 -9.63552e-17 0.001 -0.00847663 -0.0683132 0.001 -0.00399701 -0.0342871 0.001 -0.0025 -9.63552e-17 0 -0.00847663 -0.0683132 0 -0.00399701 -0.0342871 0 -0.0025 -9.63552e-17 0 -0.0025 -9.63552e-17 0.001 -0.0159048 0.101819 0.001 -0.00399701 0.0342871 0.001 -0.00847663 0.0683132 0.001 -0.0159048 0.101819 0 -0.00399701 0.0342871 0 -0.00847663 0.0683132 0 -0.0159048 0.101819 0 -0.0110752 0.103114 0 -0.0110752 0.103114 0.001 -0.0159048 0.101819 0.001 0.0025 -9.75799e-17 0 0.0025 -9.75799e-17 0.001 -0.0110752 0.103114 0.001 0.000983968 0.0347228 0.001 -0.00355259 0.0691814 0.001 -0.0110752 0.103114 0 0.000983968 0.0347228 0 -0.00355259 0.0691814 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0130085 -0.0798198 0 -0.00817885 -0.0811139 0 -0.00817885 -0.0811139 0.001 -0.0130085 -0.0798198 0.001 -0.0130085 -0.0798198 0 -0.00817885 -0.0811139 0 -0.0025 -7.55362e-17 0 -0.00718529 -0.0535531 0 -0.00367356 -0.0268788 0 -0.0130085 0.0798198 0 -0.00367356 0.0268788 0 -0.00718529 0.0535531 0 -0.00817885 0.0811139 0 0.0025 -7.67609e-17 0 0.00130742 0.0273146 0 -0.00226125 0.0544213 0 -0.00226125 -0.0544213 0 0.00130742 -0.0273146 0 -0.00817885 -0.0811139 0 -0.00817885 -0.0811139 0.001 0.0025 -7.67609e-17 0.001 -0.00226125 -0.0544213 0.001 0.00130742 -0.0273146 0.001 0.0025 -7.67609e-17 0 -0.00226125 -0.0544213 0 0.00130742 -0.0273146 0 -0.0130085 -0.0798198 0.001 -0.00817885 -0.0811139 0.001 -0.0025 -7.55362e-17 0.001 -0.00718529 -0.0535531 0.001 -0.00367356 -0.0268788 0.001 -0.0130085 0.0798198 0.001 -0.00367356 0.0268788 0.001 -0.00718529 0.0535531 0.001 -0.00817885 0.0811139 0.001 0.0025 -7.67609e-17 0.001 0.00130742 0.0273146 0.001 -0.00226125 0.0544213 0.001 -0.00226125 -0.0544213 0.001 0.00130742 -0.0273146 0.001 -0.0130085 -0.0798198 0 -0.0130085 -0.0798198 0.001 -0.0025 -7.55362e-17 0.001 -0.00718529 -0.0535531 0.001 -0.00367356 -0.0268788 0.001 -0.0025 -7.55362e-17 0 -0.00718529 -0.0535531 0 -0.00367356 -0.0268788 0 -0.0025 -7.55362e-17 0 -0.0025 -7.55362e-17 0.001 -0.0130085 0.0798198 0.001 -0.00367356 0.0268788 0.001 -0.00718529 0.0535531 0.001 -0.0130085 0.0798198 0 -0.00367356 0.0268788 0 -0.00718529 0.0535531 0 -0.0130085 0.0798198 0 -0.00817885 0.0811139 0 -0.00817885 0.0811139 0.001 -0.0130085 0.0798198 0.001 0.0025 -7.67609e-17 0 0.0025 -7.67609e-17 0.001 -0.00817885 0.0811139 0.001 0.00130742 0.0273146 0.001 -0.00226125 0.0544213 0.001 -0.00817885 0.0811139 0 0.00130742 0.0273146 0 -0.00226125 0.0544213 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0160309 -0.102777 0 -0.0112012 -0.104071 0 -0.0112012 -0.104071 0.001 -0.0160309 -0.102777 0.001 -0.0160309 -0.102777 0 -0.0112012 -0.104071 0 -0.0025 -9.72614e-17 0 -0.00853284 -0.0689557 0 -0.00401109 -0.0346095 0 -0.0160309 0.102777 0 -0.00401109 0.0346095 0 -0.00853284 0.0689557 0 -0.0112012 0.104071 0 0.0025 -9.84861e-17 0 0.000969888 0.0350453 0 -0.0036088 0.0698239 0 -0.0036088 -0.0698239 0 0.000969888 -0.0350453 0 -0.0112012 -0.104071 0 -0.0112012 -0.104071 0.001 0.0025 -9.84861e-17 0.001 -0.0036088 -0.0698239 0.001 0.000969888 -0.0350453 0.001 0.0025 -9.84861e-17 0 -0.0036088 -0.0698239 0 0.000969888 -0.0350453 0 -0.0160309 -0.102777 0.001 -0.0112012 -0.104071 0.001 -0.0025 -9.72614e-17 0.001 -0.00853284 -0.0689557 0.001 -0.00401109 -0.0346095 0.001 -0.0160309 0.102777 0.001 -0.00401109 0.0346095 0.001 -0.00853284 0.0689557 0.001 -0.0112012 0.104071 0.001 0.0025 -9.84861e-17 0.001 0.000969888 0.0350453 0.001 -0.0036088 0.0698239 0.001 -0.0036088 -0.0698239 0.001 0.000969888 -0.0350453 0.001 -0.0160309 -0.102777 0 -0.0160309 -0.102777 0.001 -0.0025 -9.72614e-17 0.001 -0.00853284 -0.0689557 0.001 -0.00401109 -0.0346095 0.001 -0.0025 -9.72614e-17 0 -0.00853284 -0.0689557 0 -0.00401109 -0.0346095 0 -0.0025 -9.72614e-17 0 -0.0025 -9.72614e-17 0.001 -0.0160309 0.102777 0.001 -0.00401109 0.0346095 0.001 -0.00853284 0.0689557 0.001 -0.0160309 0.102777 0 -0.00401109 0.0346095 0 -0.00853284 0.0689557 0 -0.0160309 0.102777 0 -0.0112012 0.104071 0 -0.0112012 0.104071 0.001 -0.0160309 0.102777 0.001 0.0025 -9.84861e-17 0 0.0025 -9.84861e-17 0.001 -0.0112012 0.104071 0.001 0.000969888 0.0350453 0.001 -0.0036088 0.0698239 0.001 -0.0112012 0.104071 0 0.000969888 0.0350453 0 -0.0036088 0.0698239 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0162421 -0.104382 0 -0.0114125 -0.105676 0 -0.0114125 -0.105676 0.001 -0.0162421 -0.104382 0.001 -0.0162421 -0.104382 0 -0.0114125 -0.105676 0 -0.0025 -9.878e-17 0 -0.00862703 -0.0700323 0 -0.00403468 -0.0351499 0 -0.0162421 0.104382 0 -0.00403468 0.0351499 0 -0.00862703 0.0700323 0 -0.0114125 0.105676 0 0.0025 -1.00005e-16 0 0.000946295 0.0355857 0 -0.00370299 0.0709006 0 -0.00370299 -0.0709006 0 0.000946295 -0.0355857 0 -0.0114125 -0.105676 0 -0.0114125 -0.105676 0.001 0.0025 -1.00005e-16 0.001 -0.00370299 -0.0709006 0.001 0.000946295 -0.0355857 0.001 0.0025 -1.00005e-16 0 -0.00370299 -0.0709006 0 0.000946295 -0.0355857 0 -0.0162421 -0.104382 0.001 -0.0114125 -0.105676 0.001 -0.0025 -9.878e-17 0.001 -0.00862703 -0.0700323 0.001 -0.00403468 -0.0351499 0.001 -0.0162421 0.104382 0.001 -0.00403468 0.0351499 0.001 -0.00862703 0.0700323 0.001 -0.0114125 0.105676 0.001 0.0025 -1.00005e-16 0.001 0.000946295 0.0355857 0.001 -0.00370299 0.0709006 0.001 -0.00370299 -0.0709006 0.001 0.000946295 -0.0355857 0.001 -0.0162421 -0.104382 0 -0.0162421 -0.104382 0.001 -0.0025 -9.878e-17 0.001 -0.00862703 -0.0700323 0.001 -0.00403468 -0.0351499 0.001 -0.0025 -9.878e-17 0 -0.00862703 -0.0700323 0 -0.00403468 -0.0351499 0 -0.0025 -9.878e-17 0 -0.0025 -9.878e-17 0.001 -0.0162421 0.104382 0.001 -0.00403468 0.0351499 0.001 -0.00862703 0.0700323 0.001 -0.0162421 0.104382 0 -0.00403468 0.0351499 0 -0.00862703 0.0700323 0 -0.0162421 0.104382 0 -0.0114125 0.105676 0 -0.0114125 0.105676 0.001 -0.0162421 0.104382 0.001 0.0025 -1.00005e-16 0 0.0025 -1.00005e-16 0.001 -0.0114125 0.105676 0.001 0.000946295 0.0355857 0.001 -0.00370299 0.0709006 0.001 -0.0114125 0.105676 0 0.000946295 0.0355857 0 -0.00370299 0.0709006 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0163648 -0.105313 0 -0.0115352 -0.106608 0 -0.0115352 -0.106608 0.001 -0.0163648 -0.105313 0.001 -0.0163648 -0.105313 0 -0.0115352 -0.106608 0 -0.0025 -9.96618e-17 0 -0.00868173 -0.0706574 0 -0.00404838 -0.0354637 0 -0.0163648 0.105313 0 -0.00404838 0.0354637 0 -0.00868173 0.0706574 0 -0.0115352 0.106608 0 0.0025 -1.00886e-16 0 0.000932596 0.0358995 0 -0.00375769 0.0715257 0 -0.00375769 -0.0715257 0 0.000932596 -0.0358995 0 -0.0115352 -0.106608 0 -0.0115352 -0.106608 0.001 0.0025 -1.00886e-16 0.001 -0.00375769 -0.0715257 0.001 0.000932596 -0.0358995 0.001 0.0025 -1.00886e-16 0 -0.00375769 -0.0715257 0 0.000932596 -0.0358995 0 -0.0163648 -0.105313 0.001 -0.0115352 -0.106608 0.001 -0.0025 -9.96618e-17 0.001 -0.00868173 -0.0706574 0.001 -0.00404838 -0.0354637 0.001 -0.0163648 0.105313 0.001 -0.00404838 0.0354637 0.001 -0.00868173 0.0706574 0.001 -0.0115352 0.106608 0.001 0.0025 -1.00886e-16 0.001 0.000932596 0.0358995 0.001 -0.00375769 0.0715257 0.001 -0.00375769 -0.0715257 0.001 0.000932596 -0.0358995 0.001 -0.0163648 -0.105313 0 -0.0163648 -0.105313 0.001 -0.0025 -9.96618e-17 0.001 -0.00868173 -0.0706574 0.001 -0.00404838 -0.0354637 0.001 -0.0025 -9.96618e-17 0 -0.00868173 -0.0706574 0 -0.00404838 -0.0354637 0 -0.0025 -9.96618e-17 0 -0.0025 -9.96618e-17 0.001 -0.0163648 0.105313 0.001 -0.00404838 0.0354637 0.001 -0.00868173 0.0706574 0.001 -0.0163648 0.105313 0 -0.00404838 0.0354637 0 -0.00868173 0.0706574 0 -0.0163648 0.105313 0 -0.0115352 0.106608 0 -0.0115352 0.106608 0.001 -0.0163648 0.105313 0.001 0.0025 -1.00886e-16 0 0.0025 -1.00886e-16 0.001 -0.0115352 0.106608 0.001 0.000932596 0.0358995 0.001 -0.00375769 0.0715257 0.001 -0.0115352 0.106608 0 0.000932596 0.0358995 0 -0.00375769 0.0715257 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.016576 -0.106918 0 -0.0117464 -0.108212 0 -0.0117464 -0.108212 0.001 -0.016576 -0.106918 0.001 -0.016576 -0.106918 0 -0.0117464 -0.108212 0 -0.0025 -1.0118e-16 0 -0.00877592 -0.0717341 0 -0.00407197 -0.036004 0 -0.016576 0.106918 0 -0.00407197 0.036004 0 -0.00877592 0.0717341 0 -0.0117464 0.108212 0 0.0025 -1.02405e-16 0 0.000909003 0.0364398 0 -0.00385188 0.0726023 0 -0.00385188 -0.0726023 0 0.000909003 -0.0364398 0 -0.0117464 -0.108212 0 -0.0117464 -0.108212 0.001 0.0025 -1.02405e-16 0.001 -0.00385188 -0.0726023 0.001 0.000909003 -0.0364398 0.001 0.0025 -1.02405e-16 0 -0.00385188 -0.0726023 0 0.000909003 -0.0364398 0 -0.016576 -0.106918 0.001 -0.0117464 -0.108212 0.001 -0.0025 -1.0118e-16 0.001 -0.00877592 -0.0717341 0.001 -0.00407197 -0.036004 0.001 -0.016576 0.106918 0.001 -0.00407197 0.036004 0.001 -0.00877592 0.0717341 0.001 -0.0117464 0.108212 0.001 0.0025 -1.02405e-16 0.001 0.000909003 0.0364398 0.001 -0.00385188 0.0726023 0.001 -0.00385188 -0.0726023 0.001 0.000909003 -0.0364398 0.001 -0.016576 -0.106918 0 -0.016576 -0.106918 0.001 -0.0025 -1.0118e-16 0.001 -0.00877592 -0.0717341 0.001 -0.00407197 -0.036004 0.001 -0.0025 -1.0118e-16 0 -0.00877592 -0.0717341 0 -0.00407197 -0.036004 0 -0.0025 -1.0118e-16 0 -0.0025 -1.0118e-16 0.001 -0.016576 0.106918 0.001 -0.00407197 0.036004 0.001 -0.00877592 0.0717341 0.001 -0.016576 0.106918 0 -0.00407197 0.036004 0 -0.00877592 0.0717341 0 -0.016576 0.106918 0 -0.0117464 0.108212 0 -0.0117464 0.108212 0.001 -0.016576 0.106918 0.001 0.0025 -1.02405e-16 0 0.0025 -1.02405e-16 0.001 -0.0117464 0.108212 0.001 0.000909003 0.0364398 0.001 -0.00385188 0.0726023 0.001 -0.0117464 0.108212 0 0.000909003 0.0364398 0 -0.00385188 0.0726023 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0166987 -0.10785 0 -0.0118691 -0.109144 0 -0.0118691 -0.109144 0.001 -0.0166987 -0.10785 0.001 -0.0166987 -0.10785 0 -0.0118691 -0.109144 0 -0.0025 -1.02062e-16 0 -0.00883061 -0.0723592 0 -0.00408567 -0.0363178 0 -0.0166987 0.10785 0 -0.00408567 0.0363178 0 -0.00883061 0.0723592 0 -0.0118691 0.109144 0 0.0025 -1.03287e-16 0 0.000895304 0.0367536 0 -0.00390657 0.0732274 0 -0.00390657 -0.0732274 0 0.000895304 -0.0367536 0 -0.0118691 -0.109144 0 -0.0118691 -0.109144 0.001 0.0025 -1.03287e-16 0.001 -0.00390657 -0.0732274 0.001 0.000895304 -0.0367536 0.001 0.0025 -1.03287e-16 0 -0.00390657 -0.0732274 0 0.000895304 -0.0367536 0 -0.0166987 -0.10785 0.001 -0.0118691 -0.109144 0.001 -0.0025 -1.02062e-16 0.001 -0.00883061 -0.0723592 0.001 -0.00408567 -0.0363178 0.001 -0.0166987 0.10785 0.001 -0.00408567 0.0363178 0.001 -0.00883061 0.0723592 0.001 -0.0118691 0.109144 0.001 0.0025 -1.03287e-16 0.001 0.000895304 0.0367536 0.001 -0.00390657 0.0732274 0.001 -0.00390657 -0.0732274 0.001 0.000895304 -0.0367536 0.001 -0.0166987 -0.10785 0 -0.0166987 -0.10785 0.001 -0.0025 -1.02062e-16 0.001 -0.00883061 -0.0723592 0.001 -0.00408567 -0.0363178 0.001 -0.0025 -1.02062e-16 0 -0.00883061 -0.0723592 0 -0.00408567 -0.0363178 0 -0.0025 -1.02062e-16 0 -0.0025 -1.02062e-16 0.001 -0.0166987 0.10785 0.001 -0.00408567 0.0363178 0.001 -0.00883061 0.0723592 0.001 -0.0166987 0.10785 0 -0.00408567 0.0363178 0 -0.00883061 0.0723592 0 -0.0166987 0.10785 0 -0.0118691 0.109144 0 -0.0118691 0.109144 0.001 -0.0166987 0.10785 0.001 0.0025 -1.03287e-16 0 0.0025 -1.03287e-16 0.001 -0.0118691 0.109144 0.001 0.000895304 0.0367536 0.001 -0.00390657 0.0732274 0.001 -0.0118691 0.109144 0 0.000895304 0.0367536 0 -0.00390657 0.0732274 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0169134 -0.10948 0 -0.0120837 -0.110775 0 -0.0120837 -0.110775 0.001 -0.0169134 -0.10948 0.001 -0.0169134 -0.10948 0 -0.0120837 -0.110775 0 -0.0025 -1.03605e-16 0 -0.00892632 -0.0734532 0 -0.00410964 -0.0368669 0 -0.0169134 0.10948 0 -0.00410964 0.0368669 0 -0.00892632 0.0734532 0 -0.0120837 0.110775 0 0.0025 -1.0483e-16 0 0.000871331 0.0373027 0 -0.00400228 0.0743214 0 -0.00400228 -0.0743214 0 0.000871331 -0.0373027 0 -0.0120837 -0.110775 0 -0.0120837 -0.110775 0.001 0.0025 -1.0483e-16 0.001 -0.00400228 -0.0743214 0.001 0.000871331 -0.0373027 0.001 0.0025 -1.0483e-16 0 -0.00400228 -0.0743214 0 0.000871331 -0.0373027 0 -0.0169134 -0.10948 0.001 -0.0120837 -0.110775 0.001 -0.0025 -1.03605e-16 0.001 -0.00892632 -0.0734532 0.001 -0.00410964 -0.0368669 0.001 -0.0169134 0.10948 0.001 -0.00410964 0.0368669 0.001 -0.00892632 0.0734532 0.001 -0.0120837 0.110775 0.001 0.0025 -1.0483e-16 0.001 0.000871331 0.0373027 0.001 -0.00400228 0.0743214 0.001 -0.00400228 -0.0743214 0.001 0.000871331 -0.0373027 0.001 -0.0169134 -0.10948 0 -0.0169134 -0.10948 0.001 -0.0025 -1.03605e-16 0.001 -0.00892632 -0.0734532 0.001 -0.00410964 -0.0368669 0.001 -0.0025 -1.03605e-16 0 -0.00892632 -0.0734532 0 -0.00410964 -0.0368669 0 -0.0025 -1.03605e-16 0 -0.0025 -1.03605e-16 0.001 -0.0169134 0.10948 0.001 -0.00410964 0.0368669 0.001 -0.00892632 0.0734532 0.001 -0.0169134 0.10948 0 -0.00410964 0.0368669 0 -0.00892632 0.0734532 0 -0.0169134 0.10948 0 -0.0120837 0.110775 0 -0.0120837 0.110775 0.001 -0.0169134 0.10948 0.001 0.0025 -1.0483e-16 0 0.0025 -1.0483e-16 0.001 -0.0120837 0.110775 0.001 0.000871331 0.0373027 0.001 -0.00400228 0.0743214 0.001 -0.0120837 0.110775 0 0.000871331 0.0373027 0 -0.00400228 0.0743214 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0170326 -0.110386 0 -0.012203 -0.11168 0 -0.012203 -0.11168 0.001 -0.0170326 -0.110386 0.001 -0.0170326 -0.110386 0 -0.012203 -0.11168 0 -0.0025 -1.04462e-16 0 -0.00897949 -0.0740609 0 -0.00412296 -0.0371719 0 -0.0170326 0.110386 0 -0.00412296 0.0371719 0 -0.00897949 0.0740609 0 -0.012203 0.11168 0 0.0025 -1.05687e-16 0 0.000858012 0.0376077 0 -0.00405545 0.0749292 0 -0.00405545 -0.0749292 0 0.000858012 -0.0376077 0 -0.012203 -0.11168 0 -0.012203 -0.11168 0.001 0.0025 -1.05687e-16 0.001 -0.00405545 -0.0749292 0.001 0.000858012 -0.0376077 0.001 0.0025 -1.05687e-16 0 -0.00405545 -0.0749292 0 0.000858012 -0.0376077 0 -0.0170326 -0.110386 0.001 -0.012203 -0.11168 0.001 -0.0025 -1.04462e-16 0.001 -0.00897949 -0.0740609 0.001 -0.00412296 -0.0371719 0.001 -0.0170326 0.110386 0.001 -0.00412296 0.0371719 0.001 -0.00897949 0.0740609 0.001 -0.012203 0.11168 0.001 0.0025 -1.05687e-16 0.001 0.000858012 0.0376077 0.001 -0.00405545 0.0749292 0.001 -0.00405545 -0.0749292 0.001 0.000858012 -0.0376077 0.001 -0.0170326 -0.110386 0 -0.0170326 -0.110386 0.001 -0.0025 -1.04462e-16 0.001 -0.00897949 -0.0740609 0.001 -0.00412296 -0.0371719 0.001 -0.0025 -1.04462e-16 0 -0.00897949 -0.0740609 0 -0.00412296 -0.0371719 0 -0.0025 -1.04462e-16 0 -0.0025 -1.04462e-16 0.001 -0.0170326 0.110386 0.001 -0.00412296 0.0371719 0.001 -0.00897949 0.0740609 0.001 -0.0170326 0.110386 0 -0.00412296 0.0371719 0 -0.00897949 0.0740609 0 -0.0170326 0.110386 0 -0.012203 0.11168 0 -0.012203 0.11168 0.001 -0.0170326 0.110386 0.001 0.0025 -1.05687e-16 0 0.0025 -1.05687e-16 0.001 -0.012203 0.11168 0.001 0.000858012 0.0376077 0.001 -0.00405545 0.0749292 0.001 -0.012203 0.11168 0 0.000858012 0.0376077 0 -0.00405545 0.0749292 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0172473 -0.112017 0 -0.0124177 -0.113311 0 -0.0124177 -0.113311 0.001 -0.0172473 -0.112017 0.001 -0.0172473 -0.112017 0 -0.0124177 -0.113311 0 -0.0025 -1.06005e-16 0 -0.0090752 -0.0751549 0 -0.00414693 -0.037721 0 -0.0172473 0.112017 0 -0.00414693 0.037721 0 -0.0090752 0.0751549 0 -0.0124177 0.113311 0 0.0025 -1.0723e-16 0 0.000834039 0.0381568 0 -0.00415117 0.0760232 0 -0.00415117 -0.0760232 0 0.000834039 -0.0381568 0 -0.0124177 -0.113311 0 -0.0124177 -0.113311 0.001 0.0025 -1.0723e-16 0.001 -0.00415117 -0.0760232 0.001 0.000834039 -0.0381568 0.001 0.0025 -1.0723e-16 0 -0.00415117 -0.0760232 0 0.000834039 -0.0381568 0 -0.0172473 -0.112017 0.001 -0.0124177 -0.113311 0.001 -0.0025 -1.06005e-16 0.001 -0.0090752 -0.0751549 0.001 -0.00414693 -0.037721 0.001 -0.0172473 0.112017 0.001 -0.00414693 0.037721 0.001 -0.0090752 0.0751549 0.001 -0.0124177 0.113311 0.001 0.0025 -1.0723e-16 0.001 0.000834039 0.0381568 0.001 -0.00415117 0.0760232 0.001 -0.00415117 -0.0760232 0.001 0.000834039 -0.0381568 0.001 -0.0172473 -0.112017 0 -0.0172473 -0.112017 0.001 -0.0025 -1.06005e-16 0.001 -0.0090752 -0.0751549 0.001 -0.00414693 -0.037721 0.001 -0.0025 -1.06005e-16 0 -0.0090752 -0.0751549 0 -0.00414693 -0.037721 0 -0.0025 -1.06005e-16 0 -0.0025 -1.06005e-16 0.001 -0.0172473 0.112017 0.001 -0.00414693 0.037721 0.001 -0.0090752 0.0751549 0.001 -0.0172473 0.112017 0 -0.00414693 0.037721 0 -0.0090752 0.0751549 0 -0.0172473 0.112017 0 -0.0124177 0.113311 0 -0.0124177 0.113311 0.001 -0.0172473 0.112017 0.001 0.0025 -1.0723e-16 0 0.0025 -1.0723e-16 0.001 -0.0124177 0.113311 0.001 0.000834039 0.0381568 0.001 -0.00415117 0.0760232 0.001 -0.0124177 0.113311 0 0.000834039 0.0381568 0 -0.00415117 0.0760232 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0173666 -0.112923 0 -0.0125369 -0.114217 0 -0.0125369 -0.114217 0.001 -0.0173666 -0.112923 0.001 -0.0173666 -0.112923 0 -0.0125369 -0.114217 0 -0.0025 -1.06863e-16 0 -0.00912838 -0.0757627 0 -0.00416025 -0.0380261 0 -0.0173666 0.112923 0 -0.00416025 0.0380261 0 -0.00912838 0.0757627 0 -0.0125369 0.114217 0 0.0025 -1.08087e-16 0 0.00082072 0.0384618 0 -0.00420434 0.0766309 0 -0.00420434 -0.0766309 0 0.00082072 -0.0384618 0 -0.0125369 -0.114217 0 -0.0125369 -0.114217 0.001 0.0025 -1.08087e-16 0.001 -0.00420434 -0.0766309 0.001 0.00082072 -0.0384618 0.001 0.0025 -1.08087e-16 0 -0.00420434 -0.0766309 0 0.00082072 -0.0384618 0 -0.0173666 -0.112923 0.001 -0.0125369 -0.114217 0.001 -0.0025 -1.06863e-16 0.001 -0.00912838 -0.0757627 0.001 -0.00416025 -0.0380261 0.001 -0.0173666 0.112923 0.001 -0.00416025 0.0380261 0.001 -0.00912838 0.0757627 0.001 -0.0125369 0.114217 0.001 0.0025 -1.08087e-16 0.001 0.00082072 0.0384618 0.001 -0.00420434 0.0766309 0.001 -0.00420434 -0.0766309 0.001 0.00082072 -0.0384618 0.001 -0.0173666 -0.112923 0 -0.0173666 -0.112923 0.001 -0.0025 -1.06863e-16 0.001 -0.00912838 -0.0757627 0.001 -0.00416025 -0.0380261 0.001 -0.0025 -1.06863e-16 0 -0.00912838 -0.0757627 0 -0.00416025 -0.0380261 0 -0.0025 -1.06863e-16 0 -0.0025 -1.06863e-16 0.001 -0.0173666 0.112923 0.001 -0.00416025 0.0380261 0.001 -0.00912838 0.0757627 0.001 -0.0173666 0.112923 0 -0.00416025 0.0380261 0 -0.00912838 0.0757627 0 -0.0173666 0.112923 0 -0.0125369 0.114217 0 -0.0125369 0.114217 0.001 -0.0173666 0.112923 0.001 0.0025 -1.08087e-16 0 0.0025 -1.08087e-16 0.001 -0.0125369 0.114217 0.001 0.00082072 0.0384618 0.001 -0.00420434 0.0766309 0.001 -0.0125369 0.114217 0 0.00082072 0.0384618 0 -0.00420434 0.0766309 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0175812 -0.114553 0 -0.0127516 -0.115847 0 -0.0127516 -0.115847 0.001 -0.0175812 -0.114553 0.001 -0.0175812 -0.114553 0 -0.0127516 -0.115847 0 -0.0025 -1.08406e-16 0 -0.00922409 -0.0768567 0 -0.00418423 -0.0385751 0 -0.0175812 0.114553 0 -0.00418423 0.0385751 0 -0.00922409 0.0768567 0 -0.0127516 0.115847 0 0.0025 -1.0963e-16 0 0.000796747 0.0390109 0 -0.00430005 0.0777249 0 -0.00430005 -0.0777249 0 0.000796747 -0.0390109 0 -0.0127516 -0.115847 0 -0.0127516 -0.115847 0.001 0.0025 -1.0963e-16 0.001 -0.00430005 -0.0777249 0.001 0.000796747 -0.0390109 0.001 0.0025 -1.0963e-16 0 -0.00430005 -0.0777249 0 0.000796747 -0.0390109 0 -0.0175812 -0.114553 0.001 -0.0127516 -0.115847 0.001 -0.0025 -1.08406e-16 0.001 -0.00922409 -0.0768567 0.001 -0.00418423 -0.0385751 0.001 -0.0175812 0.114553 0.001 -0.00418423 0.0385751 0.001 -0.00922409 0.0768567 0.001 -0.0127516 0.115847 0.001 0.0025 -1.0963e-16 0.001 0.000796747 0.0390109 0.001 -0.00430005 0.0777249 0.001 -0.00430005 -0.0777249 0.001 0.000796747 -0.0390109 0.001 -0.0175812 -0.114553 0 -0.0175812 -0.114553 0.001 -0.0025 -1.08406e-16 0.001 -0.00922409 -0.0768567 0.001 -0.00418423 -0.0385751 0.001 -0.0025 -1.08406e-16 0 -0.00922409 -0.0768567 0 -0.00418423 -0.0385751 0 -0.0025 -1.08406e-16 0 -0.0025 -1.08406e-16 0.001 -0.0175812 0.114553 0.001 -0.00418423 0.0385751 0.001 -0.00922409 0.0768567 0.001 -0.0175812 0.114553 0 -0.00418423 0.0385751 0 -0.00922409 0.0768567 0 -0.0175812 0.114553 0 -0.0127516 0.115847 0 -0.0127516 0.115847 0.001 -0.0175812 0.114553 0.001 0.0025 -1.0963e-16 0 0.0025 -1.0963e-16 0.001 -0.0127516 0.115847 0.001 0.000796747 0.0390109 0.001 -0.00430005 0.0777249 0.001 -0.0127516 0.115847 0 0.000796747 0.0390109 0 -0.00430005 0.0777249 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0132095 -0.0813468 0 -0.00837988 -0.0826409 0 -0.00837988 -0.0826409 0.001 -0.0132095 -0.0813468 0.001 -0.0132095 -0.0813468 0 -0.00837988 -0.0826409 0 -0.0025 -7.69813e-17 0 -0.00727492 -0.0545776 0 -0.00369601 -0.027393 0 -0.0132095 0.0813468 0 -0.00369601 0.027393 0 -0.00727492 0.0545776 0 -0.00837988 0.0826409 0 0.0025 -7.82059e-17 0 0.00128497 0.0278288 0 -0.00235088 0.0554459 0 -0.00235088 -0.0554459 0 0.00128497 -0.0278288 0 -0.00837988 -0.0826409 0 -0.00837988 -0.0826409 0.001 0.0025 -7.82059e-17 0.001 -0.00235088 -0.0554459 0.001 0.00128497 -0.0278288 0.001 0.0025 -7.82059e-17 0 -0.00235088 -0.0554459 0 0.00128497 -0.0278288 0 -0.0132095 -0.0813468 0.001 -0.00837988 -0.0826409 0.001 -0.0025 -7.69813e-17 0.001 -0.00727492 -0.0545776 0.001 -0.00369601 -0.027393 0.001 -0.0132095 0.0813468 0.001 -0.00369601 0.027393 0.001 -0.00727492 0.0545776 0.001 -0.00837988 0.0826409 0.001 0.0025 -7.82059e-17 0.001 0.00128497 0.0278288 0.001 -0.00235088 0.0554459 0.001 -0.00235088 -0.0554459 0.001 0.00128497 -0.0278288 0.001 -0.0132095 -0.0813468 0 -0.0132095 -0.0813468 0.001 -0.0025 -7.69813e-17 0.001 -0.00727492 -0.0545776 0.001 -0.00369601 -0.027393 0.001 -0.0025 -7.69813e-17 0 -0.00727492 -0.0545776 0 -0.00369601 -0.027393 0 -0.0025 -7.69813e-17 0 -0.0025 -7.69813e-17 0.001 -0.0132095 0.0813468 0.001 -0.00369601 0.027393 0.001 -0.00727492 0.0545776 0.001 -0.0132095 0.0813468 0 -0.00369601 0.027393 0 -0.00727492 0.0545776 0 -0.0132095 0.0813468 0 -0.00837988 0.0826409 0 -0.00837988 0.0826409 0.001 -0.0132095 0.0813468 0.001 0.0025 -7.82059e-17 0 0.0025 -7.82059e-17 0.001 -0.00837988 0.0826409 0.001 0.00128497 0.0278288 0.001 -0.00235088 0.0554459 0.001 -0.00837988 0.0826409 0 0.00128497 0.0278288 0 -0.00235088 0.0554459 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0177005 -0.115459 0 -0.0128709 -0.116753 0 -0.0128709 -0.116753 0.001 -0.0177005 -0.115459 0.001 -0.0177005 -0.115459 0 -0.0128709 -0.116753 0 -0.0025 -1.09263e-16 0 -0.00927726 -0.0774645 0 -0.00419755 -0.0388802 0 -0.0177005 0.115459 0 -0.00419755 0.0388802 0 -0.00927726 0.0774645 0 -0.0128709 0.116753 0 0.0025 -1.10488e-16 0 0.000783428 0.039316 0 -0.00435322 0.0783327 0 -0.00435322 -0.0783327 0 0.000783428 -0.039316 0 -0.0128709 -0.116753 0 -0.0128709 -0.116753 0.001 0.0025 -1.10488e-16 0.001 -0.00435322 -0.0783327 0.001 0.000783428 -0.039316 0.001 0.0025 -1.10488e-16 0 -0.00435322 -0.0783327 0 0.000783428 -0.039316 0 -0.0177005 -0.115459 0.001 -0.0128709 -0.116753 0.001 -0.0025 -1.09263e-16 0.001 -0.00927726 -0.0774645 0.001 -0.00419755 -0.0388802 0.001 -0.0177005 0.115459 0.001 -0.00419755 0.0388802 0.001 -0.00927726 0.0774645 0.001 -0.0128709 0.116753 0.001 0.0025 -1.10488e-16 0.001 0.000783428 0.039316 0.001 -0.00435322 0.0783327 0.001 -0.00435322 -0.0783327 0.001 0.000783428 -0.039316 0.001 -0.0177005 -0.115459 0 -0.0177005 -0.115459 0.001 -0.0025 -1.09263e-16 0.001 -0.00927726 -0.0774645 0.001 -0.00419755 -0.0388802 0.001 -0.0025 -1.09263e-16 0 -0.00927726 -0.0774645 0 -0.00419755 -0.0388802 0 -0.0025 -1.09263e-16 0 -0.0025 -1.09263e-16 0.001 -0.0177005 0.115459 0.001 -0.00419755 0.0388802 0.001 -0.00927726 0.0774645 0.001 -0.0177005 0.115459 0 -0.00419755 0.0388802 0 -0.00927726 0.0774645 0 -0.0177005 0.115459 0 -0.0128709 0.116753 0 -0.0128709 0.116753 0.001 -0.0177005 0.115459 0.001 0.0025 -1.10488e-16 0 0.0025 -1.10488e-16 0.001 -0.0128709 0.116753 0.001 0.000783428 0.039316 0.001 -0.00435322 0.0783327 0.001 -0.0128709 0.116753 0 0.000783428 0.039316 0 -0.00435322 0.0783327 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179186 -0.117116 0 -0.0130889 -0.11841 0 -0.0130889 -0.11841 0.001 -0.0179186 -0.117116 0.001 -0.0179186 -0.117116 0 -0.0130889 -0.11841 0 -0.0025 -1.10831e-16 0 -0.00937449 -0.0785758 0 -0.0042219 -0.039438 0 -0.0179186 0.117116 0 -0.0042219 0.039438 0 -0.00937449 0.0785758 0 -0.0130889 0.11841 0 0.0025 -1.12055e-16 0 0.000759074 0.0398738 0 -0.00445045 0.079444 0 -0.00445045 -0.079444 0 0.000759074 -0.0398738 0 -0.0130889 -0.11841 0 -0.0130889 -0.11841 0.001 0.0025 -1.12055e-16 0.001 -0.00445045 -0.079444 0.001 0.000759074 -0.0398738 0.001 0.0025 -1.12055e-16 0 -0.00445045 -0.079444 0 0.000759074 -0.0398738 0 -0.0179186 -0.117116 0.001 -0.0130889 -0.11841 0.001 -0.0025 -1.10831e-16 0.001 -0.00937449 -0.0785758 0.001 -0.0042219 -0.039438 0.001 -0.0179186 0.117116 0.001 -0.0042219 0.039438 0.001 -0.00937449 0.0785758 0.001 -0.0130889 0.11841 0.001 0.0025 -1.12055e-16 0.001 0.000759074 0.0398738 0.001 -0.00445045 0.079444 0.001 -0.00445045 -0.079444 0.001 0.000759074 -0.0398738 0.001 -0.0179186 -0.117116 0 -0.0179186 -0.117116 0.001 -0.0025 -1.10831e-16 0.001 -0.00937449 -0.0785758 0.001 -0.0042219 -0.039438 0.001 -0.0025 -1.10831e-16 0 -0.00937449 -0.0785758 0 -0.0042219 -0.039438 0 -0.0025 -1.10831e-16 0 -0.0025 -1.10831e-16 0.001 -0.0179186 0.117116 0.001 -0.0042219 0.039438 0.001 -0.00937449 0.0785758 0.001 -0.0179186 0.117116 0 -0.0042219 0.039438 0 -0.00937449 0.0785758 0 -0.0179186 0.117116 0 -0.0130889 0.11841 0 -0.0130889 0.11841 0.001 -0.0179186 0.117116 0.001 0.0025 -1.12055e-16 0 0.0025 -1.12055e-16 0.001 -0.0130889 0.11841 0.001 0.000759074 0.0398738 0.001 -0.00445045 0.079444 0.001 -0.0130889 0.11841 0 0.000759074 0.0398738 0 -0.00445045 0.079444 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0180344 -0.117996 0 -0.0132048 -0.11929 0 -0.0132048 -0.11929 0.001 -0.0180344 -0.117996 0.001 -0.0180344 -0.117996 0 -0.0132048 -0.11929 0 -0.0025 -1.11663e-16 0 -0.00942615 -0.0791662 0 -0.00423484 -0.0397343 0 -0.0180344 0.117996 0 -0.00423484 0.0397343 0 -0.00942615 0.0791662 0 -0.0132048 0.11929 0 0.0025 -1.12888e-16 0 0.000746136 0.0401701 0 -0.00450211 0.0800344 0 -0.00450211 -0.0800344 0 0.000746136 -0.0401701 0 -0.0132048 -0.11929 0 -0.0132048 -0.11929 0.001 0.0025 -1.12888e-16 0.001 -0.00450211 -0.0800344 0.001 0.000746136 -0.0401701 0.001 0.0025 -1.12888e-16 0 -0.00450211 -0.0800344 0 0.000746136 -0.0401701 0 -0.0180344 -0.117996 0.001 -0.0132048 -0.11929 0.001 -0.0025 -1.11663e-16 0.001 -0.00942615 -0.0791662 0.001 -0.00423484 -0.0397343 0.001 -0.0180344 0.117996 0.001 -0.00423484 0.0397343 0.001 -0.00942615 0.0791662 0.001 -0.0132048 0.11929 0.001 0.0025 -1.12888e-16 0.001 0.000746136 0.0401701 0.001 -0.00450211 0.0800344 0.001 -0.00450211 -0.0800344 0.001 0.000746136 -0.0401701 0.001 -0.0180344 -0.117996 0 -0.0180344 -0.117996 0.001 -0.0025 -1.11663e-16 0.001 -0.00942615 -0.0791662 0.001 -0.00423484 -0.0397343 0.001 -0.0025 -1.11663e-16 0 -0.00942615 -0.0791662 0 -0.00423484 -0.0397343 0 -0.0025 -1.11663e-16 0 -0.0025 -1.11663e-16 0.001 -0.0180344 0.117996 0.001 -0.00423484 0.0397343 0.001 -0.00942615 0.0791662 0.001 -0.0180344 0.117996 0 -0.00423484 0.0397343 0 -0.00942615 0.0791662 0 -0.0180344 0.117996 0 -0.0132048 0.11929 0 -0.0132048 0.11929 0.001 -0.0180344 0.117996 0.001 0.0025 -1.12888e-16 0 0.0025 -1.12888e-16 0.001 -0.0132048 0.11929 0.001 0.000746136 0.0401701 0.001 -0.00450211 0.0800344 0.001 -0.0132048 0.11929 0 0.000746136 0.0401701 0 -0.00450211 0.0800344 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0182525 -0.119652 0 -0.0134229 -0.120946 0 -0.0134229 -0.120946 0.001 -0.0182525 -0.119652 0.001 -0.0182525 -0.119652 0 -0.0134229 -0.120946 0 -0.0025 -1.13231e-16 0 -0.00952338 -0.0802776 0 -0.00425919 -0.0402921 0 -0.0182525 0.119652 0 -0.00425919 0.0402921 0 -0.00952338 0.0802776 0 -0.0134229 0.120946 0 0.0025 -1.14455e-16 0 0.000721782 0.0407279 0 -0.00459934 0.0811458 0 -0.00459934 -0.0811458 0 0.000721782 -0.0407279 0 -0.0134229 -0.120946 0 -0.0134229 -0.120946 0.001 0.0025 -1.14455e-16 0.001 -0.00459934 -0.0811458 0.001 0.000721782 -0.0407279 0.001 0.0025 -1.14455e-16 0 -0.00459934 -0.0811458 0 0.000721782 -0.0407279 0 -0.0182525 -0.119652 0.001 -0.0134229 -0.120946 0.001 -0.0025 -1.13231e-16 0.001 -0.00952338 -0.0802776 0.001 -0.00425919 -0.0402921 0.001 -0.0182525 0.119652 0.001 -0.00425919 0.0402921 0.001 -0.00952338 0.0802776 0.001 -0.0134229 0.120946 0.001 0.0025 -1.14455e-16 0.001 0.000721782 0.0407279 0.001 -0.00459934 0.0811458 0.001 -0.00459934 -0.0811458 0.001 0.000721782 -0.0407279 0.001 -0.0182525 -0.119652 0 -0.0182525 -0.119652 0.001 -0.0025 -1.13231e-16 0.001 -0.00952338 -0.0802776 0.001 -0.00425919 -0.0402921 0.001 -0.0025 -1.13231e-16 0 -0.00952338 -0.0802776 0 -0.00425919 -0.0402921 0 -0.0025 -1.13231e-16 0 -0.0025 -1.13231e-16 0.001 -0.0182525 0.119652 0.001 -0.00425919 0.0402921 0.001 -0.00952338 0.0802776 0.001 -0.0182525 0.119652 0 -0.00425919 0.0402921 0 -0.00952338 0.0802776 0 -0.0182525 0.119652 0 -0.0134229 0.120946 0 -0.0134229 0.120946 0.001 -0.0182525 0.119652 0.001 0.0025 -1.14455e-16 0 0.0025 -1.14455e-16 0.001 -0.0134229 0.120946 0.001 0.000721782 0.0407279 0.001 -0.00459934 0.0811458 0.001 -0.0134229 0.120946 0 0.000721782 0.0407279 0 -0.00459934 0.0811458 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0183649 -0.120506 0 -0.0135353 -0.1218 0 -0.0135353 -0.1218 0.001 -0.0183649 -0.120506 0.001 -0.0183649 -0.120506 0 -0.0135353 -0.1218 0 -0.0025 -1.14039e-16 0 -0.00957351 -0.0808506 0 -0.00427175 -0.0405797 0 -0.0183649 0.120506 0 -0.00427175 0.0405797 0 -0.00957351 0.0808506 0 -0.0135353 0.1218 0 0.0025 -1.15264e-16 0 0.000709225 0.0410155 0 -0.00464947 0.0817188 0 -0.00464947 -0.0817188 0 0.000709225 -0.0410155 0 -0.0135353 -0.1218 0 -0.0135353 -0.1218 0.001 0.0025 -1.15264e-16 0.001 -0.00464947 -0.0817188 0.001 0.000709225 -0.0410155 0.001 0.0025 -1.15264e-16 0 -0.00464947 -0.0817188 0 0.000709225 -0.0410155 0 -0.0183649 -0.120506 0.001 -0.0135353 -0.1218 0.001 -0.0025 -1.14039e-16 0.001 -0.00957351 -0.0808506 0.001 -0.00427175 -0.0405797 0.001 -0.0183649 0.120506 0.001 -0.00427175 0.0405797 0.001 -0.00957351 0.0808506 0.001 -0.0135353 0.1218 0.001 0.0025 -1.15264e-16 0.001 0.000709225 0.0410155 0.001 -0.00464947 0.0817188 0.001 -0.00464947 -0.0817188 0.001 0.000709225 -0.0410155 0.001 -0.0183649 -0.120506 0 -0.0183649 -0.120506 0.001 -0.0025 -1.14039e-16 0.001 -0.00957351 -0.0808506 0.001 -0.00427175 -0.0405797 0.001 -0.0025 -1.14039e-16 0 -0.00957351 -0.0808506 0 -0.00427175 -0.0405797 0 -0.0025 -1.14039e-16 0 -0.0025 -1.14039e-16 0.001 -0.0183649 0.120506 0.001 -0.00427175 0.0405797 0.001 -0.00957351 0.0808506 0.001 -0.0183649 0.120506 0 -0.00427175 0.0405797 0 -0.00957351 0.0808506 0 -0.0183649 0.120506 0 -0.0135353 0.1218 0 -0.0135353 0.1218 0.001 -0.0183649 0.120506 0.001 0.0025 -1.15264e-16 0 0.0025 -1.15264e-16 0.001 -0.0135353 0.1218 0.001 0.000709225 0.0410155 0.001 -0.00464947 0.0817188 0.001 -0.0135353 0.1218 0 0.000709225 0.0410155 0 -0.00464947 0.0817188 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0185864 -0.122188 0 -0.0137568 -0.123483 0 -0.0137568 -0.123483 0.001 -0.0185864 -0.122188 0.001 -0.0185864 -0.122188 0 -0.0137568 -0.123483 0 -0.0025 -1.15631e-16 0 -0.00967226 -0.0819793 0 -0.00429648 -0.0411462 0 -0.0185864 0.122188 0 -0.00429648 0.0411462 0 -0.00967226 0.0819793 0 -0.0137568 0.123483 0 0.0025 -1.16856e-16 0 0.00068449 0.041582 0 -0.00474822 0.0828475 0 -0.00474822 -0.0828475 0 0.00068449 -0.041582 0 -0.0137568 -0.123483 0 -0.0137568 -0.123483 0.001 0.0025 -1.16856e-16 0.001 -0.00474822 -0.0828475 0.001 0.00068449 -0.041582 0.001 0.0025 -1.16856e-16 0 -0.00474822 -0.0828475 0 0.00068449 -0.041582 0 -0.0185864 -0.122188 0.001 -0.0137568 -0.123483 0.001 -0.0025 -1.15631e-16 0.001 -0.00967226 -0.0819793 0.001 -0.00429648 -0.0411462 0.001 -0.0185864 0.122188 0.001 -0.00429648 0.0411462 0.001 -0.00967226 0.0819793 0.001 -0.0137568 0.123483 0.001 0.0025 -1.16856e-16 0.001 0.00068449 0.041582 0.001 -0.00474822 0.0828475 0.001 -0.00474822 -0.0828475 0.001 0.00068449 -0.041582 0.001 -0.0185864 -0.122188 0 -0.0185864 -0.122188 0.001 -0.0025 -1.15631e-16 0.001 -0.00967226 -0.0819793 0.001 -0.00429648 -0.0411462 0.001 -0.0025 -1.15631e-16 0 -0.00967226 -0.0819793 0 -0.00429648 -0.0411462 0 -0.0025 -1.15631e-16 0 -0.0025 -1.15631e-16 0.001 -0.0185864 0.122188 0.001 -0.00429648 0.0411462 0.001 -0.00967226 0.0819793 0.001 -0.0185864 0.122188 0 -0.00429648 0.0411462 0 -0.00967226 0.0819793 0 -0.0185864 0.122188 0 -0.0137568 0.123483 0 -0.0137568 0.123483 0.001 -0.0185864 0.122188 0.001 0.0025 -1.16856e-16 0 0.0025 -1.16856e-16 0.001 -0.0137568 0.123483 0.001 0.00068449 0.041582 0.001 -0.00474822 0.0828475 0.001 -0.0137568 0.123483 0 0.00068449 0.041582 0 -0.00474822 0.0828475 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0186989 -0.123043 0 -0.0138692 -0.124337 0 -0.0138692 -0.124337 0.001 -0.0186989 -0.123043 0.001 -0.0186989 -0.123043 0 -0.0138692 -0.124337 0 -0.0025 -1.16439e-16 0 -0.00972239 -0.0825523 0 -0.00430904 -0.0414338 0 -0.0186989 0.123043 0 -0.00430904 0.0414338 0 -0.00972239 0.0825523 0 -0.0138692 0.124337 0 0.0025 -1.17664e-16 0 0.000671933 0.0418696 0 -0.00479836 0.0834206 0 -0.00479836 -0.0834206 0 0.000671933 -0.0418696 0 -0.0138692 -0.124337 0 -0.0138692 -0.124337 0.001 0.0025 -1.17664e-16 0.001 -0.00479836 -0.0834206 0.001 0.000671933 -0.0418696 0.001 0.0025 -1.17664e-16 0 -0.00479836 -0.0834206 0 0.000671933 -0.0418696 0 -0.0186989 -0.123043 0.001 -0.0138692 -0.124337 0.001 -0.0025 -1.16439e-16 0.001 -0.00972239 -0.0825523 0.001 -0.00430904 -0.0414338 0.001 -0.0186989 0.123043 0.001 -0.00430904 0.0414338 0.001 -0.00972239 0.0825523 0.001 -0.0138692 0.124337 0.001 0.0025 -1.17664e-16 0.001 0.000671933 0.0418696 0.001 -0.00479836 0.0834206 0.001 -0.00479836 -0.0834206 0.001 0.000671933 -0.0418696 0.001 -0.0186989 -0.123043 0 -0.0186989 -0.123043 0.001 -0.0025 -1.16439e-16 0.001 -0.00972239 -0.0825523 0.001 -0.00430904 -0.0414338 0.001 -0.0025 -1.16439e-16 0 -0.00972239 -0.0825523 0 -0.00430904 -0.0414338 0 -0.0025 -1.16439e-16 0 -0.0025 -1.16439e-16 0.001 -0.0186989 0.123043 0.001 -0.00430904 0.0414338 0.001 -0.00972239 0.0825523 0.001 -0.0186989 0.123043 0 -0.00430904 0.0414338 0 -0.00972239 0.0825523 0 -0.0186989 0.123043 0 -0.0138692 0.124337 0 -0.0138692 0.124337 0.001 -0.0186989 0.123043 0.001 0.0025 -1.17664e-16 0 0.0025 -1.17664e-16 0.001 -0.0138692 0.124337 0.001 0.000671933 0.0418696 0.001 -0.00479836 0.0834206 0.001 -0.0138692 0.124337 0 0.000671933 0.0418696 0 -0.00479836 0.0834206 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0189203 -0.124725 0 -0.0140907 -0.126019 0 -0.0140907 -0.126019 0.001 -0.0189203 -0.124725 0.001 -0.0189203 -0.124725 0 -0.0140907 -0.126019 0 -0.0025 -1.18031e-16 0 -0.00982114 -0.0836811 0 -0.00433377 -0.0420004 0 -0.0189203 0.124725 0 -0.00433377 0.0420004 0 -0.00982114 0.0836811 0 -0.0140907 0.126019 0 0.0025 -1.19256e-16 0 0.000647199 0.0424361 0 -0.00489711 0.0845493 0 -0.00489711 -0.0845493 0 0.000647199 -0.0424361 0 -0.0140907 -0.126019 0 -0.0140907 -0.126019 0.001 0.0025 -1.19256e-16 0.001 -0.00489711 -0.0845493 0.001 0.000647199 -0.0424361 0.001 0.0025 -1.19256e-16 0 -0.00489711 -0.0845493 0 0.000647199 -0.0424361 0 -0.0189203 -0.124725 0.001 -0.0140907 -0.126019 0.001 -0.0025 -1.18031e-16 0.001 -0.00982114 -0.0836811 0.001 -0.00433377 -0.0420004 0.001 -0.0189203 0.124725 0.001 -0.00433377 0.0420004 0.001 -0.00982114 0.0836811 0.001 -0.0140907 0.126019 0.001 0.0025 -1.19256e-16 0.001 0.000647199 0.0424361 0.001 -0.00489711 0.0845493 0.001 -0.00489711 -0.0845493 0.001 0.000647199 -0.0424361 0.001 -0.0189203 -0.124725 0 -0.0189203 -0.124725 0.001 -0.0025 -1.18031e-16 0.001 -0.00982114 -0.0836811 0.001 -0.00433377 -0.0420004 0.001 -0.0025 -1.18031e-16 0 -0.00982114 -0.0836811 0 -0.00433377 -0.0420004 0 -0.0025 -1.18031e-16 0 -0.0025 -1.18031e-16 0.001 -0.0189203 0.124725 0.001 -0.00433377 0.0420004 0.001 -0.00982114 0.0836811 0.001 -0.0189203 0.124725 0 -0.00433377 0.0420004 0 -0.00982114 0.0836811 0 -0.0189203 0.124725 0 -0.0140907 0.126019 0 -0.0140907 0.126019 0.001 -0.0189203 0.124725 0.001 0.0025 -1.19256e-16 0 0.0025 -1.19256e-16 0.001 -0.0140907 0.126019 0.001 0.000647199 0.0424361 0.001 -0.00489711 0.0845493 0.001 -0.0140907 0.126019 0 0.000647199 0.0424361 0 -0.00489711 0.0845493 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0190328 -0.125579 0 -0.0142032 -0.126873 0 -0.0142032 -0.126873 0.001 -0.0190328 -0.125579 0.001 -0.0190328 -0.125579 0 -0.0142032 -0.126873 0 -0.0025 -1.1884e-16 0 -0.00987128 -0.0842541 0 -0.00434633 -0.042288 0 -0.0190328 0.125579 0 -0.00434633 0.042288 0 -0.00987128 0.0842541 0 -0.0142032 0.126873 0 0.0025 -1.20064e-16 0 0.000634641 0.0427237 0 -0.00494724 0.0851223 0 -0.00494724 -0.0851223 0 0.000634641 -0.0427237 0 -0.0142032 -0.126873 0 -0.0142032 -0.126873 0.001 0.0025 -1.20064e-16 0.001 -0.00494724 -0.0851223 0.001 0.000634641 -0.0427237 0.001 0.0025 -1.20064e-16 0 -0.00494724 -0.0851223 0 0.000634641 -0.0427237 0 -0.0190328 -0.125579 0.001 -0.0142032 -0.126873 0.001 -0.0025 -1.1884e-16 0.001 -0.00987128 -0.0842541 0.001 -0.00434633 -0.042288 0.001 -0.0190328 0.125579 0.001 -0.00434633 0.042288 0.001 -0.00987128 0.0842541 0.001 -0.0142032 0.126873 0.001 0.0025 -1.20064e-16 0.001 0.000634641 0.0427237 0.001 -0.00494724 0.0851223 0.001 -0.00494724 -0.0851223 0.001 0.000634641 -0.0427237 0.001 -0.0190328 -0.125579 0 -0.0190328 -0.125579 0.001 -0.0025 -1.1884e-16 0.001 -0.00987128 -0.0842541 0.001 -0.00434633 -0.042288 0.001 -0.0025 -1.1884e-16 0 -0.00987128 -0.0842541 0 -0.00434633 -0.042288 0 -0.0025 -1.1884e-16 0 -0.0025 -1.1884e-16 0.001 -0.0190328 0.125579 0.001 -0.00434633 0.042288 0.001 -0.00987128 0.0842541 0.001 -0.0190328 0.125579 0 -0.00434633 0.042288 0 -0.00987128 0.0842541 0 -0.0190328 0.125579 0 -0.0142032 0.126873 0 -0.0142032 0.126873 0.001 -0.0190328 0.125579 0.001 0.0025 -1.20064e-16 0 0.0025 -1.20064e-16 0.001 -0.0142032 0.126873 0.001 0.000634641 0.0427237 0.001 -0.00494724 0.0851223 0.001 -0.0142032 0.126873 0 0.000634641 0.0427237 0 -0.00494724 0.0851223 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0192543 -0.127261 0 -0.0144246 -0.128555 0 -0.0144246 -0.128555 0.001 -0.0192543 -0.127261 0.001 -0.0192543 -0.127261 0 -0.0144246 -0.128555 0 -0.0025 -1.20432e-16 0 -0.00997003 -0.0853828 0 -0.00437107 -0.0428545 0 -0.0192543 0.127261 0 -0.00437107 0.0428545 0 -0.00997003 0.0853828 0 -0.0144246 0.128555 0 0.0025 -1.21656e-16 0 0.000609907 0.0432903 0 -0.00504599 0.086251 0 -0.00504599 -0.086251 0 0.000609907 -0.0432903 0 -0.0144246 -0.128555 0 -0.0144246 -0.128555 0.001 0.0025 -1.21656e-16 0.001 -0.00504599 -0.086251 0.001 0.000609907 -0.0432903 0.001 0.0025 -1.21656e-16 0 -0.00504599 -0.086251 0 0.000609907 -0.0432903 0 -0.0192543 -0.127261 0.001 -0.0144246 -0.128555 0.001 -0.0025 -1.20432e-16 0.001 -0.00997003 -0.0853828 0.001 -0.00437107 -0.0428545 0.001 -0.0192543 0.127261 0.001 -0.00437107 0.0428545 0.001 -0.00997003 0.0853828 0.001 -0.0144246 0.128555 0.001 0.0025 -1.21656e-16 0.001 0.000609907 0.0432903 0.001 -0.00504599 0.086251 0.001 -0.00504599 -0.086251 0.001 0.000609907 -0.0432903 0.001 -0.0192543 -0.127261 0 -0.0192543 -0.127261 0.001 -0.0025 -1.20432e-16 0.001 -0.00997003 -0.0853828 0.001 -0.00437107 -0.0428545 0.001 -0.0025 -1.20432e-16 0 -0.00997003 -0.0853828 0 -0.00437107 -0.0428545 0 -0.0025 -1.20432e-16 0 -0.0025 -1.20432e-16 0.001 -0.0192543 0.127261 0.001 -0.00437107 0.0428545 0.001 -0.00997003 0.0853828 0.001 -0.0192543 0.127261 0 -0.00437107 0.0428545 0 -0.00997003 0.0853828 0 -0.0192543 0.127261 0 -0.0144246 0.128555 0 -0.0144246 0.128555 0.001 -0.0192543 0.127261 0.001 0.0025 -1.21656e-16 0 0.0025 -1.21656e-16 0.001 -0.0144246 0.128555 0.001 0.000609907 0.0432903 0.001 -0.00504599 0.086251 0.001 -0.0144246 0.128555 0 0.000609907 0.0432903 0 -0.00504599 0.086251 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0133458 -0.0823821 0 -0.00851618 -0.0836762 0 -0.00851618 -0.0836762 0.001 -0.0133458 -0.0823821 0.001 -0.0133458 -0.0823821 0 -0.00851618 -0.0836762 0 -0.0025 -7.7961e-17 0 -0.00733569 -0.0552722 0 -0.00371123 -0.0277417 0 -0.0133458 0.0823821 0 -0.00371123 0.0277417 0 -0.00733569 0.0552722 0 -0.00851618 0.0836762 0 0.0025 -7.91857e-17 0 0.00126975 0.0281775 0 -0.00241165 0.0561405 0 -0.00241165 -0.0561405 0 0.00126975 -0.0281775 0 -0.00851618 -0.0836762 0 -0.00851618 -0.0836762 0.001 0.0025 -7.91857e-17 0.001 -0.00241165 -0.0561405 0.001 0.00126975 -0.0281775 0.001 0.0025 -7.91857e-17 0 -0.00241165 -0.0561405 0 0.00126975 -0.0281775 0 -0.0133458 -0.0823821 0.001 -0.00851618 -0.0836762 0.001 -0.0025 -7.7961e-17 0.001 -0.00733569 -0.0552722 0.001 -0.00371123 -0.0277417 0.001 -0.0133458 0.0823821 0.001 -0.00371123 0.0277417 0.001 -0.00733569 0.0552722 0.001 -0.00851618 0.0836762 0.001 0.0025 -7.91857e-17 0.001 0.00126975 0.0281775 0.001 -0.00241165 0.0561405 0.001 -0.00241165 -0.0561405 0.001 0.00126975 -0.0281775 0.001 -0.0133458 -0.0823821 0 -0.0133458 -0.0823821 0.001 -0.0025 -7.7961e-17 0.001 -0.00733569 -0.0552722 0.001 -0.00371123 -0.0277417 0.001 -0.0025 -7.7961e-17 0 -0.00733569 -0.0552722 0 -0.00371123 -0.0277417 0 -0.0025 -7.7961e-17 0 -0.0025 -7.7961e-17 0.001 -0.0133458 0.0823821 0.001 -0.00371123 0.0277417 0.001 -0.00733569 0.0552722 0.001 -0.0133458 0.0823821 0 -0.00371123 0.0277417 0 -0.00733569 0.0552722 0 -0.0133458 0.0823821 0 -0.00851618 0.0836762 0 -0.00851618 0.0836762 0.001 -0.0133458 0.0823821 0.001 0.0025 -7.91857e-17 0 0.0025 -7.91857e-17 0.001 -0.00851618 0.0836762 0.001 0.00126975 0.0281775 0.001 -0.00241165 0.0561405 0.001 -0.00851618 0.0836762 0 0.00126975 0.0281775 0 -0.00241165 0.0561405 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0193633 -0.12809 0 -0.0145337 -0.129384 0 -0.0145337 -0.129384 0.001 -0.0193633 -0.12809 0.001 -0.0193633 -0.12809 0 -0.0145337 -0.129384 0 -0.0025 -1.21216e-16 0 -0.0100186 -0.0859385 0 -0.00438324 -0.0431334 0 -0.0193633 0.12809 0 -0.00438324 0.0431334 0 -0.0100186 0.0859385 0 -0.0145337 0.129384 0 0.0025 -1.2244e-16 0 0.00059773 0.0435692 0 -0.0050946 0.0868067 0 -0.0050946 -0.0868067 0 0.00059773 -0.0435692 0 -0.0145337 -0.129384 0 -0.0145337 -0.129384 0.001 0.0025 -1.2244e-16 0.001 -0.0050946 -0.0868067 0.001 0.00059773 -0.0435692 0.001 0.0025 -1.2244e-16 0 -0.0050946 -0.0868067 0 0.00059773 -0.0435692 0 -0.0193633 -0.12809 0.001 -0.0145337 -0.129384 0.001 -0.0025 -1.21216e-16 0.001 -0.0100186 -0.0859385 0.001 -0.00438324 -0.0431334 0.001 -0.0193633 0.12809 0.001 -0.00438324 0.0431334 0.001 -0.0100186 0.0859385 0.001 -0.0145337 0.129384 0.001 0.0025 -1.2244e-16 0.001 0.00059773 0.0435692 0.001 -0.0050946 0.0868067 0.001 -0.0050946 -0.0868067 0.001 0.00059773 -0.0435692 0.001 -0.0193633 -0.12809 0 -0.0193633 -0.12809 0.001 -0.0025 -1.21216e-16 0.001 -0.0100186 -0.0859385 0.001 -0.00438324 -0.0431334 0.001 -0.0025 -1.21216e-16 0 -0.0100186 -0.0859385 0 -0.00438324 -0.0431334 0 -0.0025 -1.21216e-16 0 -0.0025 -1.21216e-16 0.001 -0.0193633 0.12809 0.001 -0.00438324 0.0431334 0.001 -0.0100186 0.0859385 0.001 -0.0193633 0.12809 0 -0.00438324 0.0431334 0 -0.0100186 0.0859385 0 -0.0193633 0.12809 0 -0.0145337 0.129384 0 -0.0145337 0.129384 0.001 -0.0193633 0.12809 0.001 0.0025 -1.2244e-16 0 0.0025 -1.2244e-16 0.001 -0.0145337 0.129384 0.001 0.00059773 0.0435692 0.001 -0.0050946 0.0868067 0.001 -0.0145337 0.129384 0 0.00059773 0.0435692 0 -0.0050946 0.0868067 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0195848 -0.129772 0 -0.0147552 -0.131066 0 -0.0147552 -0.131066 0.001 -0.0195848 -0.129772 0.001 -0.0195848 -0.129772 0 -0.0147552 -0.131066 0 -0.0025 -1.22808e-16 0 -0.0101174 -0.0870672 0 -0.00440798 -0.0436999 0 -0.0195848 0.129772 0 -0.00440798 0.0436999 0 -0.0101174 0.0870672 0 -0.0147552 0.131066 0 0.0025 -1.24032e-16 0 0.000572995 0.0441357 0 -0.00519335 0.0879354 0 -0.00519335 -0.0879354 0 0.000572995 -0.0441357 0 -0.0147552 -0.131066 0 -0.0147552 -0.131066 0.001 0.0025 -1.24032e-16 0.001 -0.00519335 -0.0879354 0.001 0.000572995 -0.0441357 0.001 0.0025 -1.24032e-16 0 -0.00519335 -0.0879354 0 0.000572995 -0.0441357 0 -0.0195848 -0.129772 0.001 -0.0147552 -0.131066 0.001 -0.0025 -1.22808e-16 0.001 -0.0101174 -0.0870672 0.001 -0.00440798 -0.0436999 0.001 -0.0195848 0.129772 0.001 -0.00440798 0.0436999 0.001 -0.0101174 0.0870672 0.001 -0.0147552 0.131066 0.001 0.0025 -1.24032e-16 0.001 0.000572995 0.0441357 0.001 -0.00519335 0.0879354 0.001 -0.00519335 -0.0879354 0.001 0.000572995 -0.0441357 0.001 -0.0195848 -0.129772 0 -0.0195848 -0.129772 0.001 -0.0025 -1.22808e-16 0.001 -0.0101174 -0.0870672 0.001 -0.00440798 -0.0436999 0.001 -0.0025 -1.22808e-16 0 -0.0101174 -0.0870672 0 -0.00440798 -0.0436999 0 -0.0025 -1.22808e-16 0 -0.0025 -1.22808e-16 0.001 -0.0195848 0.129772 0.001 -0.00440798 0.0436999 0.001 -0.0101174 0.0870672 0.001 -0.0195848 0.129772 0 -0.00440798 0.0436999 0 -0.0101174 0.0870672 0 -0.0195848 0.129772 0 -0.0147552 0.131066 0 -0.0147552 0.131066 0.001 -0.0195848 0.129772 0.001 0.0025 -1.24032e-16 0 0.0025 -1.24032e-16 0.001 -0.0147552 0.131066 0.001 0.000572995 0.0441357 0.001 -0.00519335 0.0879354 0.001 -0.0147552 0.131066 0 0.000572995 0.0441357 0 -0.00519335 0.0879354 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0196972 -0.130626 0 -0.0148676 -0.13192 0 -0.0148676 -0.13192 0.001 -0.0196972 -0.130626 0.001 -0.0196972 -0.130626 0 -0.0148676 -0.13192 0 -0.0025 -1.23616e-16 0 -0.0101675 -0.0876402 0 -0.00442054 -0.0439875 0 -0.0196972 0.130626 0 -0.00442054 0.0439875 0 -0.0101675 0.0876402 0 -0.0148676 0.13192 0 0.0025 -1.2484e-16 0 0.000560438 0.0444233 0 -0.00524349 0.0885085 0 -0.00524349 -0.0885085 0 0.000560438 -0.0444233 0 -0.0148676 -0.13192 0 -0.0148676 -0.13192 0.001 0.0025 -1.2484e-16 0.001 -0.00524349 -0.0885085 0.001 0.000560438 -0.0444233 0.001 0.0025 -1.2484e-16 0 -0.00524349 -0.0885085 0 0.000560438 -0.0444233 0 -0.0196972 -0.130626 0.001 -0.0148676 -0.13192 0.001 -0.0025 -1.23616e-16 0.001 -0.0101675 -0.0876402 0.001 -0.00442054 -0.0439875 0.001 -0.0196972 0.130626 0.001 -0.00442054 0.0439875 0.001 -0.0101675 0.0876402 0.001 -0.0148676 0.13192 0.001 0.0025 -1.2484e-16 0.001 0.000560438 0.0444233 0.001 -0.00524349 0.0885085 0.001 -0.00524349 -0.0885085 0.001 0.000560438 -0.0444233 0.001 -0.0196972 -0.130626 0 -0.0196972 -0.130626 0.001 -0.0025 -1.23616e-16 0.001 -0.0101675 -0.0876402 0.001 -0.00442054 -0.0439875 0.001 -0.0025 -1.23616e-16 0 -0.0101675 -0.0876402 0 -0.00442054 -0.0439875 0 -0.0025 -1.23616e-16 0 -0.0025 -1.23616e-16 0.001 -0.0196972 0.130626 0.001 -0.00442054 0.0439875 0.001 -0.0101675 0.0876402 0.001 -0.0196972 0.130626 0 -0.00442054 0.0439875 0 -0.0101675 0.0876402 0 -0.0196972 0.130626 0 -0.0148676 0.13192 0 -0.0148676 0.13192 0.001 -0.0196972 0.130626 0.001 0.0025 -1.2484e-16 0 0.0025 -1.2484e-16 0.001 -0.0148676 0.13192 0.001 0.000560438 0.0444233 0.001 -0.00524349 0.0885085 0.001 -0.0148676 0.13192 0 0.000560438 0.0444233 0 -0.00524349 0.0885085 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0199187 -0.132308 0 -0.0150891 -0.133602 0 -0.0150891 -0.133602 0.001 -0.0199187 -0.132308 0.001 -0.0199187 -0.132308 0 -0.0150891 -0.133602 0 -0.0025 -1.25208e-16 0 -0.0102663 -0.0887689 0 -0.00444527 -0.044554 0 -0.0199187 0.132308 0 -0.00444527 0.044554 0 -0.0102663 0.0887689 0 -0.0150891 0.133602 0 0.0025 -1.26433e-16 0 0.000535703 0.0449898 0 -0.00534224 0.0896372 0 -0.00534224 -0.0896372 0 0.000535703 -0.0449898 0 -0.0150891 -0.133602 0 -0.0150891 -0.133602 0.001 0.0025 -1.26433e-16 0.001 -0.00534224 -0.0896372 0.001 0.000535703 -0.0449898 0.001 0.0025 -1.26433e-16 0 -0.00534224 -0.0896372 0 0.000535703 -0.0449898 0 -0.0199187 -0.132308 0.001 -0.0150891 -0.133602 0.001 -0.0025 -1.25208e-16 0.001 -0.0102663 -0.0887689 0.001 -0.00444527 -0.044554 0.001 -0.0199187 0.132308 0.001 -0.00444527 0.044554 0.001 -0.0102663 0.0887689 0.001 -0.0150891 0.133602 0.001 0.0025 -1.26433e-16 0.001 0.000535703 0.0449898 0.001 -0.00534224 0.0896372 0.001 -0.00534224 -0.0896372 0.001 0.000535703 -0.0449898 0.001 -0.0199187 -0.132308 0 -0.0199187 -0.132308 0.001 -0.0025 -1.25208e-16 0.001 -0.0102663 -0.0887689 0.001 -0.00444527 -0.044554 0.001 -0.0025 -1.25208e-16 0 -0.0102663 -0.0887689 0 -0.00444527 -0.044554 0 -0.0025 -1.25208e-16 0 -0.0025 -1.25208e-16 0.001 -0.0199187 0.132308 0.001 -0.00444527 0.044554 0.001 -0.0102663 0.0887689 0.001 -0.0199187 0.132308 0 -0.00444527 0.044554 0 -0.0102663 0.0887689 0 -0.0199187 0.132308 0 -0.0150891 0.133602 0 -0.0150891 0.133602 0.001 -0.0199187 0.132308 0.001 0.0025 -1.26433e-16 0 0.0025 -1.26433e-16 0.001 -0.0150891 0.133602 0.001 0.000535703 0.0449898 0.001 -0.00534224 0.0896372 0.001 -0.0150891 0.133602 0 0.000535703 0.0449898 0 -0.00534224 0.0896372 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0200278 -0.133137 0 -0.0151981 -0.134431 0 -0.0151981 -0.134431 0.001 -0.0200278 -0.133137 0.001 -0.0200278 -0.133137 0 -0.0151981 -0.134431 0 -0.0025 -1.25992e-16 0 -0.0103149 -0.0893246 0 -0.00445745 -0.0448329 0 -0.0200278 0.133137 0 -0.00445745 0.0448329 0 -0.0103149 0.0893246 0 -0.0151981 0.134431 0 0.0025 -1.27216e-16 0 0.000523526 0.0452687 0 -0.00539085 0.0901929 0 -0.00539085 -0.0901929 0 0.000523526 -0.0452687 0 -0.0151981 -0.134431 0 -0.0151981 -0.134431 0.001 0.0025 -1.27216e-16 0.001 -0.00539085 -0.0901929 0.001 0.000523526 -0.0452687 0.001 0.0025 -1.27216e-16 0 -0.00539085 -0.0901929 0 0.000523526 -0.0452687 0 -0.0200278 -0.133137 0.001 -0.0151981 -0.134431 0.001 -0.0025 -1.25992e-16 0.001 -0.0103149 -0.0893246 0.001 -0.00445745 -0.0448329 0.001 -0.0200278 0.133137 0.001 -0.00445745 0.0448329 0.001 -0.0103149 0.0893246 0.001 -0.0151981 0.134431 0.001 0.0025 -1.27216e-16 0.001 0.000523526 0.0452687 0.001 -0.00539085 0.0901929 0.001 -0.00539085 -0.0901929 0.001 0.000523526 -0.0452687 0.001 -0.0200278 -0.133137 0 -0.0200278 -0.133137 0.001 -0.0025 -1.25992e-16 0.001 -0.0103149 -0.0893246 0.001 -0.00445745 -0.0448329 0.001 -0.0025 -1.25992e-16 0 -0.0103149 -0.0893246 0 -0.00445745 -0.0448329 0 -0.0025 -1.25992e-16 0 -0.0025 -1.25992e-16 0.001 -0.0200278 0.133137 0.001 -0.00445745 0.0448329 0.001 -0.0103149 0.0893246 0.001 -0.0200278 0.133137 0 -0.00445745 0.0448329 0 -0.0103149 0.0893246 0 -0.0200278 0.133137 0 -0.0151981 0.134431 0 -0.0151981 0.134431 0.001 -0.0200278 0.133137 0.001 0.0025 -1.27216e-16 0 0.0025 -1.27216e-16 0.001 -0.0151981 0.134431 0.001 0.000523526 0.0452687 0.001 -0.00539085 0.0901929 0.001 -0.0151981 0.134431 0 0.000523526 0.0452687 0 -0.00539085 0.0901929 0 + + + 2 0 3 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0135503 -0.083935 0 -0.00872063 -0.0852291 0 -0.00872063 -0.0852291 0.001 -0.0135503 -0.083935 0.001 -0.0135503 -0.083935 0 -0.00872063 -0.0852291 0 -0.0025 -7.94306e-17 0 -0.00742685 -0.0563141 0 -0.00373406 -0.0282646 0 -0.0135503 0.083935 0 -0.00373406 0.0282646 0 -0.00742685 0.0563141 0 -0.00872063 0.0852291 0 0.0025 -8.06552e-17 0 0.00124691 0.0287004 0 -0.00250281 0.0571823 0 -0.00250281 -0.0571823 0 0.00124691 -0.0287004 0 -0.00872063 -0.0852291 0 -0.00872063 -0.0852291 0.001 0.0025 -8.06552e-17 0.001 -0.00250281 -0.0571823 0.001 0.00124691 -0.0287004 0.001 0.0025 -8.06552e-17 0 -0.00250281 -0.0571823 0 0.00124691 -0.0287004 0 -0.0135503 -0.083935 0.001 -0.00872063 -0.0852291 0.001 -0.0025 -7.94306e-17 0.001 -0.00742685 -0.0563141 0.001 -0.00373406 -0.0282646 0.001 -0.0135503 0.083935 0.001 -0.00373406 0.0282646 0.001 -0.00742685 0.0563141 0.001 -0.00872063 0.0852291 0.001 0.0025 -8.06552e-17 0.001 0.00124691 0.0287004 0.001 -0.00250281 0.0571823 0.001 -0.00250281 -0.0571823 0.001 0.00124691 -0.0287004 0.001 -0.0135503 -0.083935 0 -0.0135503 -0.083935 0.001 -0.0025 -7.94306e-17 0.001 -0.00742685 -0.0563141 0.001 -0.00373406 -0.0282646 0.001 -0.0025 -7.94306e-17 0 -0.00742685 -0.0563141 0 -0.00373406 -0.0282646 0 -0.0025 -7.94306e-17 0 -0.0025 -7.94306e-17 0.001 -0.0135503 0.083935 0.001 -0.00373406 0.0282646 0.001 -0.00742685 0.0563141 0.001 -0.0135503 0.083935 0 -0.00373406 0.0282646 0 -0.00742685 0.0563141 0 -0.0135503 0.083935 0 -0.00872063 0.0852291 0 -0.00872063 0.0852291 0.001 -0.0135503 0.083935 0.001 0.0025 -8.06552e-17 0 0.0025 -8.06552e-17 0.001 -0.00872063 0.0852291 0.001 0.00124691 0.0287004 0.001 -0.00250281 0.0571823 0.001 -0.00872063 0.0852291 0 0.00124691 0.0287004 0 -0.00250281 0.0571823 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0136797 -0.0849185 0 -0.00885011 -0.0862126 0 -0.00885011 -0.0862126 0.001 -0.0136797 -0.0849185 0.001 -0.0136797 -0.0849185 0 -0.00885011 -0.0862126 0 -0.0025 -8.03613e-17 0 -0.00748458 -0.056974 0 -0.00374852 -0.0285958 0 -0.0136797 0.0849185 0 -0.00374852 0.0285958 0 -0.00748458 0.056974 0 -0.00885011 0.0862126 0 0.0025 -8.1586e-17 0 0.00123245 0.0290316 0 -0.00256054 0.0578422 0 -0.00256054 -0.0578422 0 0.00123245 -0.0290316 0 -0.00885011 -0.0862126 0 -0.00885011 -0.0862126 0.001 0.0025 -8.1586e-17 0.001 -0.00256054 -0.0578422 0.001 0.00123245 -0.0290316 0.001 0.0025 -8.1586e-17 0 -0.00256054 -0.0578422 0 0.00123245 -0.0290316 0 -0.0136797 -0.0849185 0.001 -0.00885011 -0.0862126 0.001 -0.0025 -8.03613e-17 0.001 -0.00748458 -0.056974 0.001 -0.00374852 -0.0285958 0.001 -0.0136797 0.0849185 0.001 -0.00374852 0.0285958 0.001 -0.00748458 0.056974 0.001 -0.00885011 0.0862126 0.001 0.0025 -8.1586e-17 0.001 0.00123245 0.0290316 0.001 -0.00256054 0.0578422 0.001 -0.00256054 -0.0578422 0.001 0.00123245 -0.0290316 0.001 -0.0136797 -0.0849185 0 -0.0136797 -0.0849185 0.001 -0.0025 -8.03613e-17 0.001 -0.00748458 -0.056974 0.001 -0.00374852 -0.0285958 0.001 -0.0025 -8.03613e-17 0 -0.00748458 -0.056974 0 -0.00374852 -0.0285958 0 -0.0025 -8.03613e-17 0 -0.0025 -8.03613e-17 0.001 -0.0136797 0.0849185 0.001 -0.00374852 0.0285958 0.001 -0.00748458 0.056974 0.001 -0.0136797 0.0849185 0 -0.00374852 0.0285958 0 -0.00748458 0.056974 0 -0.0136797 0.0849185 0 -0.00885011 0.0862126 0 -0.00885011 0.0862126 0.001 -0.0136797 0.0849185 0.001 0.0025 -8.1586e-17 0 0.0025 -8.1586e-17 0.001 -0.00885011 0.0862126 0.001 0.00123245 0.0290316 0.001 -0.00256054 0.0578422 0.001 -0.00885011 0.0862126 0 0.00123245 0.0290316 0 -0.00256054 0.0578422 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0138876 -0.0864973 0 -0.00905796 -0.0877914 0 -0.00905796 -0.0877914 0.001 -0.0138876 -0.0864973 0.001 -0.0138876 -0.0864973 0 -0.00905796 -0.0877914 0 -0.0025 -8.18554e-17 0 -0.00757725 -0.0580332 0 -0.00377173 -0.0291274 0 -0.0138876 0.0864973 0 -0.00377173 0.0291274 0 -0.00757725 0.0580332 0 -0.00905796 0.0877914 0 0.0025 -8.308e-17 0 0.00120924 0.0295632 0 -0.00265321 0.0589015 0 -0.00265321 -0.0589015 0 0.00120924 -0.0295632 0 -0.00905796 -0.0877914 0 -0.00905796 -0.0877914 0.001 0.0025 -8.308e-17 0.001 -0.00265321 -0.0589015 0.001 0.00120924 -0.0295632 0.001 0.0025 -8.308e-17 0 -0.00265321 -0.0589015 0 0.00120924 -0.0295632 0 -0.0138876 -0.0864973 0.001 -0.00905796 -0.0877914 0.001 -0.0025 -8.18554e-17 0.001 -0.00757725 -0.0580332 0.001 -0.00377173 -0.0291274 0.001 -0.0138876 0.0864973 0.001 -0.00377173 0.0291274 0.001 -0.00757725 0.0580332 0.001 -0.00905796 0.0877914 0.001 0.0025 -8.308e-17 0.001 0.00120924 0.0295632 0.001 -0.00265321 0.0589015 0.001 -0.00265321 -0.0589015 0.001 0.00120924 -0.0295632 0.001 -0.0138876 -0.0864973 0 -0.0138876 -0.0864973 0.001 -0.0025 -8.18554e-17 0.001 -0.00757725 -0.0580332 0.001 -0.00377173 -0.0291274 0.001 -0.0025 -8.18554e-17 0 -0.00757725 -0.0580332 0 -0.00377173 -0.0291274 0 -0.0025 -8.18554e-17 0 -0.0025 -8.18554e-17 0.001 -0.0138876 0.0864973 0.001 -0.00377173 0.0291274 0.001 -0.00757725 0.0580332 0.001 -0.0138876 0.0864973 0 -0.00377173 0.0291274 0 -0.00757725 0.0580332 0 -0.0138876 0.0864973 0 -0.00905796 0.0877914 0 -0.00905796 0.0877914 0.001 -0.0138876 0.0864973 0.001 0.0025 -8.308e-17 0 0.0025 -8.308e-17 0.001 -0.00905796 0.0877914 0.001 0.00120924 0.0295632 0.001 -0.00265321 0.0589015 0.001 -0.00905796 0.0877914 0 0.00120924 0.0295632 0 -0.00265321 0.0589015 0 + + + 2 0 3 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0140171 -0.0874808 0 -0.00918744 -0.0887749 0 -0.00918744 -0.0887749 0.001 -0.0140171 -0.0874808 0.001 -0.0140171 -0.0874808 0 -0.00918744 -0.0887749 0 -0.0025 -8.27861e-17 0 -0.00763498 -0.0586931 0 -0.00378619 -0.0294586 0 -0.0140171 0.0874808 0 -0.00378619 0.0294586 0 -0.00763498 0.0586931 0 -0.00918744 0.0887749 0 0.0025 -8.40108e-17 0 0.00119478 0.0298944 0 -0.00271094 0.0595613 0 -0.00271094 -0.0595613 0 0.00119478 -0.0298944 0 -0.00918744 -0.0887749 0 -0.00918744 -0.0887749 0.001 0.0025 -8.40108e-17 0.001 -0.00271094 -0.0595613 0.001 0.00119478 -0.0298944 0.001 0.0025 -8.40108e-17 0 -0.00271094 -0.0595613 0 0.00119478 -0.0298944 0 -0.0140171 -0.0874808 0.001 -0.00918744 -0.0887749 0.001 -0.0025 -8.27861e-17 0.001 -0.00763498 -0.0586931 0.001 -0.00378619 -0.0294586 0.001 -0.0140171 0.0874808 0.001 -0.00378619 0.0294586 0.001 -0.00763498 0.0586931 0.001 -0.00918744 0.0887749 0.001 0.0025 -8.40108e-17 0.001 0.00119478 0.0298944 0.001 -0.00271094 0.0595613 0.001 -0.00271094 -0.0595613 0.001 0.00119478 -0.0298944 0.001 -0.0140171 -0.0874808 0 -0.0140171 -0.0874808 0.001 -0.0025 -8.27861e-17 0.001 -0.00763498 -0.0586931 0.001 -0.00378619 -0.0294586 0.001 -0.0025 -8.27861e-17 0 -0.00763498 -0.0586931 0 -0.00378619 -0.0294586 0 -0.0025 -8.27861e-17 0 -0.0025 -8.27861e-17 0.001 -0.0140171 0.0874808 0.001 -0.00378619 0.0294586 0.001 -0.00763498 0.0586931 0.001 -0.0140171 0.0874808 0 -0.00378619 0.0294586 0 -0.00763498 0.0586931 0 -0.0140171 0.0874808 0 -0.00918744 0.0887749 0 -0.00918744 0.0887749 0.001 -0.0140171 0.0874808 0.001 0.0025 -8.40108e-17 0 0.0025 -8.40108e-17 0.001 -0.00918744 0.0887749 0.001 0.00119478 0.0298944 0.001 -0.00271094 0.0595613 0.001 -0.00918744 0.0887749 0 0.00119478 0.0298944 0 -0.00271094 0.0595613 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0142249 -0.0890596 0 -0.00939529 -0.0903537 0 -0.00939529 -0.0903537 0.001 -0.0142249 -0.0890596 0.001 -0.0142249 -0.0890596 0 -0.00939529 -0.0903537 0 -0.0025 -8.42802e-17 0 -0.00772765 -0.0597523 0 -0.0038094 -0.0299903 0 -0.0142249 0.0890596 0 -0.0038094 0.0299903 0 -0.00772765 0.0597523 0 -0.00939529 0.0903537 0 0.0025 -8.55048e-17 0 0.00117157 0.0304261 0 -0.00280361 0.0606206 0 -0.00280361 -0.0606206 0 0.00117157 -0.0304261 0 -0.00939529 -0.0903537 0 -0.00939529 -0.0903537 0.001 0.0025 -8.55048e-17 0.001 -0.00280361 -0.0606206 0.001 0.00117157 -0.0304261 0.001 0.0025 -8.55048e-17 0 -0.00280361 -0.0606206 0 0.00117157 -0.0304261 0 -0.0142249 -0.0890596 0.001 -0.00939529 -0.0903537 0.001 -0.0025 -8.42802e-17 0.001 -0.00772765 -0.0597523 0.001 -0.0038094 -0.0299903 0.001 -0.0142249 0.0890596 0.001 -0.0038094 0.0299903 0.001 -0.00772765 0.0597523 0.001 -0.00939529 0.0903537 0.001 0.0025 -8.55048e-17 0.001 0.00117157 0.0304261 0.001 -0.00280361 0.0606206 0.001 -0.00280361 -0.0606206 0.001 0.00117157 -0.0304261 0.001 -0.0142249 -0.0890596 0 -0.0142249 -0.0890596 0.001 -0.0025 -8.42802e-17 0.001 -0.00772765 -0.0597523 0.001 -0.0038094 -0.0299903 0.001 -0.0025 -8.42802e-17 0 -0.00772765 -0.0597523 0 -0.0038094 -0.0299903 0 -0.0025 -8.42802e-17 0 -0.0025 -8.42802e-17 0.001 -0.0142249 0.0890596 0.001 -0.0038094 0.0299903 0.001 -0.00772765 0.0597523 0.001 -0.0142249 0.0890596 0 -0.0038094 0.0299903 0 -0.00772765 0.0597523 0 -0.0142249 0.0890596 0 -0.00939529 0.0903537 0 -0.00939529 0.0903537 0.001 -0.0142249 0.0890596 0.001 0.0025 -8.55048e-17 0 0.0025 -8.55048e-17 0.001 -0.00939529 0.0903537 0.001 0.00117157 0.0304261 0.001 -0.00280361 0.0606206 0.001 -0.00939529 0.0903537 0 0.00117157 0.0304261 0 -0.00280361 0.0606206 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 58 56 59 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00689528 -0.0390311 0 -0.00202051 -0.0401431 0 -0.00202051 -0.0401431 0.01 -0.00689528 -0.0390311 0.01 -0.00689528 -0.0390311 0 -0.00202051 -0.0401431 0 -0.0025 -4.29851e-17 0 -0.00445802 -0.0261425 0 -0.00299019 -0.0131079 0 -0.00689528 0.0390311 0 -0.00299019 0.0131079 0 -0.00445802 0.0261425 0 -0.00202051 0.0401431 0 0.0025 -4.42097e-17 0 0.00199585 0.0134813 0 0.000486199 0.0268873 0 0.000486199 -0.0268873 0 0.00199585 -0.0134813 0 -0.00202051 -0.0401431 0 -0.00202051 -0.0401431 0.01 0.0025 -4.42097e-17 0.01 0.000486199 -0.0268873 0.01 0.00199585 -0.0134813 0.01 0.0025 -4.42097e-17 0 0.000486199 -0.0268873 0 0.00199585 -0.0134813 0 -0.00689528 -0.0390311 0.01 -0.00202051 -0.0401431 0.01 -0.0025 -4.29851e-17 0.01 -0.00445802 -0.0261425 0.01 -0.00299019 -0.0131079 0.01 -0.00689528 0.0390311 0.01 -0.00299019 0.0131079 0.01 -0.00445802 0.0261425 0.01 -0.00202051 0.0401431 0.01 0.0025 -4.42097e-17 0.01 0.00199585 0.0134813 0.01 0.000486199 0.0268873 0.01 0.000486199 -0.0268873 0.01 0.00199585 -0.0134813 0.01 -0.00689528 -0.0390311 0 -0.00689528 -0.0390311 0.01 -0.0025 -4.29851e-17 0.01 -0.00445802 -0.0261425 0.01 -0.00299019 -0.0131079 0.01 -0.0025 -4.29851e-17 0 -0.00445802 -0.0261425 0 -0.00299019 -0.0131079 0 -0.0025 -4.29851e-17 0 -0.0025 -4.29851e-17 0.01 -0.00689528 0.0390311 0.01 -0.00299019 0.0131079 0.01 -0.00445802 0.0261425 0.01 -0.00689528 0.0390311 0 -0.00299019 0.0131079 0 -0.00445802 0.0261425 0 -0.00689528 0.0390311 0 -0.00202051 0.0401431 0 -0.00202051 0.0401431 0.01 -0.00689528 0.0390311 0.01 0.0025 -4.42097e-17 0 0.0025 -4.42097e-17 0.01 -0.00202051 0.0401431 0.01 0.00199585 0.0134813 0.01 0.000486199 0.0268873 0.01 -0.00202051 0.0401431 0 0.00199585 0.0134813 0 0.000486199 0.0268873 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00697292 -0.0397205 0 -0.00209814 -0.0408325 0 -0.00209814 -0.0408325 0.01 -0.00697292 -0.0397205 0.01 -0.00697292 -0.0397205 0 -0.00209814 -0.0408325 0 -0.0025 -4.37444e-17 0 -0.0044926 -0.0266043 0 -0.00299885 -0.0133394 0 -0.00697292 0.0397205 0 -0.00299885 0.0133394 0 -0.0044926 0.0266043 0 -0.00209814 0.0408325 0 0.0025 -4.4969e-17 0 0.00198719 0.0137128 0 0.000451613 0.0273491 0 0.000451613 -0.0273491 0 0.00198719 -0.0137128 0 -0.00209814 -0.0408325 0 -0.00209814 -0.0408325 0.01 0.0025 -4.4969e-17 0.01 0.000451613 -0.0273491 0.01 0.00198719 -0.0137128 0.01 0.0025 -4.4969e-17 0 0.000451613 -0.0273491 0 0.00198719 -0.0137128 0 -0.00697292 -0.0397205 0.01 -0.00209814 -0.0408325 0.01 -0.0025 -4.37444e-17 0.01 -0.0044926 -0.0266043 0.01 -0.00299885 -0.0133394 0.01 -0.00697292 0.0397205 0.01 -0.00299885 0.0133394 0.01 -0.0044926 0.0266043 0.01 -0.00209814 0.0408325 0.01 0.0025 -4.4969e-17 0.01 0.00198719 0.0137128 0.01 0.000451613 0.0273491 0.01 0.000451613 -0.0273491 0.01 0.00198719 -0.0137128 0.01 -0.00697292 -0.0397205 0 -0.00697292 -0.0397205 0.01 -0.0025 -4.37444e-17 0.01 -0.0044926 -0.0266043 0.01 -0.00299885 -0.0133394 0.01 -0.0025 -4.37444e-17 0 -0.0044926 -0.0266043 0 -0.00299885 -0.0133394 0 -0.0025 -4.37444e-17 0 -0.0025 -4.37444e-17 0.01 -0.00697292 0.0397205 0.01 -0.00299885 0.0133394 0.01 -0.0044926 0.0266043 0.01 -0.00697292 0.0397205 0 -0.00299885 0.0133394 0 -0.0044926 0.0266043 0 -0.00697292 0.0397205 0 -0.00209814 0.0408325 0 -0.00209814 0.0408325 0.01 -0.00697292 0.0397205 0.01 0.0025 -4.4969e-17 0 0.0025 -4.4969e-17 0.01 -0.00209814 0.0408325 0.01 0.00198719 0.0137128 0.01 0.000451613 0.0273491 0.01 -0.00209814 0.0408325 0 0.00198719 0.0137128 0 0.000451613 0.0273491 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00811745 -0.0498842 0 -0.00324267 -0.0509962 0 -0.00324267 -0.0509962 0.01 -0.00811745 -0.0498842 0.01 -0.00811745 -0.0498842 0 -0.00324267 -0.0509962 0 -0.0025 -5.49377e-17 0 -0.00500247 -0.0334117 0 -0.00312649 -0.0167527 0 -0.00811745 0.0498842 0 -0.00312649 0.0167527 0 -0.00500247 0.0334117 0 -0.00324267 0.0509962 0 0.0025 -5.61623e-17 0 0.00185954 0.0171261 0 -5.8252e-05 0.0341565 0 -5.8252e-05 -0.0341565 0 0.00185954 -0.0171261 0 -0.00324267 -0.0509962 0 -0.00324267 -0.0509962 0.01 0.0025 -5.61623e-17 0.01 -5.8252e-05 -0.0341565 0.01 0.00185954 -0.0171261 0.01 0.0025 -5.61623e-17 0 -5.8252e-05 -0.0341565 0 0.00185954 -0.0171261 0 -0.00811745 -0.0498842 0.01 -0.00324267 -0.0509962 0.01 -0.0025 -5.49377e-17 0.01 -0.00500247 -0.0334117 0.01 -0.00312649 -0.0167527 0.01 -0.00811745 0.0498842 0.01 -0.00312649 0.0167527 0.01 -0.00500247 0.0334117 0.01 -0.00324267 0.0509962 0.01 0.0025 -5.61623e-17 0.01 0.00185954 0.0171261 0.01 -5.8252e-05 0.0341565 0.01 -5.8252e-05 -0.0341565 0.01 0.00185954 -0.0171261 0.01 -0.00811745 -0.0498842 0 -0.00811745 -0.0498842 0.01 -0.0025 -5.49377e-17 0.01 -0.00500247 -0.0334117 0.01 -0.00312649 -0.0167527 0.01 -0.0025 -5.49377e-17 0 -0.00500247 -0.0334117 0 -0.00312649 -0.0167527 0 -0.0025 -5.49377e-17 0 -0.0025 -5.49377e-17 0.01 -0.00811745 0.0498842 0.01 -0.00312649 0.0167527 0.01 -0.00500247 0.0334117 0.01 -0.00811745 0.0498842 0 -0.00312649 0.0167527 0 -0.00500247 0.0334117 0 -0.00811745 0.0498842 0 -0.00324267 0.0509962 0 -0.00324267 0.0509962 0.01 -0.00811745 0.0498842 0.01 0.0025 -5.61623e-17 0 0.0025 -5.61623e-17 0.01 -0.00324267 0.0509962 0.01 0.00185954 0.0171261 0.01 -5.8252e-05 0.0341565 0.01 -0.00324267 0.0509962 0 0.00185954 0.0171261 0 -5.8252e-05 0.0341565 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00819759 -0.0505959 0 -0.00332281 -0.0517079 0 -0.00332281 -0.0517079 0.01 -0.00819759 -0.0505959 0.01 -0.00819759 -0.0505959 0 -0.00332281 -0.0517079 0 -0.0025 -5.57214e-17 0 -0.00503817 -0.0338884 0 -0.00313543 -0.0169917 0 -0.00819759 0.0505959 0 -0.00313543 0.0169917 0 -0.00503817 0.0338884 0 -0.00332281 0.0517079 0 0.0025 -5.69461e-17 0 0.0018506 0.0173651 0 -9.39537e-05 0.0346332 0 -9.39537e-05 -0.0346332 0 0.0018506 -0.0173651 0 -0.00332281 -0.0517079 0 -0.00332281 -0.0517079 0.01 0.0025 -5.69461e-17 0.01 -9.39537e-05 -0.0346332 0.01 0.0018506 -0.0173651 0.01 0.0025 -5.69461e-17 0 -9.39537e-05 -0.0346332 0 0.0018506 -0.0173651 0 -0.00819759 -0.0505959 0.01 -0.00332281 -0.0517079 0.01 -0.0025 -5.57214e-17 0.01 -0.00503817 -0.0338884 0.01 -0.00313543 -0.0169917 0.01 -0.00819759 0.0505959 0.01 -0.00313543 0.0169917 0.01 -0.00503817 0.0338884 0.01 -0.00332281 0.0517079 0.01 0.0025 -5.69461e-17 0.01 0.0018506 0.0173651 0.01 -9.39537e-05 0.0346332 0.01 -9.39537e-05 -0.0346332 0.01 0.0018506 -0.0173651 0.01 -0.00819759 -0.0505959 0 -0.00819759 -0.0505959 0.01 -0.0025 -5.57214e-17 0.01 -0.00503817 -0.0338884 0.01 -0.00313543 -0.0169917 0.01 -0.0025 -5.57214e-17 0 -0.00503817 -0.0338884 0 -0.00313543 -0.0169917 0 -0.0025 -5.57214e-17 0 -0.0025 -5.57214e-17 0.01 -0.00819759 0.0505959 0.01 -0.00313543 0.0169917 0.01 -0.00503817 0.0338884 0.01 -0.00819759 0.0505959 0 -0.00313543 0.0169917 0 -0.00503817 0.0338884 0 -0.00819759 0.0505959 0 -0.00332281 0.0517079 0 -0.00332281 0.0517079 0.01 -0.00819759 0.0505959 0.01 0.0025 -5.69461e-17 0 0.0025 -5.69461e-17 0.01 -0.00332281 0.0517079 0.01 0.0018506 0.0173651 0.01 -9.39537e-05 0.0346332 0.01 -0.00332281 0.0517079 0 0.0018506 0.0173651 0 -9.39537e-05 0.0346332 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00836038 -0.0520415 0 -0.0034856 -0.0531535 0 -0.0034856 -0.0531535 0.01 -0.00836038 -0.0520415 0.01 -0.00836038 -0.0520415 0 -0.0034856 -0.0531535 0 -0.0025 -5.73135e-17 0 -0.00511069 -0.0348567 0 -0.00315358 -0.0174771 0 -0.00836038 0.0520415 0 -0.00315358 0.0174771 0 -0.00511069 0.0348567 0 -0.0034856 0.0531535 0 0.0025 -5.85381e-17 0 0.00183245 0.0178506 0 -0.000166473 0.0356015 0 -0.000166473 -0.0356015 0 0.00183245 -0.0178506 0 -0.0034856 -0.0531535 0 -0.0034856 -0.0531535 0.01 0.0025 -5.85381e-17 0.01 -0.000166473 -0.0356015 0.01 0.00183245 -0.0178506 0.01 0.0025 -5.85381e-17 0 -0.000166473 -0.0356015 0 0.00183245 -0.0178506 0 -0.00836038 -0.0520415 0.01 -0.0034856 -0.0531535 0.01 -0.0025 -5.73135e-17 0.01 -0.00511069 -0.0348567 0.01 -0.00315358 -0.0174771 0.01 -0.00836038 0.0520415 0.01 -0.00315358 0.0174771 0.01 -0.00511069 0.0348567 0.01 -0.0034856 0.0531535 0.01 0.0025 -5.85381e-17 0.01 0.00183245 0.0178506 0.01 -0.000166473 0.0356015 0.01 -0.000166473 -0.0356015 0.01 0.00183245 -0.0178506 0.01 -0.00836038 -0.0520415 0 -0.00836038 -0.0520415 0.01 -0.0025 -5.73135e-17 0.01 -0.00511069 -0.0348567 0.01 -0.00315358 -0.0174771 0.01 -0.0025 -5.73135e-17 0 -0.00511069 -0.0348567 0 -0.00315358 -0.0174771 0 -0.0025 -5.73135e-17 0 -0.0025 -5.73135e-17 0.01 -0.00836038 0.0520415 0.01 -0.00315358 0.0174771 0.01 -0.00511069 0.0348567 0.01 -0.00836038 0.0520415 0 -0.00315358 0.0174771 0 -0.00511069 0.0348567 0 -0.00836038 0.0520415 0 -0.0034856 0.0531535 0 -0.0034856 0.0531535 0.01 -0.00836038 0.0520415 0.01 0.0025 -5.85381e-17 0 0.0025 -5.85381e-17 0.01 -0.0034856 0.0531535 0.01 0.00183245 0.0178506 0.01 -0.000166473 0.0356015 0.01 -0.0034856 0.0531535 0 0.00183245 0.0178506 0 -0.000166473 0.0356015 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00844303 -0.0527754 0 -0.00356825 -0.0538874 0 -0.00356825 -0.0538874 0.01 -0.00844303 -0.0527754 0.01 -0.00844303 -0.0527754 0 -0.00356825 -0.0538874 0 -0.0025 -5.81217e-17 0 -0.00514751 -0.0353482 0 -0.0031628 -0.0177236 0 -0.00844303 0.0527754 0 -0.0031628 0.0177236 0 -0.00514751 0.0353482 0 -0.00356825 0.0538874 0 0.0025 -5.93464e-17 0 0.00182323 0.0180971 0 -0.00020329 0.036093 0 -0.00020329 -0.036093 0 0.00182323 -0.0180971 0 -0.00356825 -0.0538874 0 -0.00356825 -0.0538874 0.01 0.0025 -5.93464e-17 0.01 -0.00020329 -0.036093 0.01 0.00182323 -0.0180971 0.01 0.0025 -5.93464e-17 0 -0.00020329 -0.036093 0 0.00182323 -0.0180971 0 -0.00844303 -0.0527754 0.01 -0.00356825 -0.0538874 0.01 -0.0025 -5.81217e-17 0.01 -0.00514751 -0.0353482 0.01 -0.0031628 -0.0177236 0.01 -0.00844303 0.0527754 0.01 -0.0031628 0.0177236 0.01 -0.00514751 0.0353482 0.01 -0.00356825 0.0538874 0.01 0.0025 -5.93464e-17 0.01 0.00182323 0.0180971 0.01 -0.00020329 0.036093 0.01 -0.00020329 -0.036093 0.01 0.00182323 -0.0180971 0.01 -0.00844303 -0.0527754 0 -0.00844303 -0.0527754 0.01 -0.0025 -5.81217e-17 0.01 -0.00514751 -0.0353482 0.01 -0.0031628 -0.0177236 0.01 -0.0025 -5.81217e-17 0 -0.00514751 -0.0353482 0 -0.0031628 -0.0177236 0 -0.0025 -5.81217e-17 0 -0.0025 -5.81217e-17 0.01 -0.00844303 0.0527754 0.01 -0.0031628 0.0177236 0.01 -0.00514751 0.0353482 0.01 -0.00844303 0.0527754 0 -0.0031628 0.0177236 0 -0.00514751 0.0353482 0 -0.00844303 0.0527754 0 -0.00356825 0.0538874 0 -0.00356825 0.0538874 0.01 -0.00844303 0.0527754 0.01 0.0025 -5.93464e-17 0 0.0025 -5.93464e-17 0.01 -0.00356825 0.0538874 0.01 0.00182323 0.0180971 0.01 -0.00020329 0.036093 0.01 -0.00356825 0.0538874 0 0.00182323 0.0180971 0 -0.00020329 0.036093 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00860581 -0.054221 0 -0.00373104 -0.055333 0 -0.00373104 -0.055333 0.01 -0.00860581 -0.054221 0.01 -0.00860581 -0.054221 0 -0.00373104 -0.055333 0 -0.0025 -5.97138e-17 0 -0.00522003 -0.0363165 0 -0.00318096 -0.0182091 0 -0.00860581 0.054221 0 -0.00318096 0.0182091 0 -0.00522003 0.0363165 0 -0.00373104 0.055333 0 0.0025 -6.09384e-17 0 0.00180508 0.0185825 0 -0.000275809 0.0370613 0 -0.000275809 -0.0370613 0 0.00180508 -0.0185825 0 -0.00373104 -0.055333 0 -0.00373104 -0.055333 0.01 0.0025 -6.09384e-17 0.01 -0.000275809 -0.0370613 0.01 0.00180508 -0.0185825 0.01 0.0025 -6.09384e-17 0 -0.000275809 -0.0370613 0 0.00180508 -0.0185825 0 -0.00860581 -0.054221 0.01 -0.00373104 -0.055333 0.01 -0.0025 -5.97138e-17 0.01 -0.00522003 -0.0363165 0.01 -0.00318096 -0.0182091 0.01 -0.00860581 0.054221 0.01 -0.00318096 0.0182091 0.01 -0.00522003 0.0363165 0.01 -0.00373104 0.055333 0.01 0.0025 -6.09384e-17 0.01 0.00180508 0.0185825 0.01 -0.000275809 0.0370613 0.01 -0.000275809 -0.0370613 0.01 0.00180508 -0.0185825 0.01 -0.00860581 -0.054221 0 -0.00860581 -0.054221 0.01 -0.0025 -5.97138e-17 0.01 -0.00522003 -0.0363165 0.01 -0.00318096 -0.0182091 0.01 -0.0025 -5.97138e-17 0 -0.00522003 -0.0363165 0 -0.00318096 -0.0182091 0 -0.0025 -5.97138e-17 0 -0.0025 -5.97138e-17 0.01 -0.00860581 0.054221 0.01 -0.00318096 0.0182091 0.01 -0.00522003 0.0363165 0.01 -0.00860581 0.054221 0 -0.00318096 0.0182091 0 -0.00522003 0.0363165 0 -0.00860581 0.054221 0 -0.00373104 0.055333 0 -0.00373104 0.055333 0.01 -0.00860581 0.054221 0.01 0.0025 -6.09384e-17 0 0.0025 -6.09384e-17 0.01 -0.00373104 0.055333 0.01 0.00180508 0.0185825 0.01 -0.000275809 0.0370613 0.01 -0.00373104 0.055333 0 0.00180508 0.0185825 0 -0.000275809 0.0370613 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00868596 -0.0549326 0 -0.00381118 -0.0560446 0 -0.00381118 -0.0560446 0.01 -0.00868596 -0.0549326 0.01 -0.00868596 -0.0549326 0 -0.00381118 -0.0560446 0 -0.0025 -6.04976e-17 0 -0.00525573 -0.0367931 0 -0.0031899 -0.0184481 0 -0.00868596 0.0549326 0 -0.0031899 0.0184481 0 -0.00525573 0.0367931 0 -0.00381118 0.0560446 0 0.0025 -6.17222e-17 0 0.00179614 0.0188215 0 -0.000311511 0.0375379 0 -0.000311511 -0.0375379 0 0.00179614 -0.0188215 0 -0.00381118 -0.0560446 0 -0.00381118 -0.0560446 0.01 0.0025 -6.17222e-17 0.01 -0.000311511 -0.0375379 0.01 0.00179614 -0.0188215 0.01 0.0025 -6.17222e-17 0 -0.000311511 -0.0375379 0 0.00179614 -0.0188215 0 -0.00868596 -0.0549326 0.01 -0.00381118 -0.0560446 0.01 -0.0025 -6.04976e-17 0.01 -0.00525573 -0.0367931 0.01 -0.0031899 -0.0184481 0.01 -0.00868596 0.0549326 0.01 -0.0031899 0.0184481 0.01 -0.00525573 0.0367931 0.01 -0.00381118 0.0560446 0.01 0.0025 -6.17222e-17 0.01 0.00179614 0.0188215 0.01 -0.000311511 0.0375379 0.01 -0.000311511 -0.0375379 0.01 0.00179614 -0.0188215 0.01 -0.00868596 -0.0549326 0 -0.00868596 -0.0549326 0.01 -0.0025 -6.04976e-17 0.01 -0.00525573 -0.0367931 0.01 -0.0031899 -0.0184481 0.01 -0.0025 -6.04976e-17 0 -0.00525573 -0.0367931 0 -0.0031899 -0.0184481 0 -0.0025 -6.04976e-17 0 -0.0025 -6.04976e-17 0.01 -0.00868596 0.0549326 0.01 -0.0031899 0.0184481 0.01 -0.00525573 0.0367931 0.01 -0.00868596 0.0549326 0 -0.0031899 0.0184481 0 -0.00525573 0.0367931 0 -0.00868596 0.0549326 0 -0.00381118 0.0560446 0 -0.00381118 0.0560446 0.01 -0.00868596 0.0549326 0.01 0.0025 -6.17222e-17 0 0.0025 -6.17222e-17 0.01 -0.00381118 0.0560446 0.01 0.00179614 0.0188215 0.01 -0.000311511 0.0375379 0.01 -0.00381118 0.0560446 0 0.00179614 0.0188215 0 -0.000311511 0.0375379 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00885125 -0.0564005 0 -0.00397647 -0.0575125 0 -0.00397647 -0.0575125 0.01 -0.00885125 -0.0564005 0.01 -0.00885125 -0.0564005 0 -0.00397647 -0.0575125 0 -0.0025 -6.21141e-17 0 -0.00532936 -0.0377763 0 -0.00320833 -0.018941 0 -0.00885125 0.0564005 0 -0.00320833 0.018941 0 -0.00532936 0.0377763 0 -0.00397647 0.0575125 0 0.0025 -6.33387e-17 0 0.0017777 0.0193145 0 -0.000385146 0.0385211 0 -0.000385146 -0.0385211 0 0.0017777 -0.0193145 0 -0.00397647 -0.0575125 0 -0.00397647 -0.0575125 0.01 0.0025 -6.33387e-17 0.01 -0.000385146 -0.0385211 0.01 0.0017777 -0.0193145 0.01 0.0025 -6.33387e-17 0 -0.000385146 -0.0385211 0 0.0017777 -0.0193145 0 -0.00885125 -0.0564005 0.01 -0.00397647 -0.0575125 0.01 -0.0025 -6.21141e-17 0.01 -0.00532936 -0.0377763 0.01 -0.00320833 -0.018941 0.01 -0.00885125 0.0564005 0.01 -0.00320833 0.018941 0.01 -0.00532936 0.0377763 0.01 -0.00397647 0.0575125 0.01 0.0025 -6.33387e-17 0.01 0.0017777 0.0193145 0.01 -0.000385146 0.0385211 0.01 -0.000385146 -0.0385211 0.01 0.0017777 -0.0193145 0.01 -0.00885125 -0.0564005 0 -0.00885125 -0.0564005 0.01 -0.0025 -6.21141e-17 0.01 -0.00532936 -0.0377763 0.01 -0.00320833 -0.018941 0.01 -0.0025 -6.21141e-17 0 -0.00532936 -0.0377763 0 -0.00320833 -0.018941 0 -0.0025 -6.21141e-17 0 -0.0025 -6.21141e-17 0.01 -0.00885125 0.0564005 0.01 -0.00320833 0.018941 0.01 -0.00532936 0.0377763 0.01 -0.00885125 0.0564005 0 -0.00320833 0.018941 0 -0.00532936 0.0377763 0 -0.00885125 0.0564005 0 -0.00397647 0.0575125 0 -0.00397647 0.0575125 0.01 -0.00885125 0.0564005 0.01 0.0025 -6.33387e-17 0 0.0025 -6.33387e-17 0.01 -0.00397647 0.0575125 0.01 0.0017777 0.0193145 0.01 -0.000385146 0.0385211 0.01 -0.00397647 0.0575125 0 0.0017777 0.0193145 0 -0.000385146 0.0385211 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00893139 -0.0571122 0 -0.00405661 -0.0582242 0 -0.00405661 -0.0582242 0.01 -0.00893139 -0.0571122 0.01 -0.00893139 -0.0571122 0 -0.00405661 -0.0582242 0 -0.0025 -6.28979e-17 0 -0.00536506 -0.0382529 0 -0.00321727 -0.01918 0 -0.00893139 0.0571122 0 -0.00321727 0.01918 0 -0.00536506 0.0382529 0 -0.00405661 0.0582242 0 0.0025 -6.41225e-17 0 0.00176877 0.0195535 0 -0.000420848 0.0389977 0 -0.000420848 -0.0389977 0 0.00176877 -0.0195535 0 -0.00405661 -0.0582242 0 -0.00405661 -0.0582242 0.01 0.0025 -6.41225e-17 0.01 -0.000420848 -0.0389977 0.01 0.00176877 -0.0195535 0.01 0.0025 -6.41225e-17 0 -0.000420848 -0.0389977 0 0.00176877 -0.0195535 0 -0.00893139 -0.0571122 0.01 -0.00405661 -0.0582242 0.01 -0.0025 -6.28979e-17 0.01 -0.00536506 -0.0382529 0.01 -0.00321727 -0.01918 0.01 -0.00893139 0.0571122 0.01 -0.00321727 0.01918 0.01 -0.00536506 0.0382529 0.01 -0.00405661 0.0582242 0.01 0.0025 -6.41225e-17 0.01 0.00176877 0.0195535 0.01 -0.000420848 0.0389977 0.01 -0.000420848 -0.0389977 0.01 0.00176877 -0.0195535 0.01 -0.00893139 -0.0571122 0 -0.00893139 -0.0571122 0.01 -0.0025 -6.28979e-17 0.01 -0.00536506 -0.0382529 0.01 -0.00321727 -0.01918 0.01 -0.0025 -6.28979e-17 0 -0.00536506 -0.0382529 0 -0.00321727 -0.01918 0 -0.0025 -6.28979e-17 0 -0.0025 -6.28979e-17 0.01 -0.00893139 0.0571122 0.01 -0.00321727 0.01918 0.01 -0.00536506 0.0382529 0.01 -0.00893139 0.0571122 0 -0.00321727 0.01918 0 -0.00536506 0.0382529 0 -0.00893139 0.0571122 0 -0.00405661 0.0582242 0 -0.00405661 0.0582242 0.01 -0.00893139 0.0571122 0.01 0.0025 -6.41225e-17 0 0.0025 -6.41225e-17 0.01 -0.00405661 0.0582242 0.01 0.00176877 0.0195535 0.01 -0.000420848 0.0389977 0.01 -0.00405661 0.0582242 0 0.00176877 0.0195535 0 -0.000420848 0.0389977 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00909418 -0.0585578 0 -0.0042194 -0.0596698 0 -0.0042194 -0.0596698 0.01 -0.00909418 -0.0585578 0.01 -0.00909418 -0.0585578 0 -0.0042194 -0.0596698 0 -0.0025 -6.44899e-17 0 -0.00543758 -0.0392212 0 -0.00323542 -0.0196655 0 -0.00909418 0.0585578 0 -0.00323542 0.0196655 0 -0.00543758 0.0392212 0 -0.0042194 0.0596698 0 0.0025 -6.57145e-17 0 0.00175061 0.020039 0 -0.000493367 0.039966 0 -0.000493367 -0.039966 0 0.00175061 -0.020039 0 -0.0042194 -0.0596698 0 -0.0042194 -0.0596698 0.01 0.0025 -6.57145e-17 0.01 -0.000493367 -0.039966 0.01 0.00175061 -0.020039 0.01 0.0025 -6.57145e-17 0 -0.000493367 -0.039966 0 0.00175061 -0.020039 0 -0.00909418 -0.0585578 0.01 -0.0042194 -0.0596698 0.01 -0.0025 -6.44899e-17 0.01 -0.00543758 -0.0392212 0.01 -0.00323542 -0.0196655 0.01 -0.00909418 0.0585578 0.01 -0.00323542 0.0196655 0.01 -0.00543758 0.0392212 0.01 -0.0042194 0.0596698 0.01 0.0025 -6.57145e-17 0.01 0.00175061 0.020039 0.01 -0.000493367 0.039966 0.01 -0.000493367 -0.039966 0.01 0.00175061 -0.020039 0.01 -0.00909418 -0.0585578 0 -0.00909418 -0.0585578 0.01 -0.0025 -6.44899e-17 0.01 -0.00543758 -0.0392212 0.01 -0.00323542 -0.0196655 0.01 -0.0025 -6.44899e-17 0 -0.00543758 -0.0392212 0 -0.00323542 -0.0196655 0 -0.0025 -6.44899e-17 0 -0.0025 -6.44899e-17 0.01 -0.00909418 0.0585578 0.01 -0.00323542 0.0196655 0.01 -0.00543758 0.0392212 0.01 -0.00909418 0.0585578 0 -0.00323542 0.0196655 0 -0.00543758 0.0392212 0 -0.00909418 0.0585578 0 -0.0042194 0.0596698 0 -0.0042194 0.0596698 0.01 -0.00909418 0.0585578 0.01 0.0025 -6.57145e-17 0 0.0025 -6.57145e-17 0.01 -0.0042194 0.0596698 0.01 0.00175061 0.020039 0.01 -0.000493367 0.039966 0.01 -0.0042194 0.0596698 0 0.00175061 0.020039 0 -0.000493367 0.039966 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00917432 -0.0592694 0 -0.00429954 -0.0603814 0 -0.00429954 -0.0603814 0.01 -0.00917432 -0.0592694 0.01 -0.00917432 -0.0592694 0 -0.00429954 -0.0603814 0 -0.0025 -6.52737e-17 0 -0.00547328 -0.0396979 0 -0.00324436 -0.0199045 0 -0.00917432 0.0592694 0 -0.00324436 0.0199045 0 -0.00547328 0.0396979 0 -0.00429954 0.0603814 0 0.0025 -6.64983e-17 0 0.00174167 0.020278 0 -0.000529069 0.0404427 0 -0.000529069 -0.0404427 0 0.00174167 -0.020278 0 -0.00429954 -0.0603814 0 -0.00429954 -0.0603814 0.01 0.0025 -6.64983e-17 0.01 -0.000529069 -0.0404427 0.01 0.00174167 -0.020278 0.01 0.0025 -6.64983e-17 0 -0.000529069 -0.0404427 0 0.00174167 -0.020278 0 -0.00917432 -0.0592694 0.01 -0.00429954 -0.0603814 0.01 -0.0025 -6.52737e-17 0.01 -0.00547328 -0.0396979 0.01 -0.00324436 -0.0199045 0.01 -0.00917432 0.0592694 0.01 -0.00324436 0.0199045 0.01 -0.00547328 0.0396979 0.01 -0.00429954 0.0603814 0.01 0.0025 -6.64983e-17 0.01 0.00174167 0.020278 0.01 -0.000529069 0.0404427 0.01 -0.000529069 -0.0404427 0.01 0.00174167 -0.020278 0.01 -0.00917432 -0.0592694 0 -0.00917432 -0.0592694 0.01 -0.0025 -6.52737e-17 0.01 -0.00547328 -0.0396979 0.01 -0.00324436 -0.0199045 0.01 -0.0025 -6.52737e-17 0 -0.00547328 -0.0396979 0 -0.00324436 -0.0199045 0 -0.0025 -6.52737e-17 0 -0.0025 -6.52737e-17 0.01 -0.00917432 0.0592694 0.01 -0.00324436 0.0199045 0.01 -0.00547328 0.0396979 0.01 -0.00917432 0.0592694 0 -0.00324436 0.0199045 0 -0.00547328 0.0396979 0 -0.00917432 0.0592694 0 -0.00429954 0.0603814 0 -0.00429954 0.0603814 0.01 -0.00917432 0.0592694 0.01 0.0025 -6.64983e-17 0 0.0025 -6.64983e-17 0.01 -0.00429954 0.0603814 0.01 0.00174167 0.020278 0.01 -0.000529069 0.0404427 0.01 -0.00429954 0.0603814 0 0.00174167 0.020278 0 -0.000529069 0.0404427 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00713821 -0.0411884 0 -0.00226344 -0.0423004 0 -0.00226344 -0.0423004 0.01 -0.00713821 -0.0411884 0.01 -0.00713821 -0.0411884 0 -0.00226344 -0.0423004 0 -0.0025 -4.53609e-17 0 -0.00456624 -0.0275874 0 -0.00301728 -0.0138323 0 -0.00713821 0.0411884 0 -0.00301728 0.0138323 0 -0.00456624 0.0275874 0 -0.00226344 0.0423004 0 0.0025 -4.65856e-17 0 0.00196875 0.0142058 0 0.000377979 0.0283322 0 0.000377979 -0.0283322 0 0.00196875 -0.0142058 0 -0.00226344 -0.0423004 0 -0.00226344 -0.0423004 0.01 0.0025 -4.65856e-17 0.01 0.000377979 -0.0283322 0.01 0.00196875 -0.0142058 0.01 0.0025 -4.65856e-17 0 0.000377979 -0.0283322 0 0.00196875 -0.0142058 0 -0.00713821 -0.0411884 0.01 -0.00226344 -0.0423004 0.01 -0.0025 -4.53609e-17 0.01 -0.00456624 -0.0275874 0.01 -0.00301728 -0.0138323 0.01 -0.00713821 0.0411884 0.01 -0.00301728 0.0138323 0.01 -0.00456624 0.0275874 0.01 -0.00226344 0.0423004 0.01 0.0025 -4.65856e-17 0.01 0.00196875 0.0142058 0.01 0.000377979 0.0283322 0.01 0.000377979 -0.0283322 0.01 0.00196875 -0.0142058 0.01 -0.00713821 -0.0411884 0 -0.00713821 -0.0411884 0.01 -0.0025 -4.53609e-17 0.01 -0.00456624 -0.0275874 0.01 -0.00301728 -0.0138323 0.01 -0.0025 -4.53609e-17 0 -0.00456624 -0.0275874 0 -0.00301728 -0.0138323 0 -0.0025 -4.53609e-17 0 -0.0025 -4.53609e-17 0.01 -0.00713821 0.0411884 0.01 -0.00301728 0.0138323 0.01 -0.00456624 0.0275874 0.01 -0.00713821 0.0411884 0 -0.00301728 0.0138323 0 -0.00456624 0.0275874 0 -0.00713821 0.0411884 0 -0.00226344 0.0423004 0 -0.00226344 0.0423004 0.01 -0.00713821 0.0411884 0.01 0.0025 -4.65856e-17 0 0.0025 -4.65856e-17 0.01 -0.00226344 0.0423004 0.01 0.00196875 0.0142058 0.01 0.000377979 0.0283322 0.01 -0.00226344 0.0423004 0 0.00196875 0.0142058 0 0.000377979 0.0283322 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00721836 -0.0419 0 -0.00234358 -0.043012 0 -0.00234358 -0.043012 0.01 -0.00721836 -0.0419 0.01 -0.00721836 -0.0419 0 -0.00234358 -0.043012 0 -0.0025 -4.61447e-17 0 -0.00460194 -0.0280641 0 -0.00302622 -0.0140713 0 -0.00721836 0.0419 0 -0.00302622 0.0140713 0 -0.00460194 0.0280641 0 -0.00234358 0.043012 0 0.0025 -4.73693e-17 0 0.00195981 0.0144448 0 0.000342277 0.0288089 0 0.000342277 -0.0288089 0 0.00195981 -0.0144448 0 -0.00234358 -0.043012 0 -0.00234358 -0.043012 0.01 0.0025 -4.73693e-17 0.01 0.000342277 -0.0288089 0.01 0.00195981 -0.0144448 0.01 0.0025 -4.73693e-17 0 0.000342277 -0.0288089 0 0.00195981 -0.0144448 0 -0.00721836 -0.0419 0.01 -0.00234358 -0.043012 0.01 -0.0025 -4.61447e-17 0.01 -0.00460194 -0.0280641 0.01 -0.00302622 -0.0140713 0.01 -0.00721836 0.0419 0.01 -0.00302622 0.0140713 0.01 -0.00460194 0.0280641 0.01 -0.00234358 0.043012 0.01 0.0025 -4.73693e-17 0.01 0.00195981 0.0144448 0.01 0.000342277 0.0288089 0.01 0.000342277 -0.0288089 0.01 0.00195981 -0.0144448 0.01 -0.00721836 -0.0419 0 -0.00721836 -0.0419 0.01 -0.0025 -4.61447e-17 0.01 -0.00460194 -0.0280641 0.01 -0.00302622 -0.0140713 0.01 -0.0025 -4.61447e-17 0 -0.00460194 -0.0280641 0 -0.00302622 -0.0140713 0 -0.0025 -4.61447e-17 0 -0.0025 -4.61447e-17 0.01 -0.00721836 0.0419 0.01 -0.00302622 0.0140713 0.01 -0.00460194 0.0280641 0.01 -0.00721836 0.0419 0 -0.00302622 0.0140713 0 -0.00460194 0.0280641 0 -0.00721836 0.0419 0 -0.00234358 0.043012 0 -0.00234358 0.043012 0.01 -0.00721836 0.0419 0.01 0.0025 -4.73693e-17 0 0.0025 -4.73693e-17 0.01 -0.00234358 0.043012 0.01 0.00195981 0.0144448 0.01 0.000342277 0.0288089 0.01 -0.00234358 0.043012 0 0.00195981 0.0144448 0 0.000342277 0.0288089 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00738365 -0.0433679 0 -0.00250887 -0.0444799 0 -0.00250887 -0.0444799 0.01 -0.00738365 -0.0433679 0.01 -0.00738365 -0.0433679 0 -0.00250887 -0.0444799 0 -0.0025 -4.77612e-17 0 -0.00467557 -0.0290472 0 -0.00304465 -0.0145643 0 -0.00738365 0.0433679 0 -0.00304465 0.0145643 0 -0.00467557 0.0290472 0 -0.00250887 0.0444799 0 0.0025 -4.89859e-17 0 0.00194138 0.0149377 0 0.000268642 0.029792 0 0.000268642 -0.029792 0 0.00194138 -0.0149377 0 -0.00250887 -0.0444799 0 -0.00250887 -0.0444799 0.01 0.0025 -4.89859e-17 0.01 0.000268642 -0.029792 0.01 0.00194138 -0.0149377 0.01 0.0025 -4.89859e-17 0 0.000268642 -0.029792 0 0.00194138 -0.0149377 0 -0.00738365 -0.0433679 0.01 -0.00250887 -0.0444799 0.01 -0.0025 -4.77612e-17 0.01 -0.00467557 -0.0290472 0.01 -0.00304465 -0.0145643 0.01 -0.00738365 0.0433679 0.01 -0.00304465 0.0145643 0.01 -0.00467557 0.0290472 0.01 -0.00250887 0.0444799 0.01 0.0025 -4.89859e-17 0.01 0.00194138 0.0149377 0.01 0.000268642 0.029792 0.01 0.000268642 -0.029792 0.01 0.00194138 -0.0149377 0.01 -0.00738365 -0.0433679 0 -0.00738365 -0.0433679 0.01 -0.0025 -4.77612e-17 0.01 -0.00467557 -0.0290472 0.01 -0.00304465 -0.0145643 0.01 -0.0025 -4.77612e-17 0 -0.00467557 -0.0290472 0 -0.00304465 -0.0145643 0 -0.0025 -4.77612e-17 0 -0.0025 -4.77612e-17 0.01 -0.00738365 0.0433679 0.01 -0.00304465 0.0145643 0.01 -0.00467557 0.0290472 0.01 -0.00738365 0.0433679 0 -0.00304465 0.0145643 0 -0.00467557 0.0290472 0 -0.00738365 0.0433679 0 -0.00250887 0.0444799 0 -0.00250887 0.0444799 0.01 -0.00738365 0.0433679 0.01 0.0025 -4.89859e-17 0 0.0025 -4.89859e-17 0.01 -0.00250887 0.0444799 0.01 0.00194138 0.0149377 0.01 0.000268642 0.029792 0.01 -0.00250887 0.0444799 0 0.00194138 0.0149377 0 0.000268642 0.029792 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00746379 -0.0440796 0 -0.00258901 -0.0451916 0 -0.00258901 -0.0451916 0.01 -0.00746379 -0.0440796 0.01 -0.00746379 -0.0440796 0 -0.00258901 -0.0451916 0 -0.0025 -4.8545e-17 0 -0.00471128 -0.0295239 0 -0.00305359 -0.0148033 0 -0.00746379 0.0440796 0 -0.00305359 0.0148033 0 -0.00471128 0.0295239 0 -0.00258901 0.0451916 0 0.0025 -4.97696e-17 0 0.00193244 0.0151767 0 0.00023294 0.0302687 0 0.00023294 -0.0302687 0 0.00193244 -0.0151767 0 -0.00258901 -0.0451916 0 -0.00258901 -0.0451916 0.01 0.0025 -4.97696e-17 0.01 0.00023294 -0.0302687 0.01 0.00193244 -0.0151767 0.01 0.0025 -4.97696e-17 0 0.00023294 -0.0302687 0 0.00193244 -0.0151767 0 -0.00746379 -0.0440796 0.01 -0.00258901 -0.0451916 0.01 -0.0025 -4.8545e-17 0.01 -0.00471128 -0.0295239 0.01 -0.00305359 -0.0148033 0.01 -0.00746379 0.0440796 0.01 -0.00305359 0.0148033 0.01 -0.00471128 0.0295239 0.01 -0.00258901 0.0451916 0.01 0.0025 -4.97696e-17 0.01 0.00193244 0.0151767 0.01 0.00023294 0.0302687 0.01 0.00023294 -0.0302687 0.01 0.00193244 -0.0151767 0.01 -0.00746379 -0.0440796 0 -0.00746379 -0.0440796 0.01 -0.0025 -4.8545e-17 0.01 -0.00471128 -0.0295239 0.01 -0.00305359 -0.0148033 0.01 -0.0025 -4.8545e-17 0 -0.00471128 -0.0295239 0 -0.00305359 -0.0148033 0 -0.0025 -4.8545e-17 0 -0.0025 -4.8545e-17 0.01 -0.00746379 0.0440796 0.01 -0.00305359 0.0148033 0.01 -0.00471128 0.0295239 0.01 -0.00746379 0.0440796 0 -0.00305359 0.0148033 0 -0.00471128 0.0295239 0 -0.00746379 0.0440796 0 -0.00258901 0.0451916 0 -0.00258901 0.0451916 0.01 -0.00746379 0.0440796 0.01 0.0025 -4.97696e-17 0 0.0025 -4.97696e-17 0.01 -0.00258901 0.0451916 0.01 0.00193244 0.0151767 0.01 0.00023294 0.0302687 0.01 -0.00258901 0.0451916 0 0.00193244 0.0151767 0 0.00023294 0.0302687 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00762658 -0.0455252 0 -0.0027518 -0.0466372 0 -0.0027518 -0.0466372 0.01 -0.00762658 -0.0455252 0.01 -0.00762658 -0.0455252 0 -0.0027518 -0.0466372 0 -0.0025 -5.0137e-17 0 -0.00478379 -0.0304921 0 -0.00307175 -0.0152888 0 -0.00762658 0.0455252 0 -0.00307175 0.0152888 0 -0.00478379 0.0304921 0 -0.0027518 0.0466372 0 0.0025 -5.13617e-17 0 0.00191429 0.0156622 0 0.000160421 0.0312369 0 0.000160421 -0.0312369 0 0.00191429 -0.0156622 0 -0.0027518 -0.0466372 0 -0.0027518 -0.0466372 0.01 0.0025 -5.13617e-17 0.01 0.000160421 -0.0312369 0.01 0.00191429 -0.0156622 0.01 0.0025 -5.13617e-17 0 0.000160421 -0.0312369 0 0.00191429 -0.0156622 0 -0.00762658 -0.0455252 0.01 -0.0027518 -0.0466372 0.01 -0.0025 -5.0137e-17 0.01 -0.00478379 -0.0304921 0.01 -0.00307175 -0.0152888 0.01 -0.00762658 0.0455252 0.01 -0.00307175 0.0152888 0.01 -0.00478379 0.0304921 0.01 -0.0027518 0.0466372 0.01 0.0025 -5.13617e-17 0.01 0.00191429 0.0156622 0.01 0.000160421 0.0312369 0.01 0.000160421 -0.0312369 0.01 0.00191429 -0.0156622 0.01 -0.00762658 -0.0455252 0 -0.00762658 -0.0455252 0.01 -0.0025 -5.0137e-17 0.01 -0.00478379 -0.0304921 0.01 -0.00307175 -0.0152888 0.01 -0.0025 -5.0137e-17 0 -0.00478379 -0.0304921 0 -0.00307175 -0.0152888 0 -0.0025 -5.0137e-17 0 -0.0025 -5.0137e-17 0.01 -0.00762658 0.0455252 0.01 -0.00307175 0.0152888 0.01 -0.00478379 0.0304921 0.01 -0.00762658 0.0455252 0 -0.00307175 0.0152888 0 -0.00478379 0.0304921 0 -0.00762658 0.0455252 0 -0.0027518 0.0466372 0 -0.0027518 0.0466372 0.01 -0.00762658 0.0455252 0.01 0.0025 -5.13617e-17 0 0.0025 -5.13617e-17 0.01 -0.0027518 0.0466372 0.01 0.00191429 0.0156622 0.01 0.000160421 0.0312369 0.01 -0.0027518 0.0466372 0 0.00191429 0.0156622 0 0.000160421 0.0312369 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00770923 -0.0462591 0 -0.00283445 -0.0473711 0 -0.00283445 -0.0473711 0.01 -0.00770923 -0.0462591 0.01 -0.00770923 -0.0462591 0 -0.00283445 -0.0473711 0 -0.0025 -5.09453e-17 0 -0.00482061 -0.0309837 0 -0.00308096 -0.0155352 0 -0.00770923 0.0462591 0 -0.00308096 0.0155352 0 -0.00482061 0.0309837 0 -0.00283445 0.0473711 0 0.0025 -5.217e-17 0 0.00190507 0.0159087 0 0.000123604 0.0317285 0 0.000123604 -0.0317285 0 0.00190507 -0.0159087 0 -0.00283445 -0.0473711 0 -0.00283445 -0.0473711 0.01 0.0025 -5.217e-17 0.01 0.000123604 -0.0317285 0.01 0.00190507 -0.0159087 0.01 0.0025 -5.217e-17 0 0.000123604 -0.0317285 0 0.00190507 -0.0159087 0 -0.00770923 -0.0462591 0.01 -0.00283445 -0.0473711 0.01 -0.0025 -5.09453e-17 0.01 -0.00482061 -0.0309837 0.01 -0.00308096 -0.0155352 0.01 -0.00770923 0.0462591 0.01 -0.00308096 0.0155352 0.01 -0.00482061 0.0309837 0.01 -0.00283445 0.0473711 0.01 0.0025 -5.217e-17 0.01 0.00190507 0.0159087 0.01 0.000123604 0.0317285 0.01 0.000123604 -0.0317285 0.01 0.00190507 -0.0159087 0.01 -0.00770923 -0.0462591 0 -0.00770923 -0.0462591 0.01 -0.0025 -5.09453e-17 0.01 -0.00482061 -0.0309837 0.01 -0.00308096 -0.0155352 0.01 -0.0025 -5.09453e-17 0 -0.00482061 -0.0309837 0 -0.00308096 -0.0155352 0 -0.0025 -5.09453e-17 0 -0.0025 -5.09453e-17 0.01 -0.00770923 0.0462591 0.01 -0.00308096 0.0155352 0.01 -0.00482061 0.0309837 0.01 -0.00770923 0.0462591 0 -0.00308096 0.0155352 0 -0.00482061 0.0309837 0 -0.00770923 0.0462591 0 -0.00283445 0.0473711 0 -0.00283445 0.0473711 0.01 -0.00770923 0.0462591 0.01 0.0025 -5.217e-17 0 0.0025 -5.217e-17 0.01 -0.00283445 0.0473711 0.01 0.00190507 0.0159087 0.01 0.000123604 0.0317285 0.01 -0.00283445 0.0473711 0 0.00190507 0.0159087 0 0.000123604 0.0317285 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00787201 -0.0477047 0 -0.00299724 -0.0488167 0 -0.00299724 -0.0488167 0.01 -0.00787201 -0.0477047 0.01 -0.00787201 -0.0477047 0 -0.00299724 -0.0488167 0 -0.0025 -5.25373e-17 0 -0.00489313 -0.0319519 0 -0.00309912 -0.0160207 0 -0.00787201 0.0477047 0 -0.00309912 0.0160207 0 -0.00489313 0.0319519 0 -0.00299724 0.0488167 0 0.0025 -5.3762e-17 0 0.00188691 0.0163942 0 5.10846e-05 0.0326967 0 5.10846e-05 -0.0326967 0 0.00188691 -0.0163942 0 -0.00299724 -0.0488167 0 -0.00299724 -0.0488167 0.01 0.0025 -5.3762e-17 0.01 5.10846e-05 -0.0326967 0.01 0.00188691 -0.0163942 0.01 0.0025 -5.3762e-17 0 5.10846e-05 -0.0326967 0 0.00188691 -0.0163942 0 -0.00787201 -0.0477047 0.01 -0.00299724 -0.0488167 0.01 -0.0025 -5.25373e-17 0.01 -0.00489313 -0.0319519 0.01 -0.00309912 -0.0160207 0.01 -0.00787201 0.0477047 0.01 -0.00309912 0.0160207 0.01 -0.00489313 0.0319519 0.01 -0.00299724 0.0488167 0.01 0.0025 -5.3762e-17 0.01 0.00188691 0.0163942 0.01 5.10846e-05 0.0326967 0.01 5.10846e-05 -0.0326967 0.01 0.00188691 -0.0163942 0.01 -0.00787201 -0.0477047 0 -0.00787201 -0.0477047 0.01 -0.0025 -5.25373e-17 0.01 -0.00489313 -0.0319519 0.01 -0.00309912 -0.0160207 0.01 -0.0025 -5.25373e-17 0 -0.00489313 -0.0319519 0 -0.00309912 -0.0160207 0 -0.0025 -5.25373e-17 0 -0.0025 -5.25373e-17 0.01 -0.00787201 0.0477047 0.01 -0.00309912 0.0160207 0.01 -0.00489313 0.0319519 0.01 -0.00787201 0.0477047 0 -0.00309912 0.0160207 0 -0.00489313 0.0319519 0 -0.00787201 0.0477047 0 -0.00299724 0.0488167 0 -0.00299724 0.0488167 0.01 -0.00787201 0.0477047 0.01 0.0025 -5.3762e-17 0 0.0025 -5.3762e-17 0.01 -0.00299724 0.0488167 0.01 0.00188691 0.0163942 0.01 5.10846e-05 0.0326967 0.01 -0.00299724 0.0488167 0 0.00188691 0.0163942 0 5.10846e-05 0.0326967 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.00795216 -0.0484163 0 -0.00307738 -0.0495283 0 -0.00307738 -0.0495283 0.01 -0.00795216 -0.0484163 0.01 -0.00795216 -0.0484163 0 -0.00307738 -0.0495283 0 -0.0025 -5.33211e-17 0 -0.00492883 -0.0324286 0 -0.00310806 -0.0162597 0 -0.00795216 0.0484163 0 -0.00310806 0.0162597 0 -0.00492883 0.0324286 0 -0.00307738 0.0495283 0 0.0025 -5.45458e-17 0 0.00187798 0.0166332 0 1.53828e-05 0.0331734 0 1.53828e-05 -0.0331734 0 0.00187798 -0.0166332 0 -0.00307738 -0.0495283 0 -0.00307738 -0.0495283 0.01 0.0025 -5.45458e-17 0.01 1.53828e-05 -0.0331734 0.01 0.00187798 -0.0166332 0.01 0.0025 -5.45458e-17 0 1.53828e-05 -0.0331734 0 0.00187798 -0.0166332 0 -0.00795216 -0.0484163 0.01 -0.00307738 -0.0495283 0.01 -0.0025 -5.33211e-17 0.01 -0.00492883 -0.0324286 0.01 -0.00310806 -0.0162597 0.01 -0.00795216 0.0484163 0.01 -0.00310806 0.0162597 0.01 -0.00492883 0.0324286 0.01 -0.00307738 0.0495283 0.01 0.0025 -5.45458e-17 0.01 0.00187798 0.0166332 0.01 1.53828e-05 0.0331734 0.01 1.53828e-05 -0.0331734 0.01 0.00187798 -0.0166332 0.01 -0.00795216 -0.0484163 0 -0.00795216 -0.0484163 0.01 -0.0025 -5.33211e-17 0.01 -0.00492883 -0.0324286 0.01 -0.00310806 -0.0162597 0.01 -0.0025 -5.33211e-17 0 -0.00492883 -0.0324286 0 -0.00310806 -0.0162597 0 -0.0025 -5.33211e-17 0 -0.0025 -5.33211e-17 0.01 -0.00795216 0.0484163 0.01 -0.00310806 0.0162597 0.01 -0.00492883 0.0324286 0.01 -0.00795216 0.0484163 0 -0.00310806 0.0162597 0 -0.00492883 0.0324286 0 -0.00795216 0.0484163 0 -0.00307738 0.0495283 0 -0.00307738 0.0495283 0.01 -0.00795216 0.0484163 0.01 0.0025 -5.45458e-17 0 0.0025 -5.45458e-17 0.01 -0.00307738 0.0495283 0.01 0.00187798 0.0166332 0.01 1.53828e-05 0.0331734 0.01 -0.00307738 0.0495283 0 0.00187798 0.0166332 0 1.53828e-05 0.0331734 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 14 10 6 14 6 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 36 32 28 36 28 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0103489 -0.0697 0 -0.00547412 -0.070812 0 -0.00547412 -0.070812 0.01 -0.0103489 -0.0697 0.01 -0.0103489 -0.0697 0 -0.00547412 -0.070812 0 -0.0025 -7.67609e-17 0 -0.00599654 -0.0466841 0 -0.00337536 -0.0234074 0 -0.0103489 0.0697 0 -0.00337536 0.0234074 0 -0.00599654 0.0466841 0 -0.00547412 0.070812 0 0.0025 -7.79855e-17 0 0.00161068 0.0237809 0 -0.00105232 0.0474289 0 -0.00105232 -0.0474289 0 0.00161068 -0.0237809 0 -0.00547412 -0.070812 0 -0.00547412 -0.070812 0.01 0.0025 -7.79855e-17 0.01 -0.00105232 -0.0474289 0.01 0.00161068 -0.0237809 0.01 0.0025 -7.79855e-17 0 -0.00105232 -0.0474289 0 0.00161068 -0.0237809 0 -0.0103489 -0.0697 0.01 -0.00547412 -0.070812 0.01 -0.0025 -7.67609e-17 0.01 -0.00599654 -0.0466841 0.01 -0.00337536 -0.0234074 0.01 -0.0103489 0.0697 0.01 -0.00337536 0.0234074 0.01 -0.00599654 0.0466841 0.01 -0.00547412 0.070812 0.01 0.0025 -7.79855e-17 0.01 0.00161068 0.0237809 0.01 -0.00105232 0.0474289 0.01 -0.00105232 -0.0474289 0.01 0.00161068 -0.0237809 0.01 -0.0103489 -0.0697 0 -0.0103489 -0.0697 0.01 -0.0025 -7.67609e-17 0.01 -0.00599654 -0.0466841 0.01 -0.00337536 -0.0234074 0.01 -0.0025 -7.67609e-17 0 -0.00599654 -0.0466841 0 -0.00337536 -0.0234074 0 -0.0025 -7.67609e-17 0 -0.0025 -7.67609e-17 0.01 -0.0103489 0.0697 0.01 -0.00337536 0.0234074 0.01 -0.00599654 0.0466841 0.01 -0.0103489 0.0697 0 -0.00337536 0.0234074 0 -0.00599654 0.0466841 0 -0.0103489 0.0697 0 -0.00547412 0.070812 0 -0.00547412 0.070812 0.01 -0.0103489 0.0697 0.01 0.0025 -7.79855e-17 0 0.0025 -7.79855e-17 0.01 -0.00547412 0.070812 0.01 0.00161068 0.0237809 0.01 -0.00105232 0.0474289 0.01 -0.00547412 0.070812 0 0.00161068 0.0237809 0 -0.00105232 0.0474289 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0104065 -0.0702115 0 -0.00553172 -0.0713235 0 -0.00553172 -0.0713235 0.01 -0.0104065 -0.0702115 0.01 -0.0104065 -0.0702115 0 -0.00553172 -0.0713235 0 -0.0025 -7.73242e-17 0 -0.0060222 -0.0470267 0 -0.00338178 -0.0235792 0 -0.0104065 0.0702115 0 -0.00338178 0.0235792 0 -0.0060222 0.0470267 0 -0.00553172 0.0713235 0 0.0025 -7.85488e-17 0 0.00160425 0.0239527 0 -0.00107798 0.0477715 0 -0.00107798 -0.0477715 0 0.00160425 -0.0239527 0 -0.00553172 -0.0713235 0 -0.00553172 -0.0713235 0.01 0.0025 -7.85488e-17 0.01 -0.00107798 -0.0477715 0.01 0.00160425 -0.0239527 0.01 0.0025 -7.85488e-17 0 -0.00107798 -0.0477715 0 0.00160425 -0.0239527 0 -0.0104065 -0.0702115 0.01 -0.00553172 -0.0713235 0.01 -0.0025 -7.73242e-17 0.01 -0.0060222 -0.0470267 0.01 -0.00338178 -0.0235792 0.01 -0.0104065 0.0702115 0.01 -0.00338178 0.0235792 0.01 -0.0060222 0.0470267 0.01 -0.00553172 0.0713235 0.01 0.0025 -7.85488e-17 0.01 0.00160425 0.0239527 0.01 -0.00107798 0.0477715 0.01 -0.00107798 -0.0477715 0.01 0.00160425 -0.0239527 0.01 -0.0104065 -0.0702115 0 -0.0104065 -0.0702115 0.01 -0.0025 -7.73242e-17 0.01 -0.0060222 -0.0470267 0.01 -0.00338178 -0.0235792 0.01 -0.0025 -7.73242e-17 0 -0.0060222 -0.0470267 0 -0.00338178 -0.0235792 0 -0.0025 -7.73242e-17 0 -0.0025 -7.73242e-17 0.01 -0.0104065 0.0702115 0.01 -0.00338178 0.0235792 0.01 -0.0060222 0.0470267 0.01 -0.0104065 0.0702115 0 -0.00338178 0.0235792 0 -0.0060222 0.0470267 0 -0.0104065 0.0702115 0 -0.00553172 0.0713235 0 -0.00553172 0.0713235 0.01 -0.0104065 0.0702115 0.01 0.0025 -7.85488e-17 0 0.0025 -7.85488e-17 0.01 -0.00553172 0.0713235 0.01 0.00160425 0.0239527 0.01 -0.00107798 0.0477715 0.01 -0.00553172 0.0713235 0 0.00160425 0.0239527 0 -0.00107798 0.0477715 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.011536 -0.0802417 0 -0.00666122 -0.0813537 0 -0.00666122 -0.0813537 0.01 -0.011536 -0.0802417 0.01 -0.011536 -0.0802417 0 -0.00666122 -0.0813537 0 -0.0025 -8.83705e-17 0 -0.00652537 -0.0537448 0 -0.00350775 -0.0269477 0 -0.011536 0.0802417 0 -0.00350775 0.0269477 0 -0.00652537 0.0537448 0 -0.00666122 0.0813537 0 0.0025 -8.95952e-17 0 0.00147828 0.0273211 0 -0.00158115 0.0544896 0 -0.00158115 -0.0544896 0 0.00147828 -0.0273211 0 -0.00666122 -0.0813537 0 -0.00666122 -0.0813537 0.01 0.0025 -8.95952e-17 0.01 -0.00158115 -0.0544896 0.01 0.00147828 -0.0273211 0.01 0.0025 -8.95952e-17 0 -0.00158115 -0.0544896 0 0.00147828 -0.0273211 0 -0.011536 -0.0802417 0.01 -0.00666122 -0.0813537 0.01 -0.0025 -8.83705e-17 0.01 -0.00652537 -0.0537448 0.01 -0.00350775 -0.0269477 0.01 -0.011536 0.0802417 0.01 -0.00350775 0.0269477 0.01 -0.00652537 0.0537448 0.01 -0.00666122 0.0813537 0.01 0.0025 -8.95952e-17 0.01 0.00147828 0.0273211 0.01 -0.00158115 0.0544896 0.01 -0.00158115 -0.0544896 0.01 0.00147828 -0.0273211 0.01 -0.011536 -0.0802417 0 -0.011536 -0.0802417 0.01 -0.0025 -8.83705e-17 0.01 -0.00652537 -0.0537448 0.01 -0.00350775 -0.0269477 0.01 -0.0025 -8.83705e-17 0 -0.00652537 -0.0537448 0 -0.00350775 -0.0269477 0 -0.0025 -8.83705e-17 0 -0.0025 -8.83705e-17 0.01 -0.011536 0.0802417 0.01 -0.00350775 0.0269477 0.01 -0.00652537 0.0537448 0.01 -0.011536 0.0802417 0 -0.00350775 0.0269477 0 -0.00652537 0.0537448 0 -0.011536 0.0802417 0 -0.00666122 0.0813537 0 -0.00666122 0.0813537 0.01 -0.011536 0.0802417 0.01 0.0025 -8.95952e-17 0 0.0025 -8.95952e-17 0.01 -0.00666122 0.0813537 0.01 0.00147828 0.0273211 0.01 -0.00158115 0.0544896 0.01 -0.00666122 0.0813537 0 0.00147828 0.0273211 0 -0.00158115 0.0544896 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0115936 -0.0807532 0 -0.00671883 -0.0818652 0 -0.00671883 -0.0818652 0.01 -0.0115936 -0.0807532 0.01 -0.0115936 -0.0807532 0 -0.00671883 -0.0818652 0 -0.0025 -8.89339e-17 0 -0.00655103 -0.0540874 0 -0.00351417 -0.0271195 0 -0.0115936 0.0807532 0 -0.00351417 0.0271195 0 -0.00655103 0.0540874 0 -0.00671883 0.0818652 0 0.0025 -9.01585e-17 0 0.00147186 0.0274929 0 -0.00160681 0.0548322 0 -0.00160681 -0.0548322 0 0.00147186 -0.0274929 0 -0.00671883 -0.0818652 0 -0.00671883 -0.0818652 0.01 0.0025 -9.01585e-17 0.01 -0.00160681 -0.0548322 0.01 0.00147186 -0.0274929 0.01 0.0025 -9.01585e-17 0 -0.00160681 -0.0548322 0 0.00147186 -0.0274929 0 -0.0115936 -0.0807532 0.01 -0.00671883 -0.0818652 0.01 -0.0025 -8.89339e-17 0.01 -0.00655103 -0.0540874 0.01 -0.00351417 -0.0271195 0.01 -0.0115936 0.0807532 0.01 -0.00351417 0.0271195 0.01 -0.00655103 0.0540874 0.01 -0.00671883 0.0818652 0.01 0.0025 -9.01585e-17 0.01 0.00147186 0.0274929 0.01 -0.00160681 0.0548322 0.01 -0.00160681 -0.0548322 0.01 0.00147186 -0.0274929 0.01 -0.0115936 -0.0807532 0 -0.0115936 -0.0807532 0.01 -0.0025 -8.89339e-17 0.01 -0.00655103 -0.0540874 0.01 -0.00351417 -0.0271195 0.01 -0.0025 -8.89339e-17 0 -0.00655103 -0.0540874 0 -0.00351417 -0.0271195 0 -0.0025 -8.89339e-17 0 -0.0025 -8.89339e-17 0.01 -0.0115936 0.0807532 0.01 -0.00351417 0.0271195 0.01 -0.00655103 0.0540874 0.01 -0.0115936 0.0807532 0 -0.00351417 0.0271195 0 -0.00655103 0.0540874 0 -0.0115936 0.0807532 0 -0.00671883 0.0818652 0 -0.00671883 0.0818652 0.01 -0.0115936 0.0807532 0.01 0.0025 -9.01585e-17 0 0.0025 -9.01585e-17 0.01 -0.00671883 0.0818652 0.01 0.00147186 0.0274929 0.01 -0.00160681 0.0548322 0.01 -0.00671883 0.0818652 0 0.00147186 0.0274929 0 -0.00160681 0.0548322 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0117739 -0.0823545 0 -0.00689915 -0.0834665 0 -0.00689915 -0.0834665 0.01 -0.0117739 -0.0823545 0.01 -0.0117739 -0.0823545 0 -0.00689915 -0.0834665 0 -0.0025 -9.06973e-17 0 -0.00663136 -0.0551599 0 -0.00353428 -0.0276572 0 -0.0117739 0.0823545 0 -0.00353428 0.0276572 0 -0.00663136 0.0551599 0 -0.00689915 0.0834665 0 0.0025 -9.1922e-17 0 0.00145175 0.0280307 0 -0.00168714 0.0559047 0 -0.00168714 -0.0559047 0 0.00145175 -0.0280307 0 -0.00689915 -0.0834665 0 -0.00689915 -0.0834665 0.01 0.0025 -9.1922e-17 0.01 -0.00168714 -0.0559047 0.01 0.00145175 -0.0280307 0.01 0.0025 -9.1922e-17 0 -0.00168714 -0.0559047 0 0.00145175 -0.0280307 0 -0.0117739 -0.0823545 0.01 -0.00689915 -0.0834665 0.01 -0.0025 -9.06973e-17 0.01 -0.00663136 -0.0551599 0.01 -0.00353428 -0.0276572 0.01 -0.0117739 0.0823545 0.01 -0.00353428 0.0276572 0.01 -0.00663136 0.0551599 0.01 -0.00689915 0.0834665 0.01 0.0025 -9.1922e-17 0.01 0.00145175 0.0280307 0.01 -0.00168714 0.0559047 0.01 -0.00168714 -0.0559047 0.01 0.00145175 -0.0280307 0.01 -0.0117739 -0.0823545 0 -0.0117739 -0.0823545 0.01 -0.0025 -9.06973e-17 0.01 -0.00663136 -0.0551599 0.01 -0.00353428 -0.0276572 0.01 -0.0025 -9.06973e-17 0 -0.00663136 -0.0551599 0 -0.00353428 -0.0276572 0 -0.0025 -9.06973e-17 0 -0.0025 -9.06973e-17 0.01 -0.0117739 0.0823545 0.01 -0.00353428 0.0276572 0.01 -0.00663136 0.0551599 0.01 -0.0117739 0.0823545 0 -0.00353428 0.0276572 0 -0.00663136 0.0551599 0 -0.0117739 0.0823545 0 -0.00689915 0.0834665 0 -0.00689915 0.0834665 0.01 -0.0117739 0.0823545 0.01 0.0025 -9.1922e-17 0 0.0025 -9.1922e-17 0.01 -0.00689915 0.0834665 0.01 0.00145175 0.0280307 0.01 -0.00168714 0.0559047 0.01 -0.00689915 0.0834665 0 0.00145175 0.0280307 0 -0.00168714 0.0559047 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0118315 -0.082866 0 -0.00695675 -0.083978 0 -0.00695675 -0.083978 0.01 -0.0118315 -0.082866 0.01 -0.0118315 -0.082866 0 -0.00695675 -0.083978 0 -0.0025 -9.12607e-17 0 -0.00665702 -0.0555025 0 -0.00354071 -0.027829 0 -0.0118315 0.082866 0 -0.00354071 0.027829 0 -0.00665702 0.0555025 0 -0.00695675 0.083978 0 0.0025 -9.24853e-17 0 0.00144533 0.0282024 0 -0.0017128 0.0562473 0 -0.0017128 -0.0562473 0 0.00144533 -0.0282024 0 -0.00695675 -0.083978 0 -0.00695675 -0.083978 0.01 0.0025 -9.24853e-17 0.01 -0.0017128 -0.0562473 0.01 0.00144533 -0.0282024 0.01 0.0025 -9.24853e-17 0 -0.0017128 -0.0562473 0 0.00144533 -0.0282024 0 -0.0118315 -0.082866 0.01 -0.00695675 -0.083978 0.01 -0.0025 -9.12607e-17 0.01 -0.00665702 -0.0555025 0.01 -0.00354071 -0.027829 0.01 -0.0118315 0.082866 0.01 -0.00354071 0.027829 0.01 -0.00665702 0.0555025 0.01 -0.00695675 0.083978 0.01 0.0025 -9.24853e-17 0.01 0.00144533 0.0282024 0.01 -0.0017128 0.0562473 0.01 -0.0017128 -0.0562473 0.01 0.00144533 -0.0282024 0.01 -0.0118315 -0.082866 0 -0.0118315 -0.082866 0.01 -0.0025 -9.12607e-17 0.01 -0.00665702 -0.0555025 0.01 -0.00354071 -0.027829 0.01 -0.0025 -9.12607e-17 0 -0.00665702 -0.0555025 0 -0.00354071 -0.027829 0 -0.0025 -9.12607e-17 0 -0.0025 -9.12607e-17 0.01 -0.0118315 0.082866 0.01 -0.00354071 0.027829 0.01 -0.00665702 0.0555025 0.01 -0.0118315 0.082866 0 -0.00354071 0.027829 0 -0.00665702 0.0555025 0 -0.0118315 0.082866 0 -0.00695675 0.083978 0 -0.00695675 0.083978 0.01 -0.0118315 0.082866 0.01 0.0025 -9.24853e-17 0 0.0025 -9.24853e-17 0.01 -0.00695675 0.083978 0.01 0.00144533 0.0282024 0.01 -0.0017128 0.0562473 0.01 -0.00695675 0.083978 0 0.00144533 0.0282024 0 -0.0017128 0.0562473 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0120118 -0.0844673 0 -0.00713707 -0.0855793 0 -0.00713707 -0.0855793 0.01 -0.0120118 -0.0844673 0.01 -0.0120118 -0.0844673 0 -0.00713707 -0.0855793 0 -0.0025 -9.30242e-17 0 -0.00673735 -0.056575 0 -0.00356082 -0.0283668 0 -0.0120118 0.0844673 0 -0.00356082 0.0283668 0 -0.00673735 0.056575 0 -0.00713707 0.0855793 0 0.0025 -9.42488e-17 0 0.00142522 0.0287402 0 -0.00179313 0.0573198 0 -0.00179313 -0.0573198 0 0.00142522 -0.0287402 0 -0.00713707 -0.0855793 0 -0.00713707 -0.0855793 0.01 0.0025 -9.42488e-17 0.01 -0.00179313 -0.0573198 0.01 0.00142522 -0.0287402 0.01 0.0025 -9.42488e-17 0 -0.00179313 -0.0573198 0 0.00142522 -0.0287402 0 -0.0120118 -0.0844673 0.01 -0.00713707 -0.0855793 0.01 -0.0025 -9.30242e-17 0.01 -0.00673735 -0.056575 0.01 -0.00356082 -0.0283668 0.01 -0.0120118 0.0844673 0.01 -0.00356082 0.0283668 0.01 -0.00673735 0.056575 0.01 -0.00713707 0.0855793 0.01 0.0025 -9.42488e-17 0.01 0.00142522 0.0287402 0.01 -0.00179313 0.0573198 0.01 -0.00179313 -0.0573198 0.01 0.00142522 -0.0287402 0.01 -0.0120118 -0.0844673 0 -0.0120118 -0.0844673 0.01 -0.0025 -9.30242e-17 0.01 -0.00673735 -0.056575 0.01 -0.00356082 -0.0283668 0.01 -0.0025 -9.30242e-17 0 -0.00673735 -0.056575 0 -0.00356082 -0.0283668 0 -0.0025 -9.30242e-17 0 -0.0025 -9.30242e-17 0.01 -0.0120118 0.0844673 0.01 -0.00356082 0.0283668 0.01 -0.00673735 0.056575 0.01 -0.0120118 0.0844673 0 -0.00356082 0.0283668 0 -0.00673735 0.056575 0 -0.0120118 0.0844673 0 -0.00713707 0.0855793 0 -0.00713707 0.0855793 0.01 -0.0120118 0.0844673 0.01 0.0025 -9.42488e-17 0 0.0025 -9.42488e-17 0.01 -0.00713707 0.0855793 0.01 0.00142522 0.0287402 0.01 -0.00179313 0.0573198 0.01 -0.00713707 0.0855793 0 0.00142522 0.0287402 0 -0.00179313 0.0573198 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0120669 -0.0849566 0 -0.00719217 -0.0860686 0 -0.00719217 -0.0860686 0.01 -0.0120669 -0.0849566 0.01 -0.0120669 -0.0849566 0 -0.00719217 -0.0860686 0 -0.0025 -9.3563e-17 0 -0.00676189 -0.0569028 0 -0.00356696 -0.0285311 0 -0.0120669 0.0849566 0 -0.00356696 0.0285311 0 -0.00676189 0.0569028 0 -0.00719217 0.0860686 0 0.0025 -9.47877e-17 0 0.00141907 0.0289045 0 -0.00181768 0.0576476 0 -0.00181768 -0.0576476 0 0.00141907 -0.0289045 0 -0.00719217 -0.0860686 0 -0.00719217 -0.0860686 0.01 0.0025 -9.47877e-17 0.01 -0.00181768 -0.0576476 0.01 0.00141907 -0.0289045 0.01 0.0025 -9.47877e-17 0 -0.00181768 -0.0576476 0 0.00141907 -0.0289045 0 -0.0120669 -0.0849566 0.01 -0.00719217 -0.0860686 0.01 -0.0025 -9.3563e-17 0.01 -0.00676189 -0.0569028 0.01 -0.00356696 -0.0285311 0.01 -0.0120669 0.0849566 0.01 -0.00356696 0.0285311 0.01 -0.00676189 0.0569028 0.01 -0.00719217 0.0860686 0.01 0.0025 -9.47877e-17 0.01 0.00141907 0.0289045 0.01 -0.00181768 0.0576476 0.01 -0.00181768 -0.0576476 0.01 0.00141907 -0.0289045 0.01 -0.0120669 -0.0849566 0 -0.0120669 -0.0849566 0.01 -0.0025 -9.3563e-17 0.01 -0.00676189 -0.0569028 0.01 -0.00356696 -0.0285311 0.01 -0.0025 -9.3563e-17 0 -0.00676189 -0.0569028 0 -0.00356696 -0.0285311 0 -0.0025 -9.3563e-17 0 -0.0025 -9.3563e-17 0.01 -0.0120669 0.0849566 0.01 -0.00356696 0.0285311 0.01 -0.00676189 0.0569028 0.01 -0.0120669 0.0849566 0 -0.00356696 0.0285311 0 -0.00676189 0.0569028 0 -0.0120669 0.0849566 0 -0.00719217 0.0860686 0 -0.00719217 0.0860686 0.01 -0.0120669 0.0849566 0.01 0.0025 -9.47877e-17 0 0.0025 -9.47877e-17 0.01 -0.00719217 0.0860686 0.01 0.00141907 0.0289045 0.01 -0.00181768 0.0576476 0.01 -0.00719217 0.0860686 0 0.00141907 0.0289045 0 -0.00181768 0.0576476 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0122473 -0.0865578 0 -0.00737248 -0.0876698 0 -0.00737248 -0.0876698 0.01 -0.0122473 -0.0865578 0.01 -0.0122473 -0.0865578 0 -0.00737248 -0.0876698 0 -0.0025 -9.53265e-17 0 -0.00684222 -0.0579753 0 -0.00358707 -0.0290688 0 -0.0122473 0.0865578 0 -0.00358707 0.0290688 0 -0.00684222 0.0579753 0 -0.00737248 0.0876698 0 0.0025 -9.65512e-17 0 0.00139896 0.0294423 0 -0.00189801 0.0587201 0 -0.00189801 -0.0587201 0 0.00139896 -0.0294423 0 -0.00737248 -0.0876698 0 -0.00737248 -0.0876698 0.01 0.0025 -9.65512e-17 0.01 -0.00189801 -0.0587201 0.01 0.00139896 -0.0294423 0.01 0.0025 -9.65512e-17 0 -0.00189801 -0.0587201 0 0.00139896 -0.0294423 0 -0.0122473 -0.0865578 0.01 -0.00737248 -0.0876698 0.01 -0.0025 -9.53265e-17 0.01 -0.00684222 -0.0579753 0.01 -0.00358707 -0.0290688 0.01 -0.0122473 0.0865578 0.01 -0.00358707 0.0290688 0.01 -0.00684222 0.0579753 0.01 -0.00737248 0.0876698 0.01 0.0025 -9.65512e-17 0.01 0.00139896 0.0294423 0.01 -0.00189801 0.0587201 0.01 -0.00189801 -0.0587201 0.01 0.00139896 -0.0294423 0.01 -0.0122473 -0.0865578 0 -0.0122473 -0.0865578 0.01 -0.0025 -9.53265e-17 0.01 -0.00684222 -0.0579753 0.01 -0.00358707 -0.0290688 0.01 -0.0025 -9.53265e-17 0 -0.00684222 -0.0579753 0 -0.00358707 -0.0290688 0 -0.0025 -9.53265e-17 0 -0.0025 -9.53265e-17 0.01 -0.0122473 0.0865578 0.01 -0.00358707 0.0290688 0.01 -0.00684222 0.0579753 0.01 -0.0122473 0.0865578 0 -0.00358707 0.0290688 0 -0.00684222 0.0579753 0 -0.0122473 0.0865578 0 -0.00737248 0.0876698 0 -0.00737248 0.0876698 0.01 -0.0122473 0.0865578 0.01 0.0025 -9.65512e-17 0 0.0025 -9.65512e-17 0.01 -0.00737248 0.0876698 0.01 0.00139896 0.0294423 0.01 -0.00189801 0.0587201 0.01 -0.00737248 0.0876698 0 0.00139896 0.0294423 0 -0.00189801 0.0587201 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0123049 -0.0870694 0 -0.00743009 -0.0881814 0 -0.00743009 -0.0881814 0.01 -0.0123049 -0.0870694 0.01 -0.0123049 -0.0870694 0 -0.00743009 -0.0881814 0 -0.0025 -9.58898e-17 0 -0.00686788 -0.0583179 0 -0.0035935 -0.0292406 0 -0.0123049 0.0870694 0 -0.0035935 0.0292406 0 -0.00686788 0.0583179 0 -0.00743009 0.0881814 0 0.0025 -9.71145e-17 0 0.00139254 0.0296141 0 -0.00192367 0.0590627 0 -0.00192367 -0.0590627 0 0.00139254 -0.0296141 0 -0.00743009 -0.0881814 0 -0.00743009 -0.0881814 0.01 0.0025 -9.71145e-17 0.01 -0.00192367 -0.0590627 0.01 0.00139254 -0.0296141 0.01 0.0025 -9.71145e-17 0 -0.00192367 -0.0590627 0 0.00139254 -0.0296141 0 -0.0123049 -0.0870694 0.01 -0.00743009 -0.0881814 0.01 -0.0025 -9.58898e-17 0.01 -0.00686788 -0.0583179 0.01 -0.0035935 -0.0292406 0.01 -0.0123049 0.0870694 0.01 -0.0035935 0.0292406 0.01 -0.00686788 0.0583179 0.01 -0.00743009 0.0881814 0.01 0.0025 -9.71145e-17 0.01 0.00139254 0.0296141 0.01 -0.00192367 0.0590627 0.01 -0.00192367 -0.0590627 0.01 0.00139254 -0.0296141 0.01 -0.0123049 -0.0870694 0 -0.0123049 -0.0870694 0.01 -0.0025 -9.58898e-17 0.01 -0.00686788 -0.0583179 0.01 -0.0035935 -0.0292406 0.01 -0.0025 -9.58898e-17 0 -0.00686788 -0.0583179 0 -0.0035935 -0.0292406 0 -0.0025 -9.58898e-17 0 -0.0025 -9.58898e-17 0.01 -0.0123049 0.0870694 0.01 -0.0035935 0.0292406 0.01 -0.00686788 0.0583179 0.01 -0.0123049 0.0870694 0 -0.0035935 0.0292406 0 -0.00686788 0.0583179 0 -0.0123049 0.0870694 0 -0.00743009 0.0881814 0 -0.00743009 0.0881814 0.01 -0.0123049 0.0870694 0.01 0.0025 -9.71145e-17 0 0.0025 -9.71145e-17 0.01 -0.00743009 0.0881814 0.01 0.00139254 0.0296141 0.01 -0.00192367 0.0590627 0.01 -0.00743009 0.0881814 0 0.00139254 0.0296141 0 -0.00192367 0.0590627 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0124852 -0.0886706 0 -0.00761041 -0.0897826 0 -0.00761041 -0.0897826 0.01 -0.0124852 -0.0886706 0.01 -0.0124852 -0.0886706 0 -0.00761041 -0.0897826 0 -0.0025 -9.76533e-17 0 -0.00694821 -0.0593904 0 -0.00361361 -0.0297784 0 -0.0124852 0.0886706 0 -0.00361361 0.0297784 0 -0.00694821 0.0593904 0 -0.00761041 0.0897826 0 0.0025 -9.8878e-17 0 0.00137243 0.0301518 0 -0.002004 0.0601352 0 -0.002004 -0.0601352 0 0.00137243 -0.0301518 0 -0.00761041 -0.0897826 0 -0.00761041 -0.0897826 0.01 0.0025 -9.8878e-17 0.01 -0.002004 -0.0601352 0.01 0.00137243 -0.0301518 0.01 0.0025 -9.8878e-17 0 -0.002004 -0.0601352 0 0.00137243 -0.0301518 0 -0.0124852 -0.0886706 0.01 -0.00761041 -0.0897826 0.01 -0.0025 -9.76533e-17 0.01 -0.00694821 -0.0593904 0.01 -0.00361361 -0.0297784 0.01 -0.0124852 0.0886706 0.01 -0.00361361 0.0297784 0.01 -0.00694821 0.0593904 0.01 -0.00761041 0.0897826 0.01 0.0025 -9.8878e-17 0.01 0.00137243 0.0301518 0.01 -0.002004 0.0601352 0.01 -0.002004 -0.0601352 0.01 0.00137243 -0.0301518 0.01 -0.0124852 -0.0886706 0 -0.0124852 -0.0886706 0.01 -0.0025 -9.76533e-17 0.01 -0.00694821 -0.0593904 0.01 -0.00361361 -0.0297784 0.01 -0.0025 -9.76533e-17 0 -0.00694821 -0.0593904 0 -0.00361361 -0.0297784 0 -0.0025 -9.76533e-17 0 -0.0025 -9.76533e-17 0.01 -0.0124852 0.0886706 0.01 -0.00361361 0.0297784 0.01 -0.00694821 0.0593904 0.01 -0.0124852 0.0886706 0 -0.00361361 0.0297784 0 -0.00694821 0.0593904 0 -0.0124852 0.0886706 0 -0.00761041 0.0897826 0 -0.00761041 0.0897826 0.01 -0.0124852 0.0886706 0.01 0.0025 -9.8878e-17 0 0.0025 -9.8878e-17 0.01 -0.00761041 0.0897826 0.01 0.00137243 0.0301518 0.01 -0.002004 0.0601352 0.01 -0.00761041 0.0897826 0 0.00137243 0.0301518 0 -0.002004 0.0601352 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0125428 -0.0891822 0 -0.00766801 -0.0902942 0 -0.00766801 -0.0902942 0.01 -0.0125428 -0.0891822 0.01 -0.0125428 -0.0891822 0 -0.00766801 -0.0902942 0 -0.0025 -9.82167e-17 0 -0.00697387 -0.059733 0 -0.00362003 -0.0299502 0 -0.0125428 0.0891822 0 -0.00362003 0.0299502 0 -0.00697387 0.059733 0 -0.00766801 0.0902942 0 0.0025 -9.94413e-17 0 0.001366 0.0303236 0 -0.00202966 0.0604778 0 -0.00202966 -0.0604778 0 0.001366 -0.0303236 0 -0.00766801 -0.0902942 0 -0.00766801 -0.0902942 0.01 0.0025 -9.94413e-17 0.01 -0.00202966 -0.0604778 0.01 0.001366 -0.0303236 0.01 0.0025 -9.94413e-17 0 -0.00202966 -0.0604778 0 0.001366 -0.0303236 0 -0.0125428 -0.0891822 0.01 -0.00766801 -0.0902942 0.01 -0.0025 -9.82167e-17 0.01 -0.00697387 -0.059733 0.01 -0.00362003 -0.0299502 0.01 -0.0125428 0.0891822 0.01 -0.00362003 0.0299502 0.01 -0.00697387 0.059733 0.01 -0.00766801 0.0902942 0.01 0.0025 -9.94413e-17 0.01 0.001366 0.0303236 0.01 -0.00202966 0.0604778 0.01 -0.00202966 -0.0604778 0.01 0.001366 -0.0303236 0.01 -0.0125428 -0.0891822 0 -0.0125428 -0.0891822 0.01 -0.0025 -9.82167e-17 0.01 -0.00697387 -0.059733 0.01 -0.00362003 -0.0299502 0.01 -0.0025 -9.82167e-17 0 -0.00697387 -0.059733 0 -0.00362003 -0.0299502 0 -0.0025 -9.82167e-17 0 -0.0025 -9.82167e-17 0.01 -0.0125428 0.0891822 0.01 -0.00362003 0.0299502 0.01 -0.00697387 0.059733 0.01 -0.0125428 0.0891822 0 -0.00362003 0.0299502 0 -0.00697387 0.059733 0 -0.0125428 0.0891822 0 -0.00766801 0.0902942 0 -0.00766801 0.0902942 0.01 -0.0125428 0.0891822 0.01 0.0025 -9.94413e-17 0 0.0025 -9.94413e-17 0.01 -0.00766801 0.0902942 0.01 0.001366 0.0303236 0.01 -0.00202966 0.0604778 0.01 -0.00766801 0.0902942 0 0.001366 0.0303236 0 -0.00202966 0.0604778 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0105868 -0.0718128 0 -0.00571204 -0.0729248 0 -0.00571204 -0.0729248 0.01 -0.0105868 -0.0718128 0.01 -0.0105868 -0.0718128 0 -0.00571204 -0.0729248 0 -0.0025 -7.90877e-17 0 -0.00610253 -0.0480992 0 -0.00340189 -0.024117 0 -0.0105868 0.0718128 0 -0.00340189 0.024117 0 -0.00610253 0.0480992 0 -0.00571204 0.0729248 0 0.0025 -8.03123e-17 0 0.00158414 0.0244904 0 -0.00115831 0.048844 0 -0.00115831 -0.048844 0 0.00158414 -0.0244904 0 -0.00571204 -0.0729248 0 -0.00571204 -0.0729248 0.01 0.0025 -8.03123e-17 0.01 -0.00115831 -0.048844 0.01 0.00158414 -0.0244904 0.01 0.0025 -8.03123e-17 0 -0.00115831 -0.048844 0 0.00158414 -0.0244904 0 -0.0105868 -0.0718128 0.01 -0.00571204 -0.0729248 0.01 -0.0025 -7.90877e-17 0.01 -0.00610253 -0.0480992 0.01 -0.00340189 -0.024117 0.01 -0.0105868 0.0718128 0.01 -0.00340189 0.024117 0.01 -0.00610253 0.0480992 0.01 -0.00571204 0.0729248 0.01 0.0025 -8.03123e-17 0.01 0.00158414 0.0244904 0.01 -0.00115831 0.048844 0.01 -0.00115831 -0.048844 0.01 0.00158414 -0.0244904 0.01 -0.0105868 -0.0718128 0 -0.0105868 -0.0718128 0.01 -0.0025 -7.90877e-17 0.01 -0.00610253 -0.0480992 0.01 -0.00340189 -0.024117 0.01 -0.0025 -7.90877e-17 0 -0.00610253 -0.0480992 0 -0.00340189 -0.024117 0 -0.0025 -7.90877e-17 0 -0.0025 -7.90877e-17 0.01 -0.0105868 0.0718128 0.01 -0.00340189 0.024117 0.01 -0.00610253 0.0480992 0.01 -0.0105868 0.0718128 0 -0.00340189 0.024117 0 -0.00610253 0.0480992 0 -0.0105868 0.0718128 0 -0.00571204 0.0729248 0 -0.00571204 0.0729248 0.01 -0.0105868 0.0718128 0.01 0.0025 -8.03123e-17 0 0.0025 -8.03123e-17 0.01 -0.00571204 0.0729248 0.01 0.00158414 0.0244904 0.01 -0.00115831 0.048844 0.01 -0.00571204 0.0729248 0 0.00158414 0.0244904 0 -0.00115831 0.048844 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0106444 -0.0723243 0 -0.00576965 -0.0734363 0 -0.00576965 -0.0734363 0.01 -0.0106444 -0.0723243 0.01 -0.0106444 -0.0723243 0 -0.00576965 -0.0734363 0 -0.0025 -7.9651e-17 0 -0.00612819 -0.0484418 0 -0.00340832 -0.0242888 0 -0.0106444 0.0723243 0 -0.00340832 0.0242888 0 -0.00612819 0.0484418 0 -0.00576965 0.0734363 0 0.0025 -8.08757e-17 0 0.00157772 0.0246622 0 -0.00118397 0.0491866 0 -0.00118397 -0.0491866 0 0.00157772 -0.0246622 0 -0.00576965 -0.0734363 0 -0.00576965 -0.0734363 0.01 0.0025 -8.08757e-17 0.01 -0.00118397 -0.0491866 0.01 0.00157772 -0.0246622 0.01 0.0025 -8.08757e-17 0 -0.00118397 -0.0491866 0 0.00157772 -0.0246622 0 -0.0106444 -0.0723243 0.01 -0.00576965 -0.0734363 0.01 -0.0025 -7.9651e-17 0.01 -0.00612819 -0.0484418 0.01 -0.00340832 -0.0242888 0.01 -0.0106444 0.0723243 0.01 -0.00340832 0.0242888 0.01 -0.00612819 0.0484418 0.01 -0.00576965 0.0734363 0.01 0.0025 -8.08757e-17 0.01 0.00157772 0.0246622 0.01 -0.00118397 0.0491866 0.01 -0.00118397 -0.0491866 0.01 0.00157772 -0.0246622 0.01 -0.0106444 -0.0723243 0 -0.0106444 -0.0723243 0.01 -0.0025 -7.9651e-17 0.01 -0.00612819 -0.0484418 0.01 -0.00340832 -0.0242888 0.01 -0.0025 -7.9651e-17 0 -0.00612819 -0.0484418 0 -0.00340832 -0.0242888 0 -0.0025 -7.9651e-17 0 -0.0025 -7.9651e-17 0.01 -0.0106444 0.0723243 0.01 -0.00340832 0.0242888 0.01 -0.00612819 0.0484418 0.01 -0.0106444 0.0723243 0 -0.00340832 0.0242888 0 -0.00612819 0.0484418 0 -0.0106444 0.0723243 0 -0.00576965 0.0734363 0 -0.00576965 0.0734363 0.01 -0.0106444 0.0723243 0.01 0.0025 -8.08757e-17 0 0.0025 -8.08757e-17 0.01 -0.00576965 0.0734363 0.01 0.00157772 0.0246622 0.01 -0.00118397 0.0491866 0.01 -0.00576965 0.0734363 0 0.00157772 0.0246622 0 -0.00118397 0.0491866 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0108247 -0.0739256 0 -0.00594997 -0.0750376 0 -0.00594997 -0.0750376 0.01 -0.0108247 -0.0739256 0.01 -0.0108247 -0.0739256 0 -0.00594997 -0.0750376 0 -0.0025 -8.14145e-17 0 -0.00620852 -0.0495143 0 -0.00342843 -0.0248265 0 -0.0108247 0.0739256 0 -0.00342843 0.0248265 0 -0.00620852 0.0495143 0 -0.00594997 0.0750376 0 0.0025 -8.26392e-17 0 0.00155761 0.0252 0 -0.0012643 0.0502591 0 -0.0012643 -0.0502591 0 0.00155761 -0.0252 0 -0.00594997 -0.0750376 0 -0.00594997 -0.0750376 0.01 0.0025 -8.26392e-17 0.01 -0.0012643 -0.0502591 0.01 0.00155761 -0.0252 0.01 0.0025 -8.26392e-17 0 -0.0012643 -0.0502591 0 0.00155761 -0.0252 0 -0.0108247 -0.0739256 0.01 -0.00594997 -0.0750376 0.01 -0.0025 -8.14145e-17 0.01 -0.00620852 -0.0495143 0.01 -0.00342843 -0.0248265 0.01 -0.0108247 0.0739256 0.01 -0.00342843 0.0248265 0.01 -0.00620852 0.0495143 0.01 -0.00594997 0.0750376 0.01 0.0025 -8.26392e-17 0.01 0.00155761 0.0252 0.01 -0.0012643 0.0502591 0.01 -0.0012643 -0.0502591 0.01 0.00155761 -0.0252 0.01 -0.0108247 -0.0739256 0 -0.0108247 -0.0739256 0.01 -0.0025 -8.14145e-17 0.01 -0.00620852 -0.0495143 0.01 -0.00342843 -0.0248265 0.01 -0.0025 -8.14145e-17 0 -0.00620852 -0.0495143 0 -0.00342843 -0.0248265 0 -0.0025 -8.14145e-17 0 -0.0025 -8.14145e-17 0.01 -0.0108247 0.0739256 0.01 -0.00342843 0.0248265 0.01 -0.00620852 0.0495143 0.01 -0.0108247 0.0739256 0 -0.00342843 0.0248265 0 -0.00620852 0.0495143 0 -0.0108247 0.0739256 0 -0.00594997 0.0750376 0 -0.00594997 0.0750376 0.01 -0.0108247 0.0739256 0.01 0.0025 -8.26392e-17 0 0.0025 -8.26392e-17 0.01 -0.00594997 0.0750376 0.01 0.00155761 0.0252 0.01 -0.0012643 0.0502591 0.01 -0.00594997 0.0750376 0 0.00155761 0.0252 0 -0.0012643 0.0502591 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0108798 -0.0744148 0 -0.00600506 -0.0755268 0 -0.00600506 -0.0755268 0.01 -0.0108798 -0.0744148 0.01 -0.0108798 -0.0744148 0 -0.00600506 -0.0755268 0 -0.0025 -8.19534e-17 0 -0.00623306 -0.049842 0 -0.00343457 -0.0249908 0 -0.0108798 0.0744148 0 -0.00343457 0.0249908 0 -0.00623306 0.049842 0 -0.00600506 0.0755268 0 0.0025 -8.3178e-17 0 0.00155146 0.0253643 0 -0.00128885 0.0505868 0 -0.00128885 -0.0505868 0 0.00155146 -0.0253643 0 -0.00600506 -0.0755268 0 -0.00600506 -0.0755268 0.01 0.0025 -8.3178e-17 0.01 -0.00128885 -0.0505868 0.01 0.00155146 -0.0253643 0.01 0.0025 -8.3178e-17 0 -0.00128885 -0.0505868 0 0.00155146 -0.0253643 0 -0.0108798 -0.0744148 0.01 -0.00600506 -0.0755268 0.01 -0.0025 -8.19534e-17 0.01 -0.00623306 -0.049842 0.01 -0.00343457 -0.0249908 0.01 -0.0108798 0.0744148 0.01 -0.00343457 0.0249908 0.01 -0.00623306 0.049842 0.01 -0.00600506 0.0755268 0.01 0.0025 -8.3178e-17 0.01 0.00155146 0.0253643 0.01 -0.00128885 0.0505868 0.01 -0.00128885 -0.0505868 0.01 0.00155146 -0.0253643 0.01 -0.0108798 -0.0744148 0 -0.0108798 -0.0744148 0.01 -0.0025 -8.19534e-17 0.01 -0.00623306 -0.049842 0.01 -0.00343457 -0.0249908 0.01 -0.0025 -8.19534e-17 0 -0.00623306 -0.049842 0 -0.00343457 -0.0249908 0 -0.0025 -8.19534e-17 0 -0.0025 -8.19534e-17 0.01 -0.0108798 0.0744148 0.01 -0.00343457 0.0249908 0.01 -0.00623306 0.049842 0.01 -0.0108798 0.0744148 0 -0.00343457 0.0249908 0 -0.00623306 0.049842 0 -0.0108798 0.0744148 0 -0.00600506 0.0755268 0 -0.00600506 0.0755268 0.01 -0.0108798 0.0744148 0.01 0.0025 -8.3178e-17 0 0.0025 -8.3178e-17 0.01 -0.00600506 0.0755268 0.01 0.00155146 0.0253643 0.01 -0.00128885 0.0505868 0.01 -0.00600506 0.0755268 0 0.00155146 0.0253643 0 -0.00128885 0.0505868 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0110602 -0.0760161 0 -0.00618538 -0.0771281 0 -0.00618538 -0.0771281 0.01 -0.0110602 -0.0760161 0.01 -0.0110602 -0.0760161 0 -0.00618538 -0.0771281 0 -0.0025 -8.37169e-17 0 -0.00631339 -0.0509146 0 -0.00345468 -0.0255286 0 -0.0110602 0.0760161 0 -0.00345468 0.0255286 0 -0.00631339 0.0509146 0 -0.00618538 0.0771281 0 0.0025 -8.49415e-17 0 0.00153135 0.025902 0 -0.00136917 0.0516594 0 -0.00136917 -0.0516594 0 0.00153135 -0.025902 0 -0.00618538 -0.0771281 0 -0.00618538 -0.0771281 0.01 0.0025 -8.49415e-17 0.01 -0.00136917 -0.0516594 0.01 0.00153135 -0.025902 0.01 0.0025 -8.49415e-17 0 -0.00136917 -0.0516594 0 0.00153135 -0.025902 0 -0.0110602 -0.0760161 0.01 -0.00618538 -0.0771281 0.01 -0.0025 -8.37169e-17 0.01 -0.00631339 -0.0509146 0.01 -0.00345468 -0.0255286 0.01 -0.0110602 0.0760161 0.01 -0.00345468 0.0255286 0.01 -0.00631339 0.0509146 0.01 -0.00618538 0.0771281 0.01 0.0025 -8.49415e-17 0.01 0.00153135 0.025902 0.01 -0.00136917 0.0516594 0.01 -0.00136917 -0.0516594 0.01 0.00153135 -0.025902 0.01 -0.0110602 -0.0760161 0 -0.0110602 -0.0760161 0.01 -0.0025 -8.37169e-17 0.01 -0.00631339 -0.0509146 0.01 -0.00345468 -0.0255286 0.01 -0.0025 -8.37169e-17 0 -0.00631339 -0.0509146 0 -0.00345468 -0.0255286 0 -0.0025 -8.37169e-17 0 -0.0025 -8.37169e-17 0.01 -0.0110602 0.0760161 0.01 -0.00345468 0.0255286 0.01 -0.00631339 0.0509146 0.01 -0.0110602 0.0760161 0 -0.00345468 0.0255286 0 -0.00631339 0.0509146 0 -0.0110602 0.0760161 0 -0.00618538 0.0771281 0 -0.00618538 0.0771281 0.01 -0.0110602 0.0760161 0.01 0.0025 -8.49415e-17 0 0.0025 -8.49415e-17 0.01 -0.00618538 0.0771281 0.01 0.00153135 0.025902 0.01 -0.00136917 0.0516594 0.01 -0.00618538 0.0771281 0 0.00153135 0.025902 0 -0.00136917 0.0516594 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0111178 -0.0765276 0 -0.00624298 -0.0776396 0 -0.00624298 -0.0776396 0.01 -0.0111178 -0.0765276 0.01 -0.0111178 -0.0765276 0 -0.00624298 -0.0776396 0 -0.0025 -8.42802e-17 0 -0.00633905 -0.0512572 0 -0.00346111 -0.0257004 0 -0.0111178 0.0765276 0 -0.00346111 0.0257004 0 -0.00633905 0.0512572 0 -0.00624298 0.0776396 0 0.0025 -8.55048e-17 0 0.00152493 0.0260738 0 -0.00139484 0.052002 0 -0.00139484 -0.052002 0 0.00152493 -0.0260738 0 -0.00624298 -0.0776396 0 -0.00624298 -0.0776396 0.01 0.0025 -8.55048e-17 0.01 -0.00139484 -0.052002 0.01 0.00152493 -0.0260738 0.01 0.0025 -8.55048e-17 0 -0.00139484 -0.052002 0 0.00152493 -0.0260738 0 -0.0111178 -0.0765276 0.01 -0.00624298 -0.0776396 0.01 -0.0025 -8.42802e-17 0.01 -0.00633905 -0.0512572 0.01 -0.00346111 -0.0257004 0.01 -0.0111178 0.0765276 0.01 -0.00346111 0.0257004 0.01 -0.00633905 0.0512572 0.01 -0.00624298 0.0776396 0.01 0.0025 -8.55048e-17 0.01 0.00152493 0.0260738 0.01 -0.00139484 0.052002 0.01 -0.00139484 -0.052002 0.01 0.00152493 -0.0260738 0.01 -0.0111178 -0.0765276 0 -0.0111178 -0.0765276 0.01 -0.0025 -8.42802e-17 0.01 -0.00633905 -0.0512572 0.01 -0.00346111 -0.0257004 0.01 -0.0025 -8.42802e-17 0 -0.00633905 -0.0512572 0 -0.00346111 -0.0257004 0 -0.0025 -8.42802e-17 0 -0.0025 -8.42802e-17 0.01 -0.0111178 0.0765276 0.01 -0.00346111 0.0257004 0.01 -0.00633905 0.0512572 0.01 -0.0111178 0.0765276 0 -0.00346111 0.0257004 0 -0.00633905 0.0512572 0 -0.0111178 0.0765276 0 -0.00624298 0.0776396 0 -0.00624298 0.0776396 0.01 -0.0111178 0.0765276 0.01 0.0025 -8.55048e-17 0 0.0025 -8.55048e-17 0.01 -0.00624298 0.0776396 0.01 0.00152493 0.0260738 0.01 -0.00139484 0.052002 0.01 -0.00624298 0.0776396 0 0.00152493 0.0260738 0 -0.00139484 0.052002 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0112981 -0.0781289 0 -0.0064233 -0.0792409 0 -0.0064233 -0.0792409 0.01 -0.0112981 -0.0781289 0.01 -0.0112981 -0.0781289 0 -0.0064233 -0.0792409 0 -0.0025 -8.60437e-17 0 -0.00641938 -0.0523297 0 -0.00348122 -0.0262381 0 -0.0112981 0.0781289 0 -0.00348122 0.0262381 0 -0.00641938 0.0523297 0 -0.0064233 0.0792409 0 0.0025 -8.72683e-17 0 0.00150482 0.0266116 0 -0.00147516 0.0530745 0 -0.00147516 -0.0530745 0 0.00150482 -0.0266116 0 -0.0064233 -0.0792409 0 -0.0064233 -0.0792409 0.01 0.0025 -8.72683e-17 0.01 -0.00147516 -0.0530745 0.01 0.00150482 -0.0266116 0.01 0.0025 -8.72683e-17 0 -0.00147516 -0.0530745 0 0.00150482 -0.0266116 0 -0.0112981 -0.0781289 0.01 -0.0064233 -0.0792409 0.01 -0.0025 -8.60437e-17 0.01 -0.00641938 -0.0523297 0.01 -0.00348122 -0.0262381 0.01 -0.0112981 0.0781289 0.01 -0.00348122 0.0262381 0.01 -0.00641938 0.0523297 0.01 -0.0064233 0.0792409 0.01 0.0025 -8.72683e-17 0.01 0.00150482 0.0266116 0.01 -0.00147516 0.0530745 0.01 -0.00147516 -0.0530745 0.01 0.00150482 -0.0266116 0.01 -0.0112981 -0.0781289 0 -0.0112981 -0.0781289 0.01 -0.0025 -8.60437e-17 0.01 -0.00641938 -0.0523297 0.01 -0.00348122 -0.0262381 0.01 -0.0025 -8.60437e-17 0 -0.00641938 -0.0523297 0 -0.00348122 -0.0262381 0 -0.0025 -8.60437e-17 0 -0.0025 -8.60437e-17 0.01 -0.0112981 0.0781289 0.01 -0.00348122 0.0262381 0.01 -0.00641938 0.0523297 0.01 -0.0112981 0.0781289 0 -0.00348122 0.0262381 0 -0.00641938 0.0523297 0 -0.0112981 0.0781289 0 -0.0064233 0.0792409 0 -0.0064233 0.0792409 0.01 -0.0112981 0.0781289 0.01 0.0025 -8.72683e-17 0 0.0025 -8.72683e-17 0.01 -0.0064233 0.0792409 0.01 0.00150482 0.0266116 0.01 -0.00147516 0.0530745 0.01 -0.0064233 0.0792409 0 0.00150482 0.0266116 0 -0.00147516 0.0530745 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0113557 -0.0786404 0 -0.00648091 -0.0797524 0 -0.00648091 -0.0797524 0.01 -0.0113557 -0.0786404 0.01 -0.0113557 -0.0786404 0 -0.00648091 -0.0797524 0 -0.0025 -8.6607e-17 0 -0.00644504 -0.0526723 0 -0.00348764 -0.0264099 0 -0.0113557 0.0786404 0 -0.00348764 0.0264099 0 -0.00644504 0.0526723 0 -0.00648091 0.0797524 0 0.0025 -8.78317e-17 0 0.00149839 0.0267834 0 -0.00150082 0.0534171 0 -0.00150082 -0.0534171 0 0.00149839 -0.0267834 0 -0.00648091 -0.0797524 0 -0.00648091 -0.0797524 0.01 0.0025 -8.78317e-17 0.01 -0.00150082 -0.0534171 0.01 0.00149839 -0.0267834 0.01 0.0025 -8.78317e-17 0 -0.00150082 -0.0534171 0 0.00149839 -0.0267834 0 -0.0113557 -0.0786404 0.01 -0.00648091 -0.0797524 0.01 -0.0025 -8.6607e-17 0.01 -0.00644504 -0.0526723 0.01 -0.00348764 -0.0264099 0.01 -0.0113557 0.0786404 0.01 -0.00348764 0.0264099 0.01 -0.00644504 0.0526723 0.01 -0.00648091 0.0797524 0.01 0.0025 -8.78317e-17 0.01 0.00149839 0.0267834 0.01 -0.00150082 0.0534171 0.01 -0.00150082 -0.0534171 0.01 0.00149839 -0.0267834 0.01 -0.0113557 -0.0786404 0 -0.0113557 -0.0786404 0.01 -0.0025 -8.6607e-17 0.01 -0.00644504 -0.0526723 0.01 -0.00348764 -0.0264099 0.01 -0.0025 -8.6607e-17 0 -0.00644504 -0.0526723 0 -0.00348764 -0.0264099 0 -0.0025 -8.6607e-17 0 -0.0025 -8.6607e-17 0.01 -0.0113557 0.0786404 0.01 -0.00348764 0.0264099 0.01 -0.00644504 0.0526723 0.01 -0.0113557 0.0786404 0 -0.00348764 0.0264099 0 -0.00644504 0.0526723 0 -0.0113557 0.0786404 0 -0.00648091 0.0797524 0 -0.00648091 0.0797524 0.01 -0.0113557 0.0786404 0.01 0.0025 -8.78317e-17 0 0.0025 -8.78317e-17 0.01 -0.00648091 0.0797524 0.01 0.00149839 0.0267834 0.01 -0.00150082 0.0534171 0.01 -0.00648091 0.0797524 0 0.00149839 0.0267834 0 -0.00150082 0.0534171 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0138476 -0.100769 0 -0.00897282 -0.101881 0 -0.00897282 -0.101881 0.01 -0.0138476 -0.100769 0.01 -0.0138476 -0.100769 0 -0.00897282 -0.101881 0 -0.0025 -1.10977e-16 0 -0.00755514 -0.0674938 0 -0.00376555 -0.0338414 0 -0.0138476 0.100769 0 -0.00376555 0.0338414 0 -0.00755514 0.0674938 0 -0.00897282 0.101881 0 0.0025 -1.12202e-16 0 0.00122048 0.0342149 0 -0.00261093 0.0682386 0 -0.00261093 -0.0682386 0 0.00122048 -0.0342149 0 -0.00897282 -0.101881 0 -0.00897282 -0.101881 0.01 0.0025 -1.12202e-16 0.01 -0.00261093 -0.0682386 0.01 0.00122048 -0.0342149 0.01 0.0025 -1.12202e-16 0 -0.00261093 -0.0682386 0 0.00122048 -0.0342149 0 -0.0138476 -0.100769 0.01 -0.00897282 -0.101881 0.01 -0.0025 -1.10977e-16 0.01 -0.00755514 -0.0674938 0.01 -0.00376555 -0.0338414 0.01 -0.0138476 0.100769 0.01 -0.00376555 0.0338414 0.01 -0.00755514 0.0674938 0.01 -0.00897282 0.101881 0.01 0.0025 -1.12202e-16 0.01 0.00122048 0.0342149 0.01 -0.00261093 0.0682386 0.01 -0.00261093 -0.0682386 0.01 0.00122048 -0.0342149 0.01 -0.0138476 -0.100769 0 -0.0138476 -0.100769 0.01 -0.0025 -1.10977e-16 0.01 -0.00755514 -0.0674938 0.01 -0.00376555 -0.0338414 0.01 -0.0025 -1.10977e-16 0 -0.00755514 -0.0674938 0 -0.00376555 -0.0338414 0 -0.0025 -1.10977e-16 0 -0.0025 -1.10977e-16 0.01 -0.0138476 0.100769 0.01 -0.00376555 0.0338414 0.01 -0.00755514 0.0674938 0.01 -0.0138476 0.100769 0 -0.00376555 0.0338414 0 -0.00755514 0.0674938 0 -0.0138476 0.100769 0 -0.00897282 0.101881 0 -0.00897282 0.101881 0.01 -0.0138476 0.100769 0.01 0.0025 -1.12202e-16 0 0.0025 -1.12202e-16 0.01 -0.00897282 0.101881 0.01 0.00122048 0.0342149 0.01 -0.00261093 0.0682386 0.01 -0.00897282 0.101881 0 0.00122048 0.0342149 0 -0.00261093 0.0682386 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0138852 -0.101103 0 -0.00901039 -0.102215 0 -0.00901039 -0.102215 0.01 -0.0138852 -0.101103 0.01 -0.0138852 -0.101103 0 -0.00901039 -0.102215 0 -0.0025 -1.11345e-16 0 -0.00757188 -0.0677173 0 -0.00376974 -0.0339535 0 -0.0138852 0.101103 0 -0.00376974 0.0339535 0 -0.00757188 0.0677173 0 -0.00901039 0.102215 0 0.0025 -1.1257e-16 0 0.00121629 0.0343269 0 -0.00262766 0.0684621 0 -0.00262766 -0.0684621 0 0.00121629 -0.0343269 0 -0.00901039 -0.102215 0 -0.00901039 -0.102215 0.01 0.0025 -1.1257e-16 0.01 -0.00262766 -0.0684621 0.01 0.00121629 -0.0343269 0.01 0.0025 -1.1257e-16 0 -0.00262766 -0.0684621 0 0.00121629 -0.0343269 0 -0.0138852 -0.101103 0.01 -0.00901039 -0.102215 0.01 -0.0025 -1.11345e-16 0.01 -0.00757188 -0.0677173 0.01 -0.00376974 -0.0339535 0.01 -0.0138852 0.101103 0.01 -0.00376974 0.0339535 0.01 -0.00757188 0.0677173 0.01 -0.00901039 0.102215 0.01 0.0025 -1.1257e-16 0.01 0.00121629 0.0343269 0.01 -0.00262766 0.0684621 0.01 -0.00262766 -0.0684621 0.01 0.00121629 -0.0343269 0.01 -0.0138852 -0.101103 0 -0.0138852 -0.101103 0.01 -0.0025 -1.11345e-16 0.01 -0.00757188 -0.0677173 0.01 -0.00376974 -0.0339535 0.01 -0.0025 -1.11345e-16 0 -0.00757188 -0.0677173 0 -0.00376974 -0.0339535 0 -0.0025 -1.11345e-16 0 -0.0025 -1.11345e-16 0.01 -0.0138852 0.101103 0.01 -0.00376974 0.0339535 0.01 -0.00757188 0.0677173 0.01 -0.0138852 0.101103 0 -0.00376974 0.0339535 0 -0.00757188 0.0677173 0 -0.0138852 0.101103 0 -0.00901039 0.102215 0 -0.00901039 0.102215 0.01 -0.0138852 0.101103 0.01 0.0025 -1.1257e-16 0 0.0025 -1.1257e-16 0.01 -0.00901039 0.102215 0.01 0.00121629 0.0343269 0.01 -0.00262766 0.0684621 0.01 -0.00901039 0.102215 0 0.00121629 0.0343269 0 -0.00262766 0.0684621 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0149946 -0.110955 0 -0.0101199 -0.112067 0 -0.0101199 -0.112067 0.01 -0.0149946 -0.110955 0.01 -0.0149946 -0.110955 0 -0.0101199 -0.112067 0 -0.0025 -1.22195e-16 0 -0.00806612 -0.0743162 0 -0.00389348 -0.0372622 0 -0.0149946 0.110955 0 -0.00389348 0.0372622 0 -0.00806612 0.0743162 0 -0.0101199 0.112067 0 0.0025 -1.2342e-16 0 0.00109256 0.0376356 0 -0.00312191 0.075061 0 -0.00312191 -0.075061 0 0.00109256 -0.0376356 0 -0.0101199 -0.112067 0 -0.0101199 -0.112067 0.01 0.0025 -1.2342e-16 0.01 -0.00312191 -0.075061 0.01 0.00109256 -0.0376356 0.01 0.0025 -1.2342e-16 0 -0.00312191 -0.075061 0 0.00109256 -0.0376356 0 -0.0149946 -0.110955 0.01 -0.0101199 -0.112067 0.01 -0.0025 -1.22195e-16 0.01 -0.00806612 -0.0743162 0.01 -0.00389348 -0.0372622 0.01 -0.0149946 0.110955 0.01 -0.00389348 0.0372622 0.01 -0.00806612 0.0743162 0.01 -0.0101199 0.112067 0.01 0.0025 -1.2342e-16 0.01 0.00109256 0.0376356 0.01 -0.00312191 0.075061 0.01 -0.00312191 -0.075061 0.01 0.00109256 -0.0376356 0.01 -0.0149946 -0.110955 0 -0.0149946 -0.110955 0.01 -0.0025 -1.22195e-16 0.01 -0.00806612 -0.0743162 0.01 -0.00389348 -0.0372622 0.01 -0.0025 -1.22195e-16 0 -0.00806612 -0.0743162 0 -0.00389348 -0.0372622 0 -0.0025 -1.22195e-16 0 -0.0025 -1.22195e-16 0.01 -0.0149946 0.110955 0.01 -0.00389348 0.0372622 0.01 -0.00806612 0.0743162 0.01 -0.0149946 0.110955 0 -0.00389348 0.0372622 0 -0.00806612 0.0743162 0 -0.0149946 0.110955 0 -0.0101199 0.112067 0 -0.0101199 0.112067 0.01 -0.0149946 0.110955 0.01 0.0025 -1.2342e-16 0 0.0025 -1.2342e-16 0.01 -0.0101199 0.112067 0.01 0.00109256 0.0376356 0.01 -0.00312191 0.075061 0.01 -0.0101199 0.112067 0 0.00109256 0.0376356 0 -0.00312191 0.075061 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0150322 -0.111289 0 -0.0101574 -0.112401 0 -0.0101574 -0.112401 0.01 -0.0150322 -0.111289 0.01 -0.0150322 -0.111289 0 -0.0101574 -0.112401 0 -0.0025 -1.22563e-16 0 -0.00808286 -0.0745396 0 -0.00389767 -0.0373742 0 -0.0150322 0.111289 0 -0.00389767 0.0373742 0 -0.00808286 0.0745396 0 -0.0101574 0.112401 0 0.0025 -1.23787e-16 0 0.00108837 0.0377476 0 -0.00313864 0.0752844 0 -0.00313864 -0.0752844 0 0.00108837 -0.0377476 0 -0.0101574 -0.112401 0 -0.0101574 -0.112401 0.01 0.0025 -1.23787e-16 0.01 -0.00313864 -0.0752844 0.01 0.00108837 -0.0377476 0.01 0.0025 -1.23787e-16 0 -0.00313864 -0.0752844 0 0.00108837 -0.0377476 0 -0.0150322 -0.111289 0.01 -0.0101574 -0.112401 0.01 -0.0025 -1.22563e-16 0.01 -0.00808286 -0.0745396 0.01 -0.00389767 -0.0373742 0.01 -0.0150322 0.111289 0.01 -0.00389767 0.0373742 0.01 -0.00808286 0.0745396 0.01 -0.0101574 0.112401 0.01 0.0025 -1.23787e-16 0.01 0.00108837 0.0377476 0.01 -0.00313864 0.0752844 0.01 -0.00313864 -0.0752844 0.01 0.00108837 -0.0377476 0.01 -0.0150322 -0.111289 0 -0.0150322 -0.111289 0.01 -0.0025 -1.22563e-16 0.01 -0.00808286 -0.0745396 0.01 -0.00389767 -0.0373742 0.01 -0.0025 -1.22563e-16 0 -0.00808286 -0.0745396 0 -0.00389767 -0.0373742 0 -0.0025 -1.22563e-16 0 -0.0025 -1.22563e-16 0.01 -0.0150322 0.111289 0.01 -0.00389767 0.0373742 0.01 -0.00808286 0.0745396 0.01 -0.0150322 0.111289 0 -0.00389767 0.0373742 0 -0.00808286 0.0745396 0 -0.0150322 0.111289 0 -0.0101574 0.112401 0 -0.0101574 0.112401 0.01 -0.0150322 0.111289 0.01 0.0025 -1.23787e-16 0 0.0025 -1.23787e-16 0.01 -0.0101574 0.112401 0.01 0.00108837 0.0377476 0.01 -0.00313864 0.0752844 0.01 -0.0101574 0.112401 0 0.00108837 0.0377476 0 -0.00313864 0.0752844 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.015225 -0.113001 0 -0.0103503 -0.114113 0 -0.0103503 -0.114113 0.01 -0.015225 -0.113001 0.01 -0.015225 -0.113001 0 -0.0103503 -0.114113 0 -0.0025 -1.24449e-16 0 -0.00816877 -0.0756866 0 -0.00391917 -0.0379493 0 -0.015225 0.113001 0 -0.00391917 0.0379493 0 -0.00816877 0.0756866 0 -0.0103503 0.114113 0 0.0025 -1.25673e-16 0 0.00106686 0.0383227 0 -0.00322455 0.0764314 0 -0.00322455 -0.0764314 0 0.00106686 -0.0383227 0 -0.0103503 -0.114113 0 -0.0103503 -0.114113 0.01 0.0025 -1.25673e-16 0.01 -0.00322455 -0.0764314 0.01 0.00106686 -0.0383227 0.01 0.0025 -1.25673e-16 0 -0.00322455 -0.0764314 0 0.00106686 -0.0383227 0 -0.015225 -0.113001 0.01 -0.0103503 -0.114113 0.01 -0.0025 -1.24449e-16 0.01 -0.00816877 -0.0756866 0.01 -0.00391917 -0.0379493 0.01 -0.015225 0.113001 0.01 -0.00391917 0.0379493 0.01 -0.00816877 0.0756866 0.01 -0.0103503 0.114113 0.01 0.0025 -1.25673e-16 0.01 0.00106686 0.0383227 0.01 -0.00322455 0.0764314 0.01 -0.00322455 -0.0764314 0.01 0.00106686 -0.0383227 0.01 -0.015225 -0.113001 0 -0.015225 -0.113001 0.01 -0.0025 -1.24449e-16 0.01 -0.00816877 -0.0756866 0.01 -0.00391917 -0.0379493 0.01 -0.0025 -1.24449e-16 0 -0.00816877 -0.0756866 0 -0.00391917 -0.0379493 0 -0.0025 -1.24449e-16 0 -0.0025 -1.24449e-16 0.01 -0.015225 0.113001 0.01 -0.00391917 0.0379493 0.01 -0.00816877 0.0756866 0.01 -0.015225 0.113001 0 -0.00391917 0.0379493 0 -0.00816877 0.0756866 0 -0.015225 0.113001 0 -0.0103503 0.114113 0 -0.0103503 0.114113 0.01 -0.015225 0.113001 0.01 0.0025 -1.25673e-16 0 0.0025 -1.25673e-16 0.01 -0.0103503 0.114113 0.01 0.00106686 0.0383227 0.01 -0.00322455 0.0764314 0.01 -0.0103503 0.114113 0 0.00106686 0.0383227 0 -0.00322455 0.0764314 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0152626 -0.113335 0 -0.0103878 -0.114447 0 -0.0103878 -0.114447 0.01 -0.0152626 -0.113335 0.01 -0.0152626 -0.113335 0 -0.0103878 -0.114447 0 -0.0025 -1.24816e-16 0 -0.0081855 -0.0759101 0 -0.00392336 -0.0380613 0 -0.0152626 0.113335 0 -0.00392336 0.0380613 0 -0.0081855 0.0759101 0 -0.0103878 0.114447 0 0.0025 -1.26041e-16 0 0.00106267 0.0384348 0 -0.00324128 0.0766549 0 -0.00324128 -0.0766549 0 0.00106267 -0.0384348 0 -0.0103878 -0.114447 0 -0.0103878 -0.114447 0.01 0.0025 -1.26041e-16 0.01 -0.00324128 -0.0766549 0.01 0.00106267 -0.0384348 0.01 0.0025 -1.26041e-16 0 -0.00324128 -0.0766549 0 0.00106267 -0.0384348 0 -0.0152626 -0.113335 0.01 -0.0103878 -0.114447 0.01 -0.0025 -1.24816e-16 0.01 -0.0081855 -0.0759101 0.01 -0.00392336 -0.0380613 0.01 -0.0152626 0.113335 0.01 -0.00392336 0.0380613 0.01 -0.0081855 0.0759101 0.01 -0.0103878 0.114447 0.01 0.0025 -1.26041e-16 0.01 0.00106267 0.0384348 0.01 -0.00324128 0.0766549 0.01 -0.00324128 -0.0766549 0.01 0.00106267 -0.0384348 0.01 -0.0152626 -0.113335 0 -0.0152626 -0.113335 0.01 -0.0025 -1.24816e-16 0.01 -0.0081855 -0.0759101 0.01 -0.00392336 -0.0380613 0.01 -0.0025 -1.24816e-16 0 -0.0081855 -0.0759101 0 -0.00392336 -0.0380613 0 -0.0025 -1.24816e-16 0 -0.0025 -1.24816e-16 0.01 -0.0152626 0.113335 0.01 -0.00392336 0.0380613 0.01 -0.0081855 0.0759101 0.01 -0.0152626 0.113335 0 -0.00392336 0.0380613 0 -0.0081855 0.0759101 0 -0.0152626 0.113335 0 -0.0103878 0.114447 0 -0.0103878 0.114447 0.01 -0.0152626 0.113335 0.01 0.0025 -1.26041e-16 0 0.0025 -1.26041e-16 0.01 -0.0103878 0.114447 0.01 0.00106267 0.0384348 0.01 -0.00324128 0.0766549 0.01 -0.0103878 0.114447 0 0.00106267 0.0384348 0 -0.00324128 0.0766549 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0154554 -0.115047 0 -0.0105807 -0.116159 0 -0.0105807 -0.116159 0.01 -0.0154554 -0.115047 0.01 -0.0154554 -0.115047 0 -0.0105807 -0.116159 0 -0.0025 -1.26702e-16 0 -0.00827141 -0.0770571 0 -0.00394487 -0.0386364 0 -0.0154554 0.115047 0 -0.00394487 0.0386364 0 -0.00827141 0.0770571 0 -0.0105807 0.116159 0 0.0025 -1.27927e-16 0 0.00104116 0.0390099 0 -0.00332719 0.0778019 0 -0.00332719 -0.0778019 0 0.00104116 -0.0390099 0 -0.0105807 -0.116159 0 -0.0105807 -0.116159 0.01 0.0025 -1.27927e-16 0.01 -0.00332719 -0.0778019 0.01 0.00104116 -0.0390099 0.01 0.0025 -1.27927e-16 0 -0.00332719 -0.0778019 0 0.00104116 -0.0390099 0 -0.0154554 -0.115047 0.01 -0.0105807 -0.116159 0.01 -0.0025 -1.26702e-16 0.01 -0.00827141 -0.0770571 0.01 -0.00394487 -0.0386364 0.01 -0.0154554 0.115047 0.01 -0.00394487 0.0386364 0.01 -0.00827141 0.0770571 0.01 -0.0105807 0.116159 0.01 0.0025 -1.27927e-16 0.01 0.00104116 0.0390099 0.01 -0.00332719 0.0778019 0.01 -0.00332719 -0.0778019 0.01 0.00104116 -0.0390099 0.01 -0.0154554 -0.115047 0 -0.0154554 -0.115047 0.01 -0.0025 -1.26702e-16 0.01 -0.00827141 -0.0770571 0.01 -0.00394487 -0.0386364 0.01 -0.0025 -1.26702e-16 0 -0.00827141 -0.0770571 0 -0.00394487 -0.0386364 0 -0.0025 -1.26702e-16 0 -0.0025 -1.26702e-16 0.01 -0.0154554 0.115047 0.01 -0.00394487 0.0386364 0.01 -0.00827141 0.0770571 0.01 -0.0154554 0.115047 0 -0.00394487 0.0386364 0 -0.00827141 0.0770571 0 -0.0154554 0.115047 0 -0.0105807 0.116159 0 -0.0105807 0.116159 0.01 -0.0154554 0.115047 0.01 0.0025 -1.27927e-16 0 0.0025 -1.27927e-16 0.01 -0.0105807 0.116159 0.01 0.00104116 0.0390099 0.01 -0.00332719 0.0778019 0.01 -0.0105807 0.116159 0 0.00104116 0.0390099 0 -0.00332719 0.0778019 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.015493 -0.115381 0 -0.0106182 -0.116493 0 -0.0106182 -0.116493 0.01 -0.015493 -0.115381 0.01 -0.015493 -0.115381 0 -0.0106182 -0.116493 0 -0.0025 -1.27069e-16 0 -0.00828814 -0.0772805 0 -0.00394906 -0.0387485 0 -0.015493 0.115381 0 -0.00394906 0.0387485 0 -0.00828814 0.0772805 0 -0.0106182 0.116493 0 0.0025 -1.28294e-16 0 0.00103698 0.0391219 0 -0.00334393 0.0780253 0 -0.00334393 -0.0780253 0 0.00103698 -0.0391219 0 -0.0106182 -0.116493 0 -0.0106182 -0.116493 0.01 0.0025 -1.28294e-16 0.01 -0.00334393 -0.0780253 0.01 0.00103698 -0.0391219 0.01 0.0025 -1.28294e-16 0 -0.00334393 -0.0780253 0 0.00103698 -0.0391219 0 -0.015493 -0.115381 0.01 -0.0106182 -0.116493 0.01 -0.0025 -1.27069e-16 0.01 -0.00828814 -0.0772805 0.01 -0.00394906 -0.0387485 0.01 -0.015493 0.115381 0.01 -0.00394906 0.0387485 0.01 -0.00828814 0.0772805 0.01 -0.0106182 0.116493 0.01 0.0025 -1.28294e-16 0.01 0.00103698 0.0391219 0.01 -0.00334393 0.0780253 0.01 -0.00334393 -0.0780253 0.01 0.00103698 -0.0391219 0.01 -0.015493 -0.115381 0 -0.015493 -0.115381 0.01 -0.0025 -1.27069e-16 0.01 -0.00828814 -0.0772805 0.01 -0.00394906 -0.0387485 0.01 -0.0025 -1.27069e-16 0 -0.00828814 -0.0772805 0 -0.00394906 -0.0387485 0 -0.0025 -1.27069e-16 0 -0.0025 -1.27069e-16 0.01 -0.015493 0.115381 0.01 -0.00394906 0.0387485 0.01 -0.00828814 0.0772805 0.01 -0.015493 0.115381 0 -0.00394906 0.0387485 0 -0.00828814 0.0772805 0 -0.015493 0.115381 0 -0.0106182 0.116493 0 -0.0106182 0.116493 0.01 -0.015493 0.115381 0.01 0.0025 -1.28294e-16 0 0.0025 -1.28294e-16 0.01 -0.0106182 0.116493 0.01 0.00103698 0.0391219 0.01 -0.00334393 0.0780253 0.01 -0.0106182 0.116493 0 0.00103698 0.0391219 0 -0.00334393 0.0780253 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0156833 -0.117071 0 -0.0108086 -0.118183 0 -0.0108086 -0.118183 0.01 -0.0156833 -0.117071 0.01 -0.0156833 -0.117071 0 -0.0108086 -0.118183 0 -0.0025 -1.28931e-16 0 -0.00837293 -0.0784126 0 -0.00397029 -0.0393161 0 -0.0156833 0.117071 0 -0.00397029 0.0393161 0 -0.00837293 0.0784126 0 -0.0108086 0.118183 0 0.0025 -1.30155e-16 0 0.00101575 0.0396896 0 -0.00342872 0.0791574 0 -0.00342872 -0.0791574 0 0.00101575 -0.0396896 0 -0.0108086 -0.118183 0 -0.0108086 -0.118183 0.01 0.0025 -1.30155e-16 0.01 -0.00342872 -0.0791574 0.01 0.00101575 -0.0396896 0.01 0.0025 -1.30155e-16 0 -0.00342872 -0.0791574 0 0.00101575 -0.0396896 0 -0.0156833 -0.117071 0.01 -0.0108086 -0.118183 0.01 -0.0025 -1.28931e-16 0.01 -0.00837293 -0.0784126 0.01 -0.00397029 -0.0393161 0.01 -0.0156833 0.117071 0.01 -0.00397029 0.0393161 0.01 -0.00837293 0.0784126 0.01 -0.0108086 0.118183 0.01 0.0025 -1.30155e-16 0.01 0.00101575 0.0396896 0.01 -0.00342872 0.0791574 0.01 -0.00342872 -0.0791574 0.01 0.00101575 -0.0396896 0.01 -0.0156833 -0.117071 0 -0.0156833 -0.117071 0.01 -0.0025 -1.28931e-16 0.01 -0.00837293 -0.0784126 0.01 -0.00397029 -0.0393161 0.01 -0.0025 -1.28931e-16 0 -0.00837293 -0.0784126 0 -0.00397029 -0.0393161 0 -0.0025 -1.28931e-16 0 -0.0025 -1.28931e-16 0.01 -0.0156833 0.117071 0.01 -0.00397029 0.0393161 0.01 -0.00837293 0.0784126 0.01 -0.0156833 0.117071 0 -0.00397029 0.0393161 0 -0.00837293 0.0784126 0 -0.0156833 0.117071 0 -0.0108086 0.118183 0 -0.0108086 0.118183 0.01 -0.0156833 0.117071 0.01 0.0025 -1.30155e-16 0 0.0025 -1.30155e-16 0.01 -0.0108086 0.118183 0.01 0.00101575 0.0396896 0.01 -0.00342872 0.0791574 0.01 -0.0108086 0.118183 0 0.00101575 0.0396896 0 -0.00342872 0.0791574 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0157234 -0.117427 0 -0.0108486 -0.118539 0 -0.0108486 -0.118539 0.01 -0.0157234 -0.117427 0.01 -0.0157234 -0.117427 0 -0.0108486 -0.118539 0 -0.0025 -1.29323e-16 0 -0.00839079 -0.0786509 0 -0.00397476 -0.0394356 0 -0.0157234 0.117427 0 -0.00397476 0.0394356 0 -0.00839079 0.0786509 0 -0.0108486 0.118539 0 0.0025 -1.30547e-16 0 0.00101128 0.0398091 0 -0.00344657 0.0793957 0 -0.00344657 -0.0793957 0 0.00101128 -0.0398091 0 -0.0108486 -0.118539 0 -0.0108486 -0.118539 0.01 0.0025 -1.30547e-16 0.01 -0.00344657 -0.0793957 0.01 0.00101128 -0.0398091 0.01 0.0025 -1.30547e-16 0 -0.00344657 -0.0793957 0 0.00101128 -0.0398091 0 -0.0157234 -0.117427 0.01 -0.0108486 -0.118539 0.01 -0.0025 -1.29323e-16 0.01 -0.00839079 -0.0786509 0.01 -0.00397476 -0.0394356 0.01 -0.0157234 0.117427 0.01 -0.00397476 0.0394356 0.01 -0.00839079 0.0786509 0.01 -0.0108486 0.118539 0.01 0.0025 -1.30547e-16 0.01 0.00101128 0.0398091 0.01 -0.00344657 0.0793957 0.01 -0.00344657 -0.0793957 0.01 0.00101128 -0.0398091 0.01 -0.0157234 -0.117427 0 -0.0157234 -0.117427 0.01 -0.0025 -1.29323e-16 0.01 -0.00839079 -0.0786509 0.01 -0.00397476 -0.0394356 0.01 -0.0025 -1.29323e-16 0 -0.00839079 -0.0786509 0 -0.00397476 -0.0394356 0 -0.0025 -1.29323e-16 0 -0.0025 -1.29323e-16 0.01 -0.0157234 0.117427 0.01 -0.00397476 0.0394356 0.01 -0.00839079 0.0786509 0.01 -0.0157234 0.117427 0 -0.00397476 0.0394356 0 -0.00839079 0.0786509 0 -0.0157234 0.117427 0 -0.0108486 0.118539 0 -0.0108486 0.118539 0.01 -0.0157234 0.117427 0.01 0.0025 -1.30547e-16 0 0.0025 -1.30547e-16 0.01 -0.0108486 0.118539 0.01 0.00101128 0.0398091 0.01 -0.00344657 0.0793957 0.01 -0.0108486 0.118539 0 0.00101128 0.0398091 0 -0.00344657 0.0793957 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0159138 -0.119117 0 -0.011039 -0.120229 0 -0.011039 -0.120229 0.01 -0.0159138 -0.119117 0.01 -0.0159138 -0.119117 0 -0.011039 -0.120229 0 -0.0025 -1.31184e-16 0 -0.00847558 -0.079783 0 -0.00399598 -0.0400032 0 -0.0159138 0.119117 0 -0.00399598 0.0400032 0 -0.00847558 0.079783 0 -0.011039 0.120229 0 0.0025 -1.32409e-16 0 0.000990051 0.0403767 0 -0.00353136 0.0805278 0 -0.00353136 -0.0805278 0 0.000990051 -0.0403767 0 -0.011039 -0.120229 0 -0.011039 -0.120229 0.01 0.0025 -1.32409e-16 0.01 -0.00353136 -0.0805278 0.01 0.000990051 -0.0403767 0.01 0.0025 -1.32409e-16 0 -0.00353136 -0.0805278 0 0.000990051 -0.0403767 0 -0.0159138 -0.119117 0.01 -0.011039 -0.120229 0.01 -0.0025 -1.31184e-16 0.01 -0.00847558 -0.079783 0.01 -0.00399598 -0.0400032 0.01 -0.0159138 0.119117 0.01 -0.00399598 0.0400032 0.01 -0.00847558 0.079783 0.01 -0.011039 0.120229 0.01 0.0025 -1.32409e-16 0.01 0.000990051 0.0403767 0.01 -0.00353136 0.0805278 0.01 -0.00353136 -0.0805278 0.01 0.000990051 -0.0403767 0.01 -0.0159138 -0.119117 0 -0.0159138 -0.119117 0.01 -0.0025 -1.31184e-16 0.01 -0.00847558 -0.079783 0.01 -0.00399598 -0.0400032 0.01 -0.0025 -1.31184e-16 0 -0.00847558 -0.079783 0 -0.00399598 -0.0400032 0 -0.0025 -1.31184e-16 0 -0.0025 -1.31184e-16 0.01 -0.0159138 0.119117 0.01 -0.00399598 0.0400032 0.01 -0.00847558 0.079783 0.01 -0.0159138 0.119117 0 -0.00399598 0.0400032 0 -0.00847558 0.079783 0 -0.0159138 0.119117 0 -0.011039 0.120229 0 -0.011039 0.120229 0.01 -0.0159138 0.119117 0.01 0.0025 -1.32409e-16 0 0.0025 -1.32409e-16 0.01 -0.011039 0.120229 0.01 0.000990051 0.0403767 0.01 -0.00353136 0.0805278 0.01 -0.011039 0.120229 0 0.000990051 0.0403767 0 -0.00353136 0.0805278 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0159513 -0.119451 0 -0.0110765 -0.120563 0 -0.0110765 -0.120563 0.01 -0.0159513 -0.119451 0.01 -0.0159513 -0.119451 0 -0.0110765 -0.120563 0 -0.0025 -1.31552e-16 0 -0.00849231 -0.0800065 0 -0.00400017 -0.0401153 0 -0.0159513 0.119451 0 -0.00400017 0.0401153 0 -0.00849231 0.0800065 0 -0.0110765 0.120563 0 0.0025 -1.32776e-16 0 0.000985861 0.0404887 0 -0.0035481 0.0807513 0 -0.0035481 -0.0807513 0 0.000985861 -0.0404887 0 -0.0110765 -0.120563 0 -0.0110765 -0.120563 0.01 0.0025 -1.32776e-16 0.01 -0.0035481 -0.0807513 0.01 0.000985861 -0.0404887 0.01 0.0025 -1.32776e-16 0 -0.0035481 -0.0807513 0 0.000985861 -0.0404887 0 -0.0159513 -0.119451 0.01 -0.0110765 -0.120563 0.01 -0.0025 -1.31552e-16 0.01 -0.00849231 -0.0800065 0.01 -0.00400017 -0.0401153 0.01 -0.0159513 0.119451 0.01 -0.00400017 0.0401153 0.01 -0.00849231 0.0800065 0.01 -0.0110765 0.120563 0.01 0.0025 -1.32776e-16 0.01 0.000985861 0.0404887 0.01 -0.0035481 0.0807513 0.01 -0.0035481 -0.0807513 0.01 0.000985861 -0.0404887 0.01 -0.0159513 -0.119451 0 -0.0159513 -0.119451 0.01 -0.0025 -1.31552e-16 0.01 -0.00849231 -0.0800065 0.01 -0.00400017 -0.0401153 0.01 -0.0025 -1.31552e-16 0 -0.00849231 -0.0800065 0 -0.00400017 -0.0401153 0 -0.0025 -1.31552e-16 0 -0.0025 -1.31552e-16 0.01 -0.0159513 0.119451 0.01 -0.00400017 0.0401153 0.01 -0.00849231 0.0800065 0.01 -0.0159513 0.119451 0 -0.00400017 0.0401153 0 -0.00849231 0.0800065 0 -0.0159513 0.119451 0 -0.0110765 0.120563 0 -0.0110765 0.120563 0.01 -0.0159513 0.119451 0.01 0.0025 -1.32776e-16 0 0.0025 -1.32776e-16 0.01 -0.0110765 0.120563 0.01 0.000985861 0.0404887 0.01 -0.0035481 0.0807513 0.01 -0.0110765 0.120563 0 0.000985861 0.0404887 0 -0.0035481 0.0807513 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0140755 -0.102793 0 -0.00920072 -0.103905 0 -0.00920072 -0.103905 0.01 -0.0140755 -0.102793 0.01 -0.0140755 -0.102793 0 -0.00920072 -0.103905 0 -0.0025 -1.13206e-16 0 -0.00765667 -0.0688494 0 -0.00379097 -0.0345211 0 -0.0140755 0.102793 0 -0.00379097 0.0345211 0 -0.00765667 0.0688494 0 -0.00920072 0.103905 0 0.0025 -1.14431e-16 0 0.00119506 0.0348945 0 -0.00271245 0.0695942 0 -0.00271245 -0.0695942 0 0.00119506 -0.0348945 0 -0.00920072 -0.103905 0 -0.00920072 -0.103905 0.01 0.0025 -1.14431e-16 0.01 -0.00271245 -0.0695942 0.01 0.00119506 -0.0348945 0.01 0.0025 -1.14431e-16 0 -0.00271245 -0.0695942 0 0.00119506 -0.0348945 0 -0.0140755 -0.102793 0.01 -0.00920072 -0.103905 0.01 -0.0025 -1.13206e-16 0.01 -0.00765667 -0.0688494 0.01 -0.00379097 -0.0345211 0.01 -0.0140755 0.102793 0.01 -0.00379097 0.0345211 0.01 -0.00765667 0.0688494 0.01 -0.00920072 0.103905 0.01 0.0025 -1.14431e-16 0.01 0.00119506 0.0348945 0.01 -0.00271245 0.0695942 0.01 -0.00271245 -0.0695942 0.01 0.00119506 -0.0348945 0.01 -0.0140755 -0.102793 0 -0.0140755 -0.102793 0.01 -0.0025 -1.13206e-16 0.01 -0.00765667 -0.0688494 0.01 -0.00379097 -0.0345211 0.01 -0.0025 -1.13206e-16 0 -0.00765667 -0.0688494 0 -0.00379097 -0.0345211 0 -0.0025 -1.13206e-16 0 -0.0025 -1.13206e-16 0.01 -0.0140755 0.102793 0.01 -0.00379097 0.0345211 0.01 -0.00765667 0.0688494 0.01 -0.0140755 0.102793 0 -0.00379097 0.0345211 0 -0.00765667 0.0688494 0 -0.0140755 0.102793 0 -0.00920072 0.103905 0 -0.00920072 0.103905 0.01 -0.0140755 0.102793 0.01 0.0025 -1.14431e-16 0 0.0025 -1.14431e-16 0.01 -0.00920072 0.103905 0.01 0.00119506 0.0348945 0.01 -0.00271245 0.0695942 0.01 -0.00920072 0.103905 0 0.00119506 0.0348945 0 -0.00271245 0.0695942 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0141156 -0.103149 0 -0.00924079 -0.104261 0 -0.00924079 -0.104261 0.01 -0.0141156 -0.103149 0.01 -0.0141156 -0.103149 0 -0.00924079 -0.104261 0 -0.0025 -1.13598e-16 0 -0.00767452 -0.0690877 0 -0.00379544 -0.0346406 0 -0.0141156 0.103149 0 -0.00379544 0.0346406 0 -0.00767452 0.0690877 0 -0.00924079 0.104261 0 0.0025 -1.14823e-16 0 0.0011906 0.035014 0 -0.0027303 0.0698325 0 -0.0027303 -0.0698325 0 0.0011906 -0.035014 0 -0.00924079 -0.104261 0 -0.00924079 -0.104261 0.01 0.0025 -1.14823e-16 0.01 -0.0027303 -0.0698325 0.01 0.0011906 -0.035014 0.01 0.0025 -1.14823e-16 0 -0.0027303 -0.0698325 0 0.0011906 -0.035014 0 -0.0141156 -0.103149 0.01 -0.00924079 -0.104261 0.01 -0.0025 -1.13598e-16 0.01 -0.00767452 -0.0690877 0.01 -0.00379544 -0.0346406 0.01 -0.0141156 0.103149 0.01 -0.00379544 0.0346406 0.01 -0.00767452 0.0690877 0.01 -0.00924079 0.104261 0.01 0.0025 -1.14823e-16 0.01 0.0011906 0.035014 0.01 -0.0027303 0.0698325 0.01 -0.0027303 -0.0698325 0.01 0.0011906 -0.035014 0.01 -0.0141156 -0.103149 0 -0.0141156 -0.103149 0.01 -0.0025 -1.13598e-16 0.01 -0.00767452 -0.0690877 0.01 -0.00379544 -0.0346406 0.01 -0.0025 -1.13598e-16 0 -0.00767452 -0.0690877 0 -0.00379544 -0.0346406 0 -0.0025 -1.13598e-16 0 -0.0025 -1.13598e-16 0.01 -0.0141156 0.103149 0.01 -0.00379544 0.0346406 0.01 -0.00767452 0.0690877 0.01 -0.0141156 0.103149 0 -0.00379544 0.0346406 0 -0.00767452 0.0690877 0 -0.0141156 0.103149 0 -0.00924079 0.104261 0 -0.00924079 0.104261 0.01 -0.0141156 0.103149 0.01 0.0025 -1.14823e-16 0 0.0025 -1.14823e-16 0.01 -0.00924079 0.104261 0.01 0.0011906 0.035014 0.01 -0.0027303 0.0698325 0.01 -0.00924079 0.104261 0 0.0011906 0.035014 0 -0.0027303 0.0698325 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0143059 -0.104839 0 -0.00943113 -0.105951 0 -0.00943113 -0.105951 0.01 -0.0143059 -0.104839 0.01 -0.0143059 -0.104839 0 -0.00943113 -0.105951 0 -0.0025 -1.1546e-16 0 -0.00775931 -0.0702198 0 -0.00381667 -0.0352082 0 -0.0143059 0.104839 0 -0.00381667 0.0352082 0 -0.00775931 0.0702198 0 -0.00943113 0.105951 0 0.0025 -1.16684e-16 0 0.00116937 0.0355817 0 -0.00281509 0.0709646 0 -0.00281509 -0.0709646 0 0.00116937 -0.0355817 0 -0.00943113 -0.105951 0 -0.00943113 -0.105951 0.01 0.0025 -1.16684e-16 0.01 -0.00281509 -0.0709646 0.01 0.00116937 -0.0355817 0.01 0.0025 -1.16684e-16 0 -0.00281509 -0.0709646 0 0.00116937 -0.0355817 0 -0.0143059 -0.104839 0.01 -0.00943113 -0.105951 0.01 -0.0025 -1.1546e-16 0.01 -0.00775931 -0.0702198 0.01 -0.00381667 -0.0352082 0.01 -0.0143059 0.104839 0.01 -0.00381667 0.0352082 0.01 -0.00775931 0.0702198 0.01 -0.00943113 0.105951 0.01 0.0025 -1.16684e-16 0.01 0.00116937 0.0355817 0.01 -0.00281509 0.0709646 0.01 -0.00281509 -0.0709646 0.01 0.00116937 -0.0355817 0.01 -0.0143059 -0.104839 0 -0.0143059 -0.104839 0.01 -0.0025 -1.1546e-16 0.01 -0.00775931 -0.0702198 0.01 -0.00381667 -0.0352082 0.01 -0.0025 -1.1546e-16 0 -0.00775931 -0.0702198 0 -0.00381667 -0.0352082 0 -0.0025 -1.1546e-16 0 -0.0025 -1.1546e-16 0.01 -0.0143059 0.104839 0.01 -0.00381667 0.0352082 0.01 -0.00775931 0.0702198 0.01 -0.0143059 0.104839 0 -0.00381667 0.0352082 0 -0.00775931 0.0702198 0 -0.0143059 0.104839 0 -0.00943113 0.105951 0 -0.00943113 0.105951 0.01 -0.0143059 0.104839 0.01 0.0025 -1.16684e-16 0 0.0025 -1.16684e-16 0.01 -0.00943113 0.105951 0.01 0.00116937 0.0355817 0.01 -0.00281509 0.0709646 0.01 -0.00943113 0.105951 0 0.00116937 0.0355817 0 -0.00281509 0.0709646 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0143435 -0.105173 0 -0.0094687 -0.106285 0 -0.0094687 -0.106285 0.01 -0.0143435 -0.105173 0.01 -0.0143435 -0.105173 0 -0.0094687 -0.106285 0 -0.0025 -1.15827e-16 0 -0.00777605 -0.0704432 0 -0.00382086 -0.0353203 0 -0.0143435 0.105173 0 -0.00382086 0.0353203 0 -0.00777605 0.0704432 0 -0.0094687 0.106285 0 0.0025 -1.17052e-16 0 0.00116518 0.0356937 0 -0.00283183 0.071188 0 -0.00283183 -0.071188 0 0.00116518 -0.0356937 0 -0.0094687 -0.106285 0 -0.0094687 -0.106285 0.01 0.0025 -1.17052e-16 0.01 -0.00283183 -0.071188 0.01 0.00116518 -0.0356937 0.01 0.0025 -1.17052e-16 0 -0.00283183 -0.071188 0 0.00116518 -0.0356937 0 -0.0143435 -0.105173 0.01 -0.0094687 -0.106285 0.01 -0.0025 -1.15827e-16 0.01 -0.00777605 -0.0704432 0.01 -0.00382086 -0.0353203 0.01 -0.0143435 0.105173 0.01 -0.00382086 0.0353203 0.01 -0.00777605 0.0704432 0.01 -0.0094687 0.106285 0.01 0.0025 -1.17052e-16 0.01 0.00116518 0.0356937 0.01 -0.00283183 0.071188 0.01 -0.00283183 -0.071188 0.01 0.00116518 -0.0356937 0.01 -0.0143435 -0.105173 0 -0.0143435 -0.105173 0.01 -0.0025 -1.15827e-16 0.01 -0.00777605 -0.0704432 0.01 -0.00382086 -0.0353203 0.01 -0.0025 -1.15827e-16 0 -0.00777605 -0.0704432 0 -0.00382086 -0.0353203 0 -0.0025 -1.15827e-16 0 -0.0025 -1.15827e-16 0.01 -0.0143435 0.105173 0.01 -0.00382086 0.0353203 0.01 -0.00777605 0.0704432 0.01 -0.0143435 0.105173 0 -0.00382086 0.0353203 0 -0.00777605 0.0704432 0 -0.0143435 0.105173 0 -0.0094687 0.106285 0 -0.0094687 0.106285 0.01 -0.0143435 0.105173 0.01 0.0025 -1.17052e-16 0 0.0025 -1.17052e-16 0.01 -0.0094687 0.106285 0.01 0.00116518 0.0356937 0.01 -0.00283183 0.071188 0.01 -0.0094687 0.106285 0 0.00116518 0.0356937 0 -0.00283183 0.071188 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145363 -0.106885 0 -0.00966154 -0.107997 0 -0.00966154 -0.107997 0.01 -0.0145363 -0.106885 0.01 -0.0145363 -0.106885 0 -0.00966154 -0.107997 0 -0.0025 -1.17713e-16 0 -0.00786195 -0.0715902 0 -0.00384236 -0.0358954 0 -0.0145363 0.106885 0 -0.00384236 0.0358954 0 -0.00786195 0.0715902 0 -0.00966154 0.107997 0 0.0025 -1.18938e-16 0 0.00114367 0.0362688 0 -0.00291774 0.072335 0 -0.00291774 -0.072335 0 0.00114367 -0.0362688 0 -0.00966154 -0.107997 0 -0.00966154 -0.107997 0.01 0.0025 -1.18938e-16 0.01 -0.00291774 -0.072335 0.01 0.00114367 -0.0362688 0.01 0.0025 -1.18938e-16 0 -0.00291774 -0.072335 0 0.00114367 -0.0362688 0 -0.0145363 -0.106885 0.01 -0.00966154 -0.107997 0.01 -0.0025 -1.17713e-16 0.01 -0.00786195 -0.0715902 0.01 -0.00384236 -0.0358954 0.01 -0.0145363 0.106885 0.01 -0.00384236 0.0358954 0.01 -0.00786195 0.0715902 0.01 -0.00966154 0.107997 0.01 0.0025 -1.18938e-16 0.01 0.00114367 0.0362688 0.01 -0.00291774 0.072335 0.01 -0.00291774 -0.072335 0.01 0.00114367 -0.0362688 0.01 -0.0145363 -0.106885 0 -0.0145363 -0.106885 0.01 -0.0025 -1.17713e-16 0.01 -0.00786195 -0.0715902 0.01 -0.00384236 -0.0358954 0.01 -0.0025 -1.17713e-16 0 -0.00786195 -0.0715902 0 -0.00384236 -0.0358954 0 -0.0025 -1.17713e-16 0 -0.0025 -1.17713e-16 0.01 -0.0145363 0.106885 0.01 -0.00384236 0.0358954 0.01 -0.00786195 0.0715902 0.01 -0.0145363 0.106885 0 -0.00384236 0.0358954 0 -0.00786195 0.0715902 0 -0.0145363 0.106885 0 -0.00966154 0.107997 0 -0.00966154 0.107997 0.01 -0.0145363 0.106885 0.01 0.0025 -1.18938e-16 0 0.0025 -1.18938e-16 0.01 -0.00966154 0.107997 0.01 0.00114367 0.0362688 0.01 -0.00291774 0.072335 0.01 -0.00966154 0.107997 0 0.00114367 0.0362688 0 -0.00291774 0.072335 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145739 -0.107219 0 -0.00969911 -0.108331 0 -0.00969911 -0.108331 0.01 -0.0145739 -0.107219 0.01 -0.0145739 -0.107219 0 -0.00969911 -0.108331 0 -0.0025 -1.1808e-16 0 -0.00787869 -0.0718137 0 -0.00384655 -0.0360074 0 -0.0145739 0.107219 0 -0.00384655 0.0360074 0 -0.00787869 0.0718137 0 -0.00969911 0.108331 0 0.0025 -1.19305e-16 0 0.00113948 0.0363808 0 -0.00293447 0.0725585 0 -0.00293447 -0.0725585 0 0.00113948 -0.0363808 0 -0.00969911 -0.108331 0 -0.00969911 -0.108331 0.01 0.0025 -1.19305e-16 0.01 -0.00293447 -0.0725585 0.01 0.00113948 -0.0363808 0.01 0.0025 -1.19305e-16 0 -0.00293447 -0.0725585 0 0.00113948 -0.0363808 0 -0.0145739 -0.107219 0.01 -0.00969911 -0.108331 0.01 -0.0025 -1.1808e-16 0.01 -0.00787869 -0.0718137 0.01 -0.00384655 -0.0360074 0.01 -0.0145739 0.107219 0.01 -0.00384655 0.0360074 0.01 -0.00787869 0.0718137 0.01 -0.00969911 0.108331 0.01 0.0025 -1.19305e-16 0.01 0.00113948 0.0363808 0.01 -0.00293447 0.0725585 0.01 -0.00293447 -0.0725585 0.01 0.00113948 -0.0363808 0.01 -0.0145739 -0.107219 0 -0.0145739 -0.107219 0.01 -0.0025 -1.1808e-16 0.01 -0.00787869 -0.0718137 0.01 -0.00384655 -0.0360074 0.01 -0.0025 -1.1808e-16 0 -0.00787869 -0.0718137 0 -0.00384655 -0.0360074 0 -0.0025 -1.1808e-16 0 -0.0025 -1.1808e-16 0.01 -0.0145739 0.107219 0.01 -0.00384655 0.0360074 0.01 -0.00787869 0.0718137 0.01 -0.0145739 0.107219 0 -0.00384655 0.0360074 0 -0.00787869 0.0718137 0 -0.0145739 0.107219 0 -0.00969911 0.108331 0 -0.00969911 0.108331 0.01 -0.0145739 0.107219 0.01 0.0025 -1.19305e-16 0 0.0025 -1.19305e-16 0.01 -0.00969911 0.108331 0.01 0.00113948 0.0363808 0.01 -0.00293447 0.0725585 0.01 -0.00969911 0.108331 0 0.00113948 0.0363808 0 -0.00293447 0.0725585 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0147667 -0.108931 0 -0.00989195 -0.110043 0 -0.00989195 -0.110043 0.01 -0.0147667 -0.108931 0.01 -0.0147667 -0.108931 0 -0.00989195 -0.110043 0 -0.0025 -1.19966e-16 0 -0.0079646 -0.0729606 0 -0.00386806 -0.0365825 0 -0.0147667 0.108931 0 -0.00386806 0.0365825 0 -0.0079646 0.0729606 0 -0.00989195 0.110043 0 0.0025 -1.21191e-16 0 0.00111797 0.0369559 0 -0.00302038 0.0737054 0 -0.00302038 -0.0737054 0 0.00111797 -0.0369559 0 -0.00989195 -0.110043 0 -0.00989195 -0.110043 0.01 0.0025 -1.21191e-16 0.01 -0.00302038 -0.0737054 0.01 0.00111797 -0.0369559 0.01 0.0025 -1.21191e-16 0 -0.00302038 -0.0737054 0 0.00111797 -0.0369559 0 -0.0147667 -0.108931 0.01 -0.00989195 -0.110043 0.01 -0.0025 -1.19966e-16 0.01 -0.0079646 -0.0729606 0.01 -0.00386806 -0.0365825 0.01 -0.0147667 0.108931 0.01 -0.00386806 0.0365825 0.01 -0.0079646 0.0729606 0.01 -0.00989195 0.110043 0.01 0.0025 -1.21191e-16 0.01 0.00111797 0.0369559 0.01 -0.00302038 0.0737054 0.01 -0.00302038 -0.0737054 0.01 0.00111797 -0.0369559 0.01 -0.0147667 -0.108931 0 -0.0147667 -0.108931 0.01 -0.0025 -1.19966e-16 0.01 -0.0079646 -0.0729606 0.01 -0.00386806 -0.0365825 0.01 -0.0025 -1.19966e-16 0 -0.0079646 -0.0729606 0 -0.00386806 -0.0365825 0 -0.0025 -1.19966e-16 0 -0.0025 -1.19966e-16 0.01 -0.0147667 0.108931 0.01 -0.00386806 0.0365825 0.01 -0.0079646 0.0729606 0.01 -0.0147667 0.108931 0 -0.00386806 0.0365825 0 -0.0079646 0.0729606 0 -0.0147667 0.108931 0 -0.00989195 0.110043 0 -0.00989195 0.110043 0.01 -0.0147667 0.108931 0.01 0.0025 -1.21191e-16 0 0.0025 -1.21191e-16 0.01 -0.00989195 0.110043 0.01 0.00111797 0.0369559 0.01 -0.00302038 0.0737054 0.01 -0.00989195 0.110043 0 0.00111797 0.0369559 0 -0.00302038 0.0737054 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0148043 -0.109265 0 -0.00992951 -0.110377 0 -0.00992951 -0.110377 0.01 -0.0148043 -0.109265 0.01 -0.0148043 -0.109265 0 -0.00992951 -0.110377 0 -0.0025 -1.20334e-16 0 -0.00798133 -0.0731841 0 -0.00387225 -0.0366945 0 -0.0148043 0.109265 0 -0.00387225 0.0366945 0 -0.00798133 0.0731841 0 -0.00992951 0.110377 0 0.0025 -1.21558e-16 0 0.00111379 0.037068 0 -0.00303711 0.0739289 0 -0.00303711 -0.0739289 0 0.00111379 -0.037068 0 -0.00992951 -0.110377 0 -0.00992951 -0.110377 0.01 0.0025 -1.21558e-16 0.01 -0.00303711 -0.0739289 0.01 0.00111379 -0.037068 0.01 0.0025 -1.21558e-16 0 -0.00303711 -0.0739289 0 0.00111379 -0.037068 0 -0.0148043 -0.109265 0.01 -0.00992951 -0.110377 0.01 -0.0025 -1.20334e-16 0.01 -0.00798133 -0.0731841 0.01 -0.00387225 -0.0366945 0.01 -0.0148043 0.109265 0.01 -0.00387225 0.0366945 0.01 -0.00798133 0.0731841 0.01 -0.00992951 0.110377 0.01 0.0025 -1.21558e-16 0.01 0.00111379 0.037068 0.01 -0.00303711 0.0739289 0.01 -0.00303711 -0.0739289 0.01 0.00111379 -0.037068 0.01 -0.0148043 -0.109265 0 -0.0148043 -0.109265 0.01 -0.0025 -1.20334e-16 0.01 -0.00798133 -0.0731841 0.01 -0.00387225 -0.0366945 0.01 -0.0025 -1.20334e-16 0 -0.00798133 -0.0731841 0 -0.00387225 -0.0366945 0 -0.0025 -1.20334e-16 0 -0.0025 -1.20334e-16 0.01 -0.0148043 0.109265 0.01 -0.00387225 0.0366945 0.01 -0.00798133 0.0731841 0.01 -0.0148043 0.109265 0 -0.00387225 0.0366945 0 -0.00798133 0.0731841 0 -0.0148043 0.109265 0 -0.00992951 0.110377 0 -0.00992951 0.110377 0.01 -0.0148043 0.109265 0.01 0.0025 -1.21558e-16 0 0.0025 -1.21558e-16 0.01 -0.00992951 0.110377 0.01 0.00111379 0.037068 0.01 -0.00303711 0.0739289 0.01 -0.00992951 0.110377 0 0.00111379 0.037068 0 -0.00303711 0.0739289 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.017742 -0.135352 0 -0.0128672 -0.136464 0 -0.0128672 -0.136464 0.01 -0.017742 -0.135352 0.01 -0.017742 -0.135352 0 -0.0128672 -0.136464 0 -0.0025 -1.49064e-16 0 -0.00929002 -0.0906571 0 -0.00419988 -0.0454555 0 -0.017742 0.135352 0 -0.00419988 0.0454555 0 -0.00929002 0.0906571 0 -0.0128672 0.136464 0 0.0025 -1.50289e-16 0 0.000786155 0.045829 0 -0.00434581 0.0914019 0 -0.00434581 -0.0914019 0 0.000786155 -0.045829 0 -0.0128672 -0.136464 0 -0.0128672 -0.136464 0.01 0.0025 -1.50289e-16 0.01 -0.00434581 -0.0914019 0.01 0.000786155 -0.045829 0.01 0.0025 -1.50289e-16 0 -0.00434581 -0.0914019 0 0.000786155 -0.045829 0 -0.017742 -0.135352 0.01 -0.0128672 -0.136464 0.01 -0.0025 -1.49064e-16 0.01 -0.00929002 -0.0906571 0.01 -0.00419988 -0.0454555 0.01 -0.017742 0.135352 0.01 -0.00419988 0.0454555 0.01 -0.00929002 0.0906571 0.01 -0.0128672 0.136464 0.01 0.0025 -1.50289e-16 0.01 0.000786155 0.045829 0.01 -0.00434581 0.0914019 0.01 -0.00434581 -0.0914019 0.01 0.000786155 -0.045829 0.01 -0.017742 -0.135352 0 -0.017742 -0.135352 0.01 -0.0025 -1.49064e-16 0.01 -0.00929002 -0.0906571 0.01 -0.00419988 -0.0454555 0.01 -0.0025 -1.49064e-16 0 -0.00929002 -0.0906571 0 -0.00419988 -0.0454555 0 -0.0025 -1.49064e-16 0 -0.0025 -1.49064e-16 0.01 -0.017742 0.135352 0.01 -0.00419988 0.0454555 0.01 -0.00929002 0.0906571 0.01 -0.017742 0.135352 0 -0.00419988 0.0454555 0 -0.00929002 0.0906571 0 -0.017742 0.135352 0 -0.0128672 0.136464 0 -0.0128672 0.136464 0.01 -0.017742 0.135352 0.01 0.0025 -1.50289e-16 0 0.0025 -1.50289e-16 0.01 -0.0128672 0.136464 0.01 0.000786155 0.045829 0.01 -0.00434581 0.0914019 0.01 -0.0128672 0.136464 0 0.000786155 0.045829 0 -0.00434581 0.0914019 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.017762 -0.13553 0 -0.0128873 -0.136642 0 -0.0128873 -0.136642 0.01 -0.017762 -0.13553 0.01 -0.017762 -0.13553 0 -0.0128873 -0.136642 0 -0.0025 -1.4926e-16 0 -0.00929895 -0.0907763 0 -0.00420211 -0.0455153 0 -0.017762 0.13553 0 -0.00420211 0.0455153 0 -0.00929895 0.0907763 0 -0.0128873 0.136642 0 0.0025 -1.50485e-16 0 0.00078392 0.0458887 0 -0.00435473 0.0915211 0 -0.00435473 -0.0915211 0 0.00078392 -0.0458887 0 -0.0128873 -0.136642 0 -0.0128873 -0.136642 0.01 0.0025 -1.50485e-16 0.01 -0.00435473 -0.0915211 0.01 0.00078392 -0.0458887 0.01 0.0025 -1.50485e-16 0 -0.00435473 -0.0915211 0 0.00078392 -0.0458887 0 -0.017762 -0.13553 0.01 -0.0128873 -0.136642 0.01 -0.0025 -1.4926e-16 0.01 -0.00929895 -0.0907763 0.01 -0.00420211 -0.0455153 0.01 -0.017762 0.13553 0.01 -0.00420211 0.0455153 0.01 -0.00929895 0.0907763 0.01 -0.0128873 0.136642 0.01 0.0025 -1.50485e-16 0.01 0.00078392 0.0458887 0.01 -0.00435473 0.0915211 0.01 -0.00435473 -0.0915211 0.01 0.00078392 -0.0458887 0.01 -0.017762 -0.13553 0 -0.017762 -0.13553 0.01 -0.0025 -1.4926e-16 0.01 -0.00929895 -0.0907763 0.01 -0.00420211 -0.0455153 0.01 -0.0025 -1.4926e-16 0 -0.00929895 -0.0907763 0 -0.00420211 -0.0455153 0 -0.0025 -1.4926e-16 0 -0.0025 -1.4926e-16 0.01 -0.017762 0.13553 0.01 -0.00420211 0.0455153 0.01 -0.00929895 0.0907763 0.01 -0.017762 0.13553 0 -0.00420211 0.0455153 0 -0.00929895 0.0907763 0 -0.017762 0.13553 0 -0.0128873 0.136642 0 -0.0128873 0.136642 0.01 -0.017762 0.13553 0.01 0.0025 -1.50485e-16 0 0.0025 -1.50485e-16 0.01 -0.0128873 0.136642 0.01 0.00078392 0.0458887 0.01 -0.00435473 0.0915211 0.01 -0.0128873 0.136642 0 0.00078392 0.0458887 0 -0.00435473 0.0915211 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0188465 -0.14516 0 -0.0139717 -0.146272 0 -0.0139717 -0.146272 0.01 -0.0188465 -0.14516 0.01 -0.0188465 -0.14516 0 -0.0139717 -0.146272 0 -0.0025 -1.59865e-16 0 -0.00978204 -0.0972262 0 -0.00432306 -0.0487493 0 -0.0188465 0.14516 0 -0.00432306 0.0487493 0 -0.00978204 0.0972262 0 -0.0139717 0.146272 0 0.0025 -1.6109e-16 0 0.000662979 0.0491227 0 -0.00483782 0.097971 0 -0.00483782 -0.097971 0 0.000662979 -0.0491227 0 -0.0139717 -0.146272 0 -0.0139717 -0.146272 0.01 0.0025 -1.6109e-16 0.01 -0.00483782 -0.097971 0.01 0.000662979 -0.0491227 0.01 0.0025 -1.6109e-16 0 -0.00483782 -0.097971 0 0.000662979 -0.0491227 0 -0.0188465 -0.14516 0.01 -0.0139717 -0.146272 0.01 -0.0025 -1.59865e-16 0.01 -0.00978204 -0.0972262 0.01 -0.00432306 -0.0487493 0.01 -0.0188465 0.14516 0.01 -0.00432306 0.0487493 0.01 -0.00978204 0.0972262 0.01 -0.0139717 0.146272 0.01 0.0025 -1.6109e-16 0.01 0.000662979 0.0491227 0.01 -0.00483782 0.097971 0.01 -0.00483782 -0.097971 0.01 0.000662979 -0.0491227 0.01 -0.0188465 -0.14516 0 -0.0188465 -0.14516 0.01 -0.0025 -1.59865e-16 0.01 -0.00978204 -0.0972262 0.01 -0.00432306 -0.0487493 0.01 -0.0025 -1.59865e-16 0 -0.00978204 -0.0972262 0 -0.00432306 -0.0487493 0 -0.0025 -1.59865e-16 0 -0.0025 -1.59865e-16 0.01 -0.0188465 0.14516 0.01 -0.00432306 0.0487493 0.01 -0.00978204 0.0972262 0.01 -0.0188465 0.14516 0 -0.00432306 0.0487493 0 -0.00978204 0.0972262 0 -0.0188465 0.14516 0 -0.0139717 0.146272 0 -0.0139717 0.146272 0.01 -0.0188465 0.14516 0.01 0.0025 -1.6109e-16 0 0.0025 -1.6109e-16 0.01 -0.0139717 0.146272 0.01 0.000662979 0.0491227 0.01 -0.00483782 0.097971 0.01 -0.0139717 0.146272 0 0.000662979 0.0491227 0 -0.00483782 0.097971 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0188665 -0.145338 0 -0.0139917 -0.14645 0 -0.0139917 -0.14645 0.01 -0.0188665 -0.145338 0.01 -0.0188665 -0.145338 0 -0.0139917 -0.14645 0 -0.0025 -1.60061e-16 0 -0.00979096 -0.0973454 0 -0.00432529 -0.048809 0 -0.0188665 0.145338 0 -0.00432529 0.048809 0 -0.00979096 0.0973454 0 -0.0139917 0.14645 0 0.0025 -1.61286e-16 0 0.000660745 0.0491825 0 -0.00484675 0.0980902 0 -0.00484675 -0.0980902 0 0.000660745 -0.0491825 0 -0.0139917 -0.14645 0 -0.0139917 -0.14645 0.01 0.0025 -1.61286e-16 0.01 -0.00484675 -0.0980902 0.01 0.000660745 -0.0491825 0.01 0.0025 -1.61286e-16 0 -0.00484675 -0.0980902 0 0.000660745 -0.0491825 0 -0.0188665 -0.145338 0.01 -0.0139917 -0.14645 0.01 -0.0025 -1.60061e-16 0.01 -0.00979096 -0.0973454 0.01 -0.00432529 -0.048809 0.01 -0.0188665 0.145338 0.01 -0.00432529 0.048809 0.01 -0.00979096 0.0973454 0.01 -0.0139917 0.14645 0.01 0.0025 -1.61286e-16 0.01 0.000660745 0.0491825 0.01 -0.00484675 0.0980902 0.01 -0.00484675 -0.0980902 0.01 0.000660745 -0.0491825 0.01 -0.0188665 -0.145338 0 -0.0188665 -0.145338 0.01 -0.0025 -1.60061e-16 0.01 -0.00979096 -0.0973454 0.01 -0.00432529 -0.048809 0.01 -0.0025 -1.60061e-16 0 -0.00979096 -0.0973454 0 -0.00432529 -0.048809 0 -0.0025 -1.60061e-16 0 -0.0025 -1.60061e-16 0.01 -0.0188665 0.145338 0.01 -0.00432529 0.048809 0.01 -0.00979096 0.0973454 0.01 -0.0188665 0.145338 0 -0.00432529 0.048809 0 -0.00979096 0.0973454 0 -0.0188665 0.145338 0 -0.0139917 0.14645 0 -0.0139917 0.14645 0.01 -0.0188665 0.145338 0.01 0.0025 -1.61286e-16 0 0.0025 -1.61286e-16 0.01 -0.0139917 0.14645 0.01 0.000660745 0.0491825 0.01 -0.00484675 0.0980902 0.01 -0.0139917 0.14645 0 0.000660745 0.0491825 0 -0.00484675 0.0980902 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0190668 -0.147117 0 -0.0141921 -0.148229 0 -0.0141921 -0.148229 0.01 -0.0190668 -0.147117 0.01 -0.0190668 -0.147117 0 -0.0141921 -0.148229 0 -0.0025 -1.62021e-16 0 -0.00988022 -0.0985371 0 -0.00434763 -0.0494065 0 -0.0190668 0.147117 0 -0.00434763 0.0494065 0 -0.00988022 0.0985371 0 -0.0141921 0.148229 0 0.0025 -1.63245e-16 0 0.0006384 0.04978 0 -0.004936 0.0992819 0 -0.004936 -0.0992819 0 0.0006384 -0.04978 0 -0.0141921 -0.148229 0 -0.0141921 -0.148229 0.01 0.0025 -1.63245e-16 0.01 -0.004936 -0.0992819 0.01 0.0006384 -0.04978 0.01 0.0025 -1.63245e-16 0 -0.004936 -0.0992819 0 0.0006384 -0.04978 0 -0.0190668 -0.147117 0.01 -0.0141921 -0.148229 0.01 -0.0025 -1.62021e-16 0.01 -0.00988022 -0.0985371 0.01 -0.00434763 -0.0494065 0.01 -0.0190668 0.147117 0.01 -0.00434763 0.0494065 0.01 -0.00988022 0.0985371 0.01 -0.0141921 0.148229 0.01 0.0025 -1.63245e-16 0.01 0.0006384 0.04978 0.01 -0.004936 0.0992819 0.01 -0.004936 -0.0992819 0.01 0.0006384 -0.04978 0.01 -0.0190668 -0.147117 0 -0.0190668 -0.147117 0.01 -0.0025 -1.62021e-16 0.01 -0.00988022 -0.0985371 0.01 -0.00434763 -0.0494065 0.01 -0.0025 -1.62021e-16 0 -0.00988022 -0.0985371 0 -0.00434763 -0.0494065 0 -0.0025 -1.62021e-16 0 -0.0025 -1.62021e-16 0.01 -0.0190668 0.147117 0.01 -0.00434763 0.0494065 0.01 -0.00988022 0.0985371 0.01 -0.0190668 0.147117 0 -0.00434763 0.0494065 0 -0.00988022 0.0985371 0 -0.0190668 0.147117 0 -0.0141921 0.148229 0 -0.0141921 0.148229 0.01 -0.0190668 0.147117 0.01 0.0025 -1.63245e-16 0 0.0025 -1.63245e-16 0.01 -0.0141921 0.148229 0.01 0.0006384 0.04978 0.01 -0.004936 0.0992819 0.01 -0.0141921 0.148229 0 0.0006384 0.04978 0 -0.004936 0.0992819 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 43 46 47 44 43 47 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0190869 -0.147295 0 -0.0142121 -0.148407 0 -0.0142121 -0.148407 0.01 -0.0190869 -0.147295 0.01 -0.0190869 -0.147295 0 -0.0142121 -0.148407 0 -0.0025 -1.62217e-16 0 -0.00988914 -0.0986563 0 -0.00434987 -0.0494663 0 -0.0190869 0.147295 0 -0.00434987 0.0494663 0 -0.00988914 0.0986563 0 -0.0142121 0.148407 0 0.0025 -1.63441e-16 0 0.000636166 0.0498397 0 -0.00494493 0.0994011 0 -0.00494493 -0.0994011 0 0.000636166 -0.0498397 0 -0.0142121 -0.148407 0 -0.0142121 -0.148407 0.01 0.0025 -1.63441e-16 0.01 -0.00494493 -0.0994011 0.01 0.000636166 -0.0498397 0.01 0.0025 -1.63441e-16 0 -0.00494493 -0.0994011 0 0.000636166 -0.0498397 0 -0.0190869 -0.147295 0.01 -0.0142121 -0.148407 0.01 -0.0025 -1.62217e-16 0.01 -0.00988914 -0.0986563 0.01 -0.00434987 -0.0494663 0.01 -0.0190869 0.147295 0.01 -0.00434987 0.0494663 0.01 -0.00988914 0.0986563 0.01 -0.0142121 0.148407 0.01 0.0025 -1.63441e-16 0.01 0.000636166 0.0498397 0.01 -0.00494493 0.0994011 0.01 -0.00494493 -0.0994011 0.01 0.000636166 -0.0498397 0.01 -0.0190869 -0.147295 0 -0.0190869 -0.147295 0.01 -0.0025 -1.62217e-16 0.01 -0.00988914 -0.0986563 0.01 -0.00434987 -0.0494663 0.01 -0.0025 -1.62217e-16 0 -0.00988914 -0.0986563 0 -0.00434987 -0.0494663 0 -0.0025 -1.62217e-16 0 -0.0025 -1.62217e-16 0.01 -0.0190869 0.147295 0.01 -0.00434987 0.0494663 0.01 -0.00988914 0.0986563 0.01 -0.0190869 0.147295 0 -0.00434987 0.0494663 0 -0.00988914 0.0986563 0 -0.0190869 0.147295 0 -0.0142121 0.148407 0 -0.0142121 0.148407 0.01 -0.0190869 0.147295 0.01 0.0025 -1.63441e-16 0 0.0025 -1.63441e-16 0.01 -0.0142121 0.148407 0.01 0.000636166 0.0498397 0.01 -0.00494493 0.0994011 0.01 -0.0142121 0.148407 0 0.000636166 0.0498397 0 -0.00494493 0.0994011 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0192897 -0.149097 0 -0.014415 -0.150209 0 -0.014415 -0.150209 0.01 -0.0192897 -0.149097 0.01 -0.0192897 -0.149097 0 -0.014415 -0.150209 0 -0.0025 -1.64201e-16 0 -0.00997951 -0.0998628 0 -0.00437249 -0.0500713 0 -0.0192897 0.149097 0 -0.00437249 0.0500713 0 -0.00997951 0.0998628 0 -0.014415 0.150209 0 0.0025 -1.65425e-16 0 0.000613541 0.0504447 0 -0.0050353 0.100608 0 -0.0050353 -0.100608 0 0.000613541 -0.0504447 0 -0.014415 -0.150209 0 -0.014415 -0.150209 0.01 0.0025 -1.65425e-16 0.01 -0.0050353 -0.100608 0.01 0.000613541 -0.0504447 0.01 0.0025 -1.65425e-16 0 -0.0050353 -0.100608 0 0.000613541 -0.0504447 0 -0.0192897 -0.149097 0.01 -0.014415 -0.150209 0.01 -0.0025 -1.64201e-16 0.01 -0.00997951 -0.0998628 0.01 -0.00437249 -0.0500713 0.01 -0.0192897 0.149097 0.01 -0.00437249 0.0500713 0.01 -0.00997951 0.0998628 0.01 -0.014415 0.150209 0.01 0.0025 -1.65425e-16 0.01 0.000613541 0.0504447 0.01 -0.0050353 0.100608 0.01 -0.0050353 -0.100608 0.01 0.000613541 -0.0504447 0.01 -0.0192897 -0.149097 0 -0.0192897 -0.149097 0.01 -0.0025 -1.64201e-16 0.01 -0.00997951 -0.0998628 0.01 -0.00437249 -0.0500713 0.01 -0.0025 -1.64201e-16 0 -0.00997951 -0.0998628 0 -0.00437249 -0.0500713 0 -0.0025 -1.64201e-16 0 -0.0025 -1.64201e-16 0.01 -0.0192897 0.149097 0.01 -0.00437249 0.0500713 0.01 -0.00997951 0.0998628 0.01 -0.0192897 0.149097 0 -0.00437249 0.0500713 0 -0.00997951 0.0998628 0 -0.0192897 0.149097 0 -0.014415 0.150209 0 -0.014415 0.150209 0.01 -0.0192897 0.149097 0.01 0.0025 -1.65425e-16 0 0.0025 -1.65425e-16 0.01 -0.014415 0.150209 0.01 0.000613541 0.0504447 0.01 -0.0050353 0.100608 0.01 -0.014415 0.150209 0 0.000613541 0.0504447 0 -0.0050353 0.100608 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 21 24 25 22 21 25 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0193098 -0.149274 0 -0.014435 -0.150386 0 -0.014435 -0.150386 0.01 -0.0193098 -0.149274 0.01 -0.0193098 -0.149274 0 -0.014435 -0.150386 0 -0.0025 -1.64397e-16 0 -0.00998844 -0.099982 0 -0.00437473 -0.050131 0 -0.0193098 0.149274 0 -0.00437473 0.050131 0 -0.00998844 0.099982 0 -0.014435 0.150386 0 0.0025 -1.65621e-16 0 0.000611307 0.0505045 0 -0.00504422 0.100727 0 -0.00504422 -0.100727 0 0.000611307 -0.0505045 0 -0.014435 -0.150386 0 -0.014435 -0.150386 0.01 0.0025 -1.65621e-16 0.01 -0.00504422 -0.100727 0.01 0.000611307 -0.0505045 0.01 0.0025 -1.65621e-16 0 -0.00504422 -0.100727 0 0.000611307 -0.0505045 0 -0.0193098 -0.149274 0.01 -0.014435 -0.150386 0.01 -0.0025 -1.64397e-16 0.01 -0.00998844 -0.099982 0.01 -0.00437473 -0.050131 0.01 -0.0193098 0.149274 0.01 -0.00437473 0.050131 0.01 -0.00998844 0.099982 0.01 -0.014435 0.150386 0.01 0.0025 -1.65621e-16 0.01 0.000611307 0.0505045 0.01 -0.00504422 0.100727 0.01 -0.00504422 -0.100727 0.01 0.000611307 -0.0505045 0.01 -0.0193098 -0.149274 0 -0.0193098 -0.149274 0.01 -0.0025 -1.64397e-16 0.01 -0.00998844 -0.099982 0.01 -0.00437473 -0.050131 0.01 -0.0025 -1.64397e-16 0 -0.00998844 -0.099982 0 -0.00437473 -0.050131 0 -0.0025 -1.64397e-16 0 -0.0025 -1.64397e-16 0.01 -0.0193098 0.149274 0.01 -0.00437473 0.050131 0.01 -0.00998844 0.099982 0.01 -0.0193098 0.149274 0 -0.00437473 0.050131 0 -0.00998844 0.099982 0 -0.0193098 0.149274 0 -0.014435 0.150386 0 -0.014435 0.150386 0.01 -0.0193098 0.149274 0.01 0.0025 -1.65621e-16 0 0.0025 -1.65621e-16 0.01 -0.014435 0.150386 0.01 0.000611307 0.0505045 0.01 -0.00504422 0.100727 0.01 -0.014435 0.150386 0 0.000611307 0.0505045 0 -0.00504422 0.100727 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 21 24 25 22 21 25 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0195101 -0.151054 0 -0.0146353 -0.152166 0 -0.0146353 -0.152166 0.01 -0.0195101 -0.151054 0.01 -0.0195101 -0.151054 0 -0.0146353 -0.152166 0 -0.0025 -1.66356e-16 0 -0.0100777 -0.101174 0 -0.00439707 -0.0507285 0 -0.0195101 0.151054 0 -0.00439707 0.0507285 0 -0.0100777 0.101174 0 -0.0146353 0.152166 0 0.0025 -1.67581e-16 0 0.000588962 0.051102 0 -0.00513348 0.101918 0 -0.00513348 -0.101918 0 0.000588962 -0.051102 0 -0.0146353 -0.152166 0 -0.0146353 -0.152166 0.01 0.0025 -1.67581e-16 0.01 -0.00513348 -0.101918 0.01 0.000588962 -0.051102 0.01 0.0025 -1.67581e-16 0 -0.00513348 -0.101918 0 0.000588962 -0.051102 0 -0.0195101 -0.151054 0.01 -0.0146353 -0.152166 0.01 -0.0025 -1.66356e-16 0.01 -0.0100777 -0.101174 0.01 -0.00439707 -0.0507285 0.01 -0.0195101 0.151054 0.01 -0.00439707 0.0507285 0.01 -0.0100777 0.101174 0.01 -0.0146353 0.152166 0.01 0.0025 -1.67581e-16 0.01 0.000588962 0.051102 0.01 -0.00513348 0.101918 0.01 -0.00513348 -0.101918 0.01 0.000588962 -0.051102 0.01 -0.0195101 -0.151054 0 -0.0195101 -0.151054 0.01 -0.0025 -1.66356e-16 0.01 -0.0100777 -0.101174 0.01 -0.00439707 -0.0507285 0.01 -0.0025 -1.66356e-16 0 -0.0100777 -0.101174 0 -0.00439707 -0.0507285 0 -0.0025 -1.66356e-16 0 -0.0025 -1.66356e-16 0.01 -0.0195101 0.151054 0.01 -0.00439707 0.0507285 0.01 -0.0100777 0.101174 0.01 -0.0195101 0.151054 0 -0.00439707 0.0507285 0 -0.0100777 0.101174 0 -0.0195101 0.151054 0 -0.0146353 0.152166 0 -0.0146353 0.152166 0.01 -0.0195101 0.151054 0.01 0.0025 -1.67581e-16 0 0.0025 -1.67581e-16 0.01 -0.0146353 0.152166 0.01 0.000588962 0.051102 0.01 -0.00513348 0.101918 0.01 -0.0146353 0.152166 0 0.000588962 0.051102 0 -0.00513348 0.101918 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 21 24 25 22 21 25 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0195302 -0.151232 0 -0.0146554 -0.152344 0 -0.0146554 -0.152344 0.01 -0.0195302 -0.151232 0.01 -0.0195302 -0.151232 0 -0.0146554 -0.152344 0 -0.0025 -1.66552e-16 0 -0.0100866 -0.101293 0 -0.00439931 -0.0507883 0 -0.0195302 0.151232 0 -0.00439931 0.0507883 0 -0.0100866 0.101293 0 -0.0146554 0.152344 0 0.0025 -1.67777e-16 0 0.000586728 0.0511617 0 -0.0051424 0.102038 0 -0.0051424 -0.102038 0 0.000586728 -0.0511617 0 -0.0146554 -0.152344 0 -0.0146554 -0.152344 0.01 0.0025 -1.67777e-16 0.01 -0.0051424 -0.102038 0.01 0.000586728 -0.0511617 0.01 0.0025 -1.67777e-16 0 -0.0051424 -0.102038 0 0.000586728 -0.0511617 0 -0.0195302 -0.151232 0.01 -0.0146554 -0.152344 0.01 -0.0025 -1.66552e-16 0.01 -0.0100866 -0.101293 0.01 -0.00439931 -0.0507883 0.01 -0.0195302 0.151232 0.01 -0.00439931 0.0507883 0.01 -0.0100866 0.101293 0.01 -0.0146554 0.152344 0.01 0.0025 -1.67777e-16 0.01 0.000586728 0.0511617 0.01 -0.0051424 0.102038 0.01 -0.0051424 -0.102038 0.01 0.000586728 -0.0511617 0.01 -0.0195302 -0.151232 0 -0.0195302 -0.151232 0.01 -0.0025 -1.66552e-16 0.01 -0.0100866 -0.101293 0.01 -0.00439931 -0.0507883 0.01 -0.0025 -1.66552e-16 0 -0.0100866 -0.101293 0 -0.00439931 -0.0507883 0 -0.0025 -1.66552e-16 0 -0.0025 -1.66552e-16 0.01 -0.0195302 0.151232 0.01 -0.00439931 0.0507883 0.01 -0.0100866 0.101293 0.01 -0.0195302 0.151232 0 -0.00439931 0.0507883 0 -0.0100866 0.101293 0 -0.0195302 0.151232 0 -0.0146554 0.152344 0 -0.0146554 0.152344 0.01 -0.0195302 0.151232 0.01 0.0025 -1.67777e-16 0 0.0025 -1.67777e-16 0.01 -0.0146554 0.152344 0.01 0.000586728 0.0511617 0.01 -0.0051424 0.102038 0.01 -0.0146554 0.152344 0 0.000586728 0.0511617 0 -0.0051424 0.102038 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0197305 -0.153011 0 -0.0148557 -0.154123 0 -0.0148557 -0.154123 0.01 -0.0197305 -0.153011 0.01 -0.0197305 -0.153011 0 -0.0148557 -0.154123 0 -0.0025 -1.68511e-16 0 -0.0101759 -0.102485 0 -0.00442165 -0.0513858 0 -0.0197305 0.153011 0 -0.00442165 0.0513858 0 -0.0101759 0.102485 0 -0.0148557 0.154123 0 0.0025 -1.69736e-16 0 0.000564383 0.0517592 0 -0.00523166 0.103229 0 -0.00523166 -0.103229 0 0.000564383 -0.0517592 0 -0.0148557 -0.154123 0 -0.0148557 -0.154123 0.01 0.0025 -1.69736e-16 0.01 -0.00523166 -0.103229 0.01 0.000564383 -0.0517592 0.01 0.0025 -1.69736e-16 0 -0.00523166 -0.103229 0 0.000564383 -0.0517592 0 -0.0197305 -0.153011 0.01 -0.0148557 -0.154123 0.01 -0.0025 -1.68511e-16 0.01 -0.0101759 -0.102485 0.01 -0.00442165 -0.0513858 0.01 -0.0197305 0.153011 0.01 -0.00442165 0.0513858 0.01 -0.0101759 0.102485 0.01 -0.0148557 0.154123 0.01 0.0025 -1.69736e-16 0.01 0.000564383 0.0517592 0.01 -0.00523166 0.103229 0.01 -0.00523166 -0.103229 0.01 0.000564383 -0.0517592 0.01 -0.0197305 -0.153011 0 -0.0197305 -0.153011 0.01 -0.0025 -1.68511e-16 0.01 -0.0101759 -0.102485 0.01 -0.00442165 -0.0513858 0.01 -0.0025 -1.68511e-16 0 -0.0101759 -0.102485 0 -0.00442165 -0.0513858 0 -0.0025 -1.68511e-16 0 -0.0025 -1.68511e-16 0.01 -0.0197305 0.153011 0.01 -0.00442165 0.0513858 0.01 -0.0101759 0.102485 0.01 -0.0197305 0.153011 0 -0.00442165 0.0513858 0 -0.0101759 0.102485 0 -0.0197305 0.153011 0 -0.0148557 0.154123 0 -0.0148557 0.154123 0.01 -0.0197305 0.153011 0.01 0.0025 -1.69736e-16 0 0.0025 -1.69736e-16 0.01 -0.0148557 0.154123 0.01 0.000564383 0.0517592 0.01 -0.00523166 0.103229 0.01 -0.0148557 0.154123 0 0.000564383 0.0517592 0 -0.00523166 0.103229 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0197506 -0.153189 0 -0.0148758 -0.154301 0 -0.0148758 -0.154301 0.01 -0.0197506 -0.153189 0.01 -0.0197506 -0.153189 0 -0.0148758 -0.154301 0 -0.0025 -1.68707e-16 0 -0.0101848 -0.102604 0 -0.00442389 -0.0514455 0 -0.0197506 0.153189 0 -0.00442389 0.0514455 0 -0.0101848 0.102604 0 -0.0148758 0.154301 0 0.0025 -1.69932e-16 0 0.000562148 0.051819 0 -0.00524058 0.103349 0 -0.00524058 -0.103349 0 0.000562148 -0.051819 0 -0.0148758 -0.154301 0 -0.0148758 -0.154301 0.01 0.0025 -1.69932e-16 0.01 -0.00524058 -0.103349 0.01 0.000562148 -0.051819 0.01 0.0025 -1.69932e-16 0 -0.00524058 -0.103349 0 0.000562148 -0.051819 0 -0.0197506 -0.153189 0.01 -0.0148758 -0.154301 0.01 -0.0025 -1.68707e-16 0.01 -0.0101848 -0.102604 0.01 -0.00442389 -0.0514455 0.01 -0.0197506 0.153189 0.01 -0.00442389 0.0514455 0.01 -0.0101848 0.102604 0.01 -0.0148758 0.154301 0.01 0.0025 -1.69932e-16 0.01 0.000562148 0.051819 0.01 -0.00524058 0.103349 0.01 -0.00524058 -0.103349 0.01 0.000562148 -0.051819 0.01 -0.0197506 -0.153189 0 -0.0197506 -0.153189 0.01 -0.0025 -1.68707e-16 0.01 -0.0101848 -0.102604 0.01 -0.00442389 -0.0514455 0.01 -0.0025 -1.68707e-16 0 -0.0101848 -0.102604 0 -0.00442389 -0.0514455 0 -0.0025 -1.68707e-16 0 -0.0025 -1.68707e-16 0.01 -0.0197506 0.153189 0.01 -0.00442389 0.0514455 0.01 -0.0101848 0.102604 0.01 -0.0197506 0.153189 0 -0.00442389 0.0514455 0 -0.0101848 0.102604 0 -0.0197506 0.153189 0 -0.0148758 0.154301 0 -0.0148758 0.154301 0.01 -0.0197506 0.153189 0.01 0.0025 -1.69932e-16 0 0.0025 -1.69932e-16 0.01 -0.0148758 0.154301 0.01 0.000562148 0.051819 0.01 -0.00524058 0.103349 0.01 -0.0148758 0.154301 0 0.000562148 0.051819 0 -0.00524058 0.103349 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179624 -0.137309 0 -0.0130876 -0.138421 0 -0.0130876 -0.138421 0.01 -0.0179624 -0.137309 0.01 -0.0179624 -0.137309 0 -0.0130876 -0.138421 0 -0.0025 -1.51219e-16 0 -0.0093882 -0.091968 0 -0.00422446 -0.0461128 0 -0.0179624 0.137309 0 -0.00422446 0.0461128 0 -0.0093882 0.091968 0 -0.0130876 0.138421 0 0.0025 -1.52444e-16 0 0.000761576 0.0464862 0 -0.00444399 0.0927128 0 -0.00444399 -0.0927128 0 0.000761576 -0.0464862 0 -0.0130876 -0.138421 0 -0.0130876 -0.138421 0.01 0.0025 -1.52444e-16 0.01 -0.00444399 -0.0927128 0.01 0.000761576 -0.0464862 0.01 0.0025 -1.52444e-16 0 -0.00444399 -0.0927128 0 0.000761576 -0.0464862 0 -0.0179624 -0.137309 0.01 -0.0130876 -0.138421 0.01 -0.0025 -1.51219e-16 0.01 -0.0093882 -0.091968 0.01 -0.00422446 -0.0461128 0.01 -0.0179624 0.137309 0.01 -0.00422446 0.0461128 0.01 -0.0093882 0.091968 0.01 -0.0130876 0.138421 0.01 0.0025 -1.52444e-16 0.01 0.000761576 0.0464862 0.01 -0.00444399 0.0927128 0.01 -0.00444399 -0.0927128 0.01 0.000761576 -0.0464862 0.01 -0.0179624 -0.137309 0 -0.0179624 -0.137309 0.01 -0.0025 -1.51219e-16 0.01 -0.0093882 -0.091968 0.01 -0.00422446 -0.0461128 0.01 -0.0025 -1.51219e-16 0 -0.0093882 -0.091968 0 -0.00422446 -0.0461128 0 -0.0025 -1.51219e-16 0 -0.0025 -1.51219e-16 0.01 -0.0179624 0.137309 0.01 -0.00422446 0.0461128 0.01 -0.0093882 0.091968 0.01 -0.0179624 0.137309 0 -0.00422446 0.0461128 0 -0.0093882 0.091968 0 -0.0179624 0.137309 0 -0.0130876 0.138421 0 -0.0130876 0.138421 0.01 -0.0179624 0.137309 0.01 0.0025 -1.52444e-16 0 0.0025 -1.52444e-16 0.01 -0.0130876 0.138421 0.01 0.000761576 0.0464862 0.01 -0.00444399 0.0927128 0.01 -0.0130876 0.138421 0 0.000761576 0.0464862 0 -0.00444399 0.0927128 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179824 -0.137487 0 -0.0131076 -0.138599 0 -0.0131076 -0.138599 0.01 -0.0179824 -0.137487 0.01 -0.0179824 -0.137487 0 -0.0131076 -0.138599 0 -0.0025 -1.51415e-16 0 -0.00939713 -0.0920871 0 -0.00422669 -0.0461725 0 -0.0179824 0.137487 0 -0.00422669 0.0461725 0 -0.00939713 0.0920871 0 -0.0131076 0.138599 0 0.0025 -1.5264e-16 0 0.000759341 0.046546 0 -0.00445291 0.0928319 0 -0.00445291 -0.0928319 0 0.000759341 -0.046546 0 -0.0131076 -0.138599 0 -0.0131076 -0.138599 0.01 0.0025 -1.5264e-16 0.01 -0.00445291 -0.0928319 0.01 0.000759341 -0.046546 0.01 0.0025 -1.5264e-16 0 -0.00445291 -0.0928319 0 0.000759341 -0.046546 0 -0.0179824 -0.137487 0.01 -0.0131076 -0.138599 0.01 -0.0025 -1.51415e-16 0.01 -0.00939713 -0.0920871 0.01 -0.00422669 -0.0461725 0.01 -0.0179824 0.137487 0.01 -0.00422669 0.0461725 0.01 -0.00939713 0.0920871 0.01 -0.0131076 0.138599 0.01 0.0025 -1.5264e-16 0.01 0.000759341 0.046546 0.01 -0.00445291 0.0928319 0.01 -0.00445291 -0.0928319 0.01 0.000759341 -0.046546 0.01 -0.0179824 -0.137487 0 -0.0179824 -0.137487 0.01 -0.0025 -1.51415e-16 0.01 -0.00939713 -0.0920871 0.01 -0.00422669 -0.0461725 0.01 -0.0025 -1.51415e-16 0 -0.00939713 -0.0920871 0 -0.00422669 -0.0461725 0 -0.0025 -1.51415e-16 0 -0.0025 -1.51415e-16 0.01 -0.0179824 0.137487 0.01 -0.00422669 0.0461725 0.01 -0.00939713 0.0920871 0.01 -0.0179824 0.137487 0 -0.00422669 0.0461725 0 -0.00939713 0.0920871 0 -0.0179824 0.137487 0 -0.0131076 0.138599 0 -0.0131076 0.138599 0.01 -0.0179824 0.137487 0.01 0.0025 -1.5264e-16 0 0.0025 -1.5264e-16 0.01 -0.0131076 0.138599 0.01 0.000759341 0.046546 0.01 -0.00445291 0.0928319 0.01 -0.0131076 0.138599 0 0.000759341 0.046546 0 -0.00445291 0.0928319 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0181828 -0.139266 0 -0.013308 -0.140378 0 -0.013308 -0.140378 0.01 -0.0181828 -0.139266 0.01 -0.0181828 -0.139266 0 -0.013308 -0.140378 0 -0.0025 -1.53375e-16 0 -0.00948638 -0.0932788 0 -0.00424904 -0.04677 0 -0.0181828 0.139266 0 -0.00424904 0.04677 0 -0.00948638 0.0932788 0 -0.013308 0.140378 0 0.0025 -1.54599e-16 0 0.000736996 0.0471435 0 -0.00454217 0.0940236 0 -0.00454217 -0.0940236 0 0.000736996 -0.0471435 0 -0.013308 -0.140378 0 -0.013308 -0.140378 0.01 0.0025 -1.54599e-16 0.01 -0.00454217 -0.0940236 0.01 0.000736996 -0.0471435 0.01 0.0025 -1.54599e-16 0 -0.00454217 -0.0940236 0 0.000736996 -0.0471435 0 -0.0181828 -0.139266 0.01 -0.013308 -0.140378 0.01 -0.0025 -1.53375e-16 0.01 -0.00948638 -0.0932788 0.01 -0.00424904 -0.04677 0.01 -0.0181828 0.139266 0.01 -0.00424904 0.04677 0.01 -0.00948638 0.0932788 0.01 -0.013308 0.140378 0.01 0.0025 -1.54599e-16 0.01 0.000736996 0.0471435 0.01 -0.00454217 0.0940236 0.01 -0.00454217 -0.0940236 0.01 0.000736996 -0.0471435 0.01 -0.0181828 -0.139266 0 -0.0181828 -0.139266 0.01 -0.0025 -1.53375e-16 0.01 -0.00948638 -0.0932788 0.01 -0.00424904 -0.04677 0.01 -0.0025 -1.53375e-16 0 -0.00948638 -0.0932788 0 -0.00424904 -0.04677 0 -0.0025 -1.53375e-16 0 -0.0025 -1.53375e-16 0.01 -0.0181828 0.139266 0.01 -0.00424904 0.04677 0.01 -0.00948638 0.0932788 0.01 -0.0181828 0.139266 0 -0.00424904 0.04677 0 -0.00948638 0.0932788 0 -0.0181828 0.139266 0 -0.013308 0.140378 0 -0.013308 0.140378 0.01 -0.0181828 0.139266 0.01 0.0025 -1.54599e-16 0 0.0025 -1.54599e-16 0.01 -0.013308 0.140378 0.01 0.000736996 0.0471435 0.01 -0.00454217 0.0940236 0.01 -0.013308 0.140378 0 0.000736996 0.0471435 0 -0.00454217 0.0940236 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0182028 -0.139444 0 -0.013328 -0.140556 0 -0.013328 -0.140556 0.01 -0.0182028 -0.139444 0.01 -0.0182028 -0.139444 0 -0.013328 -0.140556 0 -0.0025 -1.53571e-16 0 -0.00949531 -0.093398 0 -0.00425127 -0.0468298 0 -0.0182028 0.139444 0 -0.00425127 0.0468298 0 -0.00949531 0.093398 0 -0.013328 0.140556 0 0.0025 -1.54795e-16 0 0.000734762 0.0472032 0 -0.00455109 0.0941428 0 -0.00455109 -0.0941428 0 0.000734762 -0.0472032 0 -0.013328 -0.140556 0 -0.013328 -0.140556 0.01 0.0025 -1.54795e-16 0.01 -0.00455109 -0.0941428 0.01 0.000734762 -0.0472032 0.01 0.0025 -1.54795e-16 0 -0.00455109 -0.0941428 0 0.000734762 -0.0472032 0 -0.0182028 -0.139444 0.01 -0.013328 -0.140556 0.01 -0.0025 -1.53571e-16 0.01 -0.00949531 -0.093398 0.01 -0.00425127 -0.0468298 0.01 -0.0182028 0.139444 0.01 -0.00425127 0.0468298 0.01 -0.00949531 0.093398 0.01 -0.013328 0.140556 0.01 0.0025 -1.54795e-16 0.01 0.000734762 0.0472032 0.01 -0.00455109 0.0941428 0.01 -0.00455109 -0.0941428 0.01 0.000734762 -0.0472032 0.01 -0.0182028 -0.139444 0 -0.0182028 -0.139444 0.01 -0.0025 -1.53571e-16 0.01 -0.00949531 -0.093398 0.01 -0.00425127 -0.0468298 0.01 -0.0025 -1.53571e-16 0 -0.00949531 -0.093398 0 -0.00425127 -0.0468298 0 -0.0025 -1.53571e-16 0 -0.0025 -1.53571e-16 0.01 -0.0182028 0.139444 0.01 -0.00425127 0.0468298 0.01 -0.00949531 0.093398 0.01 -0.0182028 0.139444 0 -0.00425127 0.0468298 0 -0.00949531 0.093398 0 -0.0182028 0.139444 0 -0.013328 0.140556 0 -0.013328 0.140556 0.01 -0.0182028 0.139444 0.01 0.0025 -1.54795e-16 0 0.0025 -1.54795e-16 0.01 -0.013328 0.140556 0.01 0.000734762 0.0472032 0.01 -0.00455109 0.0941428 0.01 -0.013328 0.140556 0 0.000734762 0.0472032 0 -0.00455109 0.0941428 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 21 24 25 22 21 25 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0184057 -0.141246 0 -0.0135309 -0.142358 0 -0.0135309 -0.142358 0.01 -0.0184057 -0.141246 0.01 -0.0184057 -0.141246 0 -0.0135309 -0.142358 0 -0.0025 -1.55555e-16 0 -0.00958568 -0.0946045 0 -0.0042739 -0.0474348 0 -0.0184057 0.141246 0 -0.0042739 0.0474348 0 -0.00958568 0.0946045 0 -0.0135309 0.142358 0 0.0025 -1.56779e-16 0 0.000712138 0.0478082 0 -0.00464146 0.0953493 0 -0.00464146 -0.0953493 0 0.000712138 -0.0478082 0 -0.0135309 -0.142358 0 -0.0135309 -0.142358 0.01 0.0025 -1.56779e-16 0.01 -0.00464146 -0.0953493 0.01 0.000712138 -0.0478082 0.01 0.0025 -1.56779e-16 0 -0.00464146 -0.0953493 0 0.000712138 -0.0478082 0 -0.0184057 -0.141246 0.01 -0.0135309 -0.142358 0.01 -0.0025 -1.55555e-16 0.01 -0.00958568 -0.0946045 0.01 -0.0042739 -0.0474348 0.01 -0.0184057 0.141246 0.01 -0.0042739 0.0474348 0.01 -0.00958568 0.0946045 0.01 -0.0135309 0.142358 0.01 0.0025 -1.56779e-16 0.01 0.000712138 0.0478082 0.01 -0.00464146 0.0953493 0.01 -0.00464146 -0.0953493 0.01 0.000712138 -0.0478082 0.01 -0.0184057 -0.141246 0 -0.0184057 -0.141246 0.01 -0.0025 -1.55555e-16 0.01 -0.00958568 -0.0946045 0.01 -0.0042739 -0.0474348 0.01 -0.0025 -1.55555e-16 0 -0.00958568 -0.0946045 0 -0.0042739 -0.0474348 0 -0.0025 -1.55555e-16 0 -0.0025 -1.55555e-16 0.01 -0.0184057 0.141246 0.01 -0.0042739 0.0474348 0.01 -0.00958568 0.0946045 0.01 -0.0184057 0.141246 0 -0.0042739 0.0474348 0 -0.00958568 0.0946045 0 -0.0184057 0.141246 0 -0.0135309 0.142358 0 -0.0135309 0.142358 0.01 -0.0184057 0.141246 0.01 0.0025 -1.56779e-16 0 0.0025 -1.56779e-16 0.01 -0.0135309 0.142358 0.01 0.000712138 0.0478082 0.01 -0.00464146 0.0953493 0.01 -0.0135309 0.142358 0 0.000712138 0.0478082 0 -0.00464146 0.0953493 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 13 6 8 13 8 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 35 28 30 35 30 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0184257 -0.141424 0 -0.0135509 -0.142536 0 -0.0135509 -0.142536 0.01 -0.0184257 -0.141424 0.01 -0.0184257 -0.141424 0 -0.0135509 -0.142536 0 -0.0025 -1.55751e-16 0 -0.0095946 -0.0947237 0 -0.00427613 -0.0474945 0 -0.0184257 0.141424 0 -0.00427613 0.0474945 0 -0.0095946 0.0947237 0 -0.0135509 0.142536 0 0.0025 -1.56975e-16 0 0.000709903 0.047868 0 -0.00465039 0.0954685 0 -0.00465039 -0.0954685 0 0.000709903 -0.047868 0 -0.0135509 -0.142536 0 -0.0135509 -0.142536 0.01 0.0025 -1.56975e-16 0.01 -0.00465039 -0.0954685 0.01 0.000709903 -0.047868 0.01 0.0025 -1.56975e-16 0 -0.00465039 -0.0954685 0 0.000709903 -0.047868 0 -0.0184257 -0.141424 0.01 -0.0135509 -0.142536 0.01 -0.0025 -1.55751e-16 0.01 -0.0095946 -0.0947237 0.01 -0.00427613 -0.0474945 0.01 -0.0184257 0.141424 0.01 -0.00427613 0.0474945 0.01 -0.0095946 0.0947237 0.01 -0.0135509 0.142536 0.01 0.0025 -1.56975e-16 0.01 0.000709903 0.047868 0.01 -0.00465039 0.0954685 0.01 -0.00465039 -0.0954685 0.01 0.000709903 -0.047868 0.01 -0.0184257 -0.141424 0 -0.0184257 -0.141424 0.01 -0.0025 -1.55751e-16 0.01 -0.0095946 -0.0947237 0.01 -0.00427613 -0.0474945 0.01 -0.0025 -1.55751e-16 0 -0.0095946 -0.0947237 0 -0.00427613 -0.0474945 0 -0.0025 -1.55751e-16 0 -0.0025 -1.55751e-16 0.01 -0.0184257 0.141424 0.01 -0.00427613 0.0474945 0.01 -0.0095946 0.0947237 0.01 -0.0184257 0.141424 0 -0.00427613 0.0474945 0 -0.0095946 0.0947237 0 -0.0184257 0.141424 0 -0.0135509 0.142536 0 -0.0135509 0.142536 0.01 -0.0184257 0.141424 0.01 0.0025 -1.56975e-16 0 0.0025 -1.56975e-16 0.01 -0.0135509 0.142536 0.01 0.000709903 0.047868 0.01 -0.00465039 0.0954685 0.01 -0.0135509 0.142536 0 0.000709903 0.047868 0 -0.00465039 0.0954685 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0186261 -0.143203 0 -0.0137513 -0.144315 0 -0.0137513 -0.144315 0.01 -0.0186261 -0.143203 0.01 -0.0186261 -0.143203 0 -0.0137513 -0.144315 0 -0.0025 -1.5771e-16 0 -0.00968386 -0.0959154 0 -0.00429848 -0.048092 0 -0.0186261 0.143203 0 -0.00429848 0.048092 0 -0.00968386 0.0959154 0 -0.0137513 0.144315 0 0.0025 -1.58935e-16 0 0.000687559 0.0484655 0 -0.00473964 0.0966602 0 -0.00473964 -0.0966602 0 0.000687559 -0.0484655 0 -0.0137513 -0.144315 0 -0.0137513 -0.144315 0.01 0.0025 -1.58935e-16 0.01 -0.00473964 -0.0966602 0.01 0.000687559 -0.0484655 0.01 0.0025 -1.58935e-16 0 -0.00473964 -0.0966602 0 0.000687559 -0.0484655 0 -0.0186261 -0.143203 0.01 -0.0137513 -0.144315 0.01 -0.0025 -1.5771e-16 0.01 -0.00968386 -0.0959154 0.01 -0.00429848 -0.048092 0.01 -0.0186261 0.143203 0.01 -0.00429848 0.048092 0.01 -0.00968386 0.0959154 0.01 -0.0137513 0.144315 0.01 0.0025 -1.58935e-16 0.01 0.000687559 0.0484655 0.01 -0.00473964 0.0966602 0.01 -0.00473964 -0.0966602 0.01 0.000687559 -0.0484655 0.01 -0.0186261 -0.143203 0 -0.0186261 -0.143203 0.01 -0.0025 -1.5771e-16 0.01 -0.00968386 -0.0959154 0.01 -0.00429848 -0.048092 0.01 -0.0025 -1.5771e-16 0 -0.00968386 -0.0959154 0 -0.00429848 -0.048092 0 -0.0025 -1.5771e-16 0 -0.0025 -1.5771e-16 0.01 -0.0186261 0.143203 0.01 -0.00429848 0.048092 0.01 -0.00968386 0.0959154 0.01 -0.0186261 0.143203 0 -0.00429848 0.048092 0 -0.00968386 0.0959154 0 -0.0186261 0.143203 0 -0.0137513 0.144315 0 -0.0137513 0.144315 0.01 -0.0186261 0.143203 0.01 0.0025 -1.58935e-16 0 0.0025 -1.58935e-16 0.01 -0.0137513 0.144315 0.01 0.000687559 0.0484655 0.01 -0.00473964 0.0966602 0.01 -0.0137513 0.144315 0 0.000687559 0.0484655 0 -0.00473964 0.0966602 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0186461 -0.143381 0 -0.0137713 -0.144493 0 -0.0137713 -0.144493 0.01 -0.0186461 -0.143381 0.01 -0.0186461 -0.143381 0 -0.0137713 -0.144493 0 -0.0025 -1.57906e-16 0 -0.00969278 -0.0960346 0 -0.00430071 -0.0481518 0 -0.0186461 0.143381 0 -0.00430071 0.0481518 0 -0.00969278 0.0960346 0 -0.0137713 0.144493 0 0.0025 -1.59131e-16 0 0.000685324 0.0485252 0 -0.00474857 0.0967794 0 -0.00474857 -0.0967794 0 0.000685324 -0.0485252 0 -0.0137713 -0.144493 0 -0.0137713 -0.144493 0.01 0.0025 -1.59131e-16 0.01 -0.00474857 -0.0967794 0.01 0.000685324 -0.0485252 0.01 0.0025 -1.59131e-16 0 -0.00474857 -0.0967794 0 0.000685324 -0.0485252 0 -0.0186461 -0.143381 0.01 -0.0137713 -0.144493 0.01 -0.0025 -1.57906e-16 0.01 -0.00969278 -0.0960346 0.01 -0.00430071 -0.0481518 0.01 -0.0186461 0.143381 0.01 -0.00430071 0.0481518 0.01 -0.00969278 0.0960346 0.01 -0.0137713 0.144493 0.01 0.0025 -1.59131e-16 0.01 0.000685324 0.0485252 0.01 -0.00474857 0.0967794 0.01 -0.00474857 -0.0967794 0.01 0.000685324 -0.0485252 0.01 -0.0186461 -0.143381 0 -0.0186461 -0.143381 0.01 -0.0025 -1.57906e-16 0.01 -0.00969278 -0.0960346 0.01 -0.00430071 -0.0481518 0.01 -0.0025 -1.57906e-16 0 -0.00969278 -0.0960346 0 -0.00430071 -0.0481518 0 -0.0025 -1.57906e-16 0 -0.0025 -1.57906e-16 0.01 -0.0186461 0.143381 0.01 -0.00430071 0.0481518 0.01 -0.00969278 0.0960346 0.01 -0.0186461 0.143381 0 -0.00430071 0.0481518 0 -0.00969278 0.0960346 0 -0.0186461 0.143381 0 -0.0137713 0.144493 0 -0.0137713 0.144493 0.01 -0.0186461 0.143381 0.01 0.0025 -1.59131e-16 0 0.0025 -1.59131e-16 0.01 -0.0137713 0.144493 0.01 0.000685324 0.0485252 0.01 -0.00474857 0.0967794 0.01 -0.0137713 0.144493 0 0.000685324 0.0485252 0 -0.00474857 0.0967794 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0144077 -0.136105 0 -0.00948364 -0.136974 0 -0.00948364 -0.136974 0.01 -0.0144077 -0.136105 0.01 -0.0144077 -0.136105 0 -0.00948364 -0.136974 0 -0.0025 -1.91976e-16 0 -0.00779978 -0.0909936 0 -0.00382607 -0.0455739 0 -0.0144077 0.136105 0 -0.00382607 0.0455739 0 -0.00779978 0.0909936 0 -0.00948364 0.136974 0 0.0025 -1.932e-16 0 0.00116548 0.0458646 0 -0.00283358 0.0915741 0 -0.00283358 -0.0915741 0 0.00116548 -0.0458646 0 -0.00948364 -0.136974 0 -0.00948364 -0.136974 0.01 0.0025 -1.932e-16 0.01 -0.00283358 -0.0915741 0.01 0.00116548 -0.0458646 0.01 0.0025 -1.932e-16 0 -0.00283358 -0.0915741 0 0.00116548 -0.0458646 0 -0.0144077 -0.136105 0.01 -0.00948364 -0.136974 0.01 -0.0025 -1.91976e-16 0.01 -0.00779978 -0.0909936 0.01 -0.00382607 -0.0455739 0.01 -0.0144077 0.136105 0.01 -0.00382607 0.0455739 0.01 -0.00779978 0.0909936 0.01 -0.00948364 0.136974 0.01 0.0025 -1.932e-16 0.01 0.00116548 0.0458646 0.01 -0.00283358 0.0915741 0.01 -0.00283358 -0.0915741 0.01 0.00116548 -0.0458646 0.01 -0.0144077 -0.136105 0 -0.0144077 -0.136105 0.01 -0.0025 -1.91976e-16 0.01 -0.00779978 -0.0909936 0.01 -0.00382607 -0.0455739 0.01 -0.0025 -1.91976e-16 0 -0.00779978 -0.0909936 0 -0.00382607 -0.0455739 0 -0.0025 -1.91976e-16 0 -0.0025 -1.91976e-16 0.01 -0.0144077 0.136105 0.01 -0.00382607 0.0455739 0.01 -0.00779978 0.0909936 0.01 -0.0144077 0.136105 0 -0.00382607 0.0455739 0 -0.00779978 0.0909936 0 -0.0144077 0.136105 0 -0.00948364 0.136974 0 -0.00948364 0.136974 0.01 -0.0144077 0.136105 0.01 0.0025 -1.932e-16 0 0.0025 -1.932e-16 0.01 -0.00948364 0.136974 0.01 0.00116548 0.0458646 0.01 -0.00283358 0.0915741 0.01 -0.00948364 0.136974 0 0.00116548 0.0458646 0 -0.00283358 0.0915741 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0144092 -0.136123 0 -0.00948516 -0.136991 0 -0.00948516 -0.136991 0.01 -0.0144092 -0.136123 0.01 -0.0144092 -0.136123 0 -0.00948516 -0.136991 0 -0.0025 -1.92e-16 0 -0.00780045 -0.0910052 0 -0.00382623 -0.0455797 0 -0.0144092 0.136123 0 -0.00382623 0.0455797 0 -0.00780045 0.0910052 0 -0.00948516 0.136991 0 0.0025 -1.93225e-16 0 0.00116531 0.0458705 0 -0.00283426 0.0915857 0 -0.00283426 -0.0915857 0 0.00116531 -0.0458705 0 -0.00948516 -0.136991 0 -0.00948516 -0.136991 0.01 0.0025 -1.93225e-16 0.01 -0.00283426 -0.0915857 0.01 0.00116531 -0.0458705 0.01 0.0025 -1.93225e-16 0 -0.00283426 -0.0915857 0 0.00116531 -0.0458705 0 -0.0144092 -0.136123 0.01 -0.00948516 -0.136991 0.01 -0.0025 -1.92e-16 0.01 -0.00780045 -0.0910052 0.01 -0.00382623 -0.0455797 0.01 -0.0144092 0.136123 0.01 -0.00382623 0.0455797 0.01 -0.00780045 0.0910052 0.01 -0.00948516 0.136991 0.01 0.0025 -1.93225e-16 0.01 0.00116531 0.0458705 0.01 -0.00283426 0.0915857 0.01 -0.00283426 -0.0915857 0.01 0.00116531 -0.0458705 0.01 -0.0144092 -0.136123 0 -0.0144092 -0.136123 0.01 -0.0025 -1.92e-16 0.01 -0.00780045 -0.0910052 0.01 -0.00382623 -0.0455797 0.01 -0.0025 -1.92e-16 0 -0.00780045 -0.0910052 0 -0.00382623 -0.0455797 0 -0.0025 -1.92e-16 0 -0.0025 -1.92e-16 0.01 -0.0144092 0.136123 0.01 -0.00382623 0.0455797 0.01 -0.00780045 0.0910052 0.01 -0.0144092 0.136123 0 -0.00382623 0.0455797 0 -0.00780045 0.0910052 0 -0.0144092 0.136123 0 -0.00948516 0.136991 0 -0.00948516 0.136991 0.01 -0.0144092 0.136123 0.01 0.0025 -1.93225e-16 0 0.0025 -1.93225e-16 0.01 -0.00948516 0.136991 0.01 0.00116531 0.0458705 0.01 -0.00283426 0.0915857 0.01 -0.00948516 0.136991 0 0.00116531 0.0458705 0 -0.00283426 0.0915857 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0150503 -0.143451 0 -0.0101263 -0.144319 0 -0.0101263 -0.144319 0.01 -0.0150503 -0.143451 0.01 -0.0150503 -0.143451 0 -0.0101263 -0.144319 0 -0.0025 -2.02336e-16 0 -0.00808579 -0.0959044 0 -0.00389763 -0.0480334 0 -0.0150503 0.143451 0 -0.00389763 0.0480334 0 -0.00808579 0.0959044 0 -0.0101263 0.144319 0 0.0025 -2.03561e-16 0 0.00109391 0.0483242 0 -0.0031196 0.0964848 0 -0.0031196 -0.0964848 0 0.00109391 -0.0483242 0 -0.0101263 -0.144319 0 -0.0101263 -0.144319 0.01 0.0025 -2.03561e-16 0.01 -0.0031196 -0.0964848 0.01 0.00109391 -0.0483242 0.01 0.0025 -2.03561e-16 0 -0.0031196 -0.0964848 0 0.00109391 -0.0483242 0 -0.0150503 -0.143451 0.01 -0.0101263 -0.144319 0.01 -0.0025 -2.02336e-16 0.01 -0.00808579 -0.0959044 0.01 -0.00389763 -0.0480334 0.01 -0.0150503 0.143451 0.01 -0.00389763 0.0480334 0.01 -0.00808579 0.0959044 0.01 -0.0101263 0.144319 0.01 0.0025 -2.03561e-16 0.01 0.00109391 0.0483242 0.01 -0.0031196 0.0964848 0.01 -0.0031196 -0.0964848 0.01 0.00109391 -0.0483242 0.01 -0.0150503 -0.143451 0 -0.0150503 -0.143451 0.01 -0.0025 -2.02336e-16 0.01 -0.00808579 -0.0959044 0.01 -0.00389763 -0.0480334 0.01 -0.0025 -2.02336e-16 0 -0.00808579 -0.0959044 0 -0.00389763 -0.0480334 0 -0.0025 -2.02336e-16 0 -0.0025 -2.02336e-16 0.01 -0.0150503 0.143451 0.01 -0.00389763 0.0480334 0.01 -0.00808579 0.0959044 0.01 -0.0150503 0.143451 0 -0.00389763 0.0480334 0 -0.00808579 0.0959044 0 -0.0150503 0.143451 0 -0.0101263 0.144319 0 -0.0101263 0.144319 0.01 -0.0150503 0.143451 0.01 0.0025 -2.03561e-16 0 0.0025 -2.03561e-16 0.01 -0.0101263 0.144319 0.01 0.00109391 0.0483242 0.01 -0.0031196 0.0964848 0.01 -0.0101263 0.144319 0 0.00109391 0.0483242 0 -0.0031196 0.0964848 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0150518 -0.143468 0 -0.0101278 -0.144336 0 -0.0101278 -0.144336 0.01 -0.0150518 -0.143468 0.01 -0.0150518 -0.143468 0 -0.0101278 -0.144336 0 -0.0025 -2.02361e-16 0 -0.00808647 -0.095916 0 -0.0038978 -0.0480393 0 -0.0150518 0.143468 0 -0.0038978 0.0480393 0 -0.00808647 0.095916 0 -0.0101278 0.144336 0 0.0025 -2.03585e-16 0 0.00109374 0.04833 0 -0.00312028 0.0964964 0 -0.00312028 -0.0964964 0 0.00109374 -0.04833 0 -0.0101278 -0.144336 0 -0.0101278 -0.144336 0.01 0.0025 -2.03585e-16 0.01 -0.00312028 -0.0964964 0.01 0.00109374 -0.04833 0.01 0.0025 -2.03585e-16 0 -0.00312028 -0.0964964 0 0.00109374 -0.04833 0 -0.0150518 -0.143468 0.01 -0.0101278 -0.144336 0.01 -0.0025 -2.02361e-16 0.01 -0.00808647 -0.095916 0.01 -0.0038978 -0.0480393 0.01 -0.0150518 0.143468 0.01 -0.0038978 0.0480393 0.01 -0.00808647 0.095916 0.01 -0.0101278 0.144336 0.01 0.0025 -2.03585e-16 0.01 0.00109374 0.04833 0.01 -0.00312028 0.0964964 0.01 -0.00312028 -0.0964964 0.01 0.00109374 -0.04833 0.01 -0.0150518 -0.143468 0 -0.0150518 -0.143468 0.01 -0.0025 -2.02361e-16 0.01 -0.00808647 -0.095916 0.01 -0.0038978 -0.0480393 0.01 -0.0025 -2.02361e-16 0 -0.00808647 -0.095916 0 -0.0038978 -0.0480393 0 -0.0025 -2.02361e-16 0 -0.0025 -2.02361e-16 0.01 -0.0150518 0.143468 0.01 -0.0038978 0.0480393 0.01 -0.00808647 0.095916 0.01 -0.0150518 0.143468 0 -0.0038978 0.0480393 0 -0.00808647 0.095916 0 -0.0150518 0.143468 0 -0.0101278 0.144336 0 -0.0101278 0.144336 0.01 -0.0150518 0.143468 0.01 0.0025 -2.03585e-16 0 0.0025 -2.03585e-16 0.01 -0.0101278 0.144336 0.01 0.00109374 0.04833 0.01 -0.00312028 0.0964964 0.01 -0.0101278 0.144336 0 0.00109374 0.04833 0 -0.00312028 0.0964964 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0151779 -0.144909 0 -0.0102539 -0.145778 0 -0.0102539 -0.145778 0.01 -0.0151779 -0.144909 0.01 -0.0151779 -0.144909 0 -0.0102539 -0.145778 0 -0.0025 -2.04394e-16 0 -0.00814259 -0.0968795 0 -0.00391184 -0.0485219 0 -0.0151779 0.144909 0 -0.00391184 0.0485219 0 -0.00814259 0.0968795 0 -0.0102539 0.145778 0 0.0025 -2.05618e-16 0 0.0010797 0.0488126 0 -0.0031764 0.09746 0 -0.0031764 -0.09746 0 0.0010797 -0.0488126 0 -0.0102539 -0.145778 0 -0.0102539 -0.145778 0.01 0.0025 -2.05618e-16 0.01 -0.0031764 -0.09746 0.01 0.0010797 -0.0488126 0.01 0.0025 -2.05618e-16 0 -0.0031764 -0.09746 0 0.0010797 -0.0488126 0 -0.0151779 -0.144909 0.01 -0.0102539 -0.145778 0.01 -0.0025 -2.04394e-16 0.01 -0.00814259 -0.0968795 0.01 -0.00391184 -0.0485219 0.01 -0.0151779 0.144909 0.01 -0.00391184 0.0485219 0.01 -0.00814259 0.0968795 0.01 -0.0102539 0.145778 0.01 0.0025 -2.05618e-16 0.01 0.0010797 0.0488126 0.01 -0.0031764 0.09746 0.01 -0.0031764 -0.09746 0.01 0.0010797 -0.0488126 0.01 -0.0151779 -0.144909 0 -0.0151779 -0.144909 0.01 -0.0025 -2.04394e-16 0.01 -0.00814259 -0.0968795 0.01 -0.00391184 -0.0485219 0.01 -0.0025 -2.04394e-16 0 -0.00814259 -0.0968795 0 -0.00391184 -0.0485219 0 -0.0025 -2.04394e-16 0 -0.0025 -2.04394e-16 0.01 -0.0151779 0.144909 0.01 -0.00391184 0.0485219 0.01 -0.00814259 0.0968795 0.01 -0.0151779 0.144909 0 -0.00391184 0.0485219 0 -0.00814259 0.0968795 0 -0.0151779 0.144909 0 -0.0102539 0.145778 0 -0.0102539 0.145778 0.01 -0.0151779 0.144909 0.01 0.0025 -2.05618e-16 0 0.0025 -2.05618e-16 0.01 -0.0102539 0.145778 0.01 0.0010797 0.0488126 0.01 -0.0031764 0.09746 0.01 -0.0102539 0.145778 0 0.0010797 0.0488126 0 -0.0031764 0.09746 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.015181 -0.144944 0 -0.0102569 -0.145812 0 -0.0102569 -0.145812 0.01 -0.015181 -0.144944 0.01 -0.015181 -0.144944 0 -0.0102569 -0.145812 0 -0.0025 -2.04443e-16 0 -0.00814394 -0.0969028 0 -0.00391218 -0.0485335 0 -0.015181 0.144944 0 -0.00391218 0.0485335 0 -0.00814394 0.0969028 0 -0.0102569 0.145812 0 0.0025 -2.05667e-16 0 0.00107936 0.0488242 0 -0.00317775 0.0974832 0 -0.00317775 -0.0974832 0 0.00107936 -0.0488242 0 -0.0102569 -0.145812 0 -0.0102569 -0.145812 0.01 0.0025 -2.05667e-16 0.01 -0.00317775 -0.0974832 0.01 0.00107936 -0.0488242 0.01 0.0025 -2.05667e-16 0 -0.00317775 -0.0974832 0 0.00107936 -0.0488242 0 -0.015181 -0.144944 0.01 -0.0102569 -0.145812 0.01 -0.0025 -2.04443e-16 0.01 -0.00814394 -0.0969028 0.01 -0.00391218 -0.0485335 0.01 -0.015181 0.144944 0.01 -0.00391218 0.0485335 0.01 -0.00814394 0.0969028 0.01 -0.0102569 0.145812 0.01 0.0025 -2.05667e-16 0.01 0.00107936 0.0488242 0.01 -0.00317775 0.0974832 0.01 -0.00317775 -0.0974832 0.01 0.00107936 -0.0488242 0.01 -0.015181 -0.144944 0 -0.015181 -0.144944 0.01 -0.0025 -2.04443e-16 0.01 -0.00814394 -0.0969028 0.01 -0.00391218 -0.0485335 0.01 -0.0025 -2.04443e-16 0 -0.00814394 -0.0969028 0 -0.00391218 -0.0485335 0 -0.0025 -2.04443e-16 0 -0.0025 -2.04443e-16 0.01 -0.015181 0.144944 0.01 -0.00391218 0.0485335 0.01 -0.00814394 0.0969028 0.01 -0.015181 0.144944 0 -0.00391218 0.0485335 0 -0.00814394 0.0969028 0 -0.015181 0.144944 0 -0.0102569 0.145812 0 -0.0102569 0.145812 0.01 -0.015181 0.144944 0.01 0.0025 -2.05667e-16 0 0.0025 -2.05667e-16 0.01 -0.0102569 0.145812 0.01 0.00107936 0.0488242 0.01 -0.00317775 0.0974832 0.01 -0.0102569 0.145812 0 0.00107936 0.0488242 0 -0.00317775 0.0974832 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0153071 -0.146385 0 -0.010383 -0.147254 0 -0.010383 -0.147254 0.01 -0.0153071 -0.146385 0.01 -0.0153071 -0.146385 0 -0.010383 -0.147254 0 -0.0025 -2.06475e-16 0 -0.00820006 -0.0978663 0 -0.00392622 -0.0490161 0 -0.0153071 0.146385 0 -0.00392622 0.0490161 0 -0.00820006 0.0978663 0 -0.010383 0.147254 0 0.0025 -2.077e-16 0 0.00106532 0.0493068 0 -0.00323387 0.0984468 0 -0.00323387 -0.0984468 0 0.00106532 -0.0493068 0 -0.010383 -0.147254 0 -0.010383 -0.147254 0.01 0.0025 -2.077e-16 0.01 -0.00323387 -0.0984468 0.01 0.00106532 -0.0493068 0.01 0.0025 -2.077e-16 0 -0.00323387 -0.0984468 0 0.00106532 -0.0493068 0 -0.0153071 -0.146385 0.01 -0.010383 -0.147254 0.01 -0.0025 -2.06475e-16 0.01 -0.00820006 -0.0978663 0.01 -0.00392622 -0.0490161 0.01 -0.0153071 0.146385 0.01 -0.00392622 0.0490161 0.01 -0.00820006 0.0978663 0.01 -0.010383 0.147254 0.01 0.0025 -2.077e-16 0.01 0.00106532 0.0493068 0.01 -0.00323387 0.0984468 0.01 -0.00323387 -0.0984468 0.01 0.00106532 -0.0493068 0.01 -0.0153071 -0.146385 0 -0.0153071 -0.146385 0.01 -0.0025 -2.06475e-16 0.01 -0.00820006 -0.0978663 0.01 -0.00392622 -0.0490161 0.01 -0.0025 -2.06475e-16 0 -0.00820006 -0.0978663 0 -0.00392622 -0.0490161 0 -0.0025 -2.06475e-16 0 -0.0025 -2.06475e-16 0.01 -0.0153071 0.146385 0.01 -0.00392622 0.0490161 0.01 -0.00820006 0.0978663 0.01 -0.0153071 0.146385 0 -0.00392622 0.0490161 0 -0.00820006 0.0978663 0 -0.0153071 0.146385 0 -0.010383 0.147254 0 -0.010383 0.147254 0.01 -0.0153071 0.146385 0.01 0.0025 -2.077e-16 0 0.0025 -2.077e-16 0.01 -0.010383 0.147254 0.01 0.00106532 0.0493068 0.01 -0.00323387 0.0984468 0.01 -0.010383 0.147254 0 0.00106532 0.0493068 0 -0.00323387 0.0984468 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0153086 -0.146403 0 -0.0103845 -0.147271 0 -0.0103845 -0.147271 0.01 -0.0153086 -0.146403 0.01 -0.0153086 -0.146403 0 -0.0103845 -0.147271 0 -0.0025 -2.065e-16 0 -0.00820074 -0.0978779 0 -0.00392639 -0.0490219 0 -0.0153086 0.146403 0 -0.00392639 0.0490219 0 -0.00820074 0.0978779 0 -0.0103845 0.147271 0 0.0025 -2.07725e-16 0 0.00106515 0.0493126 0 -0.00323455 0.0984584 0 -0.00323455 -0.0984584 0 0.00106515 -0.0493126 0 -0.0103845 -0.147271 0 -0.0103845 -0.147271 0.01 0.0025 -2.07725e-16 0.01 -0.00323455 -0.0984584 0.01 0.00106515 -0.0493126 0.01 0.0025 -2.07725e-16 0 -0.00323455 -0.0984584 0 0.00106515 -0.0493126 0 -0.0153086 -0.146403 0.01 -0.0103845 -0.147271 0.01 -0.0025 -2.065e-16 0.01 -0.00820074 -0.0978779 0.01 -0.00392639 -0.0490219 0.01 -0.0153086 0.146403 0.01 -0.00392639 0.0490219 0.01 -0.00820074 0.0978779 0.01 -0.0103845 0.147271 0.01 0.0025 -2.07725e-16 0.01 0.00106515 0.0493126 0.01 -0.00323455 0.0984584 0.01 -0.00323455 -0.0984584 0.01 0.00106515 -0.0493126 0.01 -0.0153086 -0.146403 0 -0.0153086 -0.146403 0.01 -0.0025 -2.065e-16 0.01 -0.00820074 -0.0978779 0.01 -0.00392639 -0.0490219 0.01 -0.0025 -2.065e-16 0 -0.00820074 -0.0978779 0 -0.00392639 -0.0490219 0 -0.0025 -2.065e-16 0 -0.0025 -2.065e-16 0.01 -0.0153086 0.146403 0.01 -0.00392639 0.0490219 0.01 -0.00820074 0.0978779 0.01 -0.0153086 0.146403 0 -0.00392639 0.0490219 0 -0.00820074 0.0978779 0 -0.0153086 0.146403 0 -0.0103845 0.147271 0 -0.0103845 0.147271 0.01 -0.0153086 0.146403 0.01 0.0025 -2.07725e-16 0 0.0025 -2.07725e-16 0.01 -0.0103845 0.147271 0.01 0.00106515 0.0493126 0.01 -0.00323455 0.0984584 0.01 -0.0103845 0.147271 0 0.00106515 0.0493126 0 -0.00323455 0.0984584 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145991 -0.138293 0 -0.00967507 -0.139162 0 -0.00967507 -0.139162 0.01 -0.0145991 -0.138293 0.01 -0.0145991 -0.138293 0 -0.00967507 -0.139162 0 -0.0025 -1.95062e-16 0 -0.00788497 -0.0924564 0 -0.00384738 -0.0463065 0 -0.0145991 0.138293 0 -0.00384738 0.0463065 0 -0.00788497 0.0924564 0 -0.00967507 0.139162 0 0.0025 -1.96286e-16 0 0.00114416 0.0465973 0 -0.00291878 0.0930369 0 -0.00291878 -0.0930369 0 0.00114416 -0.0465973 0 -0.00967507 -0.139162 0 -0.00967507 -0.139162 0.01 0.0025 -1.96286e-16 0.01 -0.00291878 -0.0930369 0.01 0.00114416 -0.0465973 0.01 0.0025 -1.96286e-16 0 -0.00291878 -0.0930369 0 0.00114416 -0.0465973 0 -0.0145991 -0.138293 0.01 -0.00967507 -0.139162 0.01 -0.0025 -1.95062e-16 0.01 -0.00788497 -0.0924564 0.01 -0.00384738 -0.0463065 0.01 -0.0145991 0.138293 0.01 -0.00384738 0.0463065 0.01 -0.00788497 0.0924564 0.01 -0.00967507 0.139162 0.01 0.0025 -1.96286e-16 0.01 0.00114416 0.0465973 0.01 -0.00291878 0.0930369 0.01 -0.00291878 -0.0930369 0.01 0.00114416 -0.0465973 0.01 -0.0145991 -0.138293 0 -0.0145991 -0.138293 0.01 -0.0025 -1.95062e-16 0.01 -0.00788497 -0.0924564 0.01 -0.00384738 -0.0463065 0.01 -0.0025 -1.95062e-16 0 -0.00788497 -0.0924564 0 -0.00384738 -0.0463065 0 -0.0025 -1.95062e-16 0 -0.0025 -1.95062e-16 0.01 -0.0145991 0.138293 0.01 -0.00384738 0.0463065 0.01 -0.00788497 0.0924564 0.01 -0.0145991 0.138293 0 -0.00384738 0.0463065 0 -0.00788497 0.0924564 0 -0.0145991 0.138293 0 -0.00967507 0.139162 0 -0.00967507 0.139162 0.01 -0.0145991 0.138293 0.01 0.0025 -1.96286e-16 0 0.0025 -1.96286e-16 0.01 -0.00967507 0.139162 0.01 0.00114416 0.0465973 0.01 -0.00291878 0.0930369 0.01 -0.00967507 0.139162 0 0.00114416 0.0465973 0 -0.00291878 0.0930369 0 + + + 1 3 2 1 0 3 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0154377 -0.147879 0 -0.0105137 -0.148747 0 -0.0105137 -0.148747 0.01 -0.0154377 -0.147879 0.01 -0.0154377 -0.147879 0 -0.0105137 -0.148747 0 -0.0025 -2.08582e-16 0 -0.00825821 -0.0988647 0 -0.00394077 -0.0495161 0 -0.0154377 0.147879 0 -0.00394077 0.0495161 0 -0.00825821 0.0988647 0 -0.0105137 0.148747 0 0.0025 -2.09806e-16 0 0.00105077 0.0498069 0 -0.00329202 0.0994452 0 -0.00329202 -0.0994452 0 0.00105077 -0.0498069 0 -0.0105137 -0.148747 0 -0.0105137 -0.148747 0.01 0.0025 -2.09806e-16 0.01 -0.00329202 -0.0994452 0.01 0.00105077 -0.0498069 0.01 0.0025 -2.09806e-16 0 -0.00329202 -0.0994452 0 0.00105077 -0.0498069 0 -0.0154377 -0.147879 0.01 -0.0105137 -0.148747 0.01 -0.0025 -2.08582e-16 0.01 -0.00825821 -0.0988647 0.01 -0.00394077 -0.0495161 0.01 -0.0154377 0.147879 0.01 -0.00394077 0.0495161 0.01 -0.00825821 0.0988647 0.01 -0.0105137 0.148747 0.01 0.0025 -2.09806e-16 0.01 0.00105077 0.0498069 0.01 -0.00329202 0.0994452 0.01 -0.00329202 -0.0994452 0.01 0.00105077 -0.0498069 0.01 -0.0154377 -0.147879 0 -0.0154377 -0.147879 0.01 -0.0025 -2.08582e-16 0.01 -0.00825821 -0.0988647 0.01 -0.00394077 -0.0495161 0.01 -0.0025 -2.08582e-16 0 -0.00825821 -0.0988647 0 -0.00394077 -0.0495161 0 -0.0025 -2.08582e-16 0 -0.0025 -2.08582e-16 0.01 -0.0154377 0.147879 0.01 -0.00394077 0.0495161 0.01 -0.00825821 0.0988647 0.01 -0.0154377 0.147879 0 -0.00394077 0.0495161 0 -0.00825821 0.0988647 0 -0.0154377 0.147879 0 -0.0105137 0.148747 0 -0.0105137 0.148747 0.01 -0.0154377 0.147879 0.01 0.0025 -2.09806e-16 0 0.0025 -2.09806e-16 0.01 -0.0105137 0.148747 0.01 0.00105077 0.0498069 0.01 -0.00329202 0.0994452 0.01 -0.0105137 0.148747 0 0.00105077 0.0498069 0 -0.00329202 0.0994452 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0155638 -0.14932 0 -0.0106398 -0.150188 0 -0.0106398 -0.150188 0.01 -0.0155638 -0.14932 0.01 -0.0155638 -0.14932 0 -0.0106398 -0.150188 0 -0.0025 -2.10615e-16 0 -0.00831434 -0.0998283 0 -0.00395481 -0.0499987 0 -0.0155638 0.14932 0 -0.00395481 0.0499987 0 -0.00831434 0.0998283 0 -0.0106398 0.150188 0 0.0025 -2.11839e-16 0 0.00103673 0.0502895 0 -0.00334814 0.100409 0 -0.00334814 -0.100409 0 0.00103673 -0.0502895 0 -0.0106398 -0.150188 0 -0.0106398 -0.150188 0.01 0.0025 -2.11839e-16 0.01 -0.00334814 -0.100409 0.01 0.00103673 -0.0502895 0.01 0.0025 -2.11839e-16 0 -0.00334814 -0.100409 0 0.00103673 -0.0502895 0 -0.0155638 -0.14932 0.01 -0.0106398 -0.150188 0.01 -0.0025 -2.10615e-16 0.01 -0.00831434 -0.0998283 0.01 -0.00395481 -0.0499987 0.01 -0.0155638 0.14932 0.01 -0.00395481 0.0499987 0.01 -0.00831434 0.0998283 0.01 -0.0106398 0.150188 0.01 0.0025 -2.11839e-16 0.01 0.00103673 0.0502895 0.01 -0.00334814 0.100409 0.01 -0.00334814 -0.100409 0.01 0.00103673 -0.0502895 0.01 -0.0155638 -0.14932 0 -0.0155638 -0.14932 0.01 -0.0025 -2.10615e-16 0.01 -0.00831434 -0.0998283 0.01 -0.00395481 -0.0499987 0.01 -0.0025 -2.10615e-16 0 -0.00831434 -0.0998283 0 -0.00395481 -0.0499987 0 -0.0025 -2.10615e-16 0 -0.0025 -2.10615e-16 0.01 -0.0155638 0.14932 0.01 -0.00395481 0.0499987 0.01 -0.00831434 0.0998283 0.01 -0.0155638 0.14932 0 -0.00395481 0.0499987 0 -0.00831434 0.0998283 0 -0.0155638 0.14932 0 -0.0106398 0.150188 0 -0.0106398 0.150188 0.01 -0.0155638 0.14932 0.01 0.0025 -2.11839e-16 0 0.0025 -2.11839e-16 0.01 -0.0106398 0.150188 0.01 0.00103673 0.0502895 0.01 -0.00334814 0.100409 0.01 -0.0106398 0.150188 0 0.00103673 0.0502895 0 -0.00334814 0.100409 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0155653 -0.149337 0 -0.0106413 -0.150206 0 -0.0106413 -0.150206 0.01 -0.0155653 -0.149337 0.01 -0.0155653 -0.149337 0 -0.0106413 -0.150206 0 -0.0025 -2.10639e-16 0 -0.00831501 -0.0998399 0 -0.00395498 -0.0500046 0 -0.0155653 0.149337 0 -0.00395498 0.0500046 0 -0.00831501 0.0998399 0 -0.0106413 0.150206 0 0.0025 -2.11864e-16 0 0.00103656 0.0502953 0 -0.00334882 0.10042 0 -0.00334882 -0.10042 0 0.00103656 -0.0502953 0 -0.0106413 -0.150206 0 -0.0106413 -0.150206 0.01 0.0025 -2.11864e-16 0.01 -0.00334882 -0.10042 0.01 0.00103656 -0.0502953 0.01 0.0025 -2.11864e-16 0 -0.00334882 -0.10042 0 0.00103656 -0.0502953 0 -0.0155653 -0.149337 0.01 -0.0106413 -0.150206 0.01 -0.0025 -2.10639e-16 0.01 -0.00831501 -0.0998399 0.01 -0.00395498 -0.0500046 0.01 -0.0155653 0.149337 0.01 -0.00395498 0.0500046 0.01 -0.00831501 0.0998399 0.01 -0.0106413 0.150206 0.01 0.0025 -2.11864e-16 0.01 0.00103656 0.0502953 0.01 -0.00334882 0.10042 0.01 -0.00334882 -0.10042 0.01 0.00103656 -0.0502953 0.01 -0.0155653 -0.149337 0 -0.0155653 -0.149337 0.01 -0.0025 -2.10639e-16 0.01 -0.00831501 -0.0998399 0.01 -0.00395498 -0.0500046 0.01 -0.0025 -2.10639e-16 0 -0.00831501 -0.0998399 0 -0.00395498 -0.0500046 0 -0.0025 -2.10639e-16 0 -0.0025 -2.10639e-16 0.01 -0.0155653 0.149337 0.01 -0.00395498 0.0500046 0.01 -0.00831501 0.0998399 0.01 -0.0155653 0.149337 0 -0.00395498 0.0500046 0 -0.00831501 0.0998399 0 -0.0155653 0.149337 0 -0.0106413 0.150206 0 -0.0106413 0.150206 0.01 -0.0155653 0.149337 0.01 0.0025 -2.11864e-16 0 0.0025 -2.11864e-16 0.01 -0.0106413 0.150206 0.01 0.00103656 0.0502953 0.01 -0.00334882 0.10042 0.01 -0.0106413 0.150206 0 0.00103656 0.0502953 0 -0.00334882 0.10042 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145353 -0.137564 0 -0.00961126 -0.138432 0 -0.00961126 -0.138432 0.01 -0.0145353 -0.137564 0.01 -0.0145353 -0.137564 0 -0.00961126 -0.138432 0 -0.0025 -1.94033e-16 0 -0.00785657 -0.0919688 0 -0.00384028 -0.0460623 0 -0.0145353 0.137564 0 -0.00384028 0.0460623 0 -0.00785657 0.0919688 0 -0.00961126 0.138432 0 0.0025 -1.95258e-16 0 0.00115126 0.0463531 0 -0.00289038 0.0925493 0 -0.00289038 -0.0925493 0 0.00115126 -0.0463531 0 -0.00961126 -0.138432 0 -0.00961126 -0.138432 0.01 0.0025 -1.95258e-16 0.01 -0.00289038 -0.0925493 0.01 0.00115126 -0.0463531 0.01 0.0025 -1.95258e-16 0 -0.00289038 -0.0925493 0 0.00115126 -0.0463531 0 -0.0145353 -0.137564 0.01 -0.00961126 -0.138432 0.01 -0.0025 -1.94033e-16 0.01 -0.00785657 -0.0919688 0.01 -0.00384028 -0.0460623 0.01 -0.0145353 0.137564 0.01 -0.00384028 0.0460623 0.01 -0.00785657 0.0919688 0.01 -0.00961126 0.138432 0.01 0.0025 -1.95258e-16 0.01 0.00115126 0.0463531 0.01 -0.00289038 0.0925493 0.01 -0.00289038 -0.0925493 0.01 0.00115126 -0.0463531 0.01 -0.0145353 -0.137564 0 -0.0145353 -0.137564 0.01 -0.0025 -1.94033e-16 0.01 -0.00785657 -0.0919688 0.01 -0.00384028 -0.0460623 0.01 -0.0025 -1.94033e-16 0 -0.00785657 -0.0919688 0 -0.00384028 -0.0460623 0 -0.0025 -1.94033e-16 0 -0.0025 -1.94033e-16 0.01 -0.0145353 0.137564 0.01 -0.00384028 0.0460623 0.01 -0.00785657 0.0919688 0.01 -0.0145353 0.137564 0 -0.00384028 0.0460623 0 -0.00785657 0.0919688 0 -0.0145353 0.137564 0 -0.00961126 0.138432 0 -0.00961126 0.138432 0.01 -0.0145353 0.137564 0.01 0.0025 -1.95258e-16 0 0.0025 -1.95258e-16 0.01 -0.00961126 0.138432 0.01 0.00115126 0.0463531 0.01 -0.00289038 0.0925493 0.01 -0.00961126 0.138432 0 0.00115126 0.0463531 0 -0.00289038 0.0925493 0 + + + 1 3 2 1 0 3 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0145368 -0.137581 0 -0.00961278 -0.13845 0 -0.00961278 -0.13845 0.01 -0.0145368 -0.137581 0.01 -0.0145368 -0.137581 0 -0.00961278 -0.13845 0 -0.0025 -1.94058e-16 0 -0.00785725 -0.0919804 0 -0.00384045 -0.0460681 0 -0.0145368 0.137581 0 -0.00384045 0.0460681 0 -0.00785725 0.0919804 0 -0.00961278 0.13845 0 0.0025 -1.95282e-16 0 0.00115109 0.0463589 0 -0.00289106 0.0925609 0 -0.00289106 -0.0925609 0 0.00115109 -0.0463589 0 -0.00961278 -0.13845 0 -0.00961278 -0.13845 0.01 0.0025 -1.95282e-16 0.01 -0.00289106 -0.0925609 0.01 0.00115109 -0.0463589 0.01 0.0025 -1.95282e-16 0 -0.00289106 -0.0925609 0 0.00115109 -0.0463589 0 -0.0145368 -0.137581 0.01 -0.00961278 -0.13845 0.01 -0.0025 -1.94058e-16 0.01 -0.00785725 -0.0919804 0.01 -0.00384045 -0.0460681 0.01 -0.0145368 0.137581 0.01 -0.00384045 0.0460681 0.01 -0.00785725 0.0919804 0.01 -0.00961278 0.13845 0.01 0.0025 -1.95282e-16 0.01 0.00115109 0.0463589 0.01 -0.00289106 0.0925609 0.01 -0.00289106 -0.0925609 0.01 0.00115109 -0.0463589 0.01 -0.0145368 -0.137581 0 -0.0145368 -0.137581 0.01 -0.0025 -1.94058e-16 0.01 -0.00785725 -0.0919804 0.01 -0.00384045 -0.0460681 0.01 -0.0025 -1.94058e-16 0 -0.00785725 -0.0919804 0 -0.00384045 -0.0460681 0 -0.0025 -1.94058e-16 0 -0.0025 -1.94058e-16 0.01 -0.0145368 0.137581 0.01 -0.00384045 0.0460681 0.01 -0.00785725 0.0919804 0.01 -0.0145368 0.137581 0 -0.00384045 0.0460681 0 -0.00785725 0.0919804 0 -0.0145368 0.137581 0 -0.00961278 0.13845 0 -0.00961278 0.13845 0.01 -0.0145368 0.137581 0.01 0.0025 -1.95282e-16 0 0.0025 -1.95282e-16 0.01 -0.00961278 0.13845 0.01 0.00115109 0.0463589 0.01 -0.00289106 0.0925609 0.01 -0.00961278 0.13845 0 0.00115109 0.0463589 0 -0.00289106 0.0925609 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0146644 -0.13904 0 -0.00974039 -0.139908 0 -0.00974039 -0.139908 0.01 -0.0146644 -0.13904 0.01 -0.0146644 -0.13904 0 -0.00974039 -0.139908 0 -0.0025 -1.96115e-16 0 -0.00791405 -0.0929556 0 -0.00385466 -0.0465566 0 -0.0146644 0.13904 0 -0.00385466 0.0465566 0 -0.00791405 0.0929556 0 -0.00974039 0.139908 0 0.0025 -1.9734e-16 0 0.00113688 0.0468473 0 -0.00294786 0.0935361 0 -0.00294786 -0.0935361 0 0.00113688 -0.0468473 0 -0.00974039 -0.139908 0 -0.00974039 -0.139908 0.01 0.0025 -1.9734e-16 0.01 -0.00294786 -0.0935361 0.01 0.00113688 -0.0468473 0.01 0.0025 -1.9734e-16 0 -0.00294786 -0.0935361 0 0.00113688 -0.0468473 0 -0.0146644 -0.13904 0.01 -0.00974039 -0.139908 0.01 -0.0025 -1.96115e-16 0.01 -0.00791405 -0.0929556 0.01 -0.00385466 -0.0465566 0.01 -0.0146644 0.13904 0.01 -0.00385466 0.0465566 0.01 -0.00791405 0.0929556 0.01 -0.00974039 0.139908 0.01 0.0025 -1.9734e-16 0.01 0.00113688 0.0468473 0.01 -0.00294786 0.0935361 0.01 -0.00294786 -0.0935361 0.01 0.00113688 -0.0468473 0.01 -0.0146644 -0.13904 0 -0.0146644 -0.13904 0.01 -0.0025 -1.96115e-16 0.01 -0.00791405 -0.0929556 0.01 -0.00385466 -0.0465566 0.01 -0.0025 -1.96115e-16 0 -0.00791405 -0.0929556 0 -0.00385466 -0.0465566 0 -0.0025 -1.96115e-16 0 -0.0025 -1.96115e-16 0.01 -0.0146644 0.13904 0.01 -0.00385466 0.0465566 0.01 -0.00791405 0.0929556 0.01 -0.0146644 0.13904 0 -0.00385466 0.0465566 0 -0.00791405 0.0929556 0 -0.0146644 0.13904 0 -0.00974039 0.139908 0 -0.00974039 0.139908 0.01 -0.0146644 0.13904 0.01 0.0025 -1.9734e-16 0 0.0025 -1.9734e-16 0.01 -0.00974039 0.139908 0.01 0.00113688 0.0468473 0.01 -0.00294786 0.0935361 0.01 -0.00974039 0.139908 0 0.00113688 0.0468473 0 -0.00294786 0.0935361 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.014666 -0.139057 0 -0.00974191 -0.139926 0 -0.00974191 -0.139926 0.01 -0.014666 -0.139057 0.01 -0.014666 -0.139057 0 -0.00974191 -0.139926 0 -0.0025 -1.96139e-16 0 -0.00791472 -0.0929672 0 -0.00385483 -0.0465624 0 -0.014666 0.139057 0 -0.00385483 0.0465624 0 -0.00791472 0.0929672 0 -0.00974191 0.139926 0 0.0025 -1.97364e-16 0 0.00113671 0.0468531 0 -0.00294853 0.0935477 0 -0.00294853 -0.0935477 0 0.00113671 -0.0468531 0 -0.00974191 -0.139926 0 -0.00974191 -0.139926 0.01 0.0025 -1.97364e-16 0.01 -0.00294853 -0.0935477 0.01 0.00113671 -0.0468531 0.01 0.0025 -1.97364e-16 0 -0.00294853 -0.0935477 0 0.00113671 -0.0468531 0 -0.014666 -0.139057 0.01 -0.00974191 -0.139926 0.01 -0.0025 -1.96139e-16 0.01 -0.00791472 -0.0929672 0.01 -0.00385483 -0.0465624 0.01 -0.014666 0.139057 0.01 -0.00385483 0.0465624 0.01 -0.00791472 0.0929672 0.01 -0.00974191 0.139926 0.01 0.0025 -1.97364e-16 0.01 0.00113671 0.0468531 0.01 -0.00294853 0.0935477 0.01 -0.00294853 -0.0935477 0.01 0.00113671 -0.0468531 0.01 -0.014666 -0.139057 0 -0.014666 -0.139057 0.01 -0.0025 -1.96139e-16 0.01 -0.00791472 -0.0929672 0.01 -0.00385483 -0.0465624 0.01 -0.0025 -1.96139e-16 0 -0.00791472 -0.0929672 0 -0.00385483 -0.0465624 0 -0.0025 -1.96139e-16 0 -0.0025 -1.96139e-16 0.01 -0.014666 0.139057 0.01 -0.00385483 0.0465624 0.01 -0.00791472 0.0929672 0.01 -0.014666 0.139057 0 -0.00385483 0.0465624 0 -0.00791472 0.0929672 0 -0.014666 0.139057 0 -0.00974191 0.139926 0 -0.00974191 0.139926 0.01 -0.014666 0.139057 0.01 0.0025 -1.97364e-16 0 0.0025 -1.97364e-16 0.01 -0.00974191 0.139926 0.01 0.00113671 0.0468531 0.01 -0.00294853 0.0935477 0.01 -0.00974191 0.139926 0 0.00113671 0.0468531 0 -0.00294853 0.0935477 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.014792 -0.140499 0 -0.00986801 -0.141367 0 -0.00986801 -0.141367 0.01 -0.014792 -0.140499 0.01 -0.014792 -0.140499 0 -0.00986801 -0.141367 0 -0.0025 -1.98172e-16 0 -0.00797084 -0.0939308 0 -0.00386887 -0.047045 0 -0.014792 0.140499 0 -0.00386887 0.047045 0 -0.00797084 0.0939308 0 -0.00986801 0.141367 0 0.0025 -1.99397e-16 0 0.00112267 0.0473357 0 -0.00300465 0.0945112 0 -0.00300465 -0.0945112 0 0.00112267 -0.0473357 0 -0.00986801 -0.141367 0 -0.00986801 -0.141367 0.01 0.0025 -1.99397e-16 0.01 -0.00300465 -0.0945112 0.01 0.00112267 -0.0473357 0.01 0.0025 -1.99397e-16 0 -0.00300465 -0.0945112 0 0.00112267 -0.0473357 0 -0.014792 -0.140499 0.01 -0.00986801 -0.141367 0.01 -0.0025 -1.98172e-16 0.01 -0.00797084 -0.0939308 0.01 -0.00386887 -0.047045 0.01 -0.014792 0.140499 0.01 -0.00386887 0.047045 0.01 -0.00797084 0.0939308 0.01 -0.00986801 0.141367 0.01 0.0025 -1.99397e-16 0.01 0.00112267 0.0473357 0.01 -0.00300465 0.0945112 0.01 -0.00300465 -0.0945112 0.01 0.00112267 -0.0473357 0.01 -0.014792 -0.140499 0 -0.014792 -0.140499 0.01 -0.0025 -1.98172e-16 0.01 -0.00797084 -0.0939308 0.01 -0.00386887 -0.047045 0.01 -0.0025 -1.98172e-16 0 -0.00797084 -0.0939308 0 -0.00386887 -0.047045 0 -0.0025 -1.98172e-16 0 -0.0025 -1.98172e-16 0.01 -0.014792 0.140499 0.01 -0.00386887 0.047045 0.01 -0.00797084 0.0939308 0.01 -0.014792 0.140499 0 -0.00386887 0.047045 0 -0.00797084 0.0939308 0 -0.014792 0.140499 0 -0.00986801 0.141367 0 -0.00986801 0.141367 0.01 -0.014792 0.140499 0.01 0.0025 -1.99397e-16 0 0.0025 -1.99397e-16 0.01 -0.00986801 0.141367 0.01 0.00112267 0.0473357 0.01 -0.00300465 0.0945112 0.01 -0.00986801 0.141367 0 0.00112267 0.0473357 0 -0.00300465 0.0945112 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0147951 -0.140533 0 -0.00987105 -0.141402 0 -0.00987105 -0.141402 0.01 -0.0147951 -0.140533 0.01 -0.0147951 -0.140533 0 -0.00987105 -0.141402 0 -0.0025 -1.98221e-16 0 -0.0079722 -0.093954 0 -0.00386921 -0.0470566 0 -0.0147951 0.140533 0 -0.00386921 0.0470566 0 -0.0079722 0.093954 0 -0.00987105 0.141402 0 0.0025 -1.99446e-16 0 0.00112233 0.0473473 0 -0.00300601 0.0945345 0 -0.00300601 -0.0945345 0 0.00112233 -0.0473473 0 -0.00987105 -0.141402 0 -0.00987105 -0.141402 0.01 0.0025 -1.99446e-16 0.01 -0.00300601 -0.0945345 0.01 0.00112233 -0.0473473 0.01 0.0025 -1.99446e-16 0 -0.00300601 -0.0945345 0 0.00112233 -0.0473473 0 -0.0147951 -0.140533 0.01 -0.00987105 -0.141402 0.01 -0.0025 -1.98221e-16 0.01 -0.0079722 -0.093954 0.01 -0.00386921 -0.0470566 0.01 -0.0147951 0.140533 0.01 -0.00386921 0.0470566 0.01 -0.0079722 0.093954 0.01 -0.00987105 0.141402 0.01 0.0025 -1.99446e-16 0.01 0.00112233 0.0473473 0.01 -0.00300601 0.0945345 0.01 -0.00300601 -0.0945345 0.01 0.00112233 -0.0473473 0.01 -0.0147951 -0.140533 0 -0.0147951 -0.140533 0.01 -0.0025 -1.98221e-16 0.01 -0.0079722 -0.093954 0.01 -0.00386921 -0.0470566 0.01 -0.0025 -1.98221e-16 0 -0.0079722 -0.093954 0 -0.00386921 -0.0470566 0 -0.0025 -1.98221e-16 0 -0.0025 -1.98221e-16 0.01 -0.0147951 0.140533 0.01 -0.00386921 0.0470566 0.01 -0.0079722 0.093954 0.01 -0.0147951 0.140533 0 -0.00386921 0.0470566 0 -0.0079722 0.093954 0 -0.0147951 0.140533 0 -0.00987105 0.141402 0 -0.00987105 0.141402 0.01 -0.0147951 0.140533 0.01 0.0025 -1.99446e-16 0 0.0025 -1.99446e-16 0.01 -0.00987105 0.141402 0.01 0.00112233 0.0473473 0.01 -0.00300601 0.0945345 0.01 -0.00987105 0.141402 0 0.00112233 0.0473473 0 -0.00300601 0.0945345 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0149212 -0.141975 0 -0.00999714 -0.142843 0 -0.00999714 -0.142843 0.01 -0.0149212 -0.141975 0.01 -0.0149212 -0.141975 0 -0.00999714 -0.142843 0 -0.0025 -2.00254e-16 0 -0.00802832 -0.0949176 0 -0.00388325 -0.0475392 0 -0.0149212 0.141975 0 -0.00388325 0.0475392 0 -0.00802832 0.0949176 0 -0.00999714 0.142843 0 0.0025 -2.01479e-16 0 0.00110829 0.0478299 0 -0.00306213 0.095498 0 -0.00306213 -0.095498 0 0.00110829 -0.0478299 0 -0.00999714 -0.142843 0 -0.00999714 -0.142843 0.01 0.0025 -2.01479e-16 0.01 -0.00306213 -0.095498 0.01 0.00110829 -0.0478299 0.01 0.0025 -2.01479e-16 0 -0.00306213 -0.095498 0 0.00110829 -0.0478299 0 -0.0149212 -0.141975 0.01 -0.00999714 -0.142843 0.01 -0.0025 -2.00254e-16 0.01 -0.00802832 -0.0949176 0.01 -0.00388325 -0.0475392 0.01 -0.0149212 0.141975 0.01 -0.00388325 0.0475392 0.01 -0.00802832 0.0949176 0.01 -0.00999714 0.142843 0.01 0.0025 -2.01479e-16 0.01 0.00110829 0.0478299 0.01 -0.00306213 0.095498 0.01 -0.00306213 -0.095498 0.01 0.00110829 -0.0478299 0.01 -0.0149212 -0.141975 0 -0.0149212 -0.141975 0.01 -0.0025 -2.00254e-16 0.01 -0.00802832 -0.0949176 0.01 -0.00388325 -0.0475392 0.01 -0.0025 -2.00254e-16 0 -0.00802832 -0.0949176 0 -0.00388325 -0.0475392 0 -0.0025 -2.00254e-16 0 -0.0025 -2.00254e-16 0.01 -0.0149212 0.141975 0.01 -0.00388325 0.0475392 0.01 -0.00802832 0.0949176 0.01 -0.0149212 0.141975 0 -0.00388325 0.0475392 0 -0.00802832 0.0949176 0 -0.0149212 0.141975 0 -0.00999714 0.142843 0 -0.00999714 0.142843 0.01 -0.0149212 0.141975 0.01 0.0025 -2.01479e-16 0 0.0025 -2.01479e-16 0.01 -0.00999714 0.142843 0.01 0.00110829 0.0478299 0.01 -0.00306213 0.095498 0.01 -0.00999714 0.142843 0 0.00110829 0.0478299 0 -0.00306213 0.095498 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0149227 -0.141992 0 -0.00999866 -0.14286 0 -0.00999866 -0.14286 0.01 -0.0149227 -0.141992 0.01 -0.0149227 -0.141992 0 -0.00999866 -0.14286 0 -0.0025 -2.00279e-16 0 -0.00802899 -0.0949292 0 -0.00388342 -0.047545 0 -0.0149227 0.141992 0 -0.00388342 0.047545 0 -0.00802899 0.0949292 0 -0.00999866 0.14286 0 0.0025 -2.01503e-16 0 0.00110812 0.0478358 0 -0.0030628 0.0955096 0 -0.0030628 -0.0955096 0 0.00110812 -0.0478358 0 -0.00999866 -0.14286 0 -0.00999866 -0.14286 0.01 0.0025 -2.01503e-16 0.01 -0.0030628 -0.0955096 0.01 0.00110812 -0.0478358 0.01 0.0025 -2.01503e-16 0 -0.0030628 -0.0955096 0 0.00110812 -0.0478358 0 -0.0149227 -0.141992 0.01 -0.00999866 -0.14286 0.01 -0.0025 -2.00279e-16 0.01 -0.00802899 -0.0949292 0.01 -0.00388342 -0.047545 0.01 -0.0149227 0.141992 0.01 -0.00388342 0.047545 0.01 -0.00802899 0.0949292 0.01 -0.00999866 0.14286 0.01 0.0025 -2.01503e-16 0.01 0.00110812 0.0478358 0.01 -0.0030628 0.0955096 0.01 -0.0030628 -0.0955096 0.01 0.00110812 -0.0478358 0.01 -0.0149227 -0.141992 0 -0.0149227 -0.141992 0.01 -0.0025 -2.00279e-16 0.01 -0.00802899 -0.0949292 0.01 -0.00388342 -0.047545 0.01 -0.0025 -2.00279e-16 0 -0.00802899 -0.0949292 0 -0.00388342 -0.047545 0 -0.0025 -2.00279e-16 0 -0.0025 -2.00279e-16 0.01 -0.0149227 0.141992 0.01 -0.00388342 0.047545 0.01 -0.00802899 0.0949292 0.01 -0.0149227 0.141992 0 -0.00388342 0.047545 0 -0.00802899 0.0949292 0 -0.0149227 0.141992 0 -0.00999866 0.14286 0 -0.00999866 0.14286 0.01 -0.0149227 0.141992 0.01 0.0025 -2.01503e-16 0 0.0025 -2.01503e-16 0.01 -0.00999866 0.14286 0.01 0.00110812 0.0478358 0.01 -0.0030628 0.0955096 0.01 -0.00999866 0.14286 0 0.00110812 0.0478358 0 -0.0030628 0.0955096 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0173155 -0.169342 0 -0.0123914 -0.17021 0 -0.0123914 -0.17021 0.01 -0.0173155 -0.169342 0.01 -0.0173155 -0.169342 0 -0.0123914 -0.17021 0 -0.0025 -2.38855e-16 0 -0.00909395 -0.113214 0 -0.00414988 -0.0567028 0 -0.0173155 0.169342 0 -0.00414988 0.0567028 0 -0.00909395 0.113214 0 -0.0123914 0.17021 0 0.0025 -2.4008e-16 0 0.000841657 0.0569936 0 -0.00412776 0.113794 0 -0.00412776 -0.113794 0 0.000841657 -0.0569936 0 -0.0123914 -0.17021 0 -0.0123914 -0.17021 0.01 0.0025 -2.4008e-16 0.01 -0.00412776 -0.113794 0.01 0.000841657 -0.0569936 0.01 0.0025 -2.4008e-16 0 -0.00412776 -0.113794 0 0.000841657 -0.0569936 0 -0.0173155 -0.169342 0.01 -0.0123914 -0.17021 0.01 -0.0025 -2.38855e-16 0.01 -0.00909395 -0.113214 0.01 -0.00414988 -0.0567028 0.01 -0.0173155 0.169342 0.01 -0.00414988 0.0567028 0.01 -0.00909395 0.113214 0.01 -0.0123914 0.17021 0.01 0.0025 -2.4008e-16 0.01 0.000841657 0.0569936 0.01 -0.00412776 0.113794 0.01 -0.00412776 -0.113794 0.01 0.000841657 -0.0569936 0.01 -0.0173155 -0.169342 0 -0.0173155 -0.169342 0.01 -0.0025 -2.38855e-16 0.01 -0.00909395 -0.113214 0.01 -0.00414988 -0.0567028 0.01 -0.0025 -2.38855e-16 0 -0.00909395 -0.113214 0 -0.00414988 -0.0567028 0 -0.0025 -2.38855e-16 0 -0.0025 -2.38855e-16 0.01 -0.0173155 0.169342 0.01 -0.00414988 0.0567028 0.01 -0.00909395 0.113214 0.01 -0.0173155 0.169342 0 -0.00414988 0.0567028 0 -0.00909395 0.113214 0 -0.0173155 0.169342 0 -0.0123914 0.17021 0 -0.0123914 0.17021 0.01 -0.0173155 0.169342 0.01 0.0025 -2.4008e-16 0 0.0025 -2.4008e-16 0.01 -0.0123914 0.17021 0.01 0.000841657 0.0569936 0.01 -0.00412776 0.113794 0.01 -0.0123914 0.17021 0 0.000841657 0.0569936 0 -0.00412776 0.113794 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0173094 -0.169272 0 -0.0123854 -0.17014 0 -0.0123854 -0.17014 0.01 -0.0173094 -0.169272 0.01 -0.0173094 -0.169272 0 -0.0123854 -0.17014 0 -0.0025 -2.38757e-16 0 -0.00909125 -0.113167 0 -0.00414921 -0.0566796 0 -0.0173094 0.169272 0 -0.00414921 0.0566796 0 -0.00909125 0.113167 0 -0.0123854 0.17014 0 0.0025 -2.39982e-16 0 0.000842333 0.0569703 0 -0.00412506 0.113748 0 -0.00412506 -0.113748 0 0.000842333 -0.0569703 0 -0.0123854 -0.17014 0 -0.0123854 -0.17014 0.01 0.0025 -2.39982e-16 0.01 -0.00412506 -0.113748 0.01 0.000842333 -0.0569703 0.01 0.0025 -2.39982e-16 0 -0.00412506 -0.113748 0 0.000842333 -0.0569703 0 -0.0173094 -0.169272 0.01 -0.0123854 -0.17014 0.01 -0.0025 -2.38757e-16 0.01 -0.00909125 -0.113167 0.01 -0.00414921 -0.0566796 0.01 -0.0173094 0.169272 0.01 -0.00414921 0.0566796 0.01 -0.00909125 0.113167 0.01 -0.0123854 0.17014 0.01 0.0025 -2.39982e-16 0.01 0.000842333 0.0569703 0.01 -0.00412506 0.113748 0.01 -0.00412506 -0.113748 0.01 0.000842333 -0.0569703 0.01 -0.0173094 -0.169272 0 -0.0173094 -0.169272 0.01 -0.0025 -2.38757e-16 0.01 -0.00909125 -0.113167 0.01 -0.00414921 -0.0566796 0.01 -0.0025 -2.38757e-16 0 -0.00909125 -0.113167 0 -0.00414921 -0.0566796 0 -0.0025 -2.38757e-16 0 -0.0025 -2.38757e-16 0.01 -0.0173094 0.169272 0.01 -0.00414921 0.0566796 0.01 -0.00909125 0.113167 0.01 -0.0173094 0.169272 0 -0.00414921 0.0566796 0 -0.00909125 0.113167 0 -0.0173094 0.169272 0 -0.0123854 0.17014 0 -0.0123854 0.17014 0.01 -0.0173094 0.169272 0.01 0.0025 -2.39982e-16 0 0.0025 -2.39982e-16 0.01 -0.0123854 0.17014 0.01 0.000842333 0.0569703 0.01 -0.00412506 0.113748 0.01 -0.0123854 0.17014 0 0.000842333 0.0569703 0 -0.00412506 0.113748 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179323 -0.176392 0 -0.0130082 -0.17726 0 -0.0130082 -0.17726 0.01 -0.0179323 -0.176392 0.01 -0.0179323 -0.176392 0 -0.0130082 -0.17726 0 -0.0025 -2.48799e-16 0 -0.00936848 -0.117927 0 -0.00421857 -0.0590635 0 -0.0179323 0.176392 0 -0.00421857 0.0590635 0 -0.00936848 0.117927 0 -0.0130082 0.17726 0 0.0025 -2.50024e-16 0 0.000772968 0.0593542 0 -0.00440228 0.118508 0 -0.00440228 -0.118508 0 0.000772968 -0.0593542 0 -0.0130082 -0.17726 0 -0.0130082 -0.17726 0.01 0.0025 -2.50024e-16 0.01 -0.00440228 -0.118508 0.01 0.000772968 -0.0593542 0.01 0.0025 -2.50024e-16 0 -0.00440228 -0.118508 0 0.000772968 -0.0593542 0 -0.0179323 -0.176392 0.01 -0.0130082 -0.17726 0.01 -0.0025 -2.48799e-16 0.01 -0.00936848 -0.117927 0.01 -0.00421857 -0.0590635 0.01 -0.0179323 0.176392 0.01 -0.00421857 0.0590635 0.01 -0.00936848 0.117927 0.01 -0.0130082 0.17726 0.01 0.0025 -2.50024e-16 0.01 0.000772968 0.0593542 0.01 -0.00440228 0.118508 0.01 -0.00440228 -0.118508 0.01 0.000772968 -0.0593542 0.01 -0.0179323 -0.176392 0 -0.0179323 -0.176392 0.01 -0.0025 -2.48799e-16 0.01 -0.00936848 -0.117927 0.01 -0.00421857 -0.0590635 0.01 -0.0025 -2.48799e-16 0 -0.00936848 -0.117927 0 -0.00421857 -0.0590635 0 -0.0025 -2.48799e-16 0 -0.0025 -2.48799e-16 0.01 -0.0179323 0.176392 0.01 -0.00421857 0.0590635 0.01 -0.00936848 0.117927 0.01 -0.0179323 0.176392 0 -0.00421857 0.0590635 0 -0.00936848 0.117927 0 -0.0179323 0.176392 0 -0.0130082 0.17726 0 -0.0130082 0.17726 0.01 -0.0179323 0.176392 0.01 0.0025 -2.50024e-16 0 0.0025 -2.50024e-16 0.01 -0.0130082 0.17726 0.01 0.000772968 0.0593542 0.01 -0.00440228 0.118508 0.01 -0.0130082 0.17726 0 0.000772968 0.0593542 0 -0.00440228 0.118508 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0179247 -0.176305 0 -0.0130006 -0.177173 0 -0.0130006 -0.177173 0.01 -0.0179247 -0.176305 0.01 -0.0179247 -0.176305 0 -0.0130006 -0.177173 0 -0.0025 -2.48677e-16 0 -0.0093651 -0.117869 0 -0.00421773 -0.0590344 0 -0.0179247 0.176305 0 -0.00421773 0.0590344 0 -0.0093651 0.117869 0 -0.0130006 0.177173 0 0.0025 -2.49901e-16 0 0.000773814 0.0593252 0 -0.0043989 0.11845 0 -0.0043989 -0.11845 0 0.000773814 -0.0593252 0 -0.0130006 -0.177173 0 -0.0130006 -0.177173 0.01 0.0025 -2.49901e-16 0.01 -0.0043989 -0.11845 0.01 0.000773814 -0.0593252 0.01 0.0025 -2.49901e-16 0 -0.0043989 -0.11845 0 0.000773814 -0.0593252 0 -0.0179247 -0.176305 0.01 -0.0130006 -0.177173 0.01 -0.0025 -2.48677e-16 0.01 -0.0093651 -0.117869 0.01 -0.00421773 -0.0590344 0.01 -0.0179247 0.176305 0.01 -0.00421773 0.0590344 0.01 -0.0093651 0.117869 0.01 -0.0130006 0.177173 0.01 0.0025 -2.49901e-16 0.01 0.000773814 0.0593252 0.01 -0.0043989 0.11845 0.01 -0.0043989 -0.11845 0.01 0.000773814 -0.0593252 0.01 -0.0179247 -0.176305 0 -0.0179247 -0.176305 0.01 -0.0025 -2.48677e-16 0.01 -0.0093651 -0.117869 0.01 -0.00421773 -0.0590344 0.01 -0.0025 -2.48677e-16 0 -0.0093651 -0.117869 0 -0.00421773 -0.0590344 0 -0.0025 -2.48677e-16 0 -0.0025 -2.48677e-16 0.01 -0.0179247 0.176305 0.01 -0.00421773 0.0590344 0.01 -0.0093651 0.117869 0.01 -0.0179247 0.176305 0 -0.00421773 0.0590344 0 -0.0093651 0.117869 0 -0.0179247 0.176305 0 -0.0130006 0.177173 0 -0.0130006 0.177173 0.01 -0.0179247 0.176305 0.01 0.0025 -2.49901e-16 0 0.0025 -2.49901e-16 0.01 -0.0130006 0.177173 0.01 0.000773814 0.0593252 0.01 -0.0043989 0.11845 0.01 -0.0130006 0.177173 0 0.000773814 0.0593252 0 -0.0043989 0.11845 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0180553 -0.177798 0 -0.0131313 -0.178667 0 -0.0131313 -0.178667 0.01 -0.0180553 -0.177798 0.01 -0.0180553 -0.177798 0 -0.0131313 -0.178667 0 -0.0025 -2.50783e-16 0 -0.00942325 -0.118868 0 -0.00423228 -0.0595345 0 -0.0180553 0.177798 0 -0.00423228 0.0595345 0 -0.00942325 0.118868 0 -0.0131313 0.178667 0 0.0025 -2.52008e-16 0 0.000759264 0.0598252 0 -0.00445705 0.119448 0 -0.00445705 -0.119448 0 0.000759264 -0.0598252 0 -0.0131313 -0.178667 0 -0.0131313 -0.178667 0.01 0.0025 -2.52008e-16 0.01 -0.00445705 -0.119448 0.01 0.000759264 -0.0598252 0.01 0.0025 -2.52008e-16 0 -0.00445705 -0.119448 0 0.000759264 -0.0598252 0 -0.0180553 -0.177798 0.01 -0.0131313 -0.178667 0.01 -0.0025 -2.50783e-16 0.01 -0.00942325 -0.118868 0.01 -0.00423228 -0.0595345 0.01 -0.0180553 0.177798 0.01 -0.00423228 0.0595345 0.01 -0.00942325 0.118868 0.01 -0.0131313 0.178667 0.01 0.0025 -2.52008e-16 0.01 0.000759264 0.0598252 0.01 -0.00445705 0.119448 0.01 -0.00445705 -0.119448 0.01 0.000759264 -0.0598252 0.01 -0.0180553 -0.177798 0 -0.0180553 -0.177798 0.01 -0.0025 -2.50783e-16 0.01 -0.00942325 -0.118868 0.01 -0.00423228 -0.0595345 0.01 -0.0025 -2.50783e-16 0 -0.00942325 -0.118868 0 -0.00423228 -0.0595345 0 -0.0025 -2.50783e-16 0 -0.0025 -2.50783e-16 0.01 -0.0180553 0.177798 0.01 -0.00423228 0.0595345 0.01 -0.00942325 0.118868 0.01 -0.0180553 0.177798 0 -0.00423228 0.0595345 0 -0.00942325 0.118868 0 -0.0180553 0.177798 0 -0.0131313 0.178667 0 -0.0131313 0.178667 0.01 -0.0180553 0.177798 0.01 0.0025 -2.52008e-16 0 0.0025 -2.52008e-16 0.01 -0.0131313 0.178667 0.01 0.000759264 0.0598252 0.01 -0.00445705 0.119448 0.01 -0.0131313 0.178667 0 0.000759264 0.0598252 0 -0.00445705 0.119448 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0180477 -0.177712 0 -0.0131237 -0.17858 0 -0.0131237 -0.17858 0.01 -0.0180477 -0.177712 0.01 -0.0180477 -0.177712 0 -0.0131237 -0.17858 0 -0.0025 -2.50661e-16 0 -0.00941986 -0.118809 0 -0.00423143 -0.0595054 0 -0.0180477 0.177712 0 -0.00423143 0.0595054 0 -0.00941986 0.118809 0 -0.0131237 0.17858 0 0.0025 -2.51885e-16 0 0.00076011 0.0597961 0 -0.00445367 0.11939 0 -0.00445367 -0.11939 0 0.00076011 -0.0597961 0 -0.0131237 -0.17858 0 -0.0131237 -0.17858 0.01 0.0025 -2.51885e-16 0.01 -0.00445367 -0.11939 0.01 0.00076011 -0.0597961 0.01 0.0025 -2.51885e-16 0 -0.00445367 -0.11939 0 0.00076011 -0.0597961 0 -0.0180477 -0.177712 0.01 -0.0131237 -0.17858 0.01 -0.0025 -2.50661e-16 0.01 -0.00941986 -0.118809 0.01 -0.00423143 -0.0595054 0.01 -0.0180477 0.177712 0.01 -0.00423143 0.0595054 0.01 -0.00941986 0.118809 0.01 -0.0131237 0.17858 0.01 0.0025 -2.51885e-16 0.01 0.00076011 0.0597961 0.01 -0.00445367 0.11939 0.01 -0.00445367 -0.11939 0.01 0.00076011 -0.0597961 0.01 -0.0180477 -0.177712 0 -0.0180477 -0.177712 0.01 -0.0025 -2.50661e-16 0.01 -0.00941986 -0.118809 0.01 -0.00423143 -0.0595054 0.01 -0.0025 -2.50661e-16 0 -0.00941986 -0.118809 0 -0.00423143 -0.0595054 0 -0.0025 -2.50661e-16 0 -0.0025 -2.50661e-16 0.01 -0.0180477 0.177712 0.01 -0.00423143 0.0595054 0.01 -0.00941986 0.118809 0.01 -0.0180477 0.177712 0 -0.00423143 0.0595054 0 -0.00941986 0.118809 0 -0.0180477 0.177712 0 -0.0131237 0.17858 0 -0.0131237 0.17858 0.01 -0.0180477 0.177712 0.01 0.0025 -2.51885e-16 0 0.0025 -2.51885e-16 0.01 -0.0131237 0.17858 0.01 0.00076011 0.0597961 0.01 -0.00445367 0.11939 0.01 -0.0131237 0.17858 0 0.00076011 0.0597961 0 -0.00445367 0.11939 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0181784 -0.179205 0 -0.0132544 -0.180073 0 -0.0132544 -0.180073 0.01 -0.0181784 -0.179205 0.01 -0.0181784 -0.179205 0 -0.0132544 -0.180073 0 -0.0025 -2.52767e-16 0 -0.00947801 -0.119808 0 -0.00424598 -0.0600055 0 -0.0181784 0.179205 0 -0.00424598 0.0600055 0 -0.00947801 0.119808 0 -0.0132544 0.180073 0 0.0025 -2.53992e-16 0 0.00074556 0.0602962 0 -0.00451182 0.120388 0 -0.00451182 -0.120388 0 0.00074556 -0.0602962 0 -0.0132544 -0.180073 0 -0.0132544 -0.180073 0.01 0.0025 -2.53992e-16 0.01 -0.00451182 -0.120388 0.01 0.00074556 -0.0602962 0.01 0.0025 -2.53992e-16 0 -0.00451182 -0.120388 0 0.00074556 -0.0602962 0 -0.0181784 -0.179205 0.01 -0.0132544 -0.180073 0.01 -0.0025 -2.52767e-16 0.01 -0.00947801 -0.119808 0.01 -0.00424598 -0.0600055 0.01 -0.0181784 0.179205 0.01 -0.00424598 0.0600055 0.01 -0.00947801 0.119808 0.01 -0.0132544 0.180073 0.01 0.0025 -2.53992e-16 0.01 0.00074556 0.0602962 0.01 -0.00451182 0.120388 0.01 -0.00451182 -0.120388 0.01 0.00074556 -0.0602962 0.01 -0.0181784 -0.179205 0 -0.0181784 -0.179205 0.01 -0.0025 -2.52767e-16 0.01 -0.00947801 -0.119808 0.01 -0.00424598 -0.0600055 0.01 -0.0025 -2.52767e-16 0 -0.00947801 -0.119808 0 -0.00424598 -0.0600055 0 -0.0025 -2.52767e-16 0 -0.0025 -2.52767e-16 0.01 -0.0181784 0.179205 0.01 -0.00424598 0.0600055 0.01 -0.00947801 0.119808 0.01 -0.0181784 0.179205 0 -0.00424598 0.0600055 0 -0.00947801 0.119808 0 -0.0181784 0.179205 0 -0.0132544 0.180073 0 -0.0132544 0.180073 0.01 -0.0181784 0.179205 0.01 0.0025 -2.53992e-16 0 0.0025 -2.53992e-16 0.01 -0.0132544 0.180073 0.01 0.00074556 0.0602962 0.01 -0.00451182 0.120388 0.01 -0.0132544 0.180073 0 0.00074556 0.0602962 0 -0.00451182 0.120388 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0181708 -0.179118 0 -0.0132468 -0.179986 0 -0.0132468 -0.179986 0.01 -0.0181708 -0.179118 0.01 -0.0181708 -0.179118 0 -0.0132468 -0.179986 0 -0.0025 -2.52645e-16 0 -0.00947463 -0.11975 0 -0.00424513 -0.0599764 0 -0.0181708 0.179118 0 -0.00424513 0.0599764 0 -0.00947463 0.11975 0 -0.0132468 0.179986 0 0.0025 -2.53869e-16 0 0.000746406 0.0602671 0 -0.00450844 0.12033 0 -0.00450844 -0.12033 0 0.000746406 -0.0602671 0 -0.0132468 -0.179986 0 -0.0132468 -0.179986 0.01 0.0025 -2.53869e-16 0.01 -0.00450844 -0.12033 0.01 0.000746406 -0.0602671 0.01 0.0025 -2.53869e-16 0 -0.00450844 -0.12033 0 0.000746406 -0.0602671 0 -0.0181708 -0.179118 0.01 -0.0132468 -0.179986 0.01 -0.0025 -2.52645e-16 0.01 -0.00947463 -0.11975 0.01 -0.00424513 -0.0599764 0.01 -0.0181708 0.179118 0.01 -0.00424513 0.0599764 0.01 -0.00947463 0.11975 0.01 -0.0132468 0.179986 0.01 0.0025 -2.53869e-16 0.01 0.000746406 0.0602671 0.01 -0.00450844 0.12033 0.01 -0.00450844 -0.12033 0.01 0.000746406 -0.0602671 0.01 -0.0181708 -0.179118 0 -0.0181708 -0.179118 0.01 -0.0025 -2.52645e-16 0.01 -0.00947463 -0.11975 0.01 -0.00424513 -0.0599764 0.01 -0.0025 -2.52645e-16 0 -0.00947463 -0.11975 0 -0.00424513 -0.0599764 0 -0.0025 -2.52645e-16 0 -0.0025 -2.52645e-16 0.01 -0.0181708 0.179118 0.01 -0.00424513 0.0599764 0.01 -0.00947463 0.11975 0.01 -0.0181708 0.179118 0 -0.00424513 0.0599764 0 -0.00947463 0.11975 0 -0.0181708 0.179118 0 -0.0132468 0.179986 0 -0.0132468 0.179986 0.01 -0.0181708 0.179118 0.01 0.0025 -2.53869e-16 0 0.0025 -2.53869e-16 0.01 -0.0132468 0.179986 0.01 0.000746406 0.0602671 0.01 -0.00450844 0.12033 0.01 -0.0132468 0.179986 0 0.000746406 0.0602671 0 -0.00450844 0.12033 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0183015 -0.180611 0 -0.0133774 -0.18148 0 -0.0133774 -0.18148 0.01 -0.0183015 -0.180611 0.01 -0.0183015 -0.180611 0 -0.0133774 -0.18148 0 -0.0025 -2.54751e-16 0 -0.00953278 -0.120748 0 -0.00425968 -0.0604764 0 -0.0183015 0.180611 0 -0.00425968 0.0604764 0 -0.00953278 0.120748 0 -0.0133774 0.18148 0 0.0025 -2.55976e-16 0 0.000731856 0.0607672 0 -0.00456659 0.121329 0 -0.00456659 -0.121329 0 0.000731856 -0.0607672 0 -0.0133774 -0.18148 0 -0.0133774 -0.18148 0.01 0.0025 -2.55976e-16 0.01 -0.00456659 -0.121329 0.01 0.000731856 -0.0607672 0.01 0.0025 -2.55976e-16 0 -0.00456659 -0.121329 0 0.000731856 -0.0607672 0 -0.0183015 -0.180611 0.01 -0.0133774 -0.18148 0.01 -0.0025 -2.54751e-16 0.01 -0.00953278 -0.120748 0.01 -0.00425968 -0.0604764 0.01 -0.0183015 0.180611 0.01 -0.00425968 0.0604764 0.01 -0.00953278 0.120748 0.01 -0.0133774 0.18148 0.01 0.0025 -2.55976e-16 0.01 0.000731856 0.0607672 0.01 -0.00456659 0.121329 0.01 -0.00456659 -0.121329 0.01 0.000731856 -0.0607672 0.01 -0.0183015 -0.180611 0 -0.0183015 -0.180611 0.01 -0.0025 -2.54751e-16 0.01 -0.00953278 -0.120748 0.01 -0.00425968 -0.0604764 0.01 -0.0025 -2.54751e-16 0 -0.00953278 -0.120748 0 -0.00425968 -0.0604764 0 -0.0025 -2.54751e-16 0 -0.0025 -2.54751e-16 0.01 -0.0183015 0.180611 0.01 -0.00425968 0.0604764 0.01 -0.00953278 0.120748 0.01 -0.0183015 0.180611 0 -0.00425968 0.0604764 0 -0.00953278 0.120748 0 -0.0183015 0.180611 0 -0.0133774 0.18148 0 -0.0133774 0.18148 0.01 -0.0183015 0.180611 0.01 0.0025 -2.55976e-16 0 0.0025 -2.55976e-16 0.01 -0.0133774 0.18148 0.01 0.000731856 0.0607672 0.01 -0.00456659 0.121329 0.01 -0.0133774 0.18148 0 0.000731856 0.0607672 0 -0.00456659 0.121329 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0182954 -0.180542 0 -0.0133713 -0.18141 0 -0.0133713 -0.18141 0.01 -0.0182954 -0.180542 0.01 -0.0182954 -0.180542 0 -0.0133713 -0.18141 0 -0.0025 -2.54653e-16 0 -0.00953008 -0.120702 0 -0.00425901 -0.0604532 0 -0.0182954 0.180542 0 -0.00425901 0.0604532 0 -0.00953008 0.120702 0 -0.0133713 0.18141 0 0.0025 -2.55878e-16 0 0.000732533 0.0607439 0 -0.00456389 0.121282 0 -0.00456389 -0.121282 0 0.000732533 -0.0607439 0 -0.0133713 -0.18141 0 -0.0133713 -0.18141 0.01 0.0025 -2.55878e-16 0.01 -0.00456389 -0.121282 0.01 0.000732533 -0.0607439 0.01 0.0025 -2.55878e-16 0 -0.00456389 -0.121282 0 0.000732533 -0.0607439 0 -0.0182954 -0.180542 0.01 -0.0133713 -0.18141 0.01 -0.0025 -2.54653e-16 0.01 -0.00953008 -0.120702 0.01 -0.00425901 -0.0604532 0.01 -0.0182954 0.180542 0.01 -0.00425901 0.0604532 0.01 -0.00953008 0.120702 0.01 -0.0133713 0.18141 0.01 0.0025 -2.55878e-16 0.01 0.000732533 0.0607439 0.01 -0.00456389 0.121282 0.01 -0.00456389 -0.121282 0.01 0.000732533 -0.0607439 0.01 -0.0182954 -0.180542 0 -0.0182954 -0.180542 0.01 -0.0025 -2.54653e-16 0.01 -0.00953008 -0.120702 0.01 -0.00425901 -0.0604532 0.01 -0.0025 -2.54653e-16 0 -0.00953008 -0.120702 0 -0.00425901 -0.0604532 0 -0.0025 -2.54653e-16 0 -0.0025 -2.54653e-16 0.01 -0.0182954 0.180542 0.01 -0.00425901 0.0604532 0.01 -0.00953008 0.120702 0.01 -0.0182954 0.180542 0 -0.00425901 0.0604532 0 -0.00953008 0.120702 0 -0.0182954 0.180542 0 -0.0133713 0.18141 0 -0.0133713 0.18141 0.01 -0.0182954 0.180542 0.01 0.0025 -2.55878e-16 0 0.0025 -2.55878e-16 0.01 -0.0133713 0.18141 0.01 0.000732533 0.0607439 0.01 -0.00456389 0.121282 0.01 -0.0133713 0.18141 0 0.000732533 0.0607439 0 -0.00456389 0.121282 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 8 7 16 17 8 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 30 29 38 39 30 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0184245 -0.182018 0 -0.0135005 -0.182886 0 -0.0135005 -0.182886 0.01 -0.0184245 -0.182018 0.01 -0.0184245 -0.182018 0 -0.0135005 -0.182886 0 -0.0025 -2.56735e-16 0 -0.00958755 -0.121689 0 -0.00427339 -0.0609474 0 -0.0184245 0.182018 0 -0.00427339 0.0609474 0 -0.00958755 0.121689 0 -0.0135005 0.182886 0 0.0025 -2.5796e-16 0 0.000718152 0.0612381 0 -0.00462136 0.122269 0 -0.00462136 -0.122269 0 0.000718152 -0.0612381 0 -0.0135005 -0.182886 0 -0.0135005 -0.182886 0.01 0.0025 -2.5796e-16 0.01 -0.00462136 -0.122269 0.01 0.000718152 -0.0612381 0.01 0.0025 -2.5796e-16 0 -0.00462136 -0.122269 0 0.000718152 -0.0612381 0 -0.0184245 -0.182018 0.01 -0.0135005 -0.182886 0.01 -0.0025 -2.56735e-16 0.01 -0.00958755 -0.121689 0.01 -0.00427339 -0.0609474 0.01 -0.0184245 0.182018 0.01 -0.00427339 0.0609474 0.01 -0.00958755 0.121689 0.01 -0.0135005 0.182886 0.01 0.0025 -2.5796e-16 0.01 0.000718152 0.0612381 0.01 -0.00462136 0.122269 0.01 -0.00462136 -0.122269 0.01 0.000718152 -0.0612381 0.01 -0.0184245 -0.182018 0 -0.0184245 -0.182018 0.01 -0.0025 -2.56735e-16 0.01 -0.00958755 -0.121689 0.01 -0.00427339 -0.0609474 0.01 -0.0025 -2.56735e-16 0 -0.00958755 -0.121689 0 -0.00427339 -0.0609474 0 -0.0025 -2.56735e-16 0 -0.0025 -2.56735e-16 0.01 -0.0184245 0.182018 0.01 -0.00427339 0.0609474 0.01 -0.00958755 0.121689 0.01 -0.0184245 0.182018 0 -0.00427339 0.0609474 0 -0.00958755 0.121689 0 -0.0184245 0.182018 0 -0.0135005 0.182886 0 -0.0135005 0.182886 0.01 -0.0184245 0.182018 0.01 0.0025 -2.5796e-16 0 0.0025 -2.5796e-16 0.01 -0.0135005 0.182886 0.01 0.000718152 0.0612381 0.01 -0.00462136 0.122269 0.01 -0.0135005 0.182886 0 0.000718152 0.0612381 0 -0.00462136 0.122269 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0184184 -0.181949 0 -0.0134944 -0.182817 0 -0.0134944 -0.182817 0.01 -0.0184184 -0.181949 0.01 -0.0184184 -0.181949 0 -0.0134944 -0.182817 0 -0.0025 -2.56637e-16 0 -0.00958485 -0.121642 0 -0.00427271 -0.0609242 0 -0.0184184 0.181949 0 -0.00427271 0.0609242 0 -0.00958485 0.121642 0 -0.0134944 0.182817 0 0.0025 -2.57862e-16 0 0.000718829 0.0612149 0 -0.00461866 0.122223 0 -0.00461866 -0.122223 0 0.000718829 -0.0612149 0 -0.0134944 -0.182817 0 -0.0134944 -0.182817 0.01 0.0025 -2.57862e-16 0.01 -0.00461866 -0.122223 0.01 0.000718829 -0.0612149 0.01 0.0025 -2.57862e-16 0 -0.00461866 -0.122223 0 0.000718829 -0.0612149 0 -0.0184184 -0.181949 0.01 -0.0134944 -0.182817 0.01 -0.0025 -2.56637e-16 0.01 -0.00958485 -0.121642 0.01 -0.00427271 -0.0609242 0.01 -0.0184184 0.181949 0.01 -0.00427271 0.0609242 0.01 -0.00958485 0.121642 0.01 -0.0134944 0.182817 0.01 0.0025 -2.57862e-16 0.01 0.000718829 0.0612149 0.01 -0.00461866 0.122223 0.01 -0.00461866 -0.122223 0.01 0.000718829 -0.0612149 0.01 -0.0184184 -0.181949 0 -0.0184184 -0.181949 0.01 -0.0025 -2.56637e-16 0.01 -0.00958485 -0.121642 0.01 -0.00427271 -0.0609242 0.01 -0.0025 -2.56637e-16 0 -0.00958485 -0.121642 0 -0.00427271 -0.0609242 0 -0.0025 -2.56637e-16 0 -0.0025 -2.56637e-16 0.01 -0.0184184 0.181949 0.01 -0.00427271 0.0609242 0.01 -0.00958485 0.121642 0.01 -0.0184184 0.181949 0 -0.00427271 0.0609242 0 -0.00958485 0.121642 0 -0.0184184 0.181949 0 -0.0134944 0.182817 0 -0.0134944 0.182817 0.01 -0.0184184 0.181949 0.01 0.0025 -2.57862e-16 0 0.0025 -2.57862e-16 0.01 -0.0134944 0.182817 0.01 0.000718829 0.0612149 0.01 -0.00461866 0.122223 0.01 -0.0134944 0.182817 0 0.000718829 0.0612149 0 -0.00461866 0.122223 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0174385 -0.170748 0 -0.0125145 -0.171616 0 -0.0125145 -0.171616 0.01 -0.0174385 -0.170748 0.01 -0.0174385 -0.170748 0 -0.0125145 -0.171616 0 -0.0025 -2.40839e-16 0 -0.00914872 -0.114154 0 -0.00416359 -0.0571738 0 -0.0174385 0.170748 0 -0.00416359 0.0571738 0 -0.00914872 0.114154 0 -0.0125145 0.171616 0 0.0025 -2.42064e-16 0 0.000827953 0.0574645 0 -0.00418253 0.114735 0 -0.00418253 -0.114735 0 0.000827953 -0.0574645 0 -0.0125145 -0.171616 0 -0.0125145 -0.171616 0.01 0.0025 -2.42064e-16 0.01 -0.00418253 -0.114735 0.01 0.000827953 -0.0574645 0.01 0.0025 -2.42064e-16 0 -0.00418253 -0.114735 0 0.000827953 -0.0574645 0 -0.0174385 -0.170748 0.01 -0.0125145 -0.171616 0.01 -0.0025 -2.40839e-16 0.01 -0.00914872 -0.114154 0.01 -0.00416359 -0.0571738 0.01 -0.0174385 0.170748 0.01 -0.00416359 0.0571738 0.01 -0.00914872 0.114154 0.01 -0.0125145 0.171616 0.01 0.0025 -2.42064e-16 0.01 0.000827953 0.0574645 0.01 -0.00418253 0.114735 0.01 -0.00418253 -0.114735 0.01 0.000827953 -0.0574645 0.01 -0.0174385 -0.170748 0 -0.0174385 -0.170748 0.01 -0.0025 -2.40839e-16 0.01 -0.00914872 -0.114154 0.01 -0.00416359 -0.0571738 0.01 -0.0025 -2.40839e-16 0 -0.00914872 -0.114154 0 -0.00416359 -0.0571738 0 -0.0025 -2.40839e-16 0 -0.0025 -2.40839e-16 0.01 -0.0174385 0.170748 0.01 -0.00416359 0.0571738 0.01 -0.00914872 0.114154 0.01 -0.0174385 0.170748 0 -0.00416359 0.0571738 0 -0.00914872 0.114154 0 -0.0174385 0.170748 0 -0.0125145 0.171616 0 -0.0125145 0.171616 0.01 -0.0174385 0.170748 0.01 0.0025 -2.42064e-16 0 0.0025 -2.42064e-16 0.01 -0.0125145 0.171616 0.01 0.000827953 0.0574645 0.01 -0.00418253 0.114735 0.01 -0.0125145 0.171616 0 0.000827953 0.0574645 0 -0.00418253 0.114735 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 9 11 15 12 9 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0174325 -0.170679 0 -0.0125084 -0.171547 0 -0.0125084 -0.171547 0.01 -0.0174325 -0.170679 0.01 -0.0174325 -0.170679 0 -0.0125084 -0.171547 0 -0.0025 -2.40741e-16 0 -0.00914602 -0.114108 0 -0.00416291 -0.0571506 0 -0.0174325 0.170679 0 -0.00416291 0.0571506 0 -0.00914602 0.114108 0 -0.0125084 0.171547 0 0.0025 -2.41966e-16 0 0.00082863 0.0574413 0 -0.00417983 0.114688 0 -0.00417983 -0.114688 0 0.00082863 -0.0574413 0 -0.0125084 -0.171547 0 -0.0125084 -0.171547 0.01 0.0025 -2.41966e-16 0.01 -0.00417983 -0.114688 0.01 0.00082863 -0.0574413 0.01 0.0025 -2.41966e-16 0 -0.00417983 -0.114688 0 0.00082863 -0.0574413 0 -0.0174325 -0.170679 0.01 -0.0125084 -0.171547 0.01 -0.0025 -2.40741e-16 0.01 -0.00914602 -0.114108 0.01 -0.00416291 -0.0571506 0.01 -0.0174325 0.170679 0.01 -0.00416291 0.0571506 0.01 -0.00914602 0.114108 0.01 -0.0125084 0.171547 0.01 0.0025 -2.41966e-16 0.01 0.00082863 0.0574413 0.01 -0.00417983 0.114688 0.01 -0.00417983 -0.114688 0.01 0.00082863 -0.0574413 0.01 -0.0174325 -0.170679 0 -0.0174325 -0.170679 0.01 -0.0025 -2.40741e-16 0.01 -0.00914602 -0.114108 0.01 -0.00416291 -0.0571506 0.01 -0.0025 -2.40741e-16 0 -0.00914602 -0.114108 0 -0.00416291 -0.0571506 0 -0.0025 -2.40741e-16 0 -0.0025 -2.40741e-16 0.01 -0.0174325 0.170679 0.01 -0.00416291 0.0571506 0.01 -0.00914602 0.114108 0.01 -0.0174325 0.170679 0 -0.00416291 0.0571506 0 -0.00914602 0.114108 0 -0.0174325 0.170679 0 -0.0125084 0.171547 0 -0.0125084 0.171547 0.01 -0.0174325 0.170679 0.01 0.0025 -2.41966e-16 0 0.0025 -2.41966e-16 0.01 -0.0125084 0.171547 0.01 0.00082863 0.0574413 0.01 -0.00417983 0.114688 0.01 -0.0125084 0.171547 0 0.00082863 0.0574413 0 -0.00417983 0.114688 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0175616 -0.172155 0 -0.0126376 -0.173023 0 -0.0126376 -0.173023 0.01 -0.0175616 -0.172155 0.01 -0.0175616 -0.172155 0 -0.0126376 -0.173023 0 -0.0025 -2.42823e-16 0 -0.00920349 -0.115095 0 -0.00417729 -0.0576448 0 -0.0175616 0.172155 0 -0.00417729 0.0576448 0 -0.00920349 0.115095 0 -0.0126376 0.173023 0 0.0025 -2.44048e-16 0 0.000814249 0.0579355 0 -0.0042373 0.115675 0 -0.0042373 -0.115675 0 0.000814249 -0.0579355 0 -0.0126376 -0.173023 0 -0.0126376 -0.173023 0.01 0.0025 -2.44048e-16 0.01 -0.0042373 -0.115675 0.01 0.000814249 -0.0579355 0.01 0.0025 -2.44048e-16 0 -0.0042373 -0.115675 0 0.000814249 -0.0579355 0 -0.0175616 -0.172155 0.01 -0.0126376 -0.173023 0.01 -0.0025 -2.42823e-16 0.01 -0.00920349 -0.115095 0.01 -0.00417729 -0.0576448 0.01 -0.0175616 0.172155 0.01 -0.00417729 0.0576448 0.01 -0.00920349 0.115095 0.01 -0.0126376 0.173023 0.01 0.0025 -2.44048e-16 0.01 0.000814249 0.0579355 0.01 -0.0042373 0.115675 0.01 -0.0042373 -0.115675 0.01 0.000814249 -0.0579355 0.01 -0.0175616 -0.172155 0 -0.0175616 -0.172155 0.01 -0.0025 -2.42823e-16 0.01 -0.00920349 -0.115095 0.01 -0.00417729 -0.0576448 0.01 -0.0025 -2.42823e-16 0 -0.00920349 -0.115095 0 -0.00417729 -0.0576448 0 -0.0025 -2.42823e-16 0 -0.0025 -2.42823e-16 0.01 -0.0175616 0.172155 0.01 -0.00417729 0.0576448 0.01 -0.00920349 0.115095 0.01 -0.0175616 0.172155 0 -0.00417729 0.0576448 0 -0.00920349 0.115095 0 -0.0175616 0.172155 0 -0.0126376 0.173023 0 -0.0126376 0.173023 0.01 -0.0175616 0.172155 0.01 0.0025 -2.44048e-16 0 0.0025 -2.44048e-16 0.01 -0.0126376 0.173023 0.01 0.000814249 0.0579355 0.01 -0.0042373 0.115675 0.01 -0.0126376 0.173023 0 0.000814249 0.0579355 0 -0.0042373 0.115675 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 31 33 37 34 31 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0175555 -0.172085 0 -0.0126315 -0.172954 0 -0.0126315 -0.172954 0.01 -0.0175555 -0.172085 0.01 -0.0175555 -0.172085 0 -0.0126315 -0.172954 0 -0.0025 -2.42725e-16 0 -0.00920079 -0.115048 0 -0.00417662 -0.0576215 0 -0.0175555 0.172085 0 -0.00417662 0.0576215 0 -0.00920079 0.115048 0 -0.0126315 0.172954 0 0.0025 -2.4395e-16 0 0.000814926 0.0579122 0 -0.0042346 0.115629 0 -0.0042346 -0.115629 0 0.000814926 -0.0579122 0 -0.0126315 -0.172954 0 -0.0126315 -0.172954 0.01 0.0025 -2.4395e-16 0.01 -0.0042346 -0.115629 0.01 0.000814926 -0.0579122 0.01 0.0025 -2.4395e-16 0 -0.0042346 -0.115629 0 0.000814926 -0.0579122 0 -0.0175555 -0.172085 0.01 -0.0126315 -0.172954 0.01 -0.0025 -2.42725e-16 0.01 -0.00920079 -0.115048 0.01 -0.00417662 -0.0576215 0.01 -0.0175555 0.172085 0.01 -0.00417662 0.0576215 0.01 -0.00920079 0.115048 0.01 -0.0126315 0.172954 0.01 0.0025 -2.4395e-16 0.01 0.000814926 0.0579122 0.01 -0.0042346 0.115629 0.01 -0.0042346 -0.115629 0.01 0.000814926 -0.0579122 0.01 -0.0175555 -0.172085 0 -0.0175555 -0.172085 0.01 -0.0025 -2.42725e-16 0.01 -0.00920079 -0.115048 0.01 -0.00417662 -0.0576215 0.01 -0.0025 -2.42725e-16 0 -0.00920079 -0.115048 0 -0.00417662 -0.0576215 0 -0.0025 -2.42725e-16 0 -0.0025 -2.42725e-16 0.01 -0.0175555 0.172085 0.01 -0.00417662 0.0576215 0.01 -0.00920079 0.115048 0.01 -0.0175555 0.172085 0 -0.00417662 0.0576215 0 -0.00920079 0.115048 0 -0.0175555 0.172085 0 -0.0126315 0.172954 0 -0.0126315 0.172954 0.01 -0.0175555 0.172085 0.01 0.0025 -2.4395e-16 0 0.0025 -2.4395e-16 0.01 -0.0126315 0.172954 0.01 0.000814926 0.0579122 0.01 -0.0042346 0.115629 0.01 -0.0126315 0.172954 0 0.000814926 0.0579122 0 -0.0042346 0.115629 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0176862 -0.173579 0 -0.0127621 -0.174447 0 -0.0127621 -0.174447 0.01 -0.0176862 -0.173579 0.01 -0.0176862 -0.173579 0 -0.0127621 -0.174447 0 -0.0025 -2.44831e-16 0 -0.00925894 -0.116046 0 -0.00419116 -0.0581216 0 -0.0176862 0.173579 0 -0.00419116 0.0581216 0 -0.00925894 0.116046 0 -0.0127621 0.174447 0 0.0025 -2.46056e-16 0 0.000800376 0.0584123 0 -0.00429275 0.116627 0 -0.00429275 -0.116627 0 0.000800376 -0.0584123 0 -0.0127621 -0.174447 0 -0.0127621 -0.174447 0.01 0.0025 -2.46056e-16 0.01 -0.00429275 -0.116627 0.01 0.000800376 -0.0584123 0.01 0.0025 -2.46056e-16 0 -0.00429275 -0.116627 0 0.000800376 -0.0584123 0 -0.0176862 -0.173579 0.01 -0.0127621 -0.174447 0.01 -0.0025 -2.44831e-16 0.01 -0.00925894 -0.116046 0.01 -0.00419116 -0.0581216 0.01 -0.0176862 0.173579 0.01 -0.00419116 0.0581216 0.01 -0.00925894 0.116046 0.01 -0.0127621 0.174447 0.01 0.0025 -2.46056e-16 0.01 0.000800376 0.0584123 0.01 -0.00429275 0.116627 0.01 -0.00429275 -0.116627 0.01 0.000800376 -0.0584123 0.01 -0.0176862 -0.173579 0 -0.0176862 -0.173579 0.01 -0.0025 -2.44831e-16 0.01 -0.00925894 -0.116046 0.01 -0.00419116 -0.0581216 0.01 -0.0025 -2.44831e-16 0 -0.00925894 -0.116046 0 -0.00419116 -0.0581216 0 -0.0025 -2.44831e-16 0 -0.0025 -2.44831e-16 0.01 -0.0176862 0.173579 0.01 -0.00419116 0.0581216 0.01 -0.00925894 0.116046 0.01 -0.0176862 0.173579 0 -0.00419116 0.0581216 0 -0.00925894 0.116046 0 -0.0176862 0.173579 0 -0.0127621 0.174447 0 -0.0127621 0.174447 0.01 -0.0176862 0.173579 0.01 0.0025 -2.46056e-16 0 0.0025 -2.46056e-16 0.01 -0.0127621 0.174447 0.01 0.000800376 0.0584123 0.01 -0.00429275 0.116627 0.01 -0.0127621 0.174447 0 0.000800376 0.0584123 0 -0.00429275 0.116627 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 33 32 36 37 33 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0176786 -0.173492 0 -0.0127545 -0.17436 0 -0.0127545 -0.17436 0.01 -0.0176786 -0.173492 0.01 -0.0176786 -0.173492 0 -0.0127545 -0.17436 0 -0.0025 -2.44709e-16 0 -0.00925556 -0.115988 0 -0.00419032 -0.0580925 0 -0.0176786 0.173492 0 -0.00419032 0.0580925 0 -0.00925556 0.115988 0 -0.0127545 0.17436 0 0.0025 -2.45934e-16 0 0.000801222 0.0583832 0 -0.00428936 0.116569 0 -0.00428936 -0.116569 0 0.000801222 -0.0583832 0 -0.0127545 -0.17436 0 -0.0127545 -0.17436 0.01 0.0025 -2.45934e-16 0.01 -0.00428936 -0.116569 0.01 0.000801222 -0.0583832 0.01 0.0025 -2.45934e-16 0 -0.00428936 -0.116569 0 0.000801222 -0.0583832 0 -0.0176786 -0.173492 0.01 -0.0127545 -0.17436 0.01 -0.0025 -2.44709e-16 0.01 -0.00925556 -0.115988 0.01 -0.00419032 -0.0580925 0.01 -0.0176786 0.173492 0.01 -0.00419032 0.0580925 0.01 -0.00925556 0.115988 0.01 -0.0127545 0.17436 0.01 0.0025 -2.45934e-16 0.01 0.000801222 0.0583832 0.01 -0.00428936 0.116569 0.01 -0.00428936 -0.116569 0.01 0.000801222 -0.0583832 0.01 -0.0176786 -0.173492 0 -0.0176786 -0.173492 0.01 -0.0025 -2.44709e-16 0.01 -0.00925556 -0.115988 0.01 -0.00419032 -0.0580925 0.01 -0.0025 -2.44709e-16 0 -0.00925556 -0.115988 0 -0.00419032 -0.0580925 0 -0.0025 -2.44709e-16 0 -0.0025 -2.44709e-16 0.01 -0.0176786 0.173492 0.01 -0.00419032 0.0580925 0.01 -0.00925556 0.115988 0.01 -0.0176786 0.173492 0 -0.00419032 0.0580925 0 -0.00925556 0.115988 0 -0.0176786 0.173492 0 -0.0127545 0.17436 0 -0.0127545 0.17436 0.01 -0.0176786 0.173492 0.01 0.0025 -2.45934e-16 0 0.0025 -2.45934e-16 0.01 -0.0127545 0.17436 0.01 0.000801222 0.0583832 0.01 -0.00428936 0.116569 0.01 -0.0127545 0.17436 0 0.000801222 0.0583832 0 -0.00428936 0.116569 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 11 10 14 15 11 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0178092 -0.174985 0 -0.0128852 -0.175854 0 -0.0128852 -0.175854 0.01 -0.0178092 -0.174985 0.01 -0.0178092 -0.174985 0 -0.0128852 -0.175854 0 -0.0025 -2.46815e-16 0 -0.00931371 -0.116987 0 -0.00420487 -0.0585925 0 -0.0178092 0.174985 0 -0.00420487 0.0585925 0 -0.00931371 0.116987 0 -0.0128852 0.175854 0 0.0025 -2.4804e-16 0 0.000786672 0.0588833 0 -0.00434752 0.117567 0 -0.00434752 -0.117567 0 0.000786672 -0.0588833 0 -0.0128852 -0.175854 0 -0.0128852 -0.175854 0.01 0.0025 -2.4804e-16 0.01 -0.00434752 -0.117567 0.01 0.000786672 -0.0588833 0.01 0.0025 -2.4804e-16 0 -0.00434752 -0.117567 0 0.000786672 -0.0588833 0 -0.0178092 -0.174985 0.01 -0.0128852 -0.175854 0.01 -0.0025 -2.46815e-16 0.01 -0.00931371 -0.116987 0.01 -0.00420487 -0.0585925 0.01 -0.0178092 0.174985 0.01 -0.00420487 0.0585925 0.01 -0.00931371 0.116987 0.01 -0.0128852 0.175854 0.01 0.0025 -2.4804e-16 0.01 0.000786672 0.0588833 0.01 -0.00434752 0.117567 0.01 -0.00434752 -0.117567 0.01 0.000786672 -0.0588833 0.01 -0.0178092 -0.174985 0 -0.0178092 -0.174985 0.01 -0.0025 -2.46815e-16 0.01 -0.00931371 -0.116987 0.01 -0.00420487 -0.0585925 0.01 -0.0025 -2.46815e-16 0 -0.00931371 -0.116987 0 -0.00420487 -0.0585925 0 -0.0025 -2.46815e-16 0 -0.0025 -2.46815e-16 0.01 -0.0178092 0.174985 0.01 -0.00420487 0.0585925 0.01 -0.00931371 0.116987 0.01 -0.0178092 0.174985 0 -0.00420487 0.0585925 0 -0.00931371 0.116987 0 -0.0178092 0.174985 0 -0.0128852 0.175854 0 -0.0128852 0.175854 0.01 -0.0178092 0.174985 0.01 0.0025 -2.4804e-16 0 0.0025 -2.4804e-16 0.01 -0.0128852 0.175854 0.01 0.000786672 0.0588833 0.01 -0.00434752 0.117567 0.01 -0.0128852 0.175854 0 0.000786672 0.0588833 0 -0.00434752 0.117567 0 + + + 0 3 2 1 0 2 16 4 5 16 7 4 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 38 26 27 38 29 26 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + -0.0178016 -0.174898 0 -0.0128776 -0.175767 0 -0.0128776 -0.175767 0.01 -0.0178016 -0.174898 0.01 -0.0178016 -0.174898 0 -0.0128776 -0.175767 0 -0.0025 -2.46693e-16 0 -0.00931033 -0.116929 0 -0.00420402 -0.0585635 0 -0.0178016 0.174898 0 -0.00420402 0.0585635 0 -0.00931033 0.116929 0 -0.0128776 0.175767 0 0.0025 -2.47917e-16 0 0.000787518 0.0588542 0 -0.00434413 0.117509 0 -0.00434413 -0.117509 0 0.000787518 -0.0588542 0 -0.0128776 -0.175767 0 -0.0128776 -0.175767 0.01 0.0025 -2.47917e-16 0.01 -0.00434413 -0.117509 0.01 0.000787518 -0.0588542 0.01 0.0025 -2.47917e-16 0 -0.00434413 -0.117509 0 0.000787518 -0.0588542 0 -0.0178016 -0.174898 0.01 -0.0128776 -0.175767 0.01 -0.0025 -2.46693e-16 0.01 -0.00931033 -0.116929 0.01 -0.00420402 -0.0585635 0.01 -0.0178016 0.174898 0.01 -0.00420402 0.0585635 0.01 -0.00931033 0.116929 0.01 -0.0128776 0.175767 0.01 0.0025 -2.47917e-16 0.01 0.000787518 0.0588542 0.01 -0.00434413 0.117509 0.01 -0.00434413 -0.117509 0.01 0.000787518 -0.0588542 0.01 -0.0178016 -0.174898 0 -0.0178016 -0.174898 0.01 -0.0025 -2.46693e-16 0.01 -0.00931033 -0.116929 0.01 -0.00420402 -0.0585635 0.01 -0.0025 -2.46693e-16 0 -0.00931033 -0.116929 0 -0.00420402 -0.0585635 0 -0.0025 -2.46693e-16 0 -0.0025 -2.46693e-16 0.01 -0.0178016 0.174898 0.01 -0.00420402 0.0585635 0.01 -0.00931033 0.116929 0.01 -0.0178016 0.174898 0 -0.00420402 0.0585635 0 -0.00931033 0.116929 0 -0.0178016 0.174898 0 -0.0128776 0.175767 0 -0.0128776 0.175767 0.01 -0.0178016 0.174898 0.01 0.0025 -2.47917e-16 0 0.0025 -2.47917e-16 0.01 -0.0128776 0.175767 0.01 0.000787518 0.0588542 0.01 -0.00434413 0.117509 0.01 -0.0128776 0.175767 0 0.000787518 0.0588542 0 -0.00434413 0.117509 0 + + + 0 3 2 1 0 2 7 4 5 16 7 5 17 8 7 17 7 16 6 8 17 13 6 17 10 6 13 14 10 13 15 11 10 15 10 14 12 9 11 12 11 15 21 19 18 21 18 24 22 24 25 22 21 24 20 25 23 20 22 25 29 26 27 38 29 27 39 30 29 39 29 38 28 30 39 35 28 39 32 28 35 36 32 35 37 33 32 37 32 36 34 31 33 34 33 37 43 41 40 43 40 46 44 46 47 44 43 46 42 47 45 42 44 47 51 49 48 51 48 54 52 54 55 52 51 54 50 55 53 50 52 55 56 59 58 57 56 58 63 61 60 63 60 66 64 66 67 64 63 66 62 67 65 62 64 67 + 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78 81 84 87 90 93 96 99 102 105 108 111 114 117 120 123 126 129 132 135 138 141 144 147 150 153 156 + + + + + + + + + + + + + + + + + + + + + + From f1b69a795ee41c7b227386fc10bcfb1c4d2f562c Mon Sep 17 00:00:00 2001 From: John Hill Date: Wed, 24 Sep 2014 16:47:59 +0100 Subject: [PATCH 110/284] Refs #10194 basic implementation of nxtomo file saving alg --- .../inc/MantidDataHandling/SaveNXTomo.h | 51 ++-- .../Framework/DataHandling/src/SaveNXTomo.cpp | 229 +++++++++--------- 2 files changed, 137 insertions(+), 143 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 644ca2f8abdf..464f8d839495 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -4,12 +4,7 @@ //--------------------------------------------------- // Includes //--------------------------------------------------- -//#include "MantidAPI/Algorithm.h" //#include "MantidNexus/NexusClasses.h" -//#include "MantidAPI/MatrixWorkspace.h" -//#include "MantidAPI/Sample.h" -//#include "MantidDataObjects/Workspace2D.h" -//#include "MantidDataObjects/EventWorkspace.h" //#include //#include @@ -20,6 +15,7 @@ namespace Mantid /** * Saves a workspace into a NeXus/HDF5 NXTomo file. + * File format is defined here: http://download.nexusformat.org/sphinx/classes/applications/NXtomo.html * * Required properties: *
        @@ -53,49 +49,44 @@ namespace Mantid class DLLExport SaveNXTomo: public API::Algorithm { public: - /// Constructor SaveNXTomo(); /// Virtual dtor - virtual ~SaveNXTomo() - { - } - virtual const std::string name() const - { - return "SaveNXTomo"; - } + virtual ~SaveNXTomo() {} + + /// Algorithm's name for identification overriding a virtual method + virtual const std::string name() const { return "SaveNXTomo"; } + ///Summary of algorithms purpose virtual const std::string summary() const {return "Writes a MatrixWorkspace to a file in the NXTomo format.";} /// Algorithm's version - virtual int version() const - { - return (1); - } + virtual int version() const { return (1); } + /// Algorithm's category for identification - virtual const std::string category() const - { - return "DataHandling\\Nexus;DataHandling\\Tomo;Diffraction"; - } + virtual const std::string category() const { return "DataHandling\\Nexus;DataHandling\\Tomo;Diffraction"; } - private: - + private: /// Initialisation code void init(); - ///Execution code + /// Execution code void exec(); + /// Save all data to file + + /// Save batch of images to the file + ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change - //size_t nBins; + size_t m_nBins; /// The filename of the output file - //std::string filename; + std::string m_filename; // Some constants to be written for masked values. /// Value for data if pixel is masked - //static const double MASK_FLAG; + static const double MASK_FLAG; /// Value for error if pixel is masked - //static const double MASK_ERROR; - /// file format version - //static const std::string NXSPE_VER; + static const double MASK_ERROR; + /// file format version + static const std::string NXTOMO_VER; }; } // namespace DataHandling diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index 3a053edfa273..51c5f256d435 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -1,28 +1,24 @@ -#include "MantidDataHandling/SaveNXTomo.h" #include "MantidAPI/FileProperty.h" -//#include "MantidKernel/ConfigService.h" -#include "MantidKernel/MantidVersion.h" #include "MantidAPI/WorkspaceValidators.h" -//#include "MantidAPI/WorkspaceOpOverloads.h" -//#include "MantidGeometry/Instrument/Detector.h" -//#include "MantidGeometry/Instrument/ObjComponent.h" -//#include "MantidDataHandling/FindDetectorsPar.h" -// -//#include -//#include -//#include +#include "MantidDataHandling/FindDetectorsPar.h" +#include "MantidDataHandling/SaveNXTomo.h" +#include "MantidKernel/MantidVersion.h" +#include "MantidNexus/NexusClasses.h" namespace Mantid { namespace DataHandling - { - + { // Register the algorithm into the algorithm factory DECLARE_ALGORITHM(SaveNXTomo) using namespace Kernel; using namespace API; + const double SaveNXTomo::MASK_FLAG = std::numeric_limits::quiet_NaN(); + const double SaveNXTomo::MASK_ERROR = 0.0; + const std::string SaveNXTomo::NXTOMO_VER = "2.0"; + SaveNXTomo::SaveNXTomo() : API::Algorithm() { } @@ -33,7 +29,7 @@ namespace Mantid void SaveNXTomo::init() { auto wsValidator = boost::make_shared() ; - wsValidator->add(boost::make_shared("DeltaE")); + //wsValidator->add(boost::make_shared("DeltaE")); wsValidator->add(); wsValidator->add(); @@ -52,7 +48,13 @@ namespace Mantid { // Retrieve the input workspace const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); - + + const std::string workspaceID = inputWS->id(); + + if ((workspaceID.find("Workspace2D") == std::string::npos) && + (workspaceID.find("RebinnedOutput") == std::string::npos)) + throw Exception::NotImplementedError("SaveNexusProcessed passed invalid workspaces. Must be Workspace2D, EventWorkspace, ITableWorkspace, or OffsetsWorkspace."); + // Do the full check for common binning if (!WorkspaceHelpers::commonBoundaries(inputWS)) { @@ -63,98 +65,88 @@ namespace Mantid // Number of spectra const int nHist = static_cast(inputWS->getNumberHistograms()); // Number of energy bins - this->nBins = inputWS->blocksize(); + this->m_nBins = inputWS->blocksize(); // Get a pointer to the sample Geometry::IComponent_const_sptr sample = inputWS->getInstrument()->getSample(); // Retrieve the filename from the properties - this->filename = getPropertyValue("Filename"); + this->m_filename = getPropertyValue("Filename"); - // Create the file. - ::NeXus::File nxFile(this->filename, NXACC_CREATE5); + // Create some arrays for the nexus api to use + std::vector array_dims; + array_dims.push_back((int)nHist); + array_dims.push_back((int)m_nBins); + // Create the file. + ::NeXus::File nxFile(this->m_filename, NXACC_CREATE5); + // Make the top level entry (and open it) - nxFile.makeGroup(inputWS->getName(), "NXentry", true); + nxFile.makeGroup("entry1", "NXentry", true); + + // Make a sub-group for the entry to work with DAWN software (and open it) + nxFile.makeGroup("tomo_entry", "NXsubentry", true); + + // Title + nxFile.writeData("title", this->m_filename); + + // Start Time; Format ISO8601 | unused but part of NXtomo schema + //nxFile.writeData("start_time", ); + + // End Time; Format ISO8601 | unused but part of NXtomo schema + //nxFile.writeData("end_time", ); // Definition name and version - nxFile.writeData("definition", "NXSPE"); + nxFile.writeData("definition", "NXtomo"); nxFile.openData("definition"); - nxFile.putAttr("version", NXSPE_VER); + nxFile.putAttr("version", NXTOMO_VER); nxFile.closeData(); - // Program name and version + // Originating program name and version nxFile.writeData("program_name", "mantid"); nxFile.openData("program_name"); nxFile.putAttr("version", Mantid::Kernel::MantidVersion::version()); - nxFile.closeData(); - - // Create NXSPE_info - nxFile.makeGroup("NXSPE_info", "NXcollection", true); - - // Get the value out of the property first - double efixed = getProperty("Efixed"); - if ( isEmpty(efixed) ) efixed = MASK_FLAG; - // Now lets check to see if the workspace nows better. - // TODO: Check that this is the way round we want to do it. - const API::Run & run = inputWS->run(); - if (run.hasProperty("Ei")) - { - Kernel::Property* propEi = run.getProperty("Ei"); - efixed = boost::lexical_cast(propEi->value()); - } - nxFile.writeData("fixed_energy", efixed); - nxFile.openData("fixed_energy"); - nxFile.putAttr("units", "meV"); - nxFile.closeData(); - - double psi = getProperty("Psi"); - if ( isEmpty(psi) ) psi = MASK_FLAG; - nxFile.writeData("psi", psi); - nxFile.openData("psi"); - nxFile.putAttr("units", "degrees"); - nxFile.closeData(); - - bool kikfScaling = getProperty("KiOverKfScaling"); - if (kikfScaling) - { - nxFile.writeData("ki_over_kf_scaling", 1); - } - else - { - nxFile.writeData("ki_over_kf_scaling", 0); - } - - nxFile.closeGroup(); // NXSPE_info + nxFile.closeData(); + // ****************************************** // NXinstrument nxFile.makeGroup("instrument", "NXinstrument", true); - // Write the instrument name + // Write the instrument name | could add short_name attribute to name nxFile.writeData("name", inputWS->getInstrument()->getName()); - // and the short name - nxFile.openData("name"); - // TODO: Get the instrument short name - nxFile.putAttr("short_name", inputWS->getInstrument()->getName()); - nxFile.closeData(); - - // NXfermi_chopper - nxFile.makeGroup("fermi", "NXfermi_chopper", true); - - nxFile.writeData("energy", efixed); - nxFile.closeGroup(); // NXfermi_chopper - + + // detector group - diamond example file contains {data,distance,image_key,x_pixel_size,y_pixel_size} Only adding image_key for now, 0 filled. + nxFile.makeGroup("detector", "NXdetector", true); + std::vector imageKey(array_dims[1],0); + nxFile.writeData("image_key", imageKey); + nxFile.closeGroup(); + + // source group // from diamond file contains {current,energy,name,probe,type} - probe = neutron | x-ray | electron + + nxFile.closeGroup(); // NXinstrument + // ****************************************** // NXsample nxFile.makeGroup("sample", "NXsample", true); // TODO: Write sample info -// nxFile.writeData("rotation_angle", 0.0); -// nxFile.writeData("seblock", "NONE"); -// nxFile.writeData("temperature", 300.0); - + // name + // nxFile.writeData("rotation_angle", 0.0); + // x_translation + // y_translation + // z_translation nxFile.closeGroup(); // NXsample + + // ****************************************** + // Make the NXmonitor group - Holds base beam intensity for each image + // If information is not present, set as 1 + std::vector intensity(array_dims[1],1); + nxFile.makeGroup("control", "NXmonitor", true); + nxFile.writeData("data", intensity); + nxFile.closeGroup(); // NXmonitor + + // ****************************************** // Make the NXdata group nxFile.makeGroup("data", "NXdata", true); @@ -164,37 +156,31 @@ namespace Mantid nxFile.writeData("energy", X); nxFile.openData("energy"); nxFile.putAttr("units", "meV"); - nxFile.closeData(); - - // let's create some blank arrays in the nexus file - - std::vector array_dims; - array_dims.push_back((int)nHist); - array_dims.push_back((int)nBins); + nxFile.closeData(); nxFile.makeData("data", ::NeXus::FLOAT64, array_dims, false); nxFile.makeData("error", ::NeXus::FLOAT64, array_dims, false); // Add the axes attributes to the data - nxFile.openData("data"); - nxFile.putAttr("signal", 1); - nxFile.putAttr("axes", "polar:energy"); - nxFile.closeData(); + //nxFile.openData("data"); + //nxFile.putAttr("signal", 1); + //nxFile.putAttr("axes", "polar:energy"); + //nxFile.closeData(); std::vector slab_start; std::vector slab_size; // What size slabs are we going to write... slab_size.push_back(1); - slab_size.push_back((int64_t)nBins); + slab_size.push_back((int64_t)m_nBins); // And let's start at the beginning slab_start.push_back(0); slab_start.push_back(0); // define the data and error vectors for masked detectors - std::vector masked_data (nBins, MASK_FLAG); - std::vector masked_error (nBins, MASK_ERROR); + std::vector masked_data (m_nBins, MASK_FLAG); + std::vector masked_error (m_nBins, MASK_ERROR); // Create a progress reporting object Progress progress(this,0,1,100); @@ -203,8 +189,9 @@ namespace Mantid // Loop over spectra for (int i = 0; i < nHist; i++) { - try{ // detector exist - det =inputWS->getDetector(i); + try + { // detector exist + det = inputWS->getDetector(i); // Check that we aren't writing a monitor... if (!det->isMonitor()) { @@ -247,7 +234,8 @@ namespace Mantid nxFile.closeData(); } } - }catch(Exception::NotFoundError&) + } + catch(Exception::NotFoundError&) { // Catch if no detector. Next line tests whether this happened - test placed // outside here because Mac Intel compiler doesn't like 'continue' in a catch @@ -263,7 +251,7 @@ namespace Mantid } } // execute the ChildAlgorithm to calculate the detector's parameters; - IAlgorithm_sptr spCalcDetPar = this->createChildAlgorithm("FindDetectorsPar", 0, 1, true, 1); + /* IAlgorithm_sptr spCalcDetPar = this->createChildAlgorithm("FindDetectorsPar", 0, 1, true, 1); spCalcDetPar->initialize(); spCalcDetPar->setPropertyValue("InputWorkspace", inputWS->getName()); @@ -271,37 +259,52 @@ namespace Mantid if(!(parFileName.empty()||parFileName=="not_used.par")){ spCalcDetPar->setPropertyValue("ParFile",parFileName); } - spCalcDetPar->execute(); + spCalcDetPar->execute();*/ // - FindDetectorsPar * pCalcDetPar = dynamic_cast(spCalcDetPar.get()); - if(!pCalcDetPar){ // "can not get pointer to FindDetectorsPar algorithm" - throw(std::bad_cast()); - } - const std::vector & azimuthal = pCalcDetPar->getAzimuthal(); + //FindDetectorsPar * pCalcDetPar = dynamic_cast(spCalcDetPar.get()); + //if(!pCalcDetPar){ // "can not get pointer to FindDetectorsPar algorithm" + // throw(std::bad_cast()); + //} + /* const std::vector & azimuthal = pCalcDetPar->getAzimuthal(); const std::vector & polar = pCalcDetPar->getPolar(); const std::vector & azimuthal_width = pCalcDetPar->getAzimWidth(); const std::vector & polar_width = pCalcDetPar->getPolarWidth(); - const std::vector & secondary_flightpath= pCalcDetPar->getFlightPath(); + const std::vector & secondary_flightpath= pCalcDetPar->getFlightPath();*/ - // Write the Polar (2Theta) angles - nxFile.writeData("polar", polar); + //// Write the Polar (2Theta) angles + //nxFile.writeData("polar", polar); - // Write the Azimuthal (phi) angles - nxFile.writeData("azimuthal", azimuthal); + //// Write the Azimuthal (phi) angles + //nxFile.writeData("azimuthal", azimuthal); - // Now the widths... - nxFile.writeData("polar_width", polar_width); - nxFile.writeData("azimuthal_width", azimuthal_width); + //// Now the widths... + //nxFile.writeData("polar_width", polar_width); + //nxFile.writeData("azimuthal_width", azimuthal_width); - // Secondary flight path - nxFile.writeData("distance", secondary_flightpath); + //// Secondary flight path + //nxFile.writeData("distance", secondary_flightpath); nxFile.closeGroup(); // NXdata + nxFile.closeGroup(); // tomo_entry sub-group + nxFile.closeGroup(); // Top level NXentry + + // Validate the file against the schema + } + //void someRoutineToAddDataToExisting() + //{ + // //TODO: + //} + } // namespace DataHandling } // namespace Mantid + + +// TODO: don't allow a multi-file +// Follow mtd conventions +// Add comments / function descriptions etc \ No newline at end of file From 9a271c65600de7d616078324d88afe14ec7fa6e8 Mon Sep 17 00:00:00 2001 From: John Hill Date: Tue, 14 Oct 2014 13:51:19 +0100 Subject: [PATCH 111/284] Refs #10194 faster save, output verified with DAWN software --- .../inc/MantidDataHandling/SaveNXTomo.h | 32 +- .../Framework/DataHandling/src/SaveNXTomo.cpp | 645 ++++++++++-------- 2 files changed, 377 insertions(+), 300 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 464f8d839495..13ccba3bb236 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -4,9 +4,10 @@ //--------------------------------------------------- // Includes //--------------------------------------------------- -//#include "MantidNexus/NexusClasses.h" -//#include -//#include +#include "vector" +#include "MantidGeometry/Instrument/RectangularDetector.h" + +using Mantid::Geometry::RectangularDetector; namespace Mantid { @@ -15,7 +16,7 @@ namespace Mantid /** * Saves a workspace into a NeXus/HDF5 NXTomo file. - * File format is defined here: http://download.nexusformat.org/sphinx/classes/applications/NXtomo.html + * File format is defined here: http://download.nexusformat.org/sphinx/classes/applications/NXtomo.html * * Required properties: *
          @@ -53,7 +54,7 @@ namespace Mantid /// Virtual dtor virtual ~SaveNXTomo() {} - /// Algorithm's name for identification overriding a virtual method + /// Algorithm's name for identification overriding a virtual method virtual const std::string name() const { return "SaveNXTomo"; } ///Summary of algorithms purpose @@ -71,22 +72,31 @@ namespace Mantid /// Execution code void exec(); - /// Save all data to file + /// Save all data to file + + /// Save batch of images to the file + + /// Fetch all rectangular Detector objects defined for an instrument + std::vector getRectangularDetectors(Geometry::Instrument_const_sptr &instrument); + + /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument + void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); - /// Save batch of images to the file + // Number of rows to + size_t m_numberOfRows; ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change - size_t m_nBins; + //size_t m_nBins; /// The filename of the output file - std::string m_filename; + std::string m_filename; // Some constants to be written for masked values. /// Value for data if pixel is masked static const double MASK_FLAG; /// Value for error if pixel is masked static const double MASK_ERROR; - /// file format version - static const std::string NXTOMO_VER; + /// file format version + static const std::string NXTOMO_VER; }; } // namespace DataHandling diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index 51c5f256d435..7b79819b9826 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -2,309 +2,376 @@ #include "MantidAPI/WorkspaceValidators.h" #include "MantidDataHandling/FindDetectorsPar.h" #include "MantidDataHandling/SaveNXTomo.h" +#include "MantidGeometry/IComponent.h" #include "MantidKernel/MantidVersion.h" #include "MantidNexus/NexusClasses.h" namespace Mantid { - namespace DataHandling - { - // Register the algorithm into the algorithm factory - DECLARE_ALGORITHM(SaveNXTomo) - - using namespace Kernel; - using namespace API; - - const double SaveNXTomo::MASK_FLAG = std::numeric_limits::quiet_NaN(); - const double SaveNXTomo::MASK_ERROR = 0.0; - const std::string SaveNXTomo::NXTOMO_VER = "2.0"; - - SaveNXTomo::SaveNXTomo() : API::Algorithm() - { - } - - /** - * Initialise the algorithm - */ - void SaveNXTomo::init() - { - auto wsValidator = boost::make_shared() ; - //wsValidator->add(boost::make_shared("DeltaE")); - wsValidator->add(); - wsValidator->add(); - - declareProperty(new WorkspaceProperty ("InputWorkspace", - "", Direction::Input, wsValidator), - "The name of the workspace to save."); - - declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), - "The name of the NXTomo file to write, as a full or relative path"); - } - - /** - * Execute the algorithm - */ - void SaveNXTomo::exec() - { - // Retrieve the input workspace - const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); - - const std::string workspaceID = inputWS->id(); - - if ((workspaceID.find("Workspace2D") == std::string::npos) && - (workspaceID.find("RebinnedOutput") == std::string::npos)) - throw Exception::NotImplementedError("SaveNexusProcessed passed invalid workspaces. Must be Workspace2D, EventWorkspace, ITableWorkspace, or OffsetsWorkspace."); + namespace DataHandling + { + // Register the algorithm into the algorithm factory + DECLARE_ALGORITHM(SaveNXTomo) + + using namespace Kernel; + using namespace API; + using Geometry::RectangularDetector; + + const double SaveNXTomo::MASK_FLAG = std::numeric_limits::quiet_NaN(); + const double SaveNXTomo::MASK_ERROR = 0.0; + const std::string SaveNXTomo::NXTOMO_VER = "2.0"; + + SaveNXTomo::SaveNXTomo() : API::Algorithm() + { + m_filename = ""; + m_numberOfRows = 32; + } + + /** + * Initialise the algorithm + */ + void SaveNXTomo::init() + { + auto wsValidator = boost::make_shared() ; + //wsValidator->add(boost::make_shared("DeltaE")); + wsValidator->add(); + wsValidator->add(); + + declareProperty(new WorkspaceProperty ("InputWorkspace", "", Direction::Input, wsValidator), + "The name of the workspace to save."); + + declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), + "The name of the NXTomo file to write, as a full or relative path"); + + declareProperty(new PropertyWithValue("Row chunk size", 32, Kernel::Direction::Input), + "Please use an evenly divisible number smaller than the image height"); + } + + /** + * Execute the algorithm + */ + void SaveNXTomo::exec() + { + // Retrieve the input workspace + const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); + + m_numberOfRows = getProperty("Row chunk size"); + + const std::string workspaceID = inputWS->id(); + + if ((workspaceID.find("Workspace2D") == std::string::npos) && + (workspaceID.find("RebinnedOutput") == std::string::npos)) + throw Exception::NotImplementedError("SaveNXTomo passed invalid workspaces. Must be Workspace2D"); + + // Do the full check for common binning + if (!WorkspaceHelpers::commonBoundaries(inputWS)) + { + g_log.error("The input workspace must have common bins"); + throw std::invalid_argument("The input workspace must have common bins"); + } + + // Number of spectra + const int nHist = static_cast(inputWS->getNumberHistograms()); + // Number of energy bins + //this->m_nBins = inputWS->blocksize(); + + // Get a pointer to the sample + //Geometry::IComponent_const_sptr sample = + // inputWS->getInstrument()->getSample(); + + // Retrieve the filename from the properties + this->m_filename = getPropertyValue("Filename"); + + // Dimensions for axis in nxTomo file. + std::vector dims_array; + dims_array.push_back(inputWS->blocksize()); // Number of bins + + // Populate the array + getDimensionsFromDetector(getRectangularDetectors(inputWS->getInstrument()), dims_array); + + // Create the file. + ::NeXus::File nxFile(this->m_filename, NXACC_CREATE5); + + // Make the top level entry (and open it) + nxFile.makeGroup("entry1", "NXentry", true); + + // Make a sub-group for the entry to work with DAWN software (and open it) + nxFile.makeGroup("tomo_entry", "NXsubentry", true); + + // Title + nxFile.writeData("title", this->m_filename); + + // Start Time; Format ISO8601 | unused but part of NXtomo schema + //nxFile.writeData("start_time", ); + + // End Time; Format ISO8601 | unused but part of NXtomo schema + //nxFile.writeData("end_time", ); + + // Definition name and version + nxFile.writeData("definition", "NXtomo"); + nxFile.openData("definition"); + nxFile.putAttr("version", NXTOMO_VER); + nxFile.closeData(); + + // Originating program name and version + nxFile.writeData("program_name", "mantid"); + nxFile.openData("program_name"); + nxFile.putAttr("version", Mantid::Kernel::MantidVersion::version()); + nxFile.closeData(); + + // ****************************************** + // NXinstrument + nxFile.makeGroup("instrument", "NXinstrument", true); + // Write the instrument name | could add short_name attribute to name + nxFile.writeData("name", inputWS->getInstrument()->getName()); + + // detector group - diamond example file contains {data,distance,image_key,x_pixel_size,y_pixel_size} Only adding image_key for now, 0 filled. + nxFile.makeGroup("detector", "NXdetector", true); + std::vector imageKeys(dims_array[0],0); + nxFile.writeData("image_key", imageKeys); + // Create link to image_key + nxFile.openData("image_key"); + NXlink imageKeyLink = nxFile.getDataID(); + nxFile.closeData(); + nxFile.closeGroup(); + + // source group // from diamond file contains {current,energy,name,probe,type} - probe = [neutron | x-ray | electron] + + nxFile.closeGroup(); // NXinstrument + + // ****************************************** + // NXsample + nxFile.makeGroup("sample", "NXsample", true); + // TODO: Write sample info + // name + + std::vector rotationAngles(dims_array[0]); + // Initialise rotations - if unknown, fill with equal steps from 0 to 180 over all frames. + // TODO: collect and use actual rotation values + + double step = static_cast(180/dims_array[0]); + rotationAngles[0] = step; + + for(auto it = rotationAngles.begin()+1; it != rotationAngles.end(); ++it) + { + *it = (*(it-1)) + step; + } + + nxFile.writeData("rotation_angle", rotationAngles); + + // Create a link object for rotation_angle to use later + nxFile.openData("rotation_angle"); + NXlink rotationLink = nxFile.getDataID(); + nxFile.closeData(); + // x_translation + // y_translation + // z_translation + nxFile.closeGroup(); // NXsample + + // ****************************************** + // Make the NXmonitor group - Holds base beam intensity for each image + // If information is not present, set as 1 + + std::vector intensity(dims_array[0],1); + nxFile.makeGroup("control", "NXmonitor", true); + nxFile.writeData("data", intensity); + nxFile.closeGroup(); // NXmonitor + + nxFile.makeGroup("data", "NXdata", true); + + nxFile.makeLink(rotationLink); + + nxFile.makeData("data", ::NeXus::FLOAT64, dims_array, false); + nxFile.makeData("error", ::NeXus::FLOAT64, dims_array, false); + + std::vector slabStart; + std::vector slabSize; + + // What size slabs are we going to write + slabSize.push_back(dims_array[0]); + slabSize.push_back((int64_t)dims_array[1]); + slabSize.push_back((int64_t)m_numberOfRows); + + // Init start to first row + slabStart.push_back(0); + slabStart.push_back(0); + slabStart.push_back(0); + + // define the data and error vectors for masked detectors + std::vector masked_data (dims_array[0], MASK_FLAG); + std::vector masked_error (dims_array[0], MASK_ERROR); + + // Create a progress reporting object + Progress progress(this,0,1,100); + const int progStep = (int)(ceil(nHist/100.0)); + Geometry::IDetector_const_sptr det; - // Do the full check for common binning - if (!WorkspaceHelpers::commonBoundaries(inputWS)) - { - g_log.error("The input workspace must have common bins"); - throw std::invalid_argument("The input workspace must have common bins"); - } - - // Number of spectra - const int nHist = static_cast(inputWS->getNumberHistograms()); - // Number of energy bins - this->m_nBins = inputWS->blocksize(); - - // Get a pointer to the sample - Geometry::IComponent_const_sptr sample = - inputWS->getInstrument()->getSample(); - - // Retrieve the filename from the properties - this->m_filename = getPropertyValue("Filename"); - - // Create some arrays for the nexus api to use - std::vector array_dims; - array_dims.push_back((int)nHist); - array_dims.push_back((int)m_nBins); - - // Create the file. - ::NeXus::File nxFile(this->m_filename, NXACC_CREATE5); - - // Make the top level entry (and open it) - nxFile.makeGroup("entry1", "NXentry", true); + double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; + double *errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - // Make a sub-group for the entry to work with DAWN software (and open it) - nxFile.makeGroup("tomo_entry", "NXsubentry", true); + int currY = 0; + int rowIndForSlab = 0; // as we're creating slabs of multiple rows, this says which y index we're at in current slab - // Title - nxFile.writeData("title", this->m_filename); - - // Start Time; Format ISO8601 | unused but part of NXtomo schema - //nxFile.writeData("start_time", ); - - // End Time; Format ISO8601 | unused but part of NXtomo schema - //nxFile.writeData("end_time", ); - - // Definition name and version - nxFile.writeData("definition", "NXtomo"); - nxFile.openData("definition"); - nxFile.putAttr("version", NXTOMO_VER); - nxFile.closeData(); - - // Originating program name and version - nxFile.writeData("program_name", "mantid"); - nxFile.openData("program_name"); - nxFile.putAttr("version", Mantid::Kernel::MantidVersion::version()); - nxFile.closeData(); - - // ****************************************** - // NXinstrument - nxFile.makeGroup("instrument", "NXinstrument", true); - // Write the instrument name | could add short_name attribute to name - nxFile.writeData("name", inputWS->getInstrument()->getName()); - - // detector group - diamond example file contains {data,distance,image_key,x_pixel_size,y_pixel_size} Only adding image_key for now, 0 filled. - nxFile.makeGroup("detector", "NXdetector", true); - std::vector imageKey(array_dims[1],0); - nxFile.writeData("image_key", imageKey); - nxFile.closeGroup(); - - // source group // from diamond file contains {current,energy,name,probe,type} - probe = neutron | x-ray | electron - - - nxFile.closeGroup(); // NXinstrument - - // ****************************************** - // NXsample - nxFile.makeGroup("sample", "NXsample", true); - // TODO: Write sample info - // name - // nxFile.writeData("rotation_angle", 0.0); - // x_translation - // y_translation - // z_translation - nxFile.closeGroup(); // NXsample - - // ****************************************** - // Make the NXmonitor group - Holds base beam intensity for each image - // If information is not present, set as 1 - - std::vector intensity(array_dims[1],1); - nxFile.makeGroup("control", "NXmonitor", true); - nxFile.writeData("data", intensity); - nxFile.closeGroup(); // NXmonitor - - // ****************************************** - // Make the NXdata group - nxFile.makeGroup("data", "NXdata", true); - - // Energy bins - // Get the Energy Axis (X) of the first spectra (they are all the same - checked above) - const MantidVec& X = inputWS->readX(0); - nxFile.writeData("energy", X); - nxFile.openData("energy"); - nxFile.putAttr("units", "meV"); - nxFile.closeData(); - - nxFile.makeData("data", ::NeXus::FLOAT64, array_dims, false); - nxFile.makeData("error", ::NeXus::FLOAT64, array_dims, false); - - // Add the axes attributes to the data - //nxFile.openData("data"); - //nxFile.putAttr("signal", 1); - //nxFile.putAttr("axes", "polar:energy"); - //nxFile.closeData(); - - std::vector slab_start; - std::vector slab_size; - - // What size slabs are we going to write... - slab_size.push_back(1); - slab_size.push_back((int64_t)m_nBins); - - // And let's start at the beginning - slab_start.push_back(0); - slab_start.push_back(0); - - // define the data and error vectors for masked detectors - std::vector masked_data (m_nBins, MASK_FLAG); - std::vector masked_error (m_nBins, MASK_ERROR); - - // Create a progress reporting object - Progress progress(this,0,1,100); - const int progStep = (int)(ceil(nHist/100.0)); - Geometry::IDetector_const_sptr det; - // Loop over spectra - for (int i = 0; i < nHist; i++) - { + // Loop over detectors + for (size_t i = 0; i < nHist; ++i) + { try - { // detector exist - det = inputWS->getDetector(i); - // Check that we aren't writing a monitor... - if (!det->isMonitor()) + { + // detector exist + //det = inputWS->getDetector(i); + // Check that we aren't writing a monitor + //if (!det->isMonitor()) + //{ + //Geometry::IDetector_const_sptr det = inputWS->getDetector(i); + + // Figure out where this pixel is supposed to be going and set the correct slab start. + const MantidVec *y = &inputWS->readY(i); + + if(i!=0 && (i)%dims_array[1] == 0){ // When this iteration matches end of a row + currY += 1; + } + size_t currX = (i) - (currY*dims_array[1]); + + const MantidVec & thisY = inputWS->readY(i); + // No masking - Set the data and error as is + for(int j=0; jisMasked()) + // { + dataArr[currInd] = thisY.at(j); + errorArr[currInd] = inputWS->readE(i).at(j); + //} + //else + //{ + // dataArr[currInd] = masked_data[j]; + // errorArr[currInd] = masked_error[j]; + //} + } + + // If end of the row has been reached, check for end of slab and write data/error + if(((i+1)%dims_array[2]) == 0) { - Geometry::IDetector_const_sptr det = inputWS->getDetector(i); - - if (!det->isMasked()) - { - // no masking... - // Open the data - nxFile.openData("data"); - slab_start[0] = i; - nxFile.putSlab(const_cast (inputWS->readY(i)), - slab_start, slab_size); - // Close the data - nxFile.closeData(); + rowIndForSlab += 1; - // Open the error - nxFile.openData("error"); - //MantidVec& tmparr = const_cast(inputWS->dataE(i)); - //nxFile.putSlab((void*)(&(tmparr[0])), slab_start, slab_size); - nxFile.putSlab(const_cast (inputWS->readE(i)), - slab_start, slab_size); - // Close the error + // if a slab has been collected. Put it into the file + if(rowIndForSlab >= m_numberOfRows) + { + slabStart[2] = currY-(rowIndForSlab-1); + + // Write Data + nxFile.openData("data"); + nxFile.putSlab(dataArr, slabStart, slabSize); nxFile.closeData(); - } - else - { - // Write a masked value... - // Open the data - nxFile.openData("data"); - slab_start[0] = i; - nxFile.putSlab(masked_data, slab_start, slab_size); - // Close the data - nxFile.closeData(); - - // Open the error - nxFile.openData("error"); - nxFile.putSlab(masked_error, slab_start, slab_size); - // Close the error + // Write Error + nxFile.openData("error"); + nxFile.putSlab(errorArr, slabStart, slabSize); nxFile.closeData(); + + // Reset slab index count + rowIndForSlab = 0; } - } - } - catch(Exception::NotFoundError&) - { - // Catch if no detector. Next line tests whether this happened - test placed - // outside here because Mac Intel compiler doesn't like 'continue' in a catch - // in an openmp block. - } - // If no detector found, skip onto the next spectrum - if ( !det ) continue; - - // make regular progress reports and check for canceling the algorithm - if ( i % progStep == 0 ) - { - progress.report(); - } - } - // execute the ChildAlgorithm to calculate the detector's parameters; - /* IAlgorithm_sptr spCalcDetPar = this->createChildAlgorithm("FindDetectorsPar", 0, 1, true, 1); - - spCalcDetPar->initialize(); - spCalcDetPar->setPropertyValue("InputWorkspace", inputWS->getName()); - std::string parFileName = this->getPropertyValue("ParFile"); - if(!(parFileName.empty()||parFileName=="not_used.par")){ - spCalcDetPar->setPropertyValue("ParFile",parFileName); - } - spCalcDetPar->execute();*/ - - // - //FindDetectorsPar * pCalcDetPar = dynamic_cast(spCalcDetPar.get()); - //if(!pCalcDetPar){ // "can not get pointer to FindDetectorsPar algorithm" - // throw(std::bad_cast()); - //} - /* const std::vector & azimuthal = pCalcDetPar->getAzimuthal(); - const std::vector & polar = pCalcDetPar->getPolar(); - const std::vector & azimuthal_width = pCalcDetPar->getAzimWidth(); - const std::vector & polar_width = pCalcDetPar->getPolarWidth(); - const std::vector & secondary_flightpath= pCalcDetPar->getFlightPath();*/ - - - //// Write the Polar (2Theta) angles - //nxFile.writeData("polar", polar); - - //// Write the Azimuthal (phi) angles - //nxFile.writeData("azimuthal", azimuthal); - - //// Now the widths... - //nxFile.writeData("polar_width", polar_width); - //nxFile.writeData("azimuthal_width", azimuthal_width); - - //// Secondary flight path - //nxFile.writeData("distance", secondary_flightpath); - - nxFile.closeGroup(); // NXdata - - nxFile.closeGroup(); // tomo_entry sub-group - - nxFile.closeGroup(); // Top level NXentry - - // Validate the file against the schema - - } - - //void someRoutineToAddDataToExisting() - //{ - // //TODO: - //} - - } // namespace DataHandling + } + } + catch(Exception::NotFoundError&) + { + /*Catch if no detector. Next line tests whether this happened - test placed + outside here because Mac Intel compiler doesn't like 'continue' in a catch + in an openmp block.*/ + } + // If no detector found, skip onto the next spectrum + if ( !det ) continue; + + // Make regular progress reports and check for canceling the algorithm + if ( i % progStep == 0 ) + { + progress.report(); + } + } + + // Create a link object for the data + nxFile.openData("data"); + NXlink dataLink = nxFile.getDataID(); + nxFile.closeData(); + + nxFile.closeGroup(); // Close Data group + + // Put a link to the data in instrument/detector + nxFile.openGroup("instrument","NXinstrument"); + nxFile.openGroup("detector","NXdetector"); + nxFile.makeLink(dataLink); + nxFile.closeGroup(); + nxFile.closeGroup(); + + + nxFile.closeGroup(); // tomo_entry sub-group + nxFile.closeGroup(); // Top level NXentry + + // Clean up memory + delete [] dataArr; + delete [] errorArr; + } + + /** + * Find all RectangularDetector objects in an instrument + * @param instrument instrument to search for detectors in + * @returns vector of all Rectangular Detectors + */ + std::vector SaveNXTomo::getRectangularDetectors(Geometry::Instrument_const_sptr &instrument) + { + std::vector> components; + instrument->getChildren(components,true); + + std::vector rectDetectors; + + for(auto it = components.begin(); it != components.end(); ++it) + { + // for all components, compare to RectangularDetector - if it is one, add it to detectors list. + const Geometry::IComponent* c = dynamic_cast(&(**it)); + + if(const RectangularDetector* r = dynamic_cast(c)) + { + rectDetectors.push_back(*(dynamic_cast(&(**it)))); + } + } + + return rectDetectors; + } + + /** + * Populates the dimensions vector with number of files, x and y sizes from a specified rectangular detector + * @param rectDetectors List of rectangular detectors to get axis sizes from + * @param dims_array vector which is populated with the different dimension values for the nxTomo file + * @param useDetectorIndex index of the detector to select from the list, default = 0 + * + * @throw runtime_error Thrown if there are no rectangular detectors + */ + void SaveNXTomo::getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) + { + // Add number of pixels in X and Y from instrument definition + // Throws if no rectangular detector is present. + + if(rectDetectors.size() != 0) + { + // Assume the first rect detector is the desired one. + dims_array.push_back(rectDetectors[useDetectorIndex].xpixels()); + dims_array.push_back(rectDetectors[useDetectorIndex].ypixels()); + } + else + { + // Incorrect workspace : requires the x/y pixel count from the instrument definition + g_log.error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); + throw std::runtime_error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); + } + } + + //void someRoutineToAddDataToExisting() + //{ + // //TODO: + //} + + } // namespace DataHandling } // namespace Mantid -// TODO: don't allow a multi-file -// Follow mtd conventions -// Add comments / function descriptions etc \ No newline at end of file From 4fc0666d294fe2383654b4b4a65315d044635c1a Mon Sep 17 00:00:00 2001 From: John Hill Date: Tue, 14 Oct 2014 15:06:33 +0100 Subject: [PATCH 112/284] Refs #10194 attempting to fix build error --- .../inc/MantidDataHandling/SaveNXTomo.h | 8 +- .../Framework/DataHandling/src/SaveNXTomo.cpp | 187 +++++++++--------- 2 files changed, 96 insertions(+), 99 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 13ccba3bb236..219aca172721 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -7,8 +7,6 @@ #include "vector" #include "MantidGeometry/Instrument/RectangularDetector.h" -using Mantid::Geometry::RectangularDetector; - namespace Mantid { namespace DataHandling @@ -77,12 +75,12 @@ namespace Mantid /// Save batch of images to the file /// Fetch all rectangular Detector objects defined for an instrument - std::vector getRectangularDetectors(Geometry::Instrument_const_sptr &instrument); + std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument - void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); + void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); - // Number of rows to + // Number of rows to size_t m_numberOfRows; ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index 7b79819b9826..38d35ca0737b 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -24,7 +24,7 @@ namespace Mantid SaveNXTomo::SaveNXTomo() : API::Algorithm() { m_filename = ""; - m_numberOfRows = 32; + m_numberOfRows = 32; } /** @@ -38,13 +38,13 @@ namespace Mantid wsValidator->add(); declareProperty(new WorkspaceProperty ("InputWorkspace", "", Direction::Input, wsValidator), - "The name of the workspace to save."); + "The name of the workspace to save."); declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), "The name of the NXTomo file to write, as a full or relative path"); - declareProperty(new PropertyWithValue("Row chunk size", 32, Kernel::Direction::Input), - "Please use an evenly divisible number smaller than the image height"); + declareProperty(new PropertyWithValue("Row chunk size", 32, Kernel::Direction::Input), + "Please use an evenly divisible number smaller than the image height"); } /** @@ -55,7 +55,7 @@ namespace Mantid // Retrieve the input workspace const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); - m_numberOfRows = getProperty("Row chunk size"); + m_numberOfRows = getProperty("Row chunk size"); const std::string workspaceID = inputWS->id(); @@ -71,7 +71,7 @@ namespace Mantid } // Number of spectra - const int nHist = static_cast(inputWS->getNumberHistograms()); + const size_t nHist = inputWS->getNumberHistograms(); // Number of energy bins //this->m_nBins = inputWS->blocksize(); @@ -84,7 +84,7 @@ namespace Mantid // Dimensions for axis in nxTomo file. std::vector dims_array; - dims_array.push_back(inputWS->blocksize()); // Number of bins + dims_array.push_back(inputWS->blocksize()); // Number of bins // Populate the array getDimensionsFromDetector(getRectangularDetectors(inputWS->getInstrument()), dims_array); @@ -188,9 +188,9 @@ namespace Mantid std::vector slabSize; // What size slabs are we going to write - slabSize.push_back(dims_array[0]); - slabSize.push_back((int64_t)dims_array[1]); - slabSize.push_back((int64_t)m_numberOfRows); + slabSize.push_back(dims_array[0]); + slabSize.push_back((int64_t)dims_array[1]); + slabSize.push_back((int64_t)m_numberOfRows); // Init start to first row slabStart.push_back(0); @@ -203,91 +203,90 @@ namespace Mantid // Create a progress reporting object Progress progress(this,0,1,100); - const int progStep = (int)(ceil(nHist/100.0)); + const size_t progStep = static_cast(ceil(nHist/100.0)); Geometry::IDetector_const_sptr det; - - double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - double *errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; + + double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; + double *errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - int currY = 0; - int rowIndForSlab = 0; // as we're creating slabs of multiple rows, this says which y index we're at in current slab + int currY = 0; + size_t rowIndForSlab = 0; // as we're creating slabs of multiple rows, this says which y index we're at in current slab // Loop over detectors for (size_t i = 0; i < nHist; ++i) { - try - { - // detector exist - //det = inputWS->getDetector(i); - // Check that we aren't writing a monitor - //if (!det->isMonitor()) - //{ - //Geometry::IDetector_const_sptr det = inputWS->getDetector(i); - - // Figure out where this pixel is supposed to be going and set the correct slab start. - const MantidVec *y = &inputWS->readY(i); - - if(i!=0 && (i)%dims_array[1] == 0){ // When this iteration matches end of a row - currY += 1; - } - size_t currX = (i) - (currY*dims_array[1]); - - const MantidVec & thisY = inputWS->readY(i); - // No masking - Set the data and error as is - for(int j=0; jisMasked()) - // { - dataArr[currInd] = thisY.at(j); - errorArr[currInd] = inputWS->readE(i).at(j); - //} - //else - //{ - // dataArr[currInd] = masked_data[j]; - // errorArr[currInd] = masked_error[j]; - //} - } + try + { + // detector exist + //det = inputWS->getDetector(i); + // Check that we aren't writing a monitor + //if (!det->isMonitor()) + //{ + //Geometry::IDetector_const_sptr det = inputWS->getDetector(i); + + // Figure out where this pixel is supposed to be going and set the correct slab start. + + if(i!=0 && (i)%dims_array[1] == 0){ // When this iteration matches end of a row + currY += 1; + } + size_t currX = (i) - (currY*dims_array[1]); + + const MantidVec & thisY = inputWS->readY(i); + // No masking - Set the data and error as is + for(int j=0; jisMasked()) + // { + dataArr[currInd] = thisY.at(j); + errorArr[currInd] = inputWS->readE(i).at(j); + //} + //else + //{ + // dataArr[currInd] = masked_data[j]; + // errorArr[currInd] = masked_error[j]; + //} + } - // If end of the row has been reached, check for end of slab and write data/error - if(((i+1)%dims_array[2]) == 0) - { - rowIndForSlab += 1; - - // if a slab has been collected. Put it into the file - if(rowIndForSlab >= m_numberOfRows) - { - slabStart[2] = currY-(rowIndForSlab-1); - - // Write Data - nxFile.openData("data"); - nxFile.putSlab(dataArr, slabStart, slabSize); - nxFile.closeData(); - // Write Error - nxFile.openData("error"); - nxFile.putSlab(errorArr, slabStart, slabSize); - nxFile.closeData(); - - // Reset slab index count - rowIndForSlab = 0; - } - } - } - catch(Exception::NotFoundError&) - { - /*Catch if no detector. Next line tests whether this happened - test placed - outside here because Mac Intel compiler doesn't like 'continue' in a catch - in an openmp block.*/ - } - // If no detector found, skip onto the next spectrum - if ( !det ) continue; - - // Make regular progress reports and check for canceling the algorithm - if ( i % progStep == 0 ) - { - progress.report(); - } + // If end of the row has been reached, check for end of slab and write data/error + if(((i+1)%dims_array[2]) == 0) + { + rowIndForSlab += 1; + + // if a slab has been collected. Put it into the file + if(rowIndForSlab >= m_numberOfRows) + { + slabStart[2] = currY-(rowIndForSlab-1); + + // Write Data + nxFile.openData("data"); + nxFile.putSlab(dataArr, slabStart, slabSize); + nxFile.closeData(); + // Write Error + nxFile.openData("error"); + nxFile.putSlab(errorArr, slabStart, slabSize); + nxFile.closeData(); + + // Reset slab index count + rowIndForSlab = 0; + } + } + } + catch(Exception::NotFoundError&) + { + /*Catch if no detector. Next line tests whether this happened - test placed + outside here because Mac Intel compiler doesn't like 'continue' in a catch + in an openmp block.*/ + } + // If no detector found, skip onto the next spectrum + if ( !det ) continue; + + // Make regular progress reports and check for canceling the algorithm + if ( i % progStep == 0 ) + { + progress.report(); + } } // Create a link object for the data @@ -308,9 +307,9 @@ namespace Mantid nxFile.closeGroup(); // tomo_entry sub-group nxFile.closeGroup(); // Top level NXentry - // Clean up memory - delete [] dataArr; - delete [] errorArr; + // Clean up memory + delete [] dataArr; + delete [] errorArr; } /** @@ -318,7 +317,7 @@ namespace Mantid * @param instrument instrument to search for detectors in * @returns vector of all Rectangular Detectors */ - std::vector SaveNXTomo::getRectangularDetectors(Geometry::Instrument_const_sptr &instrument) + std::vector SaveNXTomo::getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument) { std::vector> components; instrument->getChildren(components,true); @@ -329,8 +328,8 @@ namespace Mantid { // for all components, compare to RectangularDetector - if it is one, add it to detectors list. const Geometry::IComponent* c = dynamic_cast(&(**it)); - - if(const RectangularDetector* r = dynamic_cast(c)) + + if(dynamic_cast(c)) { rectDetectors.push_back(*(dynamic_cast(&(**it)))); } From 1dc316fa694c60cace60ab6a1c183e5e802fa0e0 Mon Sep 17 00:00:00 2001 From: John Hill Date: Tue, 14 Oct 2014 15:48:16 +0100 Subject: [PATCH 113/284] Refs #10194 attempting to fix build error --- .../inc/MantidDataHandling/SaveNXTomo.h | 5 ++- .../Framework/DataHandling/src/SaveNXTomo.cpp | 38 +++++++++++++------ 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 219aca172721..92b1d63c4244 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -78,11 +78,14 @@ namespace Mantid std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument - void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); + void getDimensionsFromDetector(const std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); // Number of rows to size_t m_numberOfRows; + // Include error data in the written file + bool m_includeError; + ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change //size_t m_nBins; /// The filename of the output file diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index 38d35ca0737b..c648698319e8 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -24,6 +24,7 @@ namespace Mantid SaveNXTomo::SaveNXTomo() : API::Algorithm() { m_filename = ""; + m_includeError = false; m_numberOfRows = 32; } @@ -45,6 +46,9 @@ namespace Mantid declareProperty(new PropertyWithValue("Row chunk size", 32, Kernel::Direction::Input), "Please use an evenly divisible number smaller than the image height"); + + declareProperty(new PropertyWithValue("Include error", false, Kernel::Direction::Input), + "Write the error values to NXTomo file?"); } /** @@ -56,6 +60,7 @@ namespace Mantid const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); m_numberOfRows = getProperty("Row chunk size"); + m_includeError = getProperty("Include error"); const std::string workspaceID = inputWS->id(); @@ -182,7 +187,8 @@ namespace Mantid nxFile.makeLink(rotationLink); nxFile.makeData("data", ::NeXus::FLOAT64, dims_array, false); - nxFile.makeData("error", ::NeXus::FLOAT64, dims_array, false); + if(m_includeError) + nxFile.makeData("error", ::NeXus::FLOAT64, dims_array, false); std::vector slabStart; std::vector slabSize; @@ -199,15 +205,18 @@ namespace Mantid // define the data and error vectors for masked detectors std::vector masked_data (dims_array[0], MASK_FLAG); - std::vector masked_error (dims_array[0], MASK_ERROR); + if(m_includeError) + std::vector masked_error (dims_array[0], MASK_ERROR); // Create a progress reporting object Progress progress(this,0,1,100); - const size_t progStep = static_cast(ceil(nHist/100.0)); + const size_t progStep = static_cast(ceil(static_cast(nHist)/100.0)); Geometry::IDetector_const_sptr det; double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - double *errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; + double *errorArr; + if(m_includeError) + errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; int currY = 0; size_t rowIndForSlab = 0; // as we're creating slabs of multiple rows, this says which y index we're at in current slab @@ -240,12 +249,14 @@ namespace Mantid // if(!det->isMasked()) // { dataArr[currInd] = thisY.at(j); - errorArr[currInd] = inputWS->readE(i).at(j); + if(m_includeError) + errorArr[currInd] = inputWS->readE(i).at(j); //} //else //{ // dataArr[currInd] = masked_data[j]; - // errorArr[currInd] = masked_error[j]; + // if(m_includeError) + // errorArr[currInd] = masked_error[j]; //} } @@ -264,10 +275,12 @@ namespace Mantid nxFile.putSlab(dataArr, slabStart, slabSize); nxFile.closeData(); // Write Error - nxFile.openData("error"); - nxFile.putSlab(errorArr, slabStart, slabSize); - nxFile.closeData(); - + if(m_includeError) + { + nxFile.openData("error"); + nxFile.putSlab(errorArr, slabStart, slabSize); + nxFile.closeData(); + } // Reset slab index count rowIndForSlab = 0; } @@ -309,7 +322,8 @@ namespace Mantid // Clean up memory delete [] dataArr; - delete [] errorArr; + if(m_includeError) + delete [] errorArr; } /** @@ -346,7 +360,7 @@ namespace Mantid * * @throw runtime_error Thrown if there are no rectangular detectors */ - void SaveNXTomo::getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) + void SaveNXTomo::getDimensionsFromDetector(const std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) { // Add number of pixels in X and Y from instrument definition // Throws if no rectangular detector is present. From c0fd0586d2eafb99c42701e7e3ddf218f8e9a868 Mon Sep 17 00:00:00 2001 From: John Hill Date: Tue, 14 Oct 2014 17:05:33 +0100 Subject: [PATCH 114/284] Refs #10194 attempting to fix build error --- .../inc/MantidDataHandling/SaveNXTomo.h | 4 +-- .../Framework/DataHandling/src/SaveNXTomo.cpp | 29 ++++++++++--------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 92b1d63c4244..59e072ad7878 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -75,10 +75,10 @@ namespace Mantid /// Save batch of images to the file /// Fetch all rectangular Detector objects defined for an instrument - std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); + std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument - void getDimensionsFromDetector(const std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); + void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); // Number of rows to size_t m_numberOfRows; diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index c648698319e8..a1d84c7666e2 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -136,7 +136,7 @@ namespace Mantid nxFile.writeData("image_key", imageKeys); // Create link to image_key nxFile.openData("image_key"); - NXlink imageKeyLink = nxFile.getDataID(); + //NXlink imageKeyLink = nxFile.getDataID(); nxFile.closeData(); nxFile.closeGroup(); @@ -206,7 +206,7 @@ namespace Mantid // define the data and error vectors for masked detectors std::vector masked_data (dims_array[0], MASK_FLAG); if(m_includeError) - std::vector masked_error (dims_array[0], MASK_ERROR); + std::vector masked_error (dims_array[0], MASK_ERROR); // Create a progress reporting object Progress progress(this,0,1,100); @@ -214,7 +214,7 @@ namespace Mantid Geometry::IDetector_const_sptr det; double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - double *errorArr; + double *errorArr = NULL; if(m_includeError) errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; @@ -256,15 +256,19 @@ namespace Mantid //{ // dataArr[currInd] = masked_data[j]; // if(m_includeError) - // errorArr[currInd] = masked_error[j]; + // errorArr[currInd] = masked_error[j]; //} } - // If end of the row has been reached, check for end of slab and write data/error + // If end of the row has been reached, check for end of slab (or end of row count) and write data/error if(((i+1)%dims_array[2]) == 0) { rowIndForSlab += 1; + // Check if we have collected all of the rows (prior to completing a slab) - if so, write the final section + // TODO:: + + // if a slab has been collected. Put it into the file if(rowIndForSlab >= m_numberOfRows) { @@ -322,8 +326,7 @@ namespace Mantid // Clean up memory delete [] dataArr; - if(m_includeError) - delete [] errorArr; + delete [] errorArr; } /** @@ -331,12 +334,12 @@ namespace Mantid * @param instrument instrument to search for detectors in * @returns vector of all Rectangular Detectors */ - std::vector SaveNXTomo::getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument) + std::vector SaveNXTomo::getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument) { std::vector> components; instrument->getChildren(components,true); - std::vector rectDetectors; + std::vector rectDetectors; for(auto it = components.begin(); it != components.end(); ++it) { @@ -345,7 +348,7 @@ namespace Mantid if(dynamic_cast(c)) { - rectDetectors.push_back(*(dynamic_cast(&(**it)))); + rectDetectors.push_back(dynamic_cast(&(**it))); } } @@ -360,7 +363,7 @@ namespace Mantid * * @throw runtime_error Thrown if there are no rectangular detectors */ - void SaveNXTomo::getDimensionsFromDetector(const std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) + void SaveNXTomo::getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) { // Add number of pixels in X and Y from instrument definition // Throws if no rectangular detector is present. @@ -368,8 +371,8 @@ namespace Mantid if(rectDetectors.size() != 0) { // Assume the first rect detector is the desired one. - dims_array.push_back(rectDetectors[useDetectorIndex].xpixels()); - dims_array.push_back(rectDetectors[useDetectorIndex].ypixels()); + dims_array.push_back(rectDetectors[useDetectorIndex]->xpixels()); + dims_array.push_back(rectDetectors[useDetectorIndex]->ypixels()); } else { From 8e79090c0b59997b756c35c427a9563b324f01a0 Mon Sep 17 00:00:00 2001 From: John Hill Date: Tue, 14 Oct 2014 17:59:18 +0100 Subject: [PATCH 115/284] Refs #10194 attempting to fix build error --- .../inc/MantidDataHandling/SaveNXTomo.h | 2 +- .../Framework/DataHandling/src/SaveNXTomo.cpp | 22 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 59e072ad7878..80e0cacbe038 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -78,7 +78,7 @@ namespace Mantid std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument - void getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex = 0); + std::vector getDimensionsFromDetector(const std::vector &rectDetectors, size_t useDetectorIndex = 0); // Number of rows to size_t m_numberOfRows; diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index a1d84c7666e2..c843331981be 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -89,10 +89,12 @@ namespace Mantid // Dimensions for axis in nxTomo file. std::vector dims_array; - dims_array.push_back(inputWS->blocksize()); // Number of bins + + // Populate the array + dims_array = getDimensionsFromDetector(getRectangularDetectors(inputWS->getInstrument())); - // Populate the array - getDimensionsFromDetector(getRectangularDetectors(inputWS->getInstrument()), dims_array); + // Insert number of bins at front + dims_array.insert(dims_array.begin(), inputWS->blocksize()); // Number of bins // Create the file. ::NeXus::File nxFile(this->m_filename, NXACC_CREATE5); @@ -358,21 +360,23 @@ namespace Mantid /** * Populates the dimensions vector with number of files, x and y sizes from a specified rectangular detector * @param rectDetectors List of rectangular detectors to get axis sizes from - * @param dims_array vector which is populated with the different dimension values for the nxTomo file * @param useDetectorIndex index of the detector to select from the list, default = 0 - * + * @returns vector of both axis dimensions for specified detector + * * @throw runtime_error Thrown if there are no rectangular detectors */ - void SaveNXTomo::getDimensionsFromDetector(std::vector &rectDetectors, std::vector &dims_array, size_t useDetectorIndex) + std::vector SaveNXTomo::getDimensionsFromDetector(const std::vector &rectDetectors, size_t useDetectorIndex) { // Add number of pixels in X and Y from instrument definition // Throws if no rectangular detector is present. + std::vector dims; + if(rectDetectors.size() != 0) { // Assume the first rect detector is the desired one. - dims_array.push_back(rectDetectors[useDetectorIndex]->xpixels()); - dims_array.push_back(rectDetectors[useDetectorIndex]->ypixels()); + dims.push_back(rectDetectors[useDetectorIndex]->xpixels()); + dims.push_back(rectDetectors[useDetectorIndex]->ypixels()); } else { @@ -380,6 +384,8 @@ namespace Mantid g_log.error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); throw std::runtime_error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); } + + return dims; } //void someRoutineToAddDataToExisting() From d2d639c41a71a85b62b4655e1eb504265e7a34ab Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Wed, 15 Oct 2014 13:17:11 +0100 Subject: [PATCH 116/284] refs #10351 This should do it --- Code/Mantid/scripts/Inelastic/dgreduce.py | 30 ++++++++++++----------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/Code/Mantid/scripts/Inelastic/dgreduce.py b/Code/Mantid/scripts/Inelastic/dgreduce.py index fed605942091..b89d69c8b542 100644 --- a/Code/Mantid/scripts/Inelastic/dgreduce.py +++ b/Code/Mantid/scripts/Inelastic/dgreduce.py @@ -45,7 +45,7 @@ def setup(instname=None,reload=False): def help(keyword=None) : """function returns help on reduction parameters. - Returns the list of the parameters availible if provided without arguments + Returns the list of the parameters available if provided without arguments or the description and the default value for the key requested """ if Reducer == None: @@ -54,7 +54,7 @@ def help(keyword=None) : Reducer.help(keyword) -def arb_units(wb_run,sample_run,ei_guess,rebin,map_file='default',monovan_run=None,**kwargs): +def arb_units(wb_run,sample_run,ei_guess,rebin,map_file='default',monovan_run=None,second_wb=None,**kwargs): """ One step conversion of run into workspace containing information about energy transfer Usage: >>arb_units(wb_run,sample_run,ei_guess,rebin) @@ -190,7 +190,10 @@ def arb_units(wb_run,sample_run,ei_guess,rebin,map_file='default',monovan_run=No wb_for_monovanadium = kwargs['wb_for_monovanadium'] del kwargs['wb_for_monovanadium'] else: - wb_for_monovanadium = wb_run; + if second_wb is None: + wb_for_monovanadium = wb_run; + else: + wb_for_monovanadium = second_wb; @@ -256,7 +259,7 @@ def arb_units(wb_run,sample_run,ei_guess,rebin,map_file='default',monovan_run=No #this sums the runs together before passing the summed file to the rest of the reduction #this circumvents the inbuilt method of summing which fails to sum the files for diag - #the D.E.C. tries to be too clever so we have to fool it into thinking the raw file is already exists as a workpsace + #the D.E.C. tries to be too clever so we have to fool it into thinking the raw file is already exists as a workspace sumfilename=Reducer.instr_name+str(sample_run[0])+'.raw' sample_run =sum_files(Reducer.instr_name,sumfilename, sample_run) common.apply_calibration(Reducer.instr_name,sample_run,Reducer.det_cal_file) @@ -291,7 +294,7 @@ def arb_units(wb_run,sample_run,ei_guess,rebin,map_file='default',monovan_run=No if not masks_done: print '########### Run diagnose for sample run ##############################' masking = Reducer.diagnose(wb_run,sample = mask_run, - second_white = None,print_results=True) + second_white=None,print_results=True) header = "Diag Processed workspace with {0:d} spectra and masked {1:d} bad spectra" @@ -412,7 +415,7 @@ def abs_units(wb_for_run,sample_run,monovan_run,wb_for_monovanadium,samp_rmm,sam variation -The number of medians the ratio of the first/second white beam can deviate from the average by (default=1.1) bleed_test - If true then the CreatePSDBleedMask algorithm is run - bleed_maxrate - If the bleed test is on then this is the maximum framerate allowed in a tube + bleed_maxrate - If the bleed test is on then this is the maximum frame rate allowed in a tube bleed_pixels - If the bleed test is on then this is the number of pixels ignored within the bleed test diagnostic print_results - If True then the results are printed to the screen @@ -438,11 +441,10 @@ def abs_units(wb_for_run,sample_run,monovan_run,wb_for_monovanadium,samp_rmm,sam abs_units_van_range=[-40,40] integral range for absolute vanadium data - mono_correction_factor=float User specified correction factor for absolute units normalisation + mono_correction_factor=float User specified correction factor for absolute units normalization """ kwargs['monovan_mapfile'] = monovan_mapfile - kwargs['wb_for_monovanadium']= wb_for_monovanadium kwargs['sample_mass'] = samp_mass kwargs['sample_rmm'] = samp_rmm @@ -462,7 +464,7 @@ def abs_units(wb_for_run,sample_run,monovan_run,wb_for_monovanadium,samp_rmm,sam results_name = wksp_out - wksp_out = arb_units(wb_for_run,sample_run,ei_guess,rebin,map_file,monovan_run,**kwargs) + wksp_out = arb_units(wb_for_run,sample_run,ei_guess,rebin,map_file,monovan_run,wb_for_monovanadium,**kwargs) if results_name != wksp_out.getName(): @@ -522,7 +524,7 @@ def apply_absolute_normalization(Reducer,deltaE_wkspace_sample,monovan_run,ei_gu def process_legacy_parameters(**kwargs) : """ The method to deal with old parameters which have logi c different from default and easy to process using - subprogram. All other parameters just copiet to output + subprogram. All other parameters just copied to output """ params = dict(); for key,value in kwargs.iteritems(): @@ -568,7 +570,7 @@ def get_abs_normalization_factor(Reducer,deltaE_wkspaceName,ei_monovan) : are different and accounted for by dividing each MV value by corresponding WBV value, the signal on a detector has poison distribution and the error for a detector is the square root of correspondent signal on a detector. - Error for WBV considered negligebly small wrt the error on MV + Error for WBV considered negligibly small wrt. the error on MV """ van_mass=Reducer.van_mass; @@ -627,7 +629,7 @@ def get_abs_normalization_factor(Reducer,deltaE_wkspaceName,ei_monovan) : weight = err_sq/signal signal3_sum += err_sq weight3_sum += weight - # Guess which estimatnes value sum(n_i^2/Sigma_i^2)/sum(n_i/Sigma_i^2) TGP suggestion from 12-2012 + # Guess which estimates value sum(n_i^2/Sigma_i^2)/sum(n_i/Sigma_i^2) TGP suggestion from 12-2012 signal4_sum += signal*signal/err_sq weight4_sum += signal/err_sq @@ -638,7 +640,7 @@ def get_abs_normalization_factor(Reducer,deltaE_wkspaceName,ei_monovan) : #---------------- Loop finished if( weight1_sum==0.0 or weight2_sum == 0.0 or weight3_sum == 0.0 or weight4_sum == 0.0) : - print "WB integral has been calculated incorrectrly, look at van_int workspace in the input workspace: ",deltaE_wkspaceName + print "WB integral has been calculated incorrectly, look at van_int workspace in the input workspace: ",deltaE_wkspaceName raise IOError(" divided by 0 weight") integral_monovanLibISIS=signal1_sum / weight1_sum @@ -693,7 +695,7 @@ def get_abs_normalization_factor(Reducer,deltaE_wkspaceName,ei_monovan) : def sum_files(inst_name, accumulator, files): """ Custom sum for multiple runs - Left for compartibility as internal summation had some unspecified problems. + Left for compatibility as internal summation had some unspecified problems. Will go in a future """ accum_name = accumulator From 7450a0f59198821516d50c343eca702c0a019d87 Mon Sep 17 00:00:00 2001 From: Alex Buts Date: Wed, 15 Oct 2014 13:54:38 +0100 Subject: [PATCH 117/284] REFS #10351 a bit more needs to change --- Code/Mantid/scripts/Inelastic/dgreduce.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/scripts/Inelastic/dgreduce.py b/Code/Mantid/scripts/Inelastic/dgreduce.py index b89d69c8b542..df35acd037bc 100644 --- a/Code/Mantid/scripts/Inelastic/dgreduce.py +++ b/Code/Mantid/scripts/Inelastic/dgreduce.py @@ -332,7 +332,7 @@ def arb_units(wb_run,sample_run,ei_guess,rebin,map_file='default',monovan_run=No # calculate absolute units integral and apply it to the workspace if monovan_run != None or Reducer.mono_correction_factor != None : - deltaE_wkspace_sample = apply_absolute_normalization(Reducer,deltaE_wkspace_sample,monovan_run,ei_guess,wb_run) + deltaE_wkspace_sample = apply_absolute_normalization(Reducer,deltaE_wkspace_sample,monovan_run,ei_guess,wb_for_monovanadium) # Hack for multirep #if isinstance(monovan_run,int): # filename = common.find_file(monovan_run) From bc8a9775c0dc477c8ede7f0c3625c52c8b8c7b35 Mon Sep 17 00:00:00 2001 From: John Hill Date: Wed, 15 Oct 2014 16:50:32 +0100 Subject: [PATCH 118/284] Refs #10194 fixing property name for system test --- Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index c843331981be..99bab4ece30a 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -44,10 +44,10 @@ namespace Mantid declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), "The name of the NXTomo file to write, as a full or relative path"); - declareProperty(new PropertyWithValue("Row chunk size", 32, Kernel::Direction::Input), + declareProperty(new PropertyWithValue("RowChunkSize", 32, Kernel::Direction::Input), "Please use an evenly divisible number smaller than the image height"); - declareProperty(new PropertyWithValue("Include error", false, Kernel::Direction::Input), + declareProperty(new PropertyWithValue("IncludeError", false, Kernel::Direction::Input), "Write the error values to NXTomo file?"); } From f7b5dc47002e8ced4790ca023482072b38640295 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 16 Oct 2014 09:02:37 +0100 Subject: [PATCH 119/284] Allow XMin to be zero Refs #7860 --- .../PythonInterface/plugins/algorithms/Symmetrise.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 47fb46f2afb0..efa84b95cac1 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -191,8 +191,8 @@ def validateInputs(self): # Validate X range x_min = self.getProperty('XMin').value - if x_min < 1e-5: - issues['XMin'] = 'XMin must be greater than zero' + if x_min < -1e-5: + issues['XMin'] = 'XMin must be greater than or equal to zero' x_max = self.getProperty('XMax').value if x_max < 1e-5: From 19bbbd325d2182815b138e8e0916058bc09a44cc Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 16 Oct 2014 16:20:28 +0100 Subject: [PATCH 120/284] Fix scattering angle calculation on final detector event. Refs #10169 --- Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index af602567ec64..fa8b4f358f01 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -917,6 +917,8 @@ namespace Mantid "Logical error. No intersection with sample, despite track " "originating from with sample."); } + // Calculate final scattering angle + scAngs[i] = detDirection.angle(scatterPts[i]); const auto & link = scatterToDet.begin(); double distToExit = link->distInsideObject; // Weight by probability neutron leaves sample From 303294c4a2aaaa7ad239fa5958bc52826ac7e3af Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 16 Oct 2014 16:22:13 +0100 Subject: [PATCH 121/284] Fix loop terminator for uranium final energy. Refs #10169 --- .../Framework/CurveFitting/src/CalculateMSVesuvio.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index fa8b4f358f01..0aea4ca37dfc 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -249,8 +249,8 @@ namespace Mantid } /** - * Generate the final energy of a neutron for gold foil analyser at 293K - * with number density of 7.35E19 atoms/cm^2 in double-difference mode. + * Generate the final energy of a neutron for uranium foil analyser at 293K + * with number density of 1.456E20 atoms/cm^2 in double-difference mode. * @param randv A random number between 0.0 & 1.0, sample from a flat distribution * @return A value to use for the final energy */ @@ -296,7 +296,7 @@ namespace Mantid 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 }; - for(size_t i = 0; i < 299; ++i) + for(size_t i = 0; i < 200; ++i) { if(XVALUES[i] < randv && XVALUES[i+1] > randv) { From 664d2da2bb5f0334802fdff2671b4959ddd1d3e9 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Thu, 16 Oct 2014 17:46:46 +0100 Subject: [PATCH 122/284] recent files menu added into the main app menu, re #10335 --- .../MantidPlot/src/ApplicationWindow.cpp | 100 ++++++++++++++---- .../Mantid/MantidPlot/src/ApplicationWindow.h | 19 +++- 2 files changed, 96 insertions(+), 23 deletions(-) diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp index 9bef2715e1ac..45b97f127fc0 100644 --- a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp +++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp @@ -551,7 +551,8 @@ void ApplicationWindow::init(bool factorySettings, const QStringList& args) connect(lv, SIGNAL(itemRenamed(Q3ListViewItem *, int, const QString &)), this, SLOT(renameWindow(Q3ListViewItem *, int, const QString &))); - connect(recent, SIGNAL(activated(int)), this, SLOT(openRecentProject(int))); + connect(recentProjectsMenu, SIGNAL(activated(int)), this, SLOT(openRecentProject(int))); + connect(recentFilesMenu, SIGNAL(activated(int)), this, SLOT(openRecentFile(int))); //apply user settings updateAppFonts(); @@ -1155,6 +1156,7 @@ void ApplicationWindow::insertTranslatedStrings() formatToolBar->setWindowTitle(tr("Format")); fileMenu->changeItem(recentMenuID, tr("&Recent Projects")); + fileMenu->changeItem(recentFilesMenuID, tr("R&ecent Files")); translateActionsStrings(); customMenu(activeWindow()); @@ -1166,8 +1168,9 @@ void ApplicationWindow::initMainMenu() fileMenu->setObjectName("fileMenu"); connect(fileMenu, SIGNAL(aboutToShow()), this, SLOT(fileMenuAboutToShow())); - recent = new QMenu(this); newMenu = new QMenu(this); + recentProjectsMenu = new QMenu(this); + recentFilesMenu = new QMenu(this); newMenu->setObjectName("newMenu"); exportPlotMenu = new QMenu(this); exportPlotMenu->setObjectName("exportPlotMenu"); @@ -4461,9 +4464,31 @@ ApplicationWindow* ApplicationWindow::open(const QString& fn, bool factorySettin return app; } +void ApplicationWindow::openRecentFile(int index) +{ + QString fn = recentFilesMenu->text(index); + int pos = fn.find(" ",0); + fn = fn.right(fn.length()-pos-1); + + QFile f(fn); + if (!f.exists()){ + QMessageBox::critical(this, tr("MantidPlot - File Open Error"),//Mantid + tr("The file: %1

          does not exist anymore!" + "

          It will be removed from the list.").arg(fn)); + + recentFiles.remove(fn); + updateRecentFilesList(fn); + return; + } + + loadDataFileByName(fn); + updateRecentFilesList(fn); + saveSettings(); // save new list of recent files +} + void ApplicationWindow::openRecentProject(int index) { - QString fn = recent->text(index); + QString fn = recentProjectsMenu->text(index); int pos = fn.find(" ",0); fn = fn.right(fn.length()-pos-1); @@ -4502,6 +4527,7 @@ void ApplicationWindow::openRecentProject(int index) } } + ApplicationWindow* ApplicationWindow::openProject(const QString& fn, bool factorySettings, bool newProject) { ApplicationWindow *app = this; @@ -5039,6 +5065,7 @@ void ApplicationWindow::readSettings() show_windows_policy = (ShowWindowsPolicy)settings.value("/ShowWindowsPolicy", ApplicationWindow::ActiveFolder).toInt(); recentProjects = settings.value("/RecentProjects").toStringList(); + recentFiles = settings.value("/RecentFiles").toStringList(); //Follows an ugly hack added by Ion in order to fix Qt4 porting issues //(only needed on Windows due to a Qt bug?) #ifdef Q_OS_WIN @@ -5049,9 +5076,18 @@ void ApplicationWindow::readSettings() if (s.remove(QRegExp("\\s")).isEmpty()) recentProjects = QStringList(); } + + if (!recentFiles.isEmpty() && recentFiles[0].contains("^e")) + recentFiles = recentFiles[0].split("^e", QString::SkipEmptyParts); + else if (recentFiles.count() == 1){ + QString s = recentFiles[0]; + if (s.remove(QRegExp("\\s")).isEmpty()) + recentFiles = QStringList(); + } #endif updateRecentProjectsList(); + updateRecentFilesList(); changeAppStyle(settings.value("/Style", appStyle).toString()); autoSave = settings.value("/AutoSave", false).toBool(); @@ -5513,6 +5549,7 @@ void ApplicationWindow::saveSettings() settings.setValue("/Language", appLanguage); settings.setValue("/ShowWindowsPolicy", show_windows_policy); settings.setValue("/RecentProjects", recentProjects); + settings.setValue("/RecentFiles", recentFiles); settings.setValue("/Style", appStyle); settings.setValue("/AutoSave", autoSave); settings.setValue("/AutoSaveTime", autoSaveTime); @@ -6209,7 +6246,7 @@ void ApplicationWindow::savetoNexusFile() savedatainNexusFormat(wsName,fileName.toStdString()); MantidQt::API::AlgorithmInputHistory::Instance().setPreviousDirectory(QFileInfo(fileName).absoluteDir().path()); - + updateRecentFilesList(fileName); } } @@ -6218,18 +6255,27 @@ void ApplicationWindow::loadDataFile() // Ask user for file QString fn = QFileDialog::getOpenFileName( 0, tr("Mantidplot - Open file to load"), AlgorithmInputHistory::Instance().getPreviousDirectory()); if(fn != "") { - QFileInfo fnInfo(fn); - AlgorithmInputHistory::Instance().setPreviousDirectory(fnInfo.absoluteDir().path()); - if( fnInfo.suffix() == "py") - { // We have a python file, just load it into script window - loadScript( fn, true ); - } - else if(mantidUI) - { // Run Load algorithm on file - QHash params; - params["Filename"] = fn; - mantidUI->showAlgorithmDialog(QString("Load"),params); - } + loadDataFileByName(fn); + } + updateRecentFilesList(fn); + saveSettings(); // save new list of recent files +} + +void ApplicationWindow::loadDataFileByName(QString fn) +{ + QFileInfo fnInfo(fn); + AlgorithmInputHistory::Instance().setPreviousDirectory(fnInfo.absoluteDir().path()); + if( fnInfo.suffix() == "py") + { + // We have a python file, just load it into script window + loadScript( fn, true ); + } + else if(mantidUI) + { + // Run Load algorithm on file + QHash params; + params["Filename"] = fn; + mantidUI->showAlgorithmDialog(QString("Load"),params); } } @@ -9280,7 +9326,9 @@ void ApplicationWindow::fileMenuAboutToShow() openMenu->addAction(actionOpenProj); openMenu->addAction(actionLoadFile); - recentMenuID = fileMenu->insertItem(tr("&Recent Projects"), recent); + recentMenuID = fileMenu->insertItem(tr("&Recent Projects"), recentProjectsMenu); + + recentFilesMenuID = fileMenu->insertItem(tr("R&ecent Files"), recentFilesMenu); fileMenu->insertSeparator(); fileMenu->addAction(actionManageDirs); @@ -14438,10 +14486,24 @@ void ApplicationWindow::updateRecentProjectsList() while ((int)recentProjects.size() > MaxRecentProjects) recentProjects.pop_back(); - recent->clear(); + recentProjectsMenu->clear(); for (int i = 0; i<(int)recentProjects.size(); i++ ) - recent->insertItem("&" + QString::number(i+1) + " " + recentProjects[i]); + recentProjectsMenu->insertItem("&" + QString::number(i+1) + " " + recentProjects[i]); +} + +void ApplicationWindow::updateRecentFilesList(QString fname) +{ + if (!fname.isEmpty()) { + recentFiles.remove(fname); + recentFiles.push_front(fname); + } + while ((int)recentFiles.size() > MaxRecentFiles) + recentFiles.pop_back(); + + recentFilesMenu->clear(); + for (int i = 0; i<(int)recentFiles.size(); i++ ) + recentFilesMenu->insertItem("&" + QString::number(i+1) + " " + recentFiles[i]); } void ApplicationWindow::translateCurveHor() diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.h b/Code/Mantid/MantidPlot/src/ApplicationWindow.h index 5de461c6140a..1b3ea9c2f2e3 100644 --- a/Code/Mantid/MantidPlot/src/ApplicationWindow.h +++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.h @@ -213,8 +213,13 @@ public slots: ApplicationWindow* open(const QString& fn, bool factorySettings = false, bool newProject = true); ApplicationWindow* openProject(const QString& fn, bool factorySettings = false, bool newProject = true); ApplicationWindow* importOPJ(const QString& fn, bool factorySettings = false, bool newProject = true); - /// Load mantid data files using generic load algorithm + /// Load mantid data files using generic load algorithm, opening user dialog void loadDataFile(); + /// Load mantid data files (generic load algorithm) + void loadDataFileByName(QString fn); + /// Open from the list of recent files + void openRecentFile(int index); + /** * \brief Create a new project from a data file. * @@ -619,6 +624,7 @@ public slots: Graph3D* openSurfacePlot(ApplicationWindow* app, const QStringList &lst); Graph* openGraph(ApplicationWindow* app, MultiLayer *plot, const QStringList &list); void openRecentProject(int index); + //@} //! \name Table Tools @@ -852,8 +858,12 @@ public slots: void custom3DGrids(int grids); //@} + //! Updates the recent projects list and menu (but doesn't insert anything) void updateRecentProjectsList(); + //! Inserts file name in the list of recent files (if fname not empty) and updates the "recent files" menu + void updateRecentFilesList(QString fname=""); + //! connected to the done(bool) signal of the http object //void receivedVersionFile(bool error); //! called when the user presses the actionCheckUpdates @@ -1279,6 +1289,7 @@ public slots: //! Describes which windows are shown when the folder becomes the current folder ShowWindowsPolicy show_windows_policy; enum {MaxRecentProjects = 10}; + enum {MaxRecentFiles = MaxRecentProjects}; //! File version code used when opening project files (= maj * 100 + min * 10 + patch) int d_file_version; @@ -1327,9 +1338,9 @@ public slots: QColor tableBkgdColor, tableTextColor, tableHeaderColor; QString projectname, columnSeparator, helpFilePath, appLanguage; QString configFilePath, fitPluginsPath, fitModelsPath, asciiDirPath, imagesDirPath, scriptsDirPath; - int ignoredLines, savingTimerId, plot3DResolution, recentMenuID; + int ignoredLines, savingTimerId, plot3DResolution, recentMenuID, recentFilesMenuID; bool renameColumns, strip_spaces, simplify_spaces; - QStringList recentProjects; + QStringList recentProjects, recentFiles; bool saved, showPlot3DProjection, showPlot3DLegend, orthogonal3DPlots, autoscale3DPlots; QStringList plot3DColors, locales; QStringList functions; //user-defined functions; @@ -1413,7 +1424,7 @@ public slots: QWidget* catalogSearch; - QMenu *windowsMenu, *foldersMenu, *view, *graph, *fileMenu, *format, *edit, *recent, *interfaceMenu; + QMenu *windowsMenu, *foldersMenu, *view, *graph, *fileMenu, *format, *edit, *recentProjectsMenu, *recentFilesMenu, *interfaceMenu; QMenu *help, *plot2DMenu, *analysisMenu, *multiPeakMenu, *icat; QMenu *matrixMenu, *plot3DMenu, *plotDataMenu, *tablesDepend, *scriptingMenu; From c8ee45c5625d9517ad484c77eb604c91445ce7fa Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Thu, 16 Oct 2014 18:02:20 +0100 Subject: [PATCH 123/284] a bit shorter lines, re #10335 --- Code/Mantid/MantidPlot/src/ApplicationWindow.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.h b/Code/Mantid/MantidPlot/src/ApplicationWindow.h index 1b3ea9c2f2e3..c27bf6582ac3 100644 --- a/Code/Mantid/MantidPlot/src/ApplicationWindow.h +++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.h @@ -1424,7 +1424,8 @@ public slots: QWidget* catalogSearch; - QMenu *windowsMenu, *foldersMenu, *view, *graph, *fileMenu, *format, *edit, *recentProjectsMenu, *recentFilesMenu, *interfaceMenu; + QMenu *windowsMenu, *foldersMenu, *view, *graph, *fileMenu, *format, *edit; + QMenu *recentProjectsMenu, *recentFilesMenu, *interfaceMenu; QMenu *help, *plot2DMenu, *analysisMenu, *multiPeakMenu, *icat; QMenu *matrixMenu, *plot3DMenu, *plotDataMenu, *tablesDepend, *scriptingMenu; From fe546e5affcf34d3a8f4fd23cdc966d3575d9668 Mon Sep 17 00:00:00 2001 From: Raquel Alvarez Banos Date: Fri, 17 Oct 2014 09:15:19 +0100 Subject: [PATCH 124/284] partial spectra loading in LoadEventNexus Re #3878 --- .../inc/MantidDataHandling/LoadEventNexus.h | 10 ++ .../DataHandling/src/LoadEventNexus.cpp | 107 +++++++++++++++++- .../inc/MantidDataObjects/EventWorkspace.h | 2 + .../DataObjects/src/EventWorkspace.cpp | 23 ++++ 4 files changed, 140 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadEventNexus.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadEventNexus.h index 1fb267994473..2fc947dc03c0 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadEventNexus.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadEventNexus.h @@ -142,6 +142,13 @@ namespace DataHandling /// Filter by a maximum time-of-flight double filter_tof_max; + /// Spectra list to load + std::vector m_specList; + /// Minimum spectrum to load + int32_t m_specMin; + /// Maximum spectrum to load + int32_t m_specMax; + /// Filter by start time Kernel::DateAndTime filter_time_start; /// Filter by stop time @@ -245,6 +252,9 @@ namespace DataHandling void filterDuringPause(API::MatrixWorkspace_sptr workspace); + // Validate the optional spectra input properties and initialize m_specList + void createSpectraList(int32_t min, int32_t max); + public: /// name of top level NXentry to use std::string m_top_entry_name; diff --git a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp index ef501b221f70..39b6893d61d4 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp @@ -168,6 +168,13 @@ namespace DataHandling if (alg->precount) { + + if ( alg->m_specMin !=EMPTY_INT() && alg->m_specMax !=EMPTY_INT() ) + { + m_min_id = alg->m_specMin; + m_max_id = alg->m_specMax; + } + std::vector counts(m_max_id-m_min_id+1, 0); for (size_t i=0; i < numEvents; i++) { @@ -1108,6 +1115,14 @@ namespace DataHandling setPropertyGroup("FilterMonByTimeStart", grp4); setPropertyGroup("FilterMonByTimeStop", grp4); + declareProperty("SpectrumMin",(int32_t)EMPTY_INT(), mustBePositive, + "The number of the first spectrum to read."); + declareProperty("SpectrumMax",(int32_t)EMPTY_INT(), mustBePositive, + "The number of the last spectrum to read."); + declareProperty(new ArrayProperty("SpectrumList"), + "A comma-separated list of individual spectra to read."); + + declareProperty( new PropertyWithValue("MetaDataOnly", false, Direction::Input), "If true, only the meta data and sample logs will be loaded."); @@ -2097,6 +2112,10 @@ void LoadEventNexus::createSpectraMapping(const std::string &nxsfile, const bool monitorsOnly, const std::vector &bankNames) { bool spectramap = false; + m_specMin = getProperty("SpectrumMin"); + m_specMax = getProperty("SpectrumMax"); + m_specList = getProperty("SpectrumList"); + // set up the if( !monitorsOnly && !bankNames.empty() ) { @@ -2137,8 +2156,10 @@ void LoadEventNexus::createSpectraMapping(const std::string &nxsfile, if( !spectramap ) { g_log.debug() << "No custom spectra mapping found, continuing with default 1:1 mapping of spectrum:detectorID\n"; - // The default 1:1 will suffice but exclude the monitors as they are always in a separate workspace - WS->padSpectra(); + auto specList= WS->getInstrument()->getDetectorIDs(true); + createSpectraList(*std::min_element(specList.begin(),specList.end()),*std::max_element(specList.begin(),specList.end())); + // The default 1:1 will suffice but exclude the monitors as they are always in a separate workspace + WS->padSpectra(m_specList); g_log.debug() << "Populated 1:1 spectra map for the whole instrument \n"; } } @@ -2296,6 +2317,26 @@ bool LoadEventNexus::loadSpectraMapping(const std::string& filename, const bool else { g_log.debug() << "Loading only detector spectra from " << filename << "\n"; + + // If optional spectra are provided, if so, m_specList is initialized. spec is used if necessary + createSpectraList(*std::min_element(spec.begin(),spec.end()), *std::max_element(spec.begin(),spec.end())); + + if ( !m_specList.empty() ) { + int i=0; + std::vector spec_temp, udet_temp; + for(auto it=spec.begin(); it!=spec.end(); it++) + { + if ( find(m_specList.begin(),m_specList.end(),*it)!= m_specList.end() ) // spec element *it is not in spec_list + { + spec_temp.push_back( *it ); + udet_temp.push_back( udet.at(i) ); + } + i++; + } + spec=spec_temp; + udet=udet_temp; + } + SpectrumDetectorMapping mapping(spec,udet, monitors); WS->resizeTo(mapping.getMapping().size()); // Make sure spectrum numbers are correct @@ -2691,6 +2732,68 @@ boost::shared_ptr LoadEventNexus::runLoadNexusLogs(const std::st return out; } +/** +* Check the validity of the optional spectrum range/list provided and identify if partial data should be loaded. +* +* @param min :: The minimum spectrum number read from file +* @param max :: The maximum spectrum number read from file +*/ + +void LoadEventNexus::createSpectraList(int32_t min, int32_t max){ + + // check if range [SpectrumMin, SpectrumMax] was supplied + if( m_specMin != EMPTY_INT() || m_specMax != EMPTY_INT() ) + { + if ( m_specMax == EMPTY_INT() ) + { + m_specMax = max; + } + if ( m_specMin == EMPTY_INT() ) + { + m_specMin = min; + } + + if ( m_specMax > max ) + { + throw std::invalid_argument("Inconsistent range property: SpectrumMax is larger than maximum spectrum found in file."); + } + + // Sanity checks for min/max + if ( m_specMin > m_specMax ) + { + throw std::invalid_argument("Inconsistent range property: SpectrumMin is larger than SpectrumMax."); + } + + // Populate spec_list + for (int32_t i=m_specMin; i<=m_specMax; i++) + m_specList.push_back(i); + } + else{ + // Check if SpectrumList was supplied + + if ( !m_specList.empty() ) + { + // Check no negative/zero numbers have been passed + std::vector::iterator itr = std::find_if(m_specList.begin(), m_specList.end(), std::bind2nd(std::less(), 1)); + if( itr != m_specList.end() ) + { + throw std::invalid_argument("Negative/Zero SpectraList property encountered."); + } + + // Check range and set m_specMax to maximum value in m_specList + if ( (m_specMax=*std::max_element(m_specList.begin(),m_specList.end())) > *std::max_element(m_specList.begin(),m_specList.end()) ) + { + throw std::invalid_argument("Inconsistent range property: SpectrumMax is larger than number of spectra."); + } + + // Set m_specMin to minimum value in m_specList + m_specMin=*std::min_element(m_specList.begin(),m_specList.end()); + } + + } + + +} } // namespace DataHandling } // namespace Mantid diff --git a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/EventWorkspace.h b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/EventWorkspace.h index 50ff948b4a36..01ed2e99ef0f 100644 --- a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/EventWorkspace.h +++ b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/EventWorkspace.h @@ -152,6 +152,8 @@ class DLLExport EventWorkspace : public API::IEventWorkspace void resizeTo(const std::size_t numSpectra); // Pad pixels in the workspace using the loaded spectra. Requires a non-empty spectra-detector map void padSpectra(); + // Pad pixels in the workspace using specList. Requires a non-empty vector + void padSpectra(const std::vector & specList); // Remove pixels in the workspace that do not contain events. void deleteEmptyLists(); diff --git a/Code/Mantid/Framework/DataObjects/src/EventWorkspace.cpp b/Code/Mantid/Framework/DataObjects/src/EventWorkspace.cpp index 222e78fd56b6..5027c8a023a5 100644 --- a/Code/Mantid/Framework/DataObjects/src/EventWorkspace.cpp +++ b/Code/Mantid/Framework/DataObjects/src/EventWorkspace.cpp @@ -615,6 +615,29 @@ namespace Mantid } } + /** Expands the workspace to a number of spectra corresponding to the number of + * pixels/detectors contained in specList. + * All events lists will be empty after calling this method. + */ + void EventWorkspace::padSpectra(const std::vector & specList) + { + if (specList.empty()) + { + padSpectra(); + } + else + { + resizeTo(specList.size()); + for (size_t i = 0; i < specList.size(); ++i) + { + // specList ranges from 1, ..., N + // detector ranges from 0, ..., N-1 + getSpectrum(i)->setDetectorID(specList[i]-1); + getSpectrum(i)->setSpectrumNo(specList[i]); + } + } + } + void EventWorkspace::deleteEmptyLists() { // figure out how much data to copy From d752c06a0ef063f76eeb3f2566f5d6ef280b5d6c Mon Sep 17 00:00:00 2001 From: Raquel Alvarez Banos Date: Fri, 17 Oct 2014 09:15:24 +0100 Subject: [PATCH 125/284] test partial spectra loading in LoadEventNexus Re #3878 --- .../DataHandling/test/LoadEventNexusTest.h | 35 ++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/test/LoadEventNexusTest.h b/Code/Mantid/Framework/DataHandling/test/LoadEventNexusTest.h index 9739246443c0..b6141c3fd555 100644 --- a/Code/Mantid/Framework/DataHandling/test/LoadEventNexusTest.h +++ b/Code/Mantid/Framework/DataHandling/test/LoadEventNexusTest.h @@ -218,7 +218,40 @@ class LoadEventNexusTest : public CxxTest::TestSuite TSM_ASSERT("The min TOF in the workspace should be equal to or greater than the filtered cut-off", min >= filterStart); } - void test_Load_And_CompressEvents() + void test_partial_spectra_loading() + { + const std::string wsName = "test_partial_spectra_loading"; + const int specMin = 200; + const int specMax = 2000; + std::vector specList; + specList.push_back(13); + specList.push_back(16); + specList.push_back(21); + specList.push_back(28); + + LoadEventNexus ld; + ld.initialize(); + ld.setPropertyValue("OutputWorkspace", wsName); + ld.setPropertyValue("Filename","CNCS_7860_event.nxs"); + //ld.setProperty("SpectrumMin", specMin); + //ld.setProperty("SpectrumMax", specMax); + ld.setProperty("SpectrumList", specList); + ld.setProperty("LoadLogs", false); // Time-saver + + TS_ASSERT( ld.execute() ); + + auto outWs = AnalysisDataService::Instance().retrieveWS(wsName); + +// TSM_ASSERT("The number of spectra in the workspace should be equal to the spectra filtered", outWs->getNumberHistograms()==specMax-specMin+1); + TSM_ASSERT("The number of spectra in the workspace should be equal to the spectra filtered", outWs->getNumberHistograms()==specList.size()); + TSM_ASSERT("Some spectra were not found in the workspace", outWs->getSpectrum(0)->getSpectrumNo()==13); + TSM_ASSERT("Some spectra were not found in the workspace", outWs->getSpectrum(1)->getSpectrumNo()==16); + TSM_ASSERT("Some spectra were not found in the workspace", outWs->getSpectrum(2)->getSpectrumNo()==21); + TSM_ASSERT("Some spectra were not found in the workspace", outWs->getSpectrum(3)->getSpectrumNo()==28); + + } + + void test_Load_And_CompressEvents() { Mantid::API::FrameworkManager::Instance(); LoadEventNexus ld; From d206e01224d3099b36652d81e8b9f870cfc9ecc4 Mon Sep 17 00:00:00 2001 From: Raquel Alvarez Banos Date: Fri, 17 Oct 2014 09:41:57 +0100 Subject: [PATCH 126/284] formatting LoadEventNexus Re #3878 --- Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp index 39b6893d61d4..f4a0e0795d1c 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp @@ -165,7 +165,6 @@ namespace DataHandling // ---- Pre-counting events per pixel ID ---- auto & outputWS = *(alg->WS); - if (alg->precount) { From 0cf537dc76342ee15e81acf57f498ab06e186e8b Mon Sep 17 00:00:00 2001 From: Raquel Alvarez Banos Date: Fri, 17 Oct 2014 10:01:06 +0100 Subject: [PATCH 127/284] new formatting LoadEventNexus Re #3878 --- Code/Mantid/Framework/DataHandling/src/LoadNexusMonitors.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadNexusMonitors.cpp b/Code/Mantid/Framework/DataHandling/src/LoadNexusMonitors.cpp index 7418eaf89e6a..80918d270b23 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadNexusMonitors.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadNexusMonitors.cpp @@ -460,6 +460,7 @@ void LoadNexusMonitors::runLoadLogs(const std::string filename, API::MatrixWorks { // do the actual work API::IAlgorithm_sptr loadLogs = createChildAlgorithm("LoadNexusLogs"); + // Now execute the Child Algorithm. Catch and log any error, but don't stop. try { From 2cebd8705ad339f47fc2f925fd9254211f34cdbe Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Fri, 17 Oct 2014 13:36:19 +0100 Subject: [PATCH 128/284] Update the Vesuvio detector shape to match reality. Refs #10169 --- Code/Mantid/instrument/VESUVIO_Definition.xml | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Code/Mantid/instrument/VESUVIO_Definition.xml b/Code/Mantid/instrument/VESUVIO_Definition.xml index f760a8f2faa8..4bda845b804c 100644 --- a/Code/Mantid/instrument/VESUVIO_Definition.xml +++ b/Code/Mantid/instrument/VESUVIO_Definition.xml @@ -320,22 +320,22 @@ - - - - + + + + - - - - - + + + + + - + @@ -355,4 +355,4 @@ - \ No newline at end of file + From 6a3bd52e77a41774dd999c44e438ffb5a6b0601f Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Fri, 17 Oct 2014 15:14:45 +0100 Subject: [PATCH 129/284] Copy X unit properly Refs #7860 --- .../Framework/PythonInterface/plugins/algorithms/Symmetrise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index efa84b95cac1..6787d7e1cdb1 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -91,7 +91,7 @@ def PyExec(self): logger.notice('New array length = %d' % new_array_len) logger.notice('Output array LR split index = %d' % output_cut_index) - x_unit = mtd[self._sample].getXDimension().getUnits() + x_unit = mtd[self._sample].getAxis(0).getUnit().unitID() # Create an empty workspace with enough storage for the new data zeros = np.zeros(new_array_len * num_symm_spectra) From a25fbab79a4ad7e8bfe6ffd8906a0980eaa20ce3 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Fri, 17 Oct 2014 16:14:37 +0100 Subject: [PATCH 130/284] Fix some compiler warnings Refs #10324 --- Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp index 203bcddd3cd1..648e911f934f 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp @@ -357,7 +357,7 @@ QPoint SpectrumDisplay::GetPlotTransform( QPair values ) double x = spectrum_plot->transform( QwtPlot::xBottom, values.first ); double y = spectrum_plot->transform( QwtPlot::yLeft, values.second ); - return QPoint(x, y); + return QPoint((int)x, (int)y); } From f413b0dd19e827a16ea061cd26cd3cfb52580920 Mon Sep 17 00:00:00 2001 From: Steven Hahn Date: Fri, 17 Oct 2014 18:13:01 -0400 Subject: [PATCH 131/284] Refs #10387. OPENSSL_ROOT_DIR now points to homebrew opt directory --- Code/Mantid/Build/CMake/DarwinSetup.cmake | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Code/Mantid/Build/CMake/DarwinSetup.cmake b/Code/Mantid/Build/CMake/DarwinSetup.cmake index 07a3461a5286..d26ddce540ee 100644 --- a/Code/Mantid/Build/CMake/DarwinSetup.cmake +++ b/Code/Mantid/Build/CMake/DarwinSetup.cmake @@ -128,9 +128,7 @@ else() set ( PYQT4_PYTHONPATH /usr/local/lib/python${PY_VER}/site-packages/PyQt4 ) set ( SITEPACKAGES /usr/local/lib/python${PY_VER}/site-packages ) # use homebrew OpenSSL package - EXEC_PROGRAM( brew ARGS info openssl | grep openssl: | cut -c 17-22 OUTPUT_VARIABLE _openssl_version ) - MESSAGE(STATUS "OpenSSL version: ${_openssl_version}") - set ( OPENSSL_ROOT_DIR /usr/local/Cellar/openssl/${_openssl_version}/ ) + set ( OPENSSL_ROOT_DIR /usr/local/opt/openssl ) endif() # Python packages From dbd38823eaa36629b53387cef82683e40a08bfd9 Mon Sep 17 00:00:00 2001 From: Raquel Alvarez Banos Date: Mon, 20 Oct 2014 09:25:22 +0100 Subject: [PATCH 132/284] LoadEventNexusTest Linux compiler warnings fixed Re #3878 --- Code/Mantid/Framework/DataHandling/test/LoadEventNexusTest.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/test/LoadEventNexusTest.h b/Code/Mantid/Framework/DataHandling/test/LoadEventNexusTest.h index b6141c3fd555..18b9221ff970 100644 --- a/Code/Mantid/Framework/DataHandling/test/LoadEventNexusTest.h +++ b/Code/Mantid/Framework/DataHandling/test/LoadEventNexusTest.h @@ -221,8 +221,6 @@ class LoadEventNexusTest : public CxxTest::TestSuite void test_partial_spectra_loading() { const std::string wsName = "test_partial_spectra_loading"; - const int specMin = 200; - const int specMax = 2000; std::vector specList; specList.push_back(13); specList.push_back(16); @@ -233,8 +231,6 @@ class LoadEventNexusTest : public CxxTest::TestSuite ld.initialize(); ld.setPropertyValue("OutputWorkspace", wsName); ld.setPropertyValue("Filename","CNCS_7860_event.nxs"); - //ld.setProperty("SpectrumMin", specMin); - //ld.setProperty("SpectrumMax", specMax); ld.setProperty("SpectrumList", specList); ld.setProperty("LoadLogs", false); // Time-saver @@ -242,7 +238,6 @@ class LoadEventNexusTest : public CxxTest::TestSuite auto outWs = AnalysisDataService::Instance().retrieveWS(wsName); -// TSM_ASSERT("The number of spectra in the workspace should be equal to the spectra filtered", outWs->getNumberHistograms()==specMax-specMin+1); TSM_ASSERT("The number of spectra in the workspace should be equal to the spectra filtered", outWs->getNumberHistograms()==specList.size()); TSM_ASSERT("Some spectra were not found in the workspace", outWs->getSpectrum(0)->getSpectrumNo()==13); TSM_ASSERT("Some spectra were not found in the workspace", outWs->getSpectrum(1)->getSpectrumNo()==16); From 8abde124ecfd86efe021aab4acb4621270156439 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 20 Oct 2014 09:44:52 +0100 Subject: [PATCH 133/284] Default to loading mica when fmica is selected on IRIS Refs #10388 --- .../CustomInterfaces/src/IndirectDataReductionTab.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp index e13eb6cd28f6..f9283efd889f 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp @@ -197,6 +197,10 @@ namespace CustomInterfaces // Get the instrument workspace MatrixWorkspace_sptr instWorkspace = loadInstrumentIfNotExist(instrumentName, analyser, reflection); + // In the IRIS IPF there is no fmica component + if(instrumentName == "IRIS" && analyser == "fmica") + analyser = "mica"; + // Get the instrument auto instrument = instWorkspace->getInstrument()->getComponentByName(analyser); if(instrument == NULL) From 642f35743a21a5f467725895c8863c6e9a581262 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Mon, 20 Oct 2014 14:34:42 +0100 Subject: [PATCH 134/284] updateRecentFiles when loading new files removed from here, re #10335 also improved some error messages --- Code/Mantid/MantidPlot/src/ApplicationWindow.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp index 45b97f127fc0..ad8a24640adb 100644 --- a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp +++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp @@ -4474,15 +4474,14 @@ void ApplicationWindow::openRecentFile(int index) if (!f.exists()){ QMessageBox::critical(this, tr("MantidPlot - File Open Error"),//Mantid tr("The file: %1

          does not exist anymore!" - "

          It will be removed from the list.").arg(fn)); + "

          It will be removed from the list of recent files.").arg(fn)); recentFiles.remove(fn); - updateRecentFilesList(fn); + updateRecentFilesList(); return; } loadDataFileByName(fn); - updateRecentFilesList(fn); saveSettings(); // save new list of recent files } @@ -4496,7 +4495,7 @@ void ApplicationWindow::openRecentProject(int index) if (!f.exists()){ QMessageBox::critical(this, tr("MantidPlot - File Open Error"),//Mantid tr("The file: %1

          does not exist anymore!" - "

          It will be removed from the list.").arg(fn)); + "

          It will be removed from the list of recent projects.").arg(fn)); recentProjects.remove(fn); updateRecentProjectsList(); @@ -6257,7 +6256,6 @@ void ApplicationWindow::loadDataFile() if(fn != "") { loadDataFileByName(fn); } - updateRecentFilesList(fn); saveSettings(); // save new list of recent files } From ffd6edb88d22b5e294eeb42dae0017fc42f59510 Mon Sep 17 00:00:00 2001 From: John Hill Date: Mon, 20 Oct 2014 15:36:54 +0100 Subject: [PATCH 135/284] Refs #10194 corrected property --- .../inc/MantidDataHandling/SaveNXTomo.h | 176 ++--- .../Framework/DataHandling/src/SaveNXTomo.cpp | 735 +++++++++--------- 2 files changed, 456 insertions(+), 455 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 80e0cacbe038..2058f5dcdddb 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -9,98 +9,98 @@ namespace Mantid { - namespace DataHandling - { - - /** - * Saves a workspace into a NeXus/HDF5 NXTomo file. - * File format is defined here: http://download.nexusformat.org/sphinx/classes/applications/NXtomo.html - * - * Required properties: - *

            - *
          • InputWorkspace - The workspace to save.
          • - *
          • Filename - The filename for output
          • - *
          - * - * @author John R Hill, RAL - * @date 10/09/2014 - * - * This file is part of Mantid. - * - * Mantid 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. - * - * Mantid 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, see . - * - * File change history is stored at: - * Code Documentation is available at: - * - */ - - class DLLExport SaveNXTomo: public API::Algorithm - { - public: - SaveNXTomo(); - /// Virtual dtor - virtual ~SaveNXTomo() {} - - /// Algorithm's name for identification overriding a virtual method - virtual const std::string name() const { return "SaveNXTomo"; } - - ///Summary of algorithms purpose - virtual const std::string summary() const {return "Writes a MatrixWorkspace to a file in the NXTomo format.";} - - /// Algorithm's version - virtual int version() const { return (1); } - - /// Algorithm's category for identification - virtual const std::string category() const { return "DataHandling\\Nexus;DataHandling\\Tomo;Diffraction"; } - - private: - /// Initialisation code - void init(); - /// Execution code - void exec(); - - /// Save all data to file - - /// Save batch of images to the file - - /// Fetch all rectangular Detector objects defined for an instrument - std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); - - /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument - std::vector getDimensionsFromDetector(const std::vector &rectDetectors, size_t useDetectorIndex = 0); - - // Number of rows to - size_t m_numberOfRows; + namespace DataHandling + { + + /** + * Saves a workspace into a NeXus/HDF5 NXTomo file. + * File format is defined here: http://download.nexusformat.org/sphinx/classes/applications/NXtomo.html + * + * Required properties: + *
            + *
          • InputWorkspace - The workspace to save.
          • + *
          • Filename - The filename for output
          • + *
          + * + * @author John R Hill, RAL + * @date 10/09/2014 + * + * This file is part of Mantid. + * + * Mantid 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. + * + * Mantid 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, see . + * + * File change history is stored at: + * Code Documentation is available at: + * + */ + + class DLLExport SaveNXTomo: public API::Algorithm + { + public: + SaveNXTomo(); + /// Virtual dtor + virtual ~SaveNXTomo() {} + + /// Algorithm's name for identification overriding a virtual method + virtual const std::string name() const { return "SaveNXTomo"; } + + ///Summary of algorithms purpose + virtual const std::string summary() const {return "Writes a MatrixWorkspace to a file in the NXTomo format.";} + + /// Algorithm's version + virtual int version() const { return (1); } + + /// Algorithm's category for identification + virtual const std::string category() const { return "DataHandling\\Nexus;DataHandling\\Tomo;Diffraction"; } + + private: + /// Initialisation code + void init(); + /// Execution code + void exec(); + + /// Save all data to file + + /// Save batch of images to the file + + /// Fetch all rectangular Detector objects defined for an instrument + std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); + + /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument + std::vector getDimensionsFromDetector(const std::vector &rectDetectors, size_t useDetectorIndex = 0); + + // Number of rows to + size_t m_numberOfRows; // Include error data in the written file bool m_includeError; - ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change - //size_t m_nBins; - /// The filename of the output file - std::string m_filename; - - // Some constants to be written for masked values. - /// Value for data if pixel is masked - static const double MASK_FLAG; - /// Value for error if pixel is masked - static const double MASK_ERROR; - /// file format version - static const std::string NXTOMO_VER; - }; - - } // namespace DataHandling + ///the number of bins in each histogram, as the histogram must have common bins this shouldn't change + //size_t m_nBins; + /// The filename of the output file + std::string m_filename; + + // Some constants to be written for masked values. + /// Value for data if pixel is masked + static const double MASK_FLAG; + /// Value for error if pixel is masked + static const double MASK_ERROR; + /// file format version + static const std::string NXTOMO_VER; + }; + + } // namespace DataHandling } // namespace Mantid #endif // MANTID_DATAHANDLING_SAVENXTOMO_H_ diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index 99bab4ece30a..a1e25e8002ab 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -8,392 +8,393 @@ namespace Mantid { - namespace DataHandling - { - // Register the algorithm into the algorithm factory - DECLARE_ALGORITHM(SaveNXTomo) - - using namespace Kernel; - using namespace API; - using Geometry::RectangularDetector; - - const double SaveNXTomo::MASK_FLAG = std::numeric_limits::quiet_NaN(); - const double SaveNXTomo::MASK_ERROR = 0.0; - const std::string SaveNXTomo::NXTOMO_VER = "2.0"; - - SaveNXTomo::SaveNXTomo() : API::Algorithm() - { - m_filename = ""; - m_includeError = false; - m_numberOfRows = 32; - } - - /** - * Initialise the algorithm - */ - void SaveNXTomo::init() - { - auto wsValidator = boost::make_shared() ; - //wsValidator->add(boost::make_shared("DeltaE")); - wsValidator->add(); - wsValidator->add(); - - declareProperty(new WorkspaceProperty ("InputWorkspace", "", Direction::Input, wsValidator), - "The name of the workspace to save."); - - declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), - "The name of the NXTomo file to write, as a full or relative path"); - - declareProperty(new PropertyWithValue("RowChunkSize", 32, Kernel::Direction::Input), - "Please use an evenly divisible number smaller than the image height"); - - declareProperty(new PropertyWithValue("IncludeError", false, Kernel::Direction::Input), - "Write the error values to NXTomo file?"); - } - - /** - * Execute the algorithm - */ - void SaveNXTomo::exec() - { - // Retrieve the input workspace - const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); - - m_numberOfRows = getProperty("Row chunk size"); - m_includeError = getProperty("Include error"); - - const std::string workspaceID = inputWS->id(); - - if ((workspaceID.find("Workspace2D") == std::string::npos) && - (workspaceID.find("RebinnedOutput") == std::string::npos)) - throw Exception::NotImplementedError("SaveNXTomo passed invalid workspaces. Must be Workspace2D"); - - // Do the full check for common binning - if (!WorkspaceHelpers::commonBoundaries(inputWS)) - { - g_log.error("The input workspace must have common bins"); - throw std::invalid_argument("The input workspace must have common bins"); - } - - // Number of spectra - const size_t nHist = inputWS->getNumberHistograms(); - // Number of energy bins - //this->m_nBins = inputWS->blocksize(); - - // Get a pointer to the sample - //Geometry::IComponent_const_sptr sample = - // inputWS->getInstrument()->getSample(); - - // Retrieve the filename from the properties - this->m_filename = getPropertyValue("Filename"); - - // Dimensions for axis in nxTomo file. - std::vector dims_array; + namespace DataHandling + { + // Register the algorithm into the algorithm factory + DECLARE_ALGORITHM(SaveNXTomo) + + using namespace Kernel; + using namespace API; + using Geometry::RectangularDetector; + + const double SaveNXTomo::MASK_FLAG = std::numeric_limits::quiet_NaN(); + const double SaveNXTomo::MASK_ERROR = 0.0; + const std::string SaveNXTomo::NXTOMO_VER = "2.0"; + + SaveNXTomo::SaveNXTomo() : API::Algorithm() + { + m_filename = ""; + m_includeError = false; + m_numberOfRows = 32; + } + + /** + * Initialise the algorithm + */ + void SaveNXTomo::init() + { + auto wsValidator = boost::make_shared() ; + //wsValidator->add(boost::make_shared("DeltaE")); + wsValidator->add(); + wsValidator->add(); + + declareProperty(new WorkspaceProperty ("InputWorkspace", "", Direction::Input, wsValidator), + "The name of the workspace to save."); + + declareProperty(new API::FileProperty("Filename", "", FileProperty::Save, std::vector(1,".nxs")), + "The name of the NXTomo file to write, as a full or relative path"); + + declareProperty(new PropertyWithValue("RowChunkSize", 32, Kernel::Direction::Input), + "Please use an evenly divisible number smaller than the image height"); + + declareProperty(new PropertyWithValue("IncludeError", false, Kernel::Direction::Input), + "Write the error values to NXTomo file?"); + } + + /** + * Execute the algorithm + */ + void SaveNXTomo::exec() + { + // Retrieve the input workspace + const MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); + + m_numberOfRows = getProperty("RowChunkSize"); + m_includeError = getProperty("IncludeError"); + + const std::string workspaceID = inputWS->id(); + + if ((workspaceID.find("Workspace2D") == std::string::npos) && + (workspaceID.find("RebinnedOutput") == std::string::npos)) + throw Exception::NotImplementedError("SaveNXTomo passed invalid workspaces. Must be Workspace2D"); + + // Do the full check for common binning + if (!WorkspaceHelpers::commonBoundaries(inputWS)) + { + g_log.error("The input workspace must have common bins"); + throw std::invalid_argument("The input workspace must have common bins"); + } + + // Number of spectra + const size_t nHist = inputWS->getNumberHistograms(); + // Number of energy bins + //this->m_nBins = inputWS->blocksize(); + + // Get a pointer to the sample + //Geometry::IComponent_const_sptr sample = + // inputWS->getInstrument()->getSample(); + + // Retrieve the filename from the properties + this->m_filename = getPropertyValue("Filename"); + + // Dimensions for axis in nxTomo file. + std::vector dims_array; // Populate the array dims_array = getDimensionsFromDetector(getRectangularDetectors(inputWS->getInstrument())); // Insert number of bins at front - dims_array.insert(dims_array.begin(), inputWS->blocksize()); // Number of bins - - // Create the file. - ::NeXus::File nxFile(this->m_filename, NXACC_CREATE5); - - // Make the top level entry (and open it) - nxFile.makeGroup("entry1", "NXentry", true); - - // Make a sub-group for the entry to work with DAWN software (and open it) - nxFile.makeGroup("tomo_entry", "NXsubentry", true); - - // Title - nxFile.writeData("title", this->m_filename); - - // Start Time; Format ISO8601 | unused but part of NXtomo schema - //nxFile.writeData("start_time", ); - - // End Time; Format ISO8601 | unused but part of NXtomo schema - //nxFile.writeData("end_time", ); - - // Definition name and version - nxFile.writeData("definition", "NXtomo"); - nxFile.openData("definition"); - nxFile.putAttr("version", NXTOMO_VER); - nxFile.closeData(); - - // Originating program name and version - nxFile.writeData("program_name", "mantid"); - nxFile.openData("program_name"); - nxFile.putAttr("version", Mantid::Kernel::MantidVersion::version()); - nxFile.closeData(); - - // ****************************************** - // NXinstrument - nxFile.makeGroup("instrument", "NXinstrument", true); - // Write the instrument name | could add short_name attribute to name - nxFile.writeData("name", inputWS->getInstrument()->getName()); - - // detector group - diamond example file contains {data,distance,image_key,x_pixel_size,y_pixel_size} Only adding image_key for now, 0 filled. - nxFile.makeGroup("detector", "NXdetector", true); - std::vector imageKeys(dims_array[0],0); - nxFile.writeData("image_key", imageKeys); - // Create link to image_key - nxFile.openData("image_key"); - //NXlink imageKeyLink = nxFile.getDataID(); - nxFile.closeData(); - nxFile.closeGroup(); - - // source group // from diamond file contains {current,energy,name,probe,type} - probe = [neutron | x-ray | electron] - - nxFile.closeGroup(); // NXinstrument - - // ****************************************** - // NXsample - nxFile.makeGroup("sample", "NXsample", true); - // TODO: Write sample info - // name - - std::vector rotationAngles(dims_array[0]); - // Initialise rotations - if unknown, fill with equal steps from 0 to 180 over all frames. - // TODO: collect and use actual rotation values - - double step = static_cast(180/dims_array[0]); - rotationAngles[0] = step; - - for(auto it = rotationAngles.begin()+1; it != rotationAngles.end(); ++it) - { - *it = (*(it-1)) + step; - } - - nxFile.writeData("rotation_angle", rotationAngles); - - // Create a link object for rotation_angle to use later - nxFile.openData("rotation_angle"); - NXlink rotationLink = nxFile.getDataID(); - nxFile.closeData(); - // x_translation - // y_translation - // z_translation - nxFile.closeGroup(); // NXsample - - // ****************************************** - // Make the NXmonitor group - Holds base beam intensity for each image - // If information is not present, set as 1 - - std::vector intensity(dims_array[0],1); - nxFile.makeGroup("control", "NXmonitor", true); - nxFile.writeData("data", intensity); - nxFile.closeGroup(); // NXmonitor - - nxFile.makeGroup("data", "NXdata", true); - - nxFile.makeLink(rotationLink); - - nxFile.makeData("data", ::NeXus::FLOAT64, dims_array, false); - if(m_includeError) - nxFile.makeData("error", ::NeXus::FLOAT64, dims_array, false); - - std::vector slabStart; - std::vector slabSize; - - // What size slabs are we going to write - slabSize.push_back(dims_array[0]); - slabSize.push_back((int64_t)dims_array[1]); - slabSize.push_back((int64_t)m_numberOfRows); - - // Init start to first row - slabStart.push_back(0); - slabStart.push_back(0); - slabStart.push_back(0); - - // define the data and error vectors for masked detectors - std::vector masked_data (dims_array[0], MASK_FLAG); - if(m_includeError) - std::vector masked_error (dims_array[0], MASK_ERROR); - - // Create a progress reporting object - Progress progress(this,0,1,100); - const size_t progStep = static_cast(ceil(static_cast(nHist)/100.0)); - Geometry::IDetector_const_sptr det; - - double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - double *errorArr = NULL; - if(m_includeError) - errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; - - int currY = 0; - size_t rowIndForSlab = 0; // as we're creating slabs of multiple rows, this says which y index we're at in current slab - - // Loop over detectors - for (size_t i = 0; i < nHist; ++i) - { - try - { - // detector exist - //det = inputWS->getDetector(i); - // Check that we aren't writing a monitor - //if (!det->isMonitor()) - //{ - //Geometry::IDetector_const_sptr det = inputWS->getDetector(i); - - // Figure out where this pixel is supposed to be going and set the correct slab start. - - if(i!=0 && (i)%dims_array[1] == 0){ // When this iteration matches end of a row - currY += 1; - } - size_t currX = (i) - (currY*dims_array[1]); - - const MantidVec & thisY = inputWS->readY(i); - // No masking - Set the data and error as is - for(int j=0; jisMasked()) - // { - dataArr[currInd] = thisY.at(j); - if(m_includeError) - errorArr[currInd] = inputWS->readE(i).at(j); - //} - //else - //{ - // dataArr[currInd] = masked_data[j]; - // if(m_includeError) + dims_array.insert(dims_array.begin(), inputWS->blocksize()); // Number of bins + + // Create the file. + ::NeXus::File nxFile(this->m_filename, NXACC_CREATE5); + + // Make the top level entry (and open it) + nxFile.makeGroup("entry1", "NXentry", true); + + // Make a sub-group for the entry to work with DAWN software (and open it) + nxFile.makeGroup("tomo_entry", "NXsubentry", true); + + // Title + nxFile.writeData("title", this->m_filename); + + // Start Time; Format ISO8601 | unused but part of NXtomo schema + //nxFile.writeData("start_time", ); + + // End Time; Format ISO8601 | unused but part of NXtomo schema + //nxFile.writeData("end_time", ); + + // Definition name and version + nxFile.writeData("definition", "NXtomo"); + nxFile.openData("definition"); + nxFile.putAttr("version", NXTOMO_VER); + nxFile.closeData(); + + // Originating program name and version + nxFile.writeData("program_name", "mantid"); + nxFile.openData("program_name"); + nxFile.putAttr("version", Mantid::Kernel::MantidVersion::version()); + nxFile.closeData(); + + // ****************************************** + // NXinstrument + nxFile.makeGroup("instrument", "NXinstrument", true); + // Write the instrument name | could add short_name attribute to name + nxFile.writeData("name", inputWS->getInstrument()->getName()); + + // detector group - diamond example file contains {data,distance,image_key,x_pixel_size,y_pixel_size} Only adding image_key for now, 0 filled. + nxFile.makeGroup("detector", "NXdetector", true); + std::vector imageKeys(dims_array[0],0); + nxFile.writeData("image_key", imageKeys); + // Create link to image_key + nxFile.openData("image_key"); + //NXlink imageKeyLink = nxFile.getDataID(); + nxFile.closeData(); + nxFile.closeGroup(); + + // source group // from diamond file contains {current,energy,name,probe,type} - probe = [neutron | x-ray | electron] + + nxFile.closeGroup(); // NXinstrument + + // ****************************************** + // NXsample + nxFile.makeGroup("sample", "NXsample", true); + // TODO: Write sample info + // name + + std::vector rotationAngles(dims_array[0]); + // Initialise rotations - if unknown, fill with equal steps from 0 to 180 over all frames. + // TODO: collect and use actual rotation values + + double step = static_cast(180/dims_array[0]); + rotationAngles[0] = step; + + for(auto it = rotationAngles.begin()+1; it != rotationAngles.end(); ++it) + { + *it = (*(it-1)) + step; + } + + nxFile.writeData("rotation_angle", rotationAngles); + + // Create a link object for rotation_angle to use later + nxFile.openData("rotation_angle"); + NXlink rotationLink = nxFile.getDataID(); + nxFile.closeData(); + // x_translation + // y_translation + // z_translation + nxFile.closeGroup(); // NXsample + + // ****************************************** + // Make the NXmonitor group - Holds base beam intensity for each image + // If information is not present, set as 1 + + std::vector intensity(dims_array[0],1); + nxFile.makeGroup("control", "NXmonitor", true); + nxFile.writeData("data", intensity); + nxFile.closeGroup(); // NXmonitor + + nxFile.makeGroup("data", "NXdata", true); + + nxFile.makeLink(rotationLink); + + nxFile.makeData("data", ::NeXus::FLOAT64, dims_array, false); + if(m_includeError) + nxFile.makeData("error", ::NeXus::FLOAT64, dims_array, false); + + std::vector slabStart; + std::vector slabSize; + + // What size slabs are we going to write + slabSize.push_back(dims_array[0]); + slabSize.push_back((int64_t)dims_array[1]); + slabSize.push_back((int64_t)m_numberOfRows); + + // Init start to first row + slabStart.push_back(0); + slabStart.push_back(0); + slabStart.push_back(0); + + // define the data and error vectors for masked detectors + std::vector masked_data (dims_array[0], MASK_FLAG); + if(m_includeError) + std::vector masked_error (dims_array[0], MASK_ERROR); + + // Create a progress reporting object + Progress progress(this,0,1,100); + const size_t progStep = static_cast(ceil(static_cast(nHist)/100.0)); + Geometry::IDetector_const_sptr det; + + double *dataArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; + double *errorArr = NULL; + if(m_includeError) + errorArr = new double[dims_array[0]*dims_array[2]*m_numberOfRows]; + + int currY = 0; + size_t rowIndForSlab = 0; // as we're creating slabs of multiple rows, this says which y index we're at in current slab + + // Loop over detectors + for (size_t i = 0; i < nHist; ++i) + { + try + { + // detector exist + //det = inputWS->getDetector(i); + // Check that we aren't writing a monitor + //if (!det->isMonitor()) + //{ + //Geometry::IDetector_const_sptr det = inputWS->getDetector(i); + + // Figure out where this pixel is supposed to be going and set the correct slab start. + + if(i!=0 && (i)%dims_array[1] == 0){ // When this iteration matches end of a row + currY += 1; + } + size_t currX = (i) - (currY*dims_array[1]); + + const MantidVec & thisY = inputWS->readY(i); + // No masking - Set the data and error as is + for(int j=0; jisMasked()) + // { + dataArr[currInd] = thisY.at(j); + if(m_includeError) + errorArr[currInd] = inputWS->readE(i).at(j); + //} + //else + //{ + // dataArr[currInd] = masked_data[j]; + // if(m_includeError) // errorArr[currInd] = masked_error[j]; - //} - } - - // If end of the row has been reached, check for end of slab (or end of row count) and write data/error - if(((i+1)%dims_array[2]) == 0) - { - rowIndForSlab += 1; + //} + } + + // If end of the row has been reached, check for end of slab (or end of row count) and write data/error + if(((i+1)%dims_array[2]) == 0) + { + rowIndForSlab += 1; // Check if we have collected all of the rows (prior to completing a slab) - if so, write the final section // TODO:: - // if a slab has been collected. Put it into the file - if(rowIndForSlab >= m_numberOfRows) - { - slabStart[2] = currY-(rowIndForSlab-1); - - // Write Data - nxFile.openData("data"); - nxFile.putSlab(dataArr, slabStart, slabSize); - nxFile.closeData(); - // Write Error - if(m_includeError) - { - nxFile.openData("error"); - nxFile.putSlab(errorArr, slabStart, slabSize); - nxFile.closeData(); - } - // Reset slab index count - rowIndForSlab = 0; - } - } - } - catch(Exception::NotFoundError&) - { - /*Catch if no detector. Next line tests whether this happened - test placed - outside here because Mac Intel compiler doesn't like 'continue' in a catch - in an openmp block.*/ - } - // If no detector found, skip onto the next spectrum - if ( !det ) continue; - - // Make regular progress reports and check for canceling the algorithm - if ( i % progStep == 0 ) - { - progress.report(); - } - } - - // Create a link object for the data - nxFile.openData("data"); - NXlink dataLink = nxFile.getDataID(); - nxFile.closeData(); - - nxFile.closeGroup(); // Close Data group - - // Put a link to the data in instrument/detector - nxFile.openGroup("instrument","NXinstrument"); - nxFile.openGroup("detector","NXdetector"); - nxFile.makeLink(dataLink); - nxFile.closeGroup(); - nxFile.closeGroup(); - - - nxFile.closeGroup(); // tomo_entry sub-group - nxFile.closeGroup(); // Top level NXentry - - // Clean up memory - delete [] dataArr; - delete [] errorArr; - } - - /** - * Find all RectangularDetector objects in an instrument - * @param instrument instrument to search for detectors in - * @returns vector of all Rectangular Detectors - */ - std::vector SaveNXTomo::getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument) - { - std::vector> components; - instrument->getChildren(components,true); - - std::vector rectDetectors; - - for(auto it = components.begin(); it != components.end(); ++it) - { - // for all components, compare to RectangularDetector - if it is one, add it to detectors list. - const Geometry::IComponent* c = dynamic_cast(&(**it)); - - if(dynamic_cast(c)) - { - rectDetectors.push_back(dynamic_cast(&(**it))); - } - } - - return rectDetectors; - } - - /** - * Populates the dimensions vector with number of files, x and y sizes from a specified rectangular detector - * @param rectDetectors List of rectangular detectors to get axis sizes from - * @param useDetectorIndex index of the detector to select from the list, default = 0 - * @returns vector of both axis dimensions for specified detector + // if a slab has been collected. Put it into the file + if(rowIndForSlab >= m_numberOfRows) + { + slabStart[2] = currY-(rowIndForSlab-1); + + // Write Data + nxFile.openData("data"); + nxFile.putSlab(dataArr, slabStart, slabSize); + nxFile.closeData(); + // Write Error + if(m_includeError) + { + nxFile.openData("error"); + nxFile.putSlab(errorArr, slabStart, slabSize); + nxFile.closeData(); + } + // Reset slab index count + rowIndForSlab = 0; + } + } + } + catch(Exception::NotFoundError&) + { + /*Catch if no detector. Next line tests whether this happened - test placed + outside here because Mac Intel compiler doesn't like 'continue' in a catch + in an openmp block.*/ + } + // If no detector found, skip onto the next spectrum + if ( !det ) continue; + + // Make regular progress reports and check for canceling the algorithm + if ( i % progStep == 0 ) + { + progress.report(); + } + } + + // Create a link object for the data + nxFile.openData("data"); + NXlink dataLink = nxFile.getDataID(); + nxFile.closeData(); + + nxFile.closeGroup(); // Close Data group + + // Put a link to the data in instrument/detector + nxFile.openGroup("instrument","NXinstrument"); + nxFile.openGroup("detector","NXdetector"); + nxFile.makeLink(dataLink); + nxFile.closeGroup(); + nxFile.closeGroup(); + + + nxFile.closeGroup(); // tomo_entry sub-group + nxFile.closeGroup(); // Top level NXentry + + // Clean up memory + delete [] dataArr; + delete [] errorArr; + } + + /** + * Find all RectangularDetector objects in an instrument + * @param instrument instrument to search for detectors in + * @returns vector of all Rectangular Detectors + */ + std::vector SaveNXTomo::getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument) + { + std::vector> components; + instrument->getChildren(components,true); + + std::vector rectDetectors; + + for(auto it = components.begin(); it != components.end(); ++it) + { + // for all components, compare to RectangularDetector - if it is one, add it to detectors list. + const Geometry::IComponent* c = dynamic_cast(&(**it)); + + if(dynamic_cast(c)) + { + RectangularDetector rd = *(dynamic_cast(&(**it))); + rectDetectors.push_back(rd); + } + } + + return rectDetectors; + } + + /** + * Populates the dimensions vector with number of files, x and y sizes from a specified rectangular detector + * @param rectDetectors List of rectangular detectors to get axis sizes from + * @param useDetectorIndex index of the detector to select from the list, default = 0 + * @returns vector of both axis dimensions for specified detector * - * @throw runtime_error Thrown if there are no rectangular detectors - */ - std::vector SaveNXTomo::getDimensionsFromDetector(const std::vector &rectDetectors, size_t useDetectorIndex) - { - // Add number of pixels in X and Y from instrument definition - // Throws if no rectangular detector is present. + * @throw runtime_error Thrown if there are no rectangular detectors + */ + std::vector SaveNXTomo::getDimensionsFromDetector(const std::vector &rectDetectors, size_t useDetectorIndex) + { + // Add number of pixels in X and Y from instrument definition + // Throws if no rectangular detector is present. std::vector dims; - if(rectDetectors.size() != 0) - { - // Assume the first rect detector is the desired one. - dims.push_back(rectDetectors[useDetectorIndex]->xpixels()); - dims.push_back(rectDetectors[useDetectorIndex]->ypixels()); - } - else - { - // Incorrect workspace : requires the x/y pixel count from the instrument definition - g_log.error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); - throw std::runtime_error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); - } + if(rectDetectors.size() != 0) + { + // Assume the first rect detector is the desired one. + dims.push_back(rectDetectors[useDetectorIndex].xpixels()); + dims.push_back(rectDetectors[useDetectorIndex].ypixels()); + } + else + { + // Incorrect workspace : requires the x/y pixel count from the instrument definition + g_log.error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); + throw std::runtime_error("Unable to retrieve x and y pixel count from an instrument definition associated with this workspace."); + } return dims; - } + } - //void someRoutineToAddDataToExisting() - //{ - // //TODO: - //} + //void someRoutineToAddDataToExisting() + //{ + // //TODO: + //} - } // namespace DataHandling + } // namespace DataHandling } // namespace Mantid From 1225561e7bed336575ad17244263183d86c909f6 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Mon, 20 Oct 2014 15:57:05 +0100 Subject: [PATCH 136/284] update recent files list from LoadDialog's accept, re #10335 --- .../MantidPlot/src/ApplicationWindow.cpp | 2 +- .../Mantid/MantidPlot/src/Mantid/MantidUI.cpp | 32 +++++++++++++++++++ Code/Mantid/MantidPlot/src/Mantid/MantidUI.h | 4 +++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp index ad8a24640adb..6635bae88c2b 100644 --- a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp +++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp @@ -4473,7 +4473,7 @@ void ApplicationWindow::openRecentFile(int index) QFile f(fn); if (!f.exists()){ QMessageBox::critical(this, tr("MantidPlot - File Open Error"),//Mantid - tr("The file: %1

          does not exist anymore!" + tr("The file: %1

          is not there anymore!" "

          It will be removed from the list of recent files.").arg(fn)); recentFiles.remove(fn); diff --git a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp index d1dec3bfc58f..1df23c94c340 100644 --- a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp +++ b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp @@ -1354,6 +1354,14 @@ void MantidUI::showAlgorithmDialog(const QString & algName, int version) Mantid::API::IAlgorithm_sptr alg = this->createAlgorithm(algName, version); if( !alg ) return; MantidQt::API::AlgorithmDialog* dlg = createAlgorithmDialog(alg); + + if (algName == "Load") + { + // when loading files, we'll need to update the list of recent files + // hook up MantidUI::fileDialogAccept() to the LoadDialog dialog accepted() signal + connect(dlg, SIGNAL(accepted()), this, SLOT(loadFileDialogAccept())); + } + dlg->show(); dlg->raise(); dlg->activateWindow(); @@ -1380,6 +1388,14 @@ void MantidUI::showAlgorithmDialog(QString algName, QHash param alg->setPropertyValue(it.key().toStdString(),it.value().toStdString()); } MantidQt::API::AlgorithmDialog* dlg = createAlgorithmDialog(alg); + + if (algName == "Load") + { + // when loading files, we'll need to update the list of recent files + // hook up MantidUI::fileDialogAccept() to the LoadDialog dialog accepted() signal + connect(dlg, SIGNAL(accepted()), this, SLOT(loadFileDialogAccept())); + } + dlg->show(); dlg->raise(); dlg->activateWindow(); @@ -1748,6 +1764,22 @@ bool MantidUI::executeAlgorithmAsync(Mantid::API::IAlgorithm_sptr alg, const boo } } +/** +* Slot to update the recent files list (from main appWindow) when accepting LoadDialog dialogs +* @param dlg :: alg. dialog (in practice of subclass LoadDialog) that has been ok-clicked/accepted +*/ +void MantidUI::loadFileDialogAccept() +{ + QObject* sender = QObject::sender(); + MantidQt::API::AlgorithmDialog* dlg = reinterpret_cast(sender); + if (!dlg) + return; // should never happen + + QString fn = MantidQt::API::AlgorithmInputHistory::Instance().previousInput("Load", "Filename"); + appWindow()->updateRecentFilesList(fn); + // recent files list updated. After this point, the Qt signal handler will go to LoadDialog::accept() +} + void MantidUI::handleLoadDAEFinishedNotification(const Poco::AutoPtr& pNf) { std::string wsNAme = pNf->algorithm()->getProperty("OutputWorkspace"); diff --git a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.h b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.h index 5f7f9194029f..7b55d0b50767 100644 --- a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.h +++ b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.h @@ -440,6 +440,10 @@ class MantidUI:public QObject void memoryImage2(); #endif +private slots: + + // slot for file open dialogs created from the main app menu, or the workspaces dock window + void loadFileDialogAccept(); private: From c32f2d711aa7d645c08a0b3a04957bfdbc82b0be Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Mon, 20 Oct 2014 16:15:38 +0100 Subject: [PATCH 137/284] small doxygen doc fix, re #10335 --- Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp index 1df23c94c340..1dbd431e8603 100644 --- a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp +++ b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp @@ -1766,7 +1766,6 @@ bool MantidUI::executeAlgorithmAsync(Mantid::API::IAlgorithm_sptr alg, const boo /** * Slot to update the recent files list (from main appWindow) when accepting LoadDialog dialogs -* @param dlg :: alg. dialog (in practice of subclass LoadDialog) that has been ok-clicked/accepted */ void MantidUI::loadFileDialogAccept() { From 935e8b52ba5f3adddfda818868926107d7284038 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Mon, 20 Oct 2014 16:19:47 +0100 Subject: [PATCH 138/284] Refs #10372 Ask user before discarding changes --- .../MantidQtCustomInterfaces/QtReflMainView.h | 1 + .../MantidQtCustomInterfaces/ReflMainView.h | 1 + .../ReflMainViewPresenter.h | 5 ++++ .../CustomInterfaces/src/QtReflMainView.cpp | 15 ++++++++++- .../src/ReflMainViewPresenter.cpp | 25 ++++++++++++++++++- 5 files changed, 45 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index 2dcee3bf647c..9535bfe96f4f 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -89,6 +89,7 @@ namespace MantidQt void actionDeleteRow(); void actionProcess(); void actionGroupRows(); + void tableUpdated(const QModelIndex& topLeft, const QModelIndex& bottomRight); }; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index 7507cf17e664..54a1783042a1 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -71,6 +71,7 @@ namespace MantidQt static const int GroupRowsFlag = 6; static const int OpenTableFlag = 7; static const int NewTableFlag = 8; + static const int TableUpdatedFlag = 9; }; } } diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index e0f2c5b30283..cd0b3e5fd6ce 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -41,9 +41,14 @@ namespace MantidQt virtual ~ReflMainViewPresenter(); virtual void notify(int flag); protected: + //the model the table is currently representing Mantid::API::ITableWorkspace_sptr m_model; + //the name of the workspace/table/model in the ADS, blank if unsaved std::string m_wsName; + //the view we're managing ReflMainView* m_view; + //stores whether or not the table has changed since it was last saved + bool m_tableDirty; //process selected rows virtual void process(); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 9d16ea5a4f21..d7abaf56dd84 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -76,7 +76,10 @@ namespace MantidQt */ void QtReflMainView::showTable(ITableWorkspace_sptr model) { - ui.viewTable->setModel(new QReflTableModel(model)); + QAbstractItemModel* qModel = new QReflTableModel(model); + //So we can notify the presenter when the user updates the table + connect(qModel, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(tableUpdated(const QModelIndex&, const QModelIndex&))); + ui.viewTable->setModel(qModel); ui.viewTable->resizeColumnsToContents(); } @@ -136,6 +139,16 @@ namespace MantidQt m_presenter->notify(NewTableFlag); } + /** + This slot notifies the presenter that the table has been updated/changed by the user + */ + void QtReflMainView::tableUpdated(const QModelIndex& topLeft, const QModelIndex& bottomRight) + { + Q_UNUSED(topLeft); + Q_UNUSED(bottomRight); + m_presenter->notify(TableUpdatedFlag); + } + /** Show an information dialog @param prompt : The prompt to appear on the dialog diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index c92af568545d..33c2621d2809 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -70,7 +70,7 @@ namespace MantidQt { namespace CustomInterfaces { - ReflMainViewPresenter::ReflMainViewPresenter(ReflMainView* view): m_view(view) + ReflMainViewPresenter::ReflMainViewPresenter(ReflMainView* view): m_view(view), m_tableDirty(false) { //Set up the instrument selectors std::vector instruments; @@ -263,6 +263,7 @@ namespace MantidQt //Update the model m_model->String(rowNo, COL_ANGLE) = Strings::toString(Utils::roundToDP(thetaVal, 3)); + m_tableDirty = true; } //If we need to calculate the resolution, do. @@ -276,6 +277,7 @@ namespace MantidQt //Update the model double dqqVal = calcResAlg->getProperty("Resolution"); m_model->String(rowNo, COL_DQQ) = Strings::toString(dqqVal); + m_tableDirty = true; } //Make sure the view updates @@ -452,6 +454,7 @@ namespace MantidQt if(m_model->String(rowNo, COL_QMAX).empty()) m_model->String(rowNo, COL_QMAX) = Strings::toString(qrange[1]); + m_tableDirty = true; m_view->showTable(m_model); } } @@ -641,6 +644,7 @@ namespace MantidQt insertRow(m_model->rowCount()); else insertRow(*rows.rbegin() + 1); + m_tableDirty = true; } /** @@ -654,6 +658,7 @@ namespace MantidQt m_model->removeRow(rows.at(0)); m_view->showTable(m_model); + m_tableDirty = true; } /** @@ -671,6 +676,7 @@ namespace MantidQt //Make sure the view updates m_view->showTable(m_model); + m_tableDirty = true; } /** @@ -688,6 +694,7 @@ namespace MantidQt case ReflMainView::GroupRowsFlag: groupRows(); break; case ReflMainView::OpenTableFlag: openTable(); break; case ReflMainView::NewTableFlag: newTable(); break; + case ReflMainView::TableUpdatedFlag: m_tableDirty = true; break; case ReflMainView::NoFlags: return; } @@ -700,9 +707,14 @@ namespace MantidQt void ReflMainViewPresenter::saveTable() { if(!m_wsName.empty()) + { AnalysisDataService::Instance().addOrReplace(m_wsName,boost::shared_ptr(m_model->clone())); + m_tableDirty = false; + } else + { saveTableAs(); + } } /** @@ -723,12 +735,18 @@ namespace MantidQt */ void ReflMainViewPresenter::newTable() { + if(m_tableDirty) + if(!m_view->askUserYesNo("Your current table has unsaved changes. Are you sure you want to discard them?","Start New Table?")) + return; + m_model = createWorkspace(); m_wsName.clear(); m_view->showTable(m_model); //Start with one blank row insertRow(0); + + m_tableDirty = false; } /** @@ -736,6 +754,10 @@ namespace MantidQt */ void ReflMainViewPresenter::openTable() { + if(m_tableDirty) + if(!m_view->askUserYesNo("Your current table has unsaved changes. Are you sure you want to discard them?","Open Table?")) + return; + auto& ads = AnalysisDataService::Instance(); const std::string toOpen = m_view->getWorkspaceToOpen(); @@ -762,6 +784,7 @@ namespace MantidQt m_model = newModel; m_wsName = toOpen; m_view->showTable(m_model); + m_tableDirty = false; } } } From e0374a67f46cc05ff73d96c56ef0b9255fa32ef7 Mon Sep 17 00:00:00 2001 From: John Hill Date: Mon, 20 Oct 2014 16:40:44 +0100 Subject: [PATCH 139/284] Refs #10194 attempting to fix build --- .../inc/MantidDataHandling/SaveNXTomo.h | 4 ++-- .../Framework/DataHandling/src/SaveNXTomo.cpp | 20 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h index 2058f5dcdddb..cf83e7184b31 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveNXTomo.h @@ -75,10 +75,10 @@ namespace Mantid /// Save batch of images to the file /// Fetch all rectangular Detector objects defined for an instrument - std::vector getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); + std::vector> getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument); /// Populate dims_array with the dimensions defined in the rectangular detector in the instrument - std::vector getDimensionsFromDetector(const std::vector &rectDetectors, size_t useDetectorIndex = 0); + std::vector getDimensionsFromDetector(const std::vector> &rectDetectors, size_t useDetectorIndex = 0); // Number of rows to size_t m_numberOfRows; diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index a1e25e8002ab..836047e6fb05 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -336,23 +336,21 @@ namespace Mantid * @param instrument instrument to search for detectors in * @returns vector of all Rectangular Detectors */ - std::vector SaveNXTomo::getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument) + std::vector> SaveNXTomo::getRectangularDetectors(const Geometry::Instrument_const_sptr &instrument) { std::vector> components; instrument->getChildren(components,true); - std::vector rectDetectors; + std::vector> rectDetectors; for(auto it = components.begin(); it != components.end(); ++it) { // for all components, compare to RectangularDetector - if it is one, add it to detectors list. - const Geometry::IComponent* c = dynamic_cast(&(**it)); - - if(dynamic_cast(c)) + auto ptr = boost::dynamic_pointer_cast(*it); + if(ptr != NULL) { - RectangularDetector rd = *(dynamic_cast(&(**it))); - rectDetectors.push_back(rd); - } + rectDetectors.push_back(ptr); + } } return rectDetectors; @@ -366,7 +364,7 @@ namespace Mantid * * @throw runtime_error Thrown if there are no rectangular detectors */ - std::vector SaveNXTomo::getDimensionsFromDetector(const std::vector &rectDetectors, size_t useDetectorIndex) + std::vector SaveNXTomo::getDimensionsFromDetector(const std::vector> &rectDetectors, size_t useDetectorIndex) { // Add number of pixels in X and Y from instrument definition // Throws if no rectangular detector is present. @@ -376,8 +374,8 @@ namespace Mantid if(rectDetectors.size() != 0) { // Assume the first rect detector is the desired one. - dims.push_back(rectDetectors[useDetectorIndex].xpixels()); - dims.push_back(rectDetectors[useDetectorIndex].ypixels()); + dims.push_back(rectDetectors[useDetectorIndex]->xpixels()); + dims.push_back(rectDetectors[useDetectorIndex]->ypixels()); } else { From 31ebbbcba8ec10badac792e1a87e6c89465824dd Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 21 Oct 2014 11:14:21 +0100 Subject: [PATCH 140/284] Refs #10372 Add unit tests for prompt before discarding --- .../test/ReflMainViewPresenterTest.h | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index fb598283a8fe..7529bcfbd0a5 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -693,6 +693,117 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_EQUALS(kvp["f"], "1+1=2"); TS_ASSERT_EQUALS(kvp["g"], "'"); } + + void testPromptSaveAfterAddRow() + { + MockView mockView; + EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); + ReflMainViewPresenter presenter(&mockView); + + //User hits "add row" + EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(std::vector())); + presenter.notify(AddRowFlag); + + //The user will decide not to discard their changes + EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(1).WillOnce(Return(false)); + + //Then hits "new table" without having saved + presenter.notify(NewTableFlag); + + //The user saves + EXPECT_CALL(mockView, askUserString(_,_,"Workspace")).Times(1).WillOnce(Return("Workspace")); + presenter.notify(SaveFlag); + + //The user tries to create a new table again, and does not get bothered + EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(0); + presenter.notify(NewTableFlag); + } + + void testPromptSaveAfterDeleteRow() + { + MockView mockView; + EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); + ReflMainViewPresenter presenter(&mockView); + + //User hits "add row" a couple of times + EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(2).WillRepeatedly(Return(std::vector())); + presenter.notify(AddRowFlag); + presenter.notify(AddRowFlag); + + //The user saves + EXPECT_CALL(mockView, askUserString(_,_,"Workspace")).Times(1).WillOnce(Return("Workspace")); + presenter.notify(SaveFlag); + + //...then deletes the 2nd row + std::vector rows; + rows.push_back(1); + EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(rows)); + presenter.notify(DeleteRowFlag); + + //The user will decide not to discard their changes when asked + EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(1).WillOnce(Return(false)); + + //Then hits "new table" without having saved + presenter.notify(NewTableFlag); + + //The user saves + presenter.notify(SaveFlag); + + //The user tries to create a new table again, and does not get bothered + EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(0); + presenter.notify(NewTableFlag); + } + + void testPromptSaveAndDiscard() + { + MockView mockView; + EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); + ReflMainViewPresenter presenter(&mockView); + + //User hits "add row" a couple of times + EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(2).WillRepeatedly(Return(std::vector())); + presenter.notify(AddRowFlag); + presenter.notify(AddRowFlag); + + //Then hits "new table", and decides to discard + EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(1).WillOnce(Return(true)); + presenter.notify(NewTableFlag); + + //These next two times they don't get prompted - they have a new table + presenter.notify(NewTableFlag); + presenter.notify(NewTableFlag); + } + + void testPromptSaveOnOpen() + { + MockView mockView; + EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); + ReflMainViewPresenter presenter(&mockView); + + createPrefilledWorkspace("TestWorkspace"); + + //User hits "add row" + EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(std::vector())); + presenter.notify(AddRowFlag); + + //and tries to open a workspace, but gets prompted and decides not to discard + EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(1).WillOnce(Return(false)); + presenter.notify(OpenTableFlag); + + //the user does it again, but discards + EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(1).WillOnce(Return(true)); + EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); + presenter.notify(OpenTableFlag); + + //the user does it one more time, and is not prompted + EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); + EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(0); + presenter.notify(OpenTableFlag); + } }; #endif /* MANTID_CUSTOMINTERFACES_REFLMAINVIEWPRESENTERTEST_H */ From 3634da56d01c61f3cb9c4d74f5ffaf0b601fff72 Mon Sep 17 00:00:00 2001 From: Raquel Alvarez Banos Date: Tue, 21 Oct 2014 11:34:44 +0100 Subject: [PATCH 141/284] ConvertToMatrixWorkspace not working Re #8261 --- .../MantidPlot/src/ApplicationWindow.cpp | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp index 9bef2715e1ac..8ac0a1563442 100644 --- a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp +++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp @@ -3502,14 +3502,22 @@ void ApplicationWindow::convertTableToWorkspace() void ApplicationWindow::convertTableToMatrixWorkspace() { Table* t = dynamic_cast(activeWindow(TableWindow)); - if (!t) return; - if(auto *mt = dynamic_cast(t)) - { - mt = convertTableToTableWorkspace(t); - QHash params; - params["InputWorkspace"] = QString::fromStdString(mt->getWorkspaceName()); - mantidUI->showAlgorithmDialog(QString("ConvertTableToMatrixWorkspace"),params); - } + if (!t) return; + + // dynamic_cast is successful when converting MantidTable to MatrixWorkspace + auto *mt = dynamic_cast(t); + + if (!mt){ + // if dynamic_cast is unsuccessful, create MantidTable from which to create MatrixWorkspace + mt = convertTableToTableWorkspace(t); + } + + if (mt){ + QHash params; + params["InputWorkspace"] = QString::fromStdString(mt->getWorkspaceName()); + mantidUI->showAlgorithmDialog(QString("ConvertTableToMatrixWorkspace"),params); + } + } /** From fac5e8986a34dd04fdff46104d024bad3b5dcbd5 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 21 Oct 2014 11:40:53 +0100 Subject: [PATCH 142/284] Revert "Revert "Merge remote-tracking branch 'origin/feature/10376_refl_ui_menu_bar'"" This reverts commit 2cb19d94abd8a2f9328411771350e80dde8bbc49. --- .../MantidQtCustomInterfaces/QtReflMainView.h | 5 + .../MantidQtCustomInterfaces/ReflMainView.h | 3 + .../ReflMainViewPresenter.h | 23 ++- .../ReflMainWidget.ui | 187 +++++++----------- .../CustomInterfaces/src/QtReflMainView.cpp | 42 +++- .../src/ReflMainViewPresenter.cpp | 145 +++++++++++++- .../test/ReflMainViewMockObjects.h | 1 + .../test/ReflMainViewPresenterTest.h | 48 ++--- 8 files changed, 281 insertions(+), 173 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index 2dcee3bf647c..f8ede7178af7 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -6,6 +6,7 @@ #include "MantidQtCustomInterfaces/ReflMainView.h" #include "MantidQtCustomInterfaces/IReflPresenter.h" #include +#include #include "ui_ReflMainWidget.h" namespace MantidQt @@ -50,6 +51,9 @@ namespace MantidQt //Connect the model virtual void showTable(Mantid::API::ITableWorkspace_sptr model); + //Set the list of available tables to open + virtual void setTableList(const std::set& tables); + //Dialog/Prompt methods virtual std::string askUserString(const std::string& prompt, const std::string& title, const std::string& defaultValue); virtual bool askUserYesNo(std::string prompt, std::string title); @@ -79,6 +83,7 @@ namespace MantidQt Ui::reflMainWidget ui; //the workspace the user selected to open std::string m_toOpen; + QSignalMapper* m_openMap; private slots: void setModel(QString name); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index 7507cf17e664..949a1c489537 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -42,6 +42,9 @@ namespace MantidQt //Connect the model virtual void showTable(Mantid::API::ITableWorkspace_sptr model) = 0; + //Set the list of available tables to open + virtual void setTableList(const std::set& tables) = 0; + //Dialog/Prompt methods virtual std::string askUserString(const std::string& prompt, const std::string& title, const std::string& defaultValue) = 0; virtual bool askUserYesNo(std::string prompt, std::string title) = 0; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 72bb036b1940..7300f0e1f823 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -1,11 +1,16 @@ #ifndef MANTID_CUSTOMINTERFACES_REFLMAINVIEWPRESENTER_H #define MANTID_CUSTOMINTERFACES_REFLMAINVIEWPRESENTER_H -#include "MantidKernel/System.h" +#include "MantidAPI/AnalysisDataService.h" #include "MantidAPI/ITableWorkspace.h" #include "MantidAPI/MatrixWorkspace.h" +#include "MantidKernel/System.h" #include "MantidQtCustomInterfaces/ReflMainView.h" #include "MantidQtCustomInterfaces/IReflPresenter.h" + +#include +#include + namespace MantidQt { namespace CustomInterfaces @@ -82,6 +87,22 @@ namespace MantidQt virtual void saveTable(); virtual void saveTableAs(); + //List of workspaces the user can open + std::set m_workspaceList; + + //To maintain a list of workspaces the user may open, we observe the ADS + Poco::NObserver m_addObserver; + Poco::NObserver m_remObserver; + Poco::NObserver m_clearObserver; + Poco::NObserver m_renameObserver; + Poco::NObserver m_replaceObserver; + + void handleAddEvent(Mantid::API::WorkspaceAddNotification_ptr pNf); + void handleRemEvent(Mantid::API::WorkspacePostDeleteNotification_ptr pNf); + void handleClearEvent(Mantid::API::ClearADSNotification_ptr pNf); + void handleRenameEvent(Mantid::API::WorkspaceRenameNotification_ptr pNf); + void handleReplaceEvent(Mantid::API::WorkspaceAfterReplaceNotification_ptr pNf); + public: static const int COL_RUNS = 0; static const int COL_ANGLE = 1; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index beb3efec0c0b..84d7ffef27c3 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -6,8 +6,8 @@ 0 0 - 875 - 425 + 825 + 275 @@ -234,32 +234,23 @@ - - - Start a new table - + - New Table + AddRow - - - Save the current table as a Table Workspace - + - Save Table + DeleteRow - - - Save the current table as a Table Workspace - + - Save Table As + GroupRows @@ -276,37 +267,6 @@ - - - - Table: - - - - - - - - 0 - 0 - - - - - 150 - 0 - - - - Select the Table Workspace to display - - - - TableWorkspace - - - - @@ -351,33 +311,6 @@ 1 - - - - Add a row beneath the selected row(s) - - - Add Row - - - - - - - Delete selected row(s) from the table - - - Delete Row - - - - - - - Group Rows - - - @@ -433,98 +366,114 @@ + + + + 0 + 0 + 825 + 23 + + + + + Table + + + + Open Table + + + + :/multiload.png:/multiload.png + + + + + + + + + + + + :/new.png:/new.png + New Table + + + :/filesave.png:/filesave.png + Save Table + + + :/filesaveas.png:/filesaveas.png + Save Table As + + + :/insert_row.png:/insert_row.png + Add Row + + + :/delete_row.png:/delete_row.png + Delete Row + + + :/drag_curves.png:/drag_curves.png + Group Rows + + + :/play.png:/play.png + Process - - - MantidQt::MantidWidgets::WorkspaceSelector - QComboBox -

          MantidQtMantidWidgets/WorkspaceSelector.h
          - - comboSearchInstrument tableRuns viewTable buttonProcess - + + + - - buttonNew - clicked() - actionNewTable - trigger() - - - buttonAddRow - clicked() - actionAddRow - trigger() - - - buttonDeleteRow - clicked() - actionDeleteRow - trigger() - - - buttonGroupRows - clicked() - actionGroupRows - trigger() - buttonProcess clicked() actionProcess trigger() - - buttonSave - clicked() - actionSaveTable - trigger() - - - buttonSaveAs - clicked() - actionSaveTableAs - trigger() - diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 9d16ea5a4f21..47ecd67b4192 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -17,7 +17,7 @@ namespace MantidQt //---------------------------------------------------------------------------------------------- /** Constructor */ - QtReflMainView::QtReflMainView(QWidget *parent) : UserSubWindow(parent) + QtReflMainView::QtReflMainView(QWidget *parent) : UserSubWindow(parent), m_openMap(new QSignalMapper(this)) { } @@ -34,7 +34,10 @@ namespace MantidQt void QtReflMainView::initLayout() { ui.setupUi(this); - ui.workspaceSelector->refresh(); + + ui.buttonAddRow->setDefaultAction(ui.actionAddRow); + ui.buttonDeleteRow->setDefaultAction(ui.actionDeleteRow); + ui.buttonGroupRows->setDefaultAction(ui.actionGroupRows); //Expand the process runs column at the expense of the search column ui.splitterTables->setStretchFactor(0, 0); @@ -47,14 +50,13 @@ namespace MantidQt //Allow rows to be reordered ui.viewTable->verticalHeader()->setMovable(true); - connect(ui.workspaceSelector, SIGNAL(activated(QString)), this, SLOT(setModel(QString))); - connect(ui.actionSaveTable, SIGNAL(triggered()), this, SLOT(actionSave())); - connect(ui.actionSaveTableAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); - connect(ui.actionNewTable, SIGNAL(triggered()), this, SLOT(actionNewTable())); - connect(ui.actionAddRow, SIGNAL(triggered()), this, SLOT(actionAddRow())); - connect(ui.actionDeleteRow, SIGNAL(triggered()), this, SLOT(actionDeleteRow())); - connect(ui.actionProcess, SIGNAL(triggered()), this, SLOT(actionProcess())); - connect(ui.actionGroupRows, SIGNAL(triggered()), this, SLOT(actionGroupRows())); + connect(ui.actionSaveTable, SIGNAL(triggered()), this, SLOT(actionSave())); + connect(ui.actionSaveTableAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); + connect(ui.actionNewTable, SIGNAL(triggered()), this, SLOT(actionNewTable())); + connect(ui.actionAddRow, SIGNAL(triggered()), this, SLOT(actionAddRow())); + connect(ui.actionDeleteRow, SIGNAL(triggered()), this, SLOT(actionDeleteRow())); + connect(ui.actionProcess, SIGNAL(triggered()), this, SLOT(actionProcess())); + connect(ui.actionGroupRows, SIGNAL(triggered()), this, SLOT(actionGroupRows())); //Finally, create a presenter to do the thinking for us m_presenter = boost::shared_ptr(new ReflMainViewPresenter(this)); @@ -80,6 +82,26 @@ namespace MantidQt ui.viewTable->resizeColumnsToContents(); } + /** + Set the list of tables the user is offered to open + @param tables : the names of the tables in the ADS + */ + void QtReflMainView::setTableList(const std::set& tables) + { + ui.menuOpenTable->clear(); + + for(auto it = tables.begin(); it != tables.end(); ++it) + { + QAction* openTable = ui.menuOpenTable->addAction(QString::fromStdString(*it)); + + //Map this action to the table name + m_openMap->setMapping(openTable, QString::fromStdString(*it)); + + connect(openTable, SIGNAL(triggered()), m_openMap, SLOT(map())); + connect(m_openMap, SIGNAL(mapped(QString)), this, SLOT(setModel(QString))); + } + } + /** This slot notifies the presenter that the "save" button has been pressed */ diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index fa0b58a7fc27..2c7692eeea5b 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -17,8 +17,11 @@ using namespace Mantid::Kernel; namespace { - void checkValidModel(ITableWorkspace_sptr model) + void validateModel(ITableWorkspace_sptr model) { + if(!model) + throw std::runtime_error("Null pointer"); + if(model->columnCount() != 9) throw std::runtime_error("Selected table has the incorrect number of columns (9) to be used as a reflectometry table."); @@ -40,6 +43,19 @@ namespace } } + bool isValidModel(Workspace_sptr model) + { + try + { + validateModel(boost::dynamic_pointer_cast(model)); + } + catch(...) + { + return false; + } + return true; + } + ITableWorkspace_sptr createWorkspace() { ITableWorkspace_sptr ws = WorkspaceFactory::Instance().createTable(); @@ -71,7 +87,13 @@ namespace MantidQt { namespace CustomInterfaces { - ReflMainViewPresenter::ReflMainViewPresenter(ReflMainView* view): m_view(view) + ReflMainViewPresenter::ReflMainViewPresenter(ReflMainView* view): + m_view(view), + m_addObserver(*this, &ReflMainViewPresenter::handleAddEvent), + m_remObserver(*this, &ReflMainViewPresenter::handleRemEvent), + m_clearObserver(*this, &ReflMainViewPresenter::handleClearEvent), + m_renameObserver(*this, &ReflMainViewPresenter::handleRenameEvent), + m_replaceObserver(*this, &ReflMainViewPresenter::handleReplaceEvent) { //Set up the instrument selectors std::vector instruments; @@ -87,11 +109,41 @@ namespace MantidQt else m_view->setInstrumentList(instruments, "INTER"); + //Populate an initial list of valid tables to open, and subscribe to the ADS to keep it up to date + Mantid::API::AnalysisDataServiceImpl& ads = Mantid::API::AnalysisDataService::Instance(); + + std::set items; + items = ads.getObjectNames(); + for(auto it = items.begin(); it != items.end(); ++it ) + { + const std::string name = *it; + Workspace_sptr ws = ads.retrieve(name); + + if(isValidModel(ws)) + m_workspaceList.insert(name); + } + + ads.notificationCenter.addObserver(m_addObserver); + ads.notificationCenter.addObserver(m_remObserver); + ads.notificationCenter.addObserver(m_renameObserver); + ads.notificationCenter.addObserver(m_clearObserver); + ads.notificationCenter.addObserver(m_replaceObserver); + + if(m_view) + m_view->setTableList(m_workspaceList); + + //Start with a blank table newTable(); } ReflMainViewPresenter::~ReflMainViewPresenter() { + Mantid::API::AnalysisDataServiceImpl& ads = Mantid::API::AnalysisDataService::Instance(); + ads.notificationCenter.removeObserver(m_addObserver); + ads.notificationCenter.removeObserver(m_remObserver); + ads.notificationCenter.removeObserver(m_clearObserver); + ads.notificationCenter.removeObserver(m_renameObserver); + ads.notificationCenter.removeObserver(m_replaceObserver); } /** @@ -784,20 +836,95 @@ namespace MantidQt return; } - ITableWorkspace_sptr newModel = AnalysisDataService::Instance().retrieveWS(toOpen); + ITableWorkspace_sptr origTable = AnalysisDataService::Instance().retrieveWS(toOpen); + + //We create a clone of the table for live editing. The original is not updated unless we explicitly save. + ITableWorkspace_sptr newModel = boost::shared_ptr(origTable->clone()); try { - checkValidModel(newModel); + validateModel(newModel); + m_model = newModel; + m_wsName = toOpen; + m_view->showTable(m_model); } catch(std::runtime_error& e) { - m_view->giveUserCritical("Invalid workspace to open:\n" + std::string(e.what()), "Error"); - return; + m_view->giveUserCritical("Could not open workspace: " + std::string(e.what()), "Error"); } + } - m_model = newModel; - m_wsName = toOpen; - m_view->showTable(m_model); + /** + Handle ADS add events + */ + void ReflMainViewPresenter::handleAddEvent(Mantid::API::WorkspaceAddNotification_ptr pNf) + { + const std::string name = pNf->objectName(); + + if(Mantid::API::AnalysisDataService::Instance().isHiddenDataServiceObject(name)) + return; + + if(!isValidModel(pNf->object())) + return; + + m_workspaceList.insert(name); + if(m_view) + m_view->setTableList(m_workspaceList); + } + + /** + Handle ADS remove events + */ + void ReflMainViewPresenter::handleRemEvent(Mantid::API::WorkspacePostDeleteNotification_ptr pNf) + { + const std::string name = pNf->objectName(); + m_workspaceList.erase(name); + if(m_view) + m_view->setTableList(m_workspaceList); + } + + /** + Handle ADS clear events + */ + void ReflMainViewPresenter::handleClearEvent(Mantid::API::ClearADSNotification_ptr) + { + m_workspaceList.clear(); + if(m_view) + m_view->setTableList(m_workspaceList); + } + + /** + Handle ADS rename events + */ + void ReflMainViewPresenter::handleRenameEvent(Mantid::API::WorkspaceRenameNotification_ptr pNf) + { + //If we have this workspace, rename it + const std::string name = pNf->objectName(); + const std::string newName = pNf->newObjectName(); + + if(m_workspaceList.find(name) == m_workspaceList.end()) + return; + + m_workspaceList.erase(name); + m_workspaceList.insert(newName); + if(m_view) + m_view->setTableList(m_workspaceList); + } + + /** + Handle ADS replace events + */ + void ReflMainViewPresenter::handleReplaceEvent(Mantid::API::WorkspaceAfterReplaceNotification_ptr pNf) + { + const std::string name = pNf->objectName(); + //Erase it + m_workspaceList.erase(name); + + //If it's a table workspace, bring it back + if(isValidModel(pNf->object())) + m_workspaceList.insert(name); + + if(m_view) + m_view->setTableList(m_workspaceList); } } } diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h index 616829c8e952..49bddd05bf43 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h @@ -41,6 +41,7 @@ class MockView : public ReflMainView MOCK_METHOD2(giveUserWarning, void(std::string, std::string)); MOCK_METHOD2(setProgressRange, void(int, int)); MOCK_METHOD1(setProgress, void(int)); + MOCK_METHOD1(setTableList, void(const std::set& tableList)); MOCK_METHOD2(setInstrumentList, void(const std::vector& instruments, const std::string& defaultInstrument)); MOCK_METHOD1(setInstrument, void(const std::string&)); MOCK_CONST_METHOD0(getSelectedRowIndexes, std::vector()); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index 24a0c8dac295..fb598283a8fe 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -97,6 +97,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); createPrefilledWorkspace("TestWorkspace"); @@ -104,7 +105,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite presenter.notify(OpenTableFlag); presenter.notify(SaveFlag); - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); AnalysisDataService::Instance().remove("TestWorkspace"); } @@ -112,6 +112,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); createPrefilledWorkspace("TestWorkspace"); @@ -129,9 +130,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, askUserString(_,_,"Workspace")).Times(1).WillOnce(Return("Workspace")); presenter.notify(SaveAsFlag); - //Check calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - //Check that the workspace was saved TS_ASSERT(AnalysisDataService::Instance().doesExist("Workspace")); @@ -144,6 +142,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); createPrefilledWorkspace("TestWorkspace"); @@ -165,9 +164,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, askUserString(_,_,_)).Times(0); presenter.notify(SaveFlag); - //Check calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - //Check that the workspace was saved TS_ASSERT(AnalysisDataService::Instance().doesExist("Workspace")); @@ -180,6 +176,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); createPrefilledWorkspace("TestWorkspace"); @@ -206,9 +203,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //The user hits "save" presenter.notify(SaveFlag); - //Check the calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - //Check that the table has been modified correctly ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); TS_ASSERT_EQUALS(ws->rowCount(), 6); @@ -228,6 +222,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); createPrefilledWorkspace("TestWorkspace"); @@ -259,9 +254,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //The user hits "save" presenter.notify(SaveFlag); - //Check the calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - //Check that the table has been modified correctly ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); TS_ASSERT_EQUALS(ws->rowCount(), 6); @@ -283,6 +275,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); createPrefilledWorkspace("TestWorkspace"); @@ -316,9 +309,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //The user hits "save" presenter.notify(SaveFlag); - //Check the calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - //Check that the table was modified correctly ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); TS_ASSERT_EQUALS(ws->rowCount(), 5); @@ -340,6 +330,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); createPrefilledWorkspace("TestWorkspace"); @@ -362,9 +353,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //The user hits save presenter.notify(SaveFlag); - //Check the calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - //Check that the table was not modified ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); TS_ASSERT_EQUALS(ws->rowCount(), 4); @@ -379,6 +367,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); createPrefilledWorkspace("TestWorkspace"); @@ -404,9 +393,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //The user hits "save" presenter.notify(SaveFlag); - //Check the calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); TS_ASSERT_EQUALS(ws->rowCount(), 3); TS_ASSERT_EQUALS(ws->String(1, RunCol), "13469"); @@ -421,6 +407,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); createPrefilledWorkspace("TestWorkspace"); @@ -448,9 +435,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //The user hits save presenter.notify(SaveFlag); - //Check the calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - //Check the rows were deleted as expected ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); TS_ASSERT_EQUALS(ws->rowCount(), 1); @@ -468,6 +452,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); createPrefilledWorkspace("TestWorkspace"); @@ -488,9 +473,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, setProgress(_)).Times(4); presenter.notify(ProcessFlag); - //Check the calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - //Check output workspaces were created as expected TS_ASSERT(AnalysisDataService::Instance().doesExist("IvsQ_13460")); TS_ASSERT(AnalysisDataService::Instance().doesExist("IvsLam_13460")); @@ -537,6 +519,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); @@ -555,9 +538,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, setProgress(_)).Times(4); presenter.notify(ProcessFlag); - //Check the calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - //Check output workspaces were created as expected TS_ASSERT(AnalysisDataService::Instance().doesExist("IvsQ_dataA")); TS_ASSERT(AnalysisDataService::Instance().doesExist("IvsQ_13462")); @@ -591,6 +571,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); @@ -612,9 +593,6 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //The user hits the "save" button presenter.notify(SaveFlag); - //Check the calls were made as expected - TS_ASSERT(Mock::VerifyAndClearExpectations(&mockView)); - //Check the table was updated as expected ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); TS_ASSERT_EQUALS(ws->String(0, ThetaCol), "0.7"); @@ -656,6 +634,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); //We should receive an error @@ -671,6 +650,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); //Because we to open twice, get an error twice From b16c6e6bd7f6724901776b34aa2e3f9d39dde666 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 21 Oct 2014 11:57:29 +0100 Subject: [PATCH 143/284] Refs #10376 Disable Refl UI native menu bar on OSX --- .../inc/MantidQtCustomInterfaces/ReflMainWidget.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index 84d7ffef27c3..961e5271ff19 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -375,6 +375,9 @@ 23 + + false + Table From 1d4c7ede38a705337df11d208c4019f4fae85d20 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 21 Oct 2014 12:08:49 +0100 Subject: [PATCH 144/284] Swapped IndirectResolution to use IIR Refs #10399 --- .../WorkflowAlgorithms/IndirectResolution.py | 30 +++++++------------ 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/IndirectResolution.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/IndirectResolution.py index 7836213dd39e..d521ad91d69e 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/IndirectResolution.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/WorkflowAlgorithms/IndirectResolution.py @@ -52,26 +52,16 @@ def PyExec(self): StartTime('IndirectResolution') self._setup() - # TODO: Replace with InelasticIndirectReduction algorithm - reducer = inelastic_indirect_reducer.IndirectReducer() - reducer.set_instrument_name(self._instrument) - reducer.set_detector_range(int(self._detector_range[0]) - 1, int(self._detector_range[1]) - 1) - for in_file in self._input_files: - reducer.append_data_file(in_file) - parfile = config['instrumentDefinition.directory'] - parfile += self._instrument + "_" + self._analyser + "_" + self._reflection + "_Parameters.xml" - reducer.set_parameter_file(parfile) - reducer.set_grouping_policy('All') - reducer.set_sum_files(True) - - try: - reducer.reduce() - except Exception, ex: - logger.error('IndirectResolution failed with error: ' + str(ex)) - EndTime('IndirectResolution') - return - - icon_ws = reducer.get_result_workspaces()[0] + InelasticIndirectReduction(Instrument=self._instrument, + Analyser=self._analyser, + Reflection=self._reflection, + Grouping='All', + SumFiles=True, + InputFiles=self._input_files, + DetectorRange=self._detector_range, + OutputWorkspaceGroup='__icon_ws_group') + + icon_ws = mtd['__icon_ws_group'].getItem(0).getName() if self._out_ws == "": self._out_ws = getWSprefix(icon_ws) + 'res' From 1ecf8470095ab84e2080f40b87a925a5302dcf69 Mon Sep 17 00:00:00 2001 From: Raquel Alvarez Banos Date: Tue, 21 Oct 2014 16:03:13 +0100 Subject: [PATCH 145/284] vector too long error fixed Re #3878 --- .../DataHandling/src/LoadEventNexus.cpp | 83 +++++++++++-------- 1 file changed, 48 insertions(+), 35 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp index d50256c070fd..9bb12b2449b7 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp @@ -1114,15 +1114,14 @@ namespace Mantid setPropertyGroup("FilterMonByTimeStart", grp4); setPropertyGroup("FilterMonByTimeStop", grp4); - declareProperty("SpectrumMin",(int32_t)EMPTY_INT(), mustBePositive, + declareProperty("SpectrumMin",(int32_t)EMPTY_INT(), mustBePositive, "The number of the first spectrum to read."); declareProperty("SpectrumMax",(int32_t)EMPTY_INT(), mustBePositive, "The number of the last spectrum to read."); declareProperty(new ArrayProperty("SpectrumList"), "A comma-separated list of individual spectra to read."); - - declareProperty( + declareProperty( new PropertyWithValue("MetaDataOnly", false, Direction::Input), "If true, only the meta data and sample logs will be loaded."); @@ -2352,44 +2351,44 @@ namespace Mantid } else { - g_log.debug() << "Loading only detector spectra from " << filename << "\n"; - - // If optional spectra are provided, if so, m_specList is initialized. spec is used if necessary - createSpectraList(*std::min_element(spec.begin(),spec.end()), *std::max_element(spec.begin(),spec.end())); + g_log.debug() << "Loading only detector spectra from " << filename << "\n"; + + // If optional spectra are provided, if so, m_specList is initialized. spec is used if necessary + createSpectraList(*std::min_element(spec.begin(),spec.end()), *std::max_element(spec.begin(),spec.end())); + + if ( !m_specList.empty() ) { + int i=0; + std::vector spec_temp, udet_temp; + for(auto it=spec.begin(); it!=spec.end(); it++) + { + if ( find(m_specList.begin(),m_specList.end(),*it)!= m_specList.end() ) // spec element *it is not in spec_list + { + spec_temp.push_back( *it ); + udet_temp.push_back( udet.at(i) ); + } + i++; + } + spec=spec_temp; + udet=udet_temp; + } - if ( !m_specList.empty() ) { - int i=0; - std::vector spec_temp, udet_temp; - for(auto it=spec.begin(); it!=spec.end(); it++) - { - if ( find(m_specList.begin(),m_specList.end(),*it)!= m_specList.end() ) // spec element *it is not in spec_list + SpectrumDetectorMapping mapping(spec,udet, monitors); + WS->resizeTo(mapping.getMapping().size()); + // Make sure spectrum numbers are correct + auto uniqueSpectra = mapping.getSpectrumNumbers(); + auto itend = uniqueSpectra.end(); + size_t counter = 0; + for(auto it = uniqueSpectra.begin(); it != itend; ++it) { - spec_temp.push_back( *it ); - udet_temp.push_back( udet.at(i) ); + WS->getSpectrum(counter)->setSpectrumNo(*it); + ++counter; } - i++; + // Fill detectors based on this mapping + WS->updateSpectraUsing(mapping); } - spec=spec_temp; - udet=udet_temp; + return true; } - SpectrumDetectorMapping mapping(spec,udet, monitors); - WS->resizeTo(mapping.getMapping().size()); - // Make sure spectrum numbers are correct - auto uniqueSpectra = mapping.getSpectrumNumbers(); - auto itend = uniqueSpectra.end(); - size_t counter = 0; - for(auto it = uniqueSpectra.begin(); it != itend; ++it) - { - WS->getSpectrum(counter)->setSpectrumNo(*it); - ++counter; - } - // Fill detectors based on this mapping - WS->updateSpectraUsing(mapping); - } - return true; - } - /** * Set the filters on TOF. * @param monitors :: If true check the monitor properties else use the standard ones @@ -2828,6 +2827,20 @@ void LoadEventNexus::createSpectraList(int32_t min, int32_t max){ } + if ( !m_specList.empty() ) { + + // Check that spectra supplied by user do not correspond to monitors + auto nmonitors = WS->getInstrument()->getMonitors().size(); + + for( size_t i = 0; i < nmonitors; ++i ) + { + if ( std::find(m_specList.begin(),m_specList.end(),i+1)!= m_specList.end() ) + { + throw std::invalid_argument("Inconsistent range property: some of the selected spectra correspond to monitors."); + } + } + + } } From 24cca11a93f054ce766ace34be1c16edf4574872 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 21 Oct 2014 16:03:17 +0100 Subject: [PATCH 146/284] Added file finder feddback to Calib and Diag run buttons Refs #10306 --- .../IndirectCalibration.h | 3 ++ .../IndirectDiagnostics.h | 3 ++ .../src/IndirectCalibration.cpp | 41 +++++++++++++++++ .../src/IndirectDiagnostics.cpp | 45 ++++++++++++++++++- 4 files changed, 90 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectCalibration.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectCalibration.h index cfbc8c83e732..3d035e9c605a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectCalibration.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectCalibration.h @@ -59,6 +59,9 @@ namespace CustomInterfaces void intensityScaleMultiplierCheck(bool state); /// Toggle the intensity scale multiplier box void calibValidateIntensity(const QString & text); /// Check that the scale multiplier is valid void setDefaultInstDetails(); + void pbRunEditing(); //< Called when a user starts to type / edit the runs to load. + void pbRunFinding(); //< Called when the FileFinder starts finding the files. + void pbRunFinished(); //< Called when the FileFinder has finished finding the files. private: void createRESfile(const QString& file); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiagnostics.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiagnostics.h index 53ad5f130fd9..decaea8f79e0 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiagnostics.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDiagnostics.h @@ -74,6 +74,9 @@ namespace CustomInterfaces void setDefaultInstDetails(); void updatePreviewPlot(); void sliceAlgDone(bool error); + void pbRunEditing(); //< Called when a user starts to type / edit the runs to load. + void pbRunFinding(); //< Called when the FileFinder starts finding the files. + void pbRunFinished(); //< Called when the FileFinder has finished finding the files. private: QString m_lastDiagFilename; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectCalibration.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectCalibration.cpp index e0cac72a4e7f..9198f5886121 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectCalibration.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectCalibration.cpp @@ -146,6 +146,13 @@ namespace CustomInterfaces // Validate the value entered in scale factor option whenever it changes connect(m_uiForm.cal_leIntensityScaleMultiplier, SIGNAL(textChanged(const QString &)), this, SLOT(calibValidateIntensity(const QString &))); + // Shows message on run buton when user is inputting a run number + connect(m_uiForm.cal_leRunNo, SIGNAL(fileTextChanged(const QString &)), this, SLOT(pbRunEditing())); + // Shows message on run button when Mantid is finding the file for a given run number + connect(m_uiForm.cal_leRunNo, SIGNAL(findingFiles()), this, SLOT(pbRunFinding())); + // Reverts run button back to normal when file finding has finished + connect(m_uiForm.cal_leRunNo, SIGNAL(fileFindingFinished()), this, SLOT(pbRunFinished())); + // Nudge resCheck to ensure res range selectors are only shown when Create RES file is checked resCheck(m_uiForm.cal_ckRES->isChecked()); } @@ -607,5 +614,39 @@ namespace CustomInterfaces } } + /** + * Called when a user starts to type / edit the runs to load. + */ + void IndirectCalibration::pbRunEditing() + { + emit updateRunButton(false, "Editing...", "Run numbers are curently being edited."); + } + + /** + * Called when the FileFinder starts finding the files. + */ + void IndirectCalibration::pbRunFinding() + { + emit updateRunButton(false, "Finding files...", "Searchig for data files for the run numbers entered..."); + m_uiForm.cal_leRunNo->setEnabled(false); + } + + /** + * Called when the FileFinder has finished finding the files. + */ + void IndirectCalibration::pbRunFinished() + { + if(!m_uiForm.cal_leRunNo->isValid()) + { + emit updateRunButton(false, "Invalid Run(s)", "Cannot find data files for some of the run numbers enetered."); + } + else + { + emit updateRunButton(); + } + + m_uiForm.cal_leRunNo->setEnabled(true); + } + } // namespace CustomInterfaces } // namespace Mantid diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiagnostics.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiagnostics.cpp index 6610843ae5c9..5b221f3c6f49 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiagnostics.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDiagnostics.cpp @@ -98,11 +98,18 @@ namespace CustomInterfaces connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(sliceUpdateRS(QtProperty*, double))); // Enable/disable second range options when checkbox is toggled connect(m_blnManager, SIGNAL(valueChanged(QtProperty*, bool)), this, SLOT(sliceTwoRanges(QtProperty*, bool))); - // Plot slice miniplot when file has finished loading - connect(m_uiForm.slice_inputFile, SIGNAL(filesFound()), this, SLOT(slicePlotRaw())); // Enables/disables calibration file selection when user toggles Use Calibratin File checkbox connect(m_uiForm.slice_ckUseCalib, SIGNAL(toggled(bool)), this, SLOT(sliceCalib(bool))); + // Plot slice miniplot when file has finished loading + connect(m_uiForm.slice_inputFile, SIGNAL(filesFound()), this, SLOT(slicePlotRaw())); + // Shows message on run buton when user is inputting a run number + connect(m_uiForm.slice_inputFile, SIGNAL(fileTextChanged(const QString &)), this, SLOT(pbRunEditing())); + // Shows message on run button when Mantid is finding the file for a given run number + connect(m_uiForm.slice_inputFile, SIGNAL(findingFiles()), this, SLOT(pbRunFinding())); + // Reverts run button back to normal when file finding has finished + connect(m_uiForm.slice_inputFile, SIGNAL(fileFindingFinished()), this, SLOT(pbRunFinished())); + // Update preview plot when slice algorithm completes connect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(sliceAlgDone(bool))); @@ -398,5 +405,39 @@ namespace CustomInterfaces m_plots["SlicePreviewPlot"]->replot(); } + /** + * Called when a user starts to type / edit the runs to load. + */ + void IndirectDiagnostics::pbRunEditing() + { + emit updateRunButton(false, "Editing...", "Run numbers are curently being edited."); + } + + /** + * Called when the FileFinder starts finding the files. + */ + void IndirectDiagnostics::pbRunFinding() + { + emit updateRunButton(false, "Finding files...", "Searchig for data files for the run numbers entered..."); + m_uiForm.slice_inputFile->setEnabled(false); + } + + /** + * Called when the FileFinder has finished finding the files. + */ + void IndirectDiagnostics::pbRunFinished() + { + if(!m_uiForm.slice_inputFile->isValid()) + { + emit updateRunButton(false, "Invalid Run(s)", "Cannot find data files for some of the run numbers enetered."); + } + else + { + emit updateRunButton(); + } + + m_uiForm.slice_inputFile->setEnabled(true); + } + } // namespace CustomInterfaces } // namespace Mantid From 3a9419915d492c15c5b27447afdf819d7eb6dcde Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Tue, 21 Oct 2014 17:06:02 +0100 Subject: [PATCH 147/284] Re #10390. Added image get functions and unit tests. --- .../API/inc/MantidAPI/MatrixWorkspace.h | 20 ++ .../Framework/API/src/MatrixWorkspace.cpp | 132 ++++++++++ .../Framework/API/test/MatrixWorkspaceTest.h | 238 ++++++++++++++++++ 3 files changed, 390 insertions(+) diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h b/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h index 01243eed4ae5..be036345c307 100644 --- a/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h +++ b/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h @@ -33,6 +33,11 @@ namespace Mantid { class SpectrumDetectorMapping; + /// typedef for the image type + typedef std::vector> MantidImage; + /// shared pointer to MantidImage + typedef boost::shared_ptr MantidImage_sptr; + //---------------------------------------------------------------------- /** Base MatrixWorkspace Abstract Class. @@ -311,6 +316,19 @@ namespace Mantid // End IMDWorkspace methods //===================================================================================== + //===================================================================================== + // Image methods + //===================================================================================== + + /// Create an image of Ys. + MantidImage_sptr getImageY (size_t start = 0, size_t stop = 0, size_t width = 0, size_t indexStart = 0, size_t indexEnd = 0) const; + /// Create an image of Es. + MantidImage_sptr getImageE (size_t start = 0, size_t stop = 0, size_t width = 0, size_t indexStart = 0, size_t indexEnd = 0) const; + + //===================================================================================== + // End image methods + //===================================================================================== + protected: MatrixWorkspace(Mantid::Geometry::INearestNeighboursFactory* factory = NULL); @@ -328,6 +346,8 @@ namespace Mantid MatrixWorkspace(const MatrixWorkspace&); /// Private copy assignment operator. NO ASSIGNMENT ALLOWED MatrixWorkspace& operator=(const MatrixWorkspace&); + /// Create an MantidImage instance. + MantidImage_sptr getImage(const MantidVec& (MatrixWorkspace::*read)(std::size_t const) const, size_t start, size_t stop, size_t width, size_t indexStart, size_t indexEnd) const; /// Has this workspace been initialised? bool m_isInitialized; diff --git a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp index 0fc11dd58755..072bf3f9b6b0 100644 --- a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp +++ b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp @@ -1713,6 +1713,138 @@ namespace Mantid return Mantid::API::None; } + /** + * Creates a 2D image. + * @param read :: Pointer to a method returning a MantidVec to provide data for the image. + * @param start :: First workspace index for the image. + * @param stop :: Last workspace index for the image. + * @param width :: Image width. Must divide (stop - start + 1) exactly. + * @param indexStart :: First index of the x integration range. + * @param indexEnd :: Last index of the x integration range. + */ + MantidImage_sptr MatrixWorkspace::getImage(const MantidVec& (MatrixWorkspace::*read)(std::size_t const) const, size_t start, size_t stop, size_t width, size_t indexStart, size_t indexEnd) const + { + // width must be provided (for now) + if ( width == 0 ) + { + throw std::runtime_error("Cannot create image with width 0"); + } + + size_t nHist = getNumberHistograms(); + // use all spectra by default + if ( stop == 0 ) + { + stop = nHist; + } + + // check start and stop + if ( stop < start ) + { + throw std::runtime_error("Cannot create image for an empty data set."); + } + + if ( start >= nHist ) + { + throw std::runtime_error("Cannot create image: start index is out of range"); + } + + if ( stop >= nHist ) + { + throw std::runtime_error("Cannot create image: stop index is out of range"); + } + + // calculate image geometry + size_t dataSize = stop - start + 1; + size_t height = dataSize / width; + + // and check that the data fits exactly into this geometry + if ( height * width != dataSize ) + { + throw std::runtime_error("Cannot create image: the data set cannot form a rectangle."); + } + + size_t nBins = blocksize(); + bool isHisto = isHistogramData(); + + // default indexEnd is the last index of the X vector + if ( indexEnd == 0 ) + { + indexEnd = nBins; + if ( !isHisto && indexEnd > 0 ) --indexEnd; + } + + // check the x-range indices + if ( indexEnd < indexStart ) + { + throw std::runtime_error("Cannot create image for an empty data set."); + } + + if ( indexStart >= nBins || indexEnd > nBins || (!isHisto && indexEnd == nBins) ) + { + throw std::runtime_error("Cannot create image: integration interval is out of range."); + } + + // initialize the image + auto image = boost::make_shared( height ); + if ( !isHisto ) ++indexEnd; + + // deal separately with single-binned workspaces: no integration is required + if ( isHisto && indexEnd == indexStart + 1 ) + { + size_t spec = start; + for(auto row = image->begin(); row != image->end(); ++row) + { + row->resize( width ); + for(size_t i = 0; i < width; ++i, ++spec) + { + (*row)[i] = (this->*read)(spec)[indexStart]; + } + } + } + else + { + // each image pixel is integrated over the x-range [indexStart,indexEnd) + size_t spec = start; + for(auto row = image->begin(); row != image->end(); ++row) + { + row->resize( width ); + for(size_t i = 0; i < width; ++i, ++spec) + { + auto &V = (this->*read)(spec); + (*row)[i] = std::accumulate( V.begin() + indexStart, V.begin() + indexEnd, 0.0 ); + } + } + } + + return image; + } + + /** + * Creates a 2D image of the y values in this workspace. + * @param start :: First workspace index for the image. + * @param stop :: Last workspace index for the image. + * @param width :: Image width. Must divide (stop - start + 1) exactly. + * @param indexStart :: First index of the x integration range. + * @param indexEnd :: Last index of the x integration range. + */ + MantidImage_sptr MatrixWorkspace::getImageY(size_t start, size_t stop, size_t width, size_t indexStart, size_t indexEnd) const + { + return getImage(&MatrixWorkspace::readY,start,stop,width,indexStart,indexEnd); + } + + /** + * Creates a 2D image of the error values in this workspace. + * @param start :: First workspace index for the image. + * @param stop :: Last workspace index for the image. + * @param width :: Image width. Must divide (stop - start + 1) exactly. + * @param indexStart :: First index of the x integration range. + * @param indexEnd :: Last index of the x integration range. + */ + MantidImage_sptr MatrixWorkspace::getImageE(size_t start, size_t stop, size_t width, size_t indexStart, size_t indexEnd) const + { + return getImage(&MatrixWorkspace::readE,start,stop,width,indexStart,indexEnd); + } + } // namespace API } // Namespace Mantid diff --git a/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h b/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h index e7bbb7f5a1bd..8dac19228677 100644 --- a/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h +++ b/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h @@ -800,6 +800,244 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite TSM_ASSERT( "Monitor workspace not successfully reset", ! ws->monitorWorkspace() ) } + void test_getImage_0_width() + { + WorkspaceTester ws; + ws.init(9,2,1); + const size_t start = 0; + const size_t stop = 8; + size_t width = 0; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width), std::runtime_error ); + width = 3; + TS_ASSERT_THROWS_NOTHING( ws.getImageY(start,stop,width) ); + } + + void test_getImage_wrong_start() + { + WorkspaceTester ws; + ws.init(9,2,1); + size_t start = 10; + size_t stop = 8; + size_t width = 3; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width), std::runtime_error ); + start = 9; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width), std::runtime_error ); + start = 0; + TS_ASSERT_THROWS_NOTHING( ws.getImageY(start,stop,width) ); + } + + void test_getImage_wrong_stop() + { + WorkspaceTester ws; + ws.init(9,2,1); + size_t start = 0; + size_t stop = 18; + size_t width = 3; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width), std::runtime_error ); + stop = 9; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width), std::runtime_error ); + stop = 8; + TS_ASSERT_THROWS_NOTHING( ws.getImageY(start,stop,width) ); + } + + void test_getImage_empty_set() + { + WorkspaceTester ws; + ws.init(9,2,1); + size_t start = 1; + size_t stop = 0; + size_t width = 1; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width), std::runtime_error ); + stop = 1; + TS_ASSERT_THROWS_NOTHING( ws.getImageY(start,stop,width) ); + } + + void test_getImage_non_rectangular() + { + WorkspaceTester ws; + ws.init(9,2,1); + size_t start = 0; + size_t stop = 7; + size_t width = 3; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width), std::runtime_error ); + } + + void test_getImage_wrong_indexStart() + { + WorkspaceTester ws; + ws.init(9,2,1); + const size_t start = 0; + const size_t stop = 8; + const size_t width = 3; + size_t indexStart = 1; + size_t indexEnd = 1; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width,indexStart,indexEnd), std::runtime_error ); + + WorkspaceTester wsh; + wsh.init(9,1,1); + indexStart = 1; + indexEnd = 1; + TS_ASSERT_THROWS( wsh.getImageY(start,stop,width,indexStart,indexEnd), std::runtime_error ); + } + + void test_getImage_wrong_indexEnd() + { + WorkspaceTester ws; + ws.init(9,2,1); + const size_t start = 0; + const size_t stop = 8; + const size_t width = 3; + size_t indexStart = 0; + size_t indexEnd = 2; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width,indexStart,indexEnd), std::runtime_error ); + indexEnd = 20; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width,indexStart,indexEnd), std::runtime_error ); + + WorkspaceTester wsh; + wsh.init(9,2,2); + indexStart = 0; + indexEnd = 2; + TS_ASSERT_THROWS( wsh.getImageY(start,stop,width,indexStart,indexEnd), std::runtime_error ); + indexEnd = 1; + TS_ASSERT_THROWS_NOTHING( wsh.getImageY(start,stop,width,indexStart,indexEnd) ); + } + + void test_getImage_single_bin_histo() + { + WorkspaceTester ws; + ws.init(9,2,1); + for(size_t i = 0; i < ws.getNumberHistograms(); ++i) + { + ws.dataY(i)[0] = static_cast( i + 1 ); + } + const size_t start = 0; + const size_t stop = 8; + const size_t width = 3; + size_t indexStart = 0; + size_t indexEnd = 1; + Mantid::API::MantidImage_sptr image; + TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width,indexStart,indexEnd) ); + if ( !image ) return; + TS_ASSERT_EQUALS( image->size(), 3 ); + TS_ASSERT_EQUALS( (*image)[0].size(), 3 ); + TS_ASSERT_EQUALS( (*image)[1].size(), 3 ); + TS_ASSERT_EQUALS( (*image)[2].size(), 3 ); + + TS_ASSERT_EQUALS( (*image)[0][0], 1 ); + TS_ASSERT_EQUALS( (*image)[0][1], 2 ); + TS_ASSERT_EQUALS( (*image)[0][2], 3 ); + TS_ASSERT_EQUALS( (*image)[1][0], 4 ); + TS_ASSERT_EQUALS( (*image)[1][1], 5 ); + TS_ASSERT_EQUALS( (*image)[1][2], 6 ); + TS_ASSERT_EQUALS( (*image)[2][0], 7 ); + TS_ASSERT_EQUALS( (*image)[2][1], 8 ); + TS_ASSERT_EQUALS( (*image)[2][2], 9 ); + + } + + void test_getImage_single_bin_points() + { + WorkspaceTester ws; + ws.init(9,1,1); + for(size_t i = 0; i < ws.getNumberHistograms(); ++i) + { + ws.dataY(i)[0] = static_cast( i + 1 ); + } + const size_t start = 0; + const size_t stop = 8; + const size_t width = 3; + size_t indexStart = 0; + size_t indexEnd = 0; + Mantid::API::MantidImage_sptr image; + TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width,indexStart,indexEnd) ); + if ( !image ) return; + TS_ASSERT_EQUALS( image->size(), 3 ); + TS_ASSERT_EQUALS( (*image)[0].size(), 3 ); + TS_ASSERT_EQUALS( (*image)[1].size(), 3 ); + TS_ASSERT_EQUALS( (*image)[2].size(), 3 ); + + TS_ASSERT_EQUALS( (*image)[0][0], 1 ); + TS_ASSERT_EQUALS( (*image)[0][1], 2 ); + TS_ASSERT_EQUALS( (*image)[0][2], 3 ); + TS_ASSERT_EQUALS( (*image)[1][0], 4 ); + TS_ASSERT_EQUALS( (*image)[1][1], 5 ); + TS_ASSERT_EQUALS( (*image)[1][2], 6 ); + TS_ASSERT_EQUALS( (*image)[2][0], 7 ); + TS_ASSERT_EQUALS( (*image)[2][1], 8 ); + TS_ASSERT_EQUALS( (*image)[2][2], 9 ); + + } + + void test_getImage_multi_bin_histo() + { + WorkspaceTester ws; + ws.init(9,4,3); + for(size_t i = 0; i < ws.getNumberHistograms(); ++i) + { + ws.dataY(i)[0] = static_cast( i + 1 ); + ws.dataY(i)[1] = static_cast( i + 2 ); + ws.dataY(i)[2] = static_cast( i + 3 ); + } + const size_t start = 0; + const size_t stop = 8; + const size_t width = 3; + size_t indexStart = 0; + size_t indexEnd = 0; + Mantid::API::MantidImage_sptr image; + TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width,indexStart,indexEnd) ); + if ( !image ) return; + TS_ASSERT_EQUALS( image->size(), 3 ); + TS_ASSERT_EQUALS( (*image)[0].size(), 3 ); + TS_ASSERT_EQUALS( (*image)[1].size(), 3 ); + TS_ASSERT_EQUALS( (*image)[2].size(), 3 ); + + TS_ASSERT_EQUALS( (*image)[0][0], 6 ); + TS_ASSERT_EQUALS( (*image)[0][1], 9 ); + TS_ASSERT_EQUALS( (*image)[0][2], 12 ); + TS_ASSERT_EQUALS( (*image)[1][0], 15 ); + TS_ASSERT_EQUALS( (*image)[1][1], 18 ); + TS_ASSERT_EQUALS( (*image)[1][2], 21 ); + TS_ASSERT_EQUALS( (*image)[2][0], 24 ); + TS_ASSERT_EQUALS( (*image)[2][1], 27 ); + TS_ASSERT_EQUALS( (*image)[2][2], 30 ); + + } + + void test_getImage_multi_bin_points() + { + WorkspaceTester ws; + ws.init(9,3,3); + for(size_t i = 0; i < ws.getNumberHistograms(); ++i) + { + ws.dataY(i)[0] = static_cast( i + 1 ); + ws.dataY(i)[1] = static_cast( i + 2 ); + ws.dataY(i)[2] = static_cast( i + 3 ); + } + const size_t start = 0; + const size_t stop = 8; + const size_t width = 3; + size_t indexStart = 0; + size_t indexEnd = 0; + Mantid::API::MantidImage_sptr image; + TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width,indexStart,indexEnd) ); + if ( !image ) return; + TS_ASSERT_EQUALS( image->size(), 3 ); + TS_ASSERT_EQUALS( (*image)[0].size(), 3 ); + TS_ASSERT_EQUALS( (*image)[1].size(), 3 ); + TS_ASSERT_EQUALS( (*image)[2].size(), 3 ); + + TS_ASSERT_EQUALS( (*image)[0][0], 6 ); + TS_ASSERT_EQUALS( (*image)[0][1], 9 ); + TS_ASSERT_EQUALS( (*image)[0][2], 12 ); + TS_ASSERT_EQUALS( (*image)[1][0], 15 ); + TS_ASSERT_EQUALS( (*image)[1][1], 18 ); + TS_ASSERT_EQUALS( (*image)[1][2], 21 ); + TS_ASSERT_EQUALS( (*image)[2][0], 24 ); + TS_ASSERT_EQUALS( (*image)[2][1], 27 ); + TS_ASSERT_EQUALS( (*image)[2][2], 30 ); + + } + private: boost::shared_ptr ws; From 153e0963f059c3c90b9cfbca6e1ceb191ca8a94f Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 21 Oct 2014 16:53:20 +0100 Subject: [PATCH 148/284] Refs #10348 Align options column to the left --- .../Mantid/MantidQt/CustomInterfaces/src/QReflTableModel.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QReflTableModel.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QReflTableModel.cpp index afd0cee4c9ca..960261203cb7 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QReflTableModel.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QReflTableModel.cpp @@ -137,7 +137,10 @@ namespace MantidQt { if (role == Qt::TextAlignmentRole) { - return Qt::AlignRight; + if(index.column() == COL_OPTIONS) + return Qt::AlignLeft; + else + return Qt::AlignRight; } else if( role != Qt::DisplayRole && role != Qt::EditRole) { From e82ebfdcd648aaa478ae6563d6cc3bed795c1ec2 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Mon, 20 Oct 2014 15:53:43 +0100 Subject: [PATCH 149/284] Refs #10348 Delegate options column --- .../ReflOptionsDelegate.h | 25 +++++++++++++++++++ .../CustomInterfaces/src/QtReflMainView.cpp | 4 +++ 2 files changed, 29 insertions(+) create mode 100644 Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h new file mode 100644 index 000000000000..b0be6536fdd6 --- /dev/null +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h @@ -0,0 +1,25 @@ +#ifndef MANTID_CUSTOMINTERFACES_REFLOPTIONSDELEGATE_H +#define MANTID_CUSTOMINTERFACES_REFLOPTIONSDELEGATE_H + +#include + +namespace MantidQt +{ + namespace CustomInterfaces + { + class ReflOptionsDelegate : public QStyledItemDelegate + { + public: + ReflOptionsDelegate() {}; + virtual ~ReflOptionsDelegate() {}; + virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const + { + Q_UNUSED(option); + Q_UNUSED(index); + return new QLineEdit(parent); + } + }; + } +} + +#endif /* MANTID_CUSTOMINTERFACES_REFLOPTIONSDELEGATE_H */ diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 9d16ea5a4f21..a882bf64c978 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -1,6 +1,7 @@ #include "MantidQtCustomInterfaces/QtReflMainView.h" #include "MantidQtCustomInterfaces/QReflTableModel.h" #include "MantidQtCustomInterfaces/ReflMainViewPresenter.h" +#include "MantidQtCustomInterfaces/ReflOptionsDelegate.h" #include "MantidAPI/ITableWorkspace.h" #include "MantidKernel/ConfigService.h" #include @@ -56,6 +57,9 @@ namespace MantidQt connect(ui.actionProcess, SIGNAL(triggered()), this, SLOT(actionProcess())); connect(ui.actionGroupRows, SIGNAL(triggered()), this, SLOT(actionGroupRows())); + QAbstractItemDelegate* delegate = new ReflOptionsDelegate(); + ui.viewTable->setItemDelegateForColumn(ReflMainViewPresenter::COL_OPTIONS, delegate); + //Finally, create a presenter to do the thinking for us m_presenter = boost::shared_ptr(new ReflMainViewPresenter(this)); } From ba3032e4d1ac8abe35ea94692515ca671b137ed3 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 21 Oct 2014 17:00:52 +0100 Subject: [PATCH 150/284] Refs #10348 Stub HintingLineEdit --- .../ReflOptionsDelegate.h | 13 +++++++- .../MantidQt/MantidWidgets/CMakeLists.txt | 2 ++ .../MantidQtMantidWidgets/HintingLineEdit.h | 33 +++++++++++++++++++ .../MantidWidgets/src/HintingLineEdit.cpp | 29 ++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h create mode 100644 Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h index b0be6536fdd6..3e6867fb1932 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h @@ -3,6 +3,10 @@ #include +#include "MantidQtMantidWidgets/HintingLineEdit.h" + +using namespace MantidQt::MantidWidgets; + namespace MantidQt { namespace CustomInterfaces @@ -16,7 +20,14 @@ namespace MantidQt { Q_UNUSED(option); Q_UNUSED(index); - return new QLineEdit(parent); + + std::map hints; + //Create hints + + auto editor = new HintingLineEdit(parent, hints); + editor->setFrame(false); + + return editor; } }; } diff --git a/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt b/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt index 64ebe528e242..bde84dac1206 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt +++ b/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt @@ -12,6 +12,7 @@ set ( SRC_FILES src/FitPropertyBrowser.cpp src/FormulaDialogEditor.cpp src/FunctionBrowser.cpp + src/HintingLineEdit.cpp src/InstrumentSelector.cpp src/MantidHelpWindow.cpp src/MWDiag.cpp @@ -53,6 +54,7 @@ set ( MOC_FILES inc/MantidQtMantidWidgets/FindDialog.h inc/MantidQtMantidWidgets/FitPropertyBrowser.h inc/MantidQtMantidWidgets/FunctionBrowser.h + inc/MantidQtMantidWidgets/HintingLineEdit.h inc/MantidQtMantidWidgets/CatalogSearch.h inc/MantidQtMantidWidgets/CatalogSelector.h inc/MantidQtMantidWidgets/InstrumentSelector.h diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h new file mode 100644 index 000000000000..1c193f08d3c0 --- /dev/null +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h @@ -0,0 +1,33 @@ +#ifndef MANTID_MANTIDWIDGETS_HINTINGLINEEDIT_H_ +#define MANTID_MANTIDWIDGETS_HINTINGLINEEDIT_H_ + +#include "MantidKernel/System.h" +#include "MantidAPI/AlgorithmFactory.h" +#include "WidgetDllOption.h" + +#include +#include +#include + +//------------------------------------------------------------------------------ +// Forward declaration +//------------------------------------------------------------------------------ +namespace MantidQt +{ + namespace MantidWidgets + { + class EXPORT_OPT_MANTIDQT_MANTIDWIDGETS HintingLineEdit : public QLineEdit + { + Q_OBJECT + public: + HintingLineEdit(QWidget *parent, const std::map &hints); + virtual ~HintingLineEdit(); + protected: + std::map m_hints; + public slots: + void showHint(const QString& keyword); + }; + } //namespace MantidWidgets +} //namepsace MantidQt + +#endif /* MANTID_MANTIDWIDGETS_HINTINGLINEEDIT_H_ */ diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp new file mode 100644 index 000000000000..6a166fedeae2 --- /dev/null +++ b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp @@ -0,0 +1,29 @@ +#include "MantidQtMantidWidgets/HintingLineEdit.h" + +#include + +namespace MantidQt +{ + namespace MantidWidgets + { + + HintingLineEdit::HintingLineEdit(QWidget *parent, const std::map &hints) : QLineEdit(parent), m_hints(hints) + { + connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(showHint(const QString&))); + } + + HintingLineEdit::~HintingLineEdit() + { + } + + void HintingLineEdit::showHint(const QString& keyword) + { + //Get the current word from the cursor position + + //If we're typing the key, auto complete and show matching keys + + //If we're typing the value, show the detailed description for this key + QToolTip::showText(mapToGlobal(QPoint(0, 5)), "You have entered:\n" + keyword); + } + } //namespace MantidWidgets +} //namepsace MantidQt From d6137c24a68fda4d4d1e9aabe191b45bfafb573c Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 22 Oct 2014 10:39:51 +0100 Subject: [PATCH 151/284] Refs #10348 Use properties for hints --- .../inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h index 3e6867fb1932..2d344b80099f 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h @@ -3,8 +3,11 @@ #include +#include "MantidAPI/AlgorithmManager.h" #include "MantidQtMantidWidgets/HintingLineEdit.h" +using namespace Mantid::API; +using namespace Mantid::Kernel; using namespace MantidQt::MantidWidgets; namespace MantidQt @@ -22,7 +25,12 @@ namespace MantidQt Q_UNUSED(index); std::map hints; + //Create hints + IAlgorithm_sptr algReflOne = AlgorithmManager::Instance().create("ReflectometryReductionOneAuto"); + auto properties = algReflOne->getProperties(); + for(auto it = properties.begin(); it != properties.end(); ++it) + hints[(*it)->name()] = (*it)->briefDocumentation(); auto editor = new HintingLineEdit(parent, hints); editor->setFrame(false); From 89f3a413c6efd8c0191c62616c1a70e27a7a6d19 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 22 Oct 2014 10:41:18 +0100 Subject: [PATCH 152/284] Refs #10348 Rudimentary hint tooltips --- .../MantidQtMantidWidgets/HintingLineEdit.h | 6 ++- .../MantidWidgets/src/HintingLineEdit.cpp | 49 +++++++++++++++++-- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h index 1c193f08d3c0..13df47d8c975 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h @@ -23,9 +23,13 @@ namespace MantidQt HintingLineEdit(QWidget *parent, const std::map &hints); virtual ~HintingLineEdit(); protected: + void updateMatches(); + std::string m_curKey; + std::map m_matches; std::map m_hints; public slots: - void showHint(const QString& keyword); + void showHint(); + void updateHint(const QString& text); }; } //namespace MantidWidgets } //namepsace MantidQt diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp index 6a166fedeae2..dadec397eec1 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp @@ -1,5 +1,6 @@ #include "MantidQtMantidWidgets/HintingLineEdit.h" +#include #include namespace MantidQt @@ -9,21 +10,61 @@ namespace MantidQt HintingLineEdit::HintingLineEdit(QWidget *parent, const std::map &hints) : QLineEdit(parent), m_hints(hints) { - connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(showHint(const QString&))); + connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(updateHint(const QString&))); } HintingLineEdit::~HintingLineEdit() { } - void HintingLineEdit::showHint(const QString& keyword) + void HintingLineEdit::updateMatches() { - //Get the current word from the cursor position + m_matches.clear(); + for(auto it = m_hints.begin(); it != m_hints.end(); ++it) + { + const std::string& hint = it->first; + + if(hint.length() < m_curKey.length()) + continue; + + const std::string hintPrefix = hint.substr(0, m_curKey.length()); + + if(m_curKey == hintPrefix) + m_matches[hint] = it->second; + } + } + + void HintingLineEdit::updateHint(const QString& text) + { + const size_t curPos = (size_t)cursorPosition(); + const std::string line = text.toStdString(); + + //Get text from start -> cursor + std::string prefix = line.substr(0, curPos); + + std::size_t startPos = prefix.find_last_of(","); + if(startPos != std::string::npos) + prefix = prefix.substr(startPos + 1, prefix.size() - (startPos + 1)); + + boost::trim(prefix); + + m_curKey = prefix; + showHint(); + } + + void HintingLineEdit::showHint() + { + updateMatches(); //If we're typing the key, auto complete and show matching keys //If we're typing the value, show the detailed description for this key - QToolTip::showText(mapToGlobal(QPoint(0, 5)), "You have entered:\n" + keyword); + QString matchList; + + for(auto mIt = m_matches.begin(); mIt != m_matches.end(); ++mIt) + matchList += QString::fromStdString(mIt->first) + " : " + QString::fromStdString(mIt->second) + "\n"; + + QToolTip::showText(mapToGlobal(QPoint(0, 5)), matchList.trimmed()); } } //namespace MantidWidgets } //namepsace MantidQt From 9a5fba2b9344741755abc7a8f9b8b78b639a0647 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 22 Oct 2014 11:39:40 +0100 Subject: [PATCH 153/284] Refs #10348 Implement autocompletion --- .../MantidQtMantidWidgets/HintingLineEdit.h | 3 ++ .../MantidWidgets/src/HintingLineEdit.cpp | 38 +++++++++++++++---- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h index 13df47d8c975..a43c78436592 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h @@ -23,10 +23,13 @@ namespace MantidQt HintingLineEdit(QWidget *parent, const std::map &hints); virtual ~HintingLineEdit(); protected: + virtual void keyPressEvent(QKeyEvent* e); + void insertSuggestion(); void updateMatches(); std::string m_curKey; std::map m_matches; std::map m_hints; + bool m_dontComplete; public slots: void showHint(); void updateHint(const QString& text); diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp index dadec397eec1..d955b432fef8 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp @@ -8,7 +8,7 @@ namespace MantidQt namespace MantidWidgets { - HintingLineEdit::HintingLineEdit(QWidget *parent, const std::map &hints) : QLineEdit(parent), m_hints(hints) + HintingLineEdit::HintingLineEdit(QWidget *parent, const std::map &hints) : QLineEdit(parent), m_hints(hints), m_dontComplete(false) { connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(updateHint(const QString&))); } @@ -17,6 +17,12 @@ namespace MantidQt { } + void HintingLineEdit::keyPressEvent(QKeyEvent* e) + { + m_dontComplete = (e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete || e->key() == Qt::Key_Space); + QLineEdit::keyPressEvent(e); + } + void HintingLineEdit::updateMatches() { m_matches.clear(); @@ -53,18 +59,36 @@ namespace MantidQt showHint(); } + void HintingLineEdit::insertSuggestion() + { + if(m_curKey.length() < 1 || m_matches.size() < 1 || m_dontComplete) + return; + + const std::string key = m_matches.begin()->first; + QString line = text(); + const int curPos = cursorPosition(); + + //Don't perform insertions mid-word + if(curPos + 1 < line.size() && line[curPos+1].isLetterOrNumber()) + return; + + line = line.left(curPos) + QString::fromStdString(key).mid((int)m_curKey.size()) + line.mid(curPos); + + setText(line); + setSelection(curPos, (int)key.size()); + } + void HintingLineEdit::showHint() { updateMatches(); - //If we're typing the key, auto complete and show matching keys - - //If we're typing the value, show the detailed description for this key - QString matchList; + QString hintList; for(auto mIt = m_matches.begin(); mIt != m_matches.end(); ++mIt) - matchList += QString::fromStdString(mIt->first) + " : " + QString::fromStdString(mIt->second) + "\n"; + hintList += QString::fromStdString(mIt->first) + " : " + QString::fromStdString(mIt->second) + "\n"; + + QToolTip::showText(mapToGlobal(QPoint(0, 5)), hintList.trimmed()); - QToolTip::showText(mapToGlobal(QPoint(0, 5)), matchList.trimmed()); + insertSuggestion(); } } //namespace MantidWidgets } //namepsace MantidQt From 9ff5789b906e0570619b61c23d9b1bdff576e3b3 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 22 Oct 2014 12:00:51 +0100 Subject: [PATCH 154/284] Refs #10348 Blacklist uninteresting properties --- .../ReflOptionsDelegate.h | 19 +++++++++++++++++-- .../CustomInterfaces/src/QtReflMainView.cpp | 3 +-- .../src/ReflMainViewPresenter.cpp | 4 ++++ 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h index 2d344b80099f..7af51cc65ae8 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h @@ -26,11 +26,26 @@ namespace MantidQt std::map hints; - //Create hints + //Dynamically produce a list of hints and their descriptions from the algorithm IAlgorithm_sptr algReflOne = AlgorithmManager::Instance().create("ReflectometryReductionOneAuto"); auto properties = algReflOne->getProperties(); for(auto it = properties.begin(); it != properties.end(); ++it) - hints[(*it)->name()] = (*it)->briefDocumentation(); + { + const std::string name = (*it)->name(); + + //Blacklist some properties from being suggested + //These are either useless to the user (such as ThetaOut), or are handled by the presenter + if(name == "ThetaIn" || + name == "ThetaOut" || + name == "InputWorkspace" || + name == "OutputWorkspace" || + name == "OutputWorkspaceWavelength" || + name == "FirstTransmissionRun" || + name == "SecondTransmissionRun") + continue; + + hints[name] = (*it)->briefDocumentation(); + } auto editor = new HintingLineEdit(parent, hints); editor->setFrame(false); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index a882bf64c978..abc78ee6e688 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -57,8 +57,7 @@ namespace MantidQt connect(ui.actionProcess, SIGNAL(triggered()), this, SLOT(actionProcess())); connect(ui.actionGroupRows, SIGNAL(triggered()), this, SLOT(actionGroupRows())); - QAbstractItemDelegate* delegate = new ReflOptionsDelegate(); - ui.viewTable->setItemDelegateForColumn(ReflMainViewPresenter::COL_OPTIONS, delegate); + ui.viewTable->setItemDelegateForColumn(ReflMainViewPresenter::COL_OPTIONS, new ReflOptionsDelegate()); //Finally, create a presenter to do the thinking for us m_presenter = boost::shared_ptr(new ReflMainViewPresenter(this)); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index c92af568545d..ac8878d13fad 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -398,6 +398,10 @@ namespace MantidQt if(!transStr.empty()) transWS = makeTransWS(transStr); + /* If you add/remove any properties given to ReflectometryReductionOneAuto you should consider + * updating the list of suggestions provided by the options column in the UI. + * See Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h + */ IAlgorithm_sptr algReflOne = AlgorithmManager::Instance().create("ReflectometryReductionOneAuto"); algReflOne->initialize(); algReflOne->setProperty("InputWorkspace", runWS); From 5d9ea12e63ba2cc3944f77e5576312bbe0c3e749 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 21 Oct 2014 13:26:49 +0100 Subject: [PATCH 155/284] Refs #10398 Add more aggressive testing These invalid inputs should throw an exception. --- .../CustomInterfaces/test/ReflMainViewPresenterTest.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index 24a0c8dac295..769ec5c82693 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -712,6 +712,12 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_EQUALS(kvp["e"], "4,5,6"); TS_ASSERT_EQUALS(kvp["f"], "1+1=2"); TS_ASSERT_EQUALS(kvp["g"], "'"); + + TS_ASSERT_THROWS(ReflMainViewPresenter::parseKeyValueString("a = 1, b = 2, c = 3,"), std::runtime_error); + TS_ASSERT_THROWS(ReflMainViewPresenter::parseKeyValueString("a = 1, b = 2, c = 3,d"), std::runtime_error); + TS_ASSERT_THROWS(ReflMainViewPresenter::parseKeyValueString(",a = 1"), std::runtime_error); + TS_ASSERT_THROWS(ReflMainViewPresenter::parseKeyValueString(",a = 1 = 2,="), std::runtime_error); + TS_ASSERT_THROWS(ReflMainViewPresenter::parseKeyValueString("=,=,="), std::runtime_error); } }; From b94de72e3e6357407de02cc1cf608fd0f021f1dd Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 21 Oct 2014 13:28:09 +0100 Subject: [PATCH 156/284] Refs #10398 Update parseKeyValueString to satisfy unit test --- .../CustomInterfaces/src/ReflMainViewPresenter.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index fa0b58a7fc27..e146390b2b0e 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -123,6 +123,7 @@ namespace MantidQt /** Parses a string in the format `a = 1,b=2, c = "1,2,3,4", d = 5.0, e='a,b,c'` into a map of key/value pairs @param str The input string + @throws std::runtime_error on an invalid input string */ std::map ReflMainViewPresenter::parseKeyValueString(const std::string& str) { @@ -149,8 +150,16 @@ namespace MantidQt boost::trim(key); boost::trim(value); + if(key.empty() || value.empty()) + throw std::runtime_error("Invalid key value pair, '" + *it + "'"); + + kvp[key] = value; } + else + { + throw std::runtime_error("Invalid key value pair, '" + *it + "'"); + } } return kvp; } From cfb3f3cf33385e50eaf27deadb73343f58786aed Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Wed, 22 Oct 2014 15:15:10 +0100 Subject: [PATCH 157/284] Re #10390. Use x values instead of indices. --- .../API/inc/MantidAPI/MatrixWorkspace.h | 10 +- .../Framework/API/src/MatrixWorkspace.cpp | 98 ++++++++- .../Framework/API/test/MatrixWorkspaceTest.h | 201 +++++++++++++++--- 3 files changed, 271 insertions(+), 38 deletions(-) diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h b/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h index be036345c307..cad5a424c3bd 100644 --- a/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h +++ b/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h @@ -16,6 +16,7 @@ #include "MantidAPI/Run.h" #include "MantidAPI/Sample.h" #include "MantidAPI/SpectraDetectorTypes.h" +#include "MAntidKernel/EmptyValues.h" namespace Mantid @@ -232,6 +233,9 @@ namespace Mantid /// Return a vector with the integrated counts for all spectra withing the given range virtual void getIntegratedSpectra(std::vector & out, const double minX, const double maxX, const bool entireRange) const; + /// Return an index in the X vector for an x-value close to a given value + std::pair getXIndex(size_t i, double x, bool isLeft = true, size_t start = 0) const; + //---------------------------------------------------------------------- int axes() const; @@ -321,9 +325,11 @@ namespace Mantid //===================================================================================== /// Create an image of Ys. - MantidImage_sptr getImageY (size_t start = 0, size_t stop = 0, size_t width = 0, size_t indexStart = 0, size_t indexEnd = 0) const; + MantidImage_sptr getImageY (size_t start = 0, size_t stop = 0, size_t width = 0, double startX = EMPTY_DBL(), double endX = EMPTY_DBL() ) const; /// Create an image of Es. - MantidImage_sptr getImageE (size_t start = 0, size_t stop = 0, size_t width = 0, size_t indexStart = 0, size_t indexEnd = 0) const; + MantidImage_sptr getImageE (size_t start = 0, size_t stop = 0, size_t width = 0, double startX = EMPTY_DBL(), double endX = EMPTY_DBL() ) const; + /// Get start and end x indices for images + std::pair getImageStartEndXIndices( size_t i, double startX, double endX ) const; //===================================================================================== // End image methods diff --git a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp index 072bf3f9b6b0..0cfbc850da79 100644 --- a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp +++ b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp @@ -1819,17 +1819,41 @@ namespace Mantid return image; } + /** + * Get start and end x indices for images + * @param i :: Histogram index. + * @param startX :: Lower bound of the x integration range. + * @param endX :: Upper bound of the x integration range. + */ + std::pair MatrixWorkspace::getImageStartEndXIndices( size_t i, double startX, double endX ) const + { + if ( startX == EMPTY_DBL() ) startX = readX(i).front(); + auto pStart = getXIndex( i, startX, true ); + if ( pStart.second != 0.0 ) + { + throw std::runtime_error("Start X value is required to be on bin boundary."); + } + if ( endX == EMPTY_DBL() ) endX = readX(i).back(); + auto pEnd = getXIndex( i, endX, false, pStart.first ); + if ( pEnd.second != 0.0 ) + { + throw std::runtime_error("End X value is required to be on bin boundary."); + } + return std::make_pair( pStart.first, pEnd.first ); + } + /** * Creates a 2D image of the y values in this workspace. * @param start :: First workspace index for the image. * @param stop :: Last workspace index for the image. * @param width :: Image width. Must divide (stop - start + 1) exactly. - * @param indexStart :: First index of the x integration range. - * @param indexEnd :: Last index of the x integration range. + * @param startX :: Lower bound of the x integration range. + * @param endX :: Upper bound of the x integration range. */ - MantidImage_sptr MatrixWorkspace::getImageY(size_t start, size_t stop, size_t width, size_t indexStart, size_t indexEnd) const + MantidImage_sptr MatrixWorkspace::getImageY(size_t start, size_t stop, size_t width, double startX, double endX ) const { - return getImage(&MatrixWorkspace::readY,start,stop,width,indexStart,indexEnd); + auto p = getImageStartEndXIndices( 0, startX, endX ); + return getImage(&MatrixWorkspace::readY,start,stop,width,p.first,p.second); } /** @@ -1837,12 +1861,70 @@ namespace Mantid * @param start :: First workspace index for the image. * @param stop :: Last workspace index for the image. * @param width :: Image width. Must divide (stop - start + 1) exactly. - * @param indexStart :: First index of the x integration range. - * @param indexEnd :: Last index of the x integration range. + * @param startX :: Lower bound of the x integration range. + * @param endX :: Upper bound of the x integration range. + */ + MantidImage_sptr MatrixWorkspace::getImageE(size_t start, size_t stop, size_t width, double startX, double endX ) const + { + auto p = getImageStartEndXIndices( 0, startX, endX ); + return getImage(&MatrixWorkspace::readE,start,stop,width,p.first,p.second); + } + + /** + * Find an index in the X vector for an x-value close to a given value. It is returned as the first + * member of the pair. The second member is the fraction [0,1] of bin width cut off by the search value. + * If the first member == size of X vector then search failed. + * @param i :: Histogram index. + * @param x :: The value to find the index for. + * @param isLeft :: If true the left bin boundary is returned, if false - the right one. + * @param start :: Index to start the search from. */ - MantidImage_sptr MatrixWorkspace::getImageE(size_t start, size_t stop, size_t width, size_t indexStart, size_t indexEnd) const + std::pair MatrixWorkspace::getXIndex(size_t i, double x, bool isLeft, size_t start) const { - return getImage(&MatrixWorkspace::readE,start,stop,width,indexStart,indexEnd); + auto &X = readX(i); + auto nx = X.size(); + + // if start out of range - search failed + if ( start >= nx ) return std::make_pair( nx, 0.0 ); + if ( start > 0 && start == nx - 1 ) + { + // starting with the last index is allowed for right boundary search + if ( !isLeft ) return std::make_pair( start, 0.0 ); + return std::make_pair( nx, 0.0 ); + } + + // consider point data with single value + if ( nx == 1 ) + { + assert( start == 0 ); + if ( isLeft ) return x <= X[start] ? std::make_pair( start, 0.0 ) : std::make_pair( nx, 0.0 ); + return x >= X[start] ? std::make_pair( start, 0.0 ) : std::make_pair( nx, 0.0 ); + } + + // left boundaries below start value map to the start value + if ( x <= X[start] ) + { + return isLeft ? std::make_pair( start, 0.0 ) : std::make_pair( nx, 0.0 ); + } + // right boundary search returns last x value for all values above it + if ( x >= X.back() ) + { + return !isLeft ? std::make_pair( nx - 1, 0.0 ) : std::make_pair( nx, 0.0 ); + } + + // general case: find the boundary index and bin fraction + auto end = X.end(); + for(auto ix = X.begin() + start + 1; ix != end; ++ix) + { + if ( *ix >= x ) + { + auto index = static_cast( std::distance(X.begin(),ix) ); + if ( isLeft ) --index; + return std::make_pair( index, fabs( (X[index] - x) / (*ix - *(ix - 1)) ) ); + } + } + // I don't think we can ever get here + return std::make_pair( nx, 0.0 ); } } // namespace API diff --git a/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h b/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h index 8dac19228677..2f8fc4dc51da 100644 --- a/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h +++ b/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h @@ -800,10 +800,128 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite TSM_ASSERT( "Monitor workspace not successfully reset", ! ws->monitorWorkspace() ) } + void test_getXIndex() + { + WorkspaceTester ws; + ws.init(1,4,3); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; + X[2] = 3.0; + X[3] = 4.0; + + auto ip = ws.getXIndex( 0, 0.0, true ); + TS_ASSERT_EQUALS( ip.first, 0 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 0.0, false ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 1.0, true ); + TS_ASSERT_EQUALS( ip.first, 0 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 1.0, false ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 5.0, true ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 5.0, false ); + TS_ASSERT_EQUALS( ip.first, 3 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 4.0, true ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 4.0, false ); + TS_ASSERT_EQUALS( ip.first, 3 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 5.0, true, 5 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 5.0, false, 5 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 3.0, true, 5 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 3.0, false, 5 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 4.0, true, 5 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 4.0, false, 5 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 4.0, true, 4 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 4.0, false, 4 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 4.0, true, 3 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 4.0, false, 3 ); + TS_ASSERT_EQUALS( ip.first, 3 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 4.0, true ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 4.0, false ); + TS_ASSERT_EQUALS( ip.first, 3 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 2.0, true, 3 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 2.0, false, 3 ); + TS_ASSERT_EQUALS( ip.first, 3 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 1.0, true, 3 ); + TS_ASSERT_EQUALS( ip.first, 4 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 1.0, false, 3 ); + TS_ASSERT_EQUALS( ip.first, 3 ); + TS_ASSERT_DELTA( ip.second, 0.0, 1e-15 ); + + ip = ws.getXIndex( 0, 2.1, true ); + TS_ASSERT_EQUALS( ip.first, 1 ); + TS_ASSERT_DELTA( ip.second, 0.1, 1e-15 ); + + ip = ws.getXIndex( 0, 2.1, false ); + TS_ASSERT_EQUALS( ip.first, 2 ); + TS_ASSERT_DELTA( ip.second, 0.9, 1e-15 ); + } + void test_getImage_0_width() { WorkspaceTester ws; ws.init(9,2,1); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; const size_t start = 0; const size_t stop = 8; size_t width = 0; @@ -816,6 +934,9 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite { WorkspaceTester ws; ws.init(9,2,1); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; size_t start = 10; size_t stop = 8; size_t width = 3; @@ -830,6 +951,9 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite { WorkspaceTester ws; ws.init(9,2,1); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; size_t start = 0; size_t stop = 18; size_t width = 3; @@ -844,6 +968,9 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite { WorkspaceTester ws; ws.init(9,2,1); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; size_t start = 1; size_t stop = 0; size_t width = 1; @@ -856,6 +983,9 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite { WorkspaceTester ws; ws.init(9,2,1); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; size_t start = 0; size_t stop = 7; size_t width = 3; @@ -866,46 +996,54 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite { WorkspaceTester ws; ws.init(9,2,1); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; const size_t start = 0; const size_t stop = 8; const size_t width = 3; - size_t indexStart = 1; - size_t indexEnd = 1; - TS_ASSERT_THROWS( ws.getImageY(start,stop,width,indexStart,indexEnd), std::runtime_error ); + double startX = 3; + double endX = 4; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width,startX,endX), std::runtime_error ); WorkspaceTester wsh; wsh.init(9,1,1); - indexStart = 1; - indexEnd = 1; - TS_ASSERT_THROWS( wsh.getImageY(start,stop,width,indexStart,indexEnd), std::runtime_error ); + startX = 2; + endX = 2; + TS_ASSERT_THROWS( wsh.getImageY(start,stop,width,startX,endX), std::runtime_error ); } void test_getImage_wrong_indexEnd() { WorkspaceTester ws; ws.init(9,2,1); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; const size_t start = 0; const size_t stop = 8; const size_t width = 3; - size_t indexStart = 0; - size_t indexEnd = 2; - TS_ASSERT_THROWS( ws.getImageY(start,stop,width,indexStart,indexEnd), std::runtime_error ); - indexEnd = 20; - TS_ASSERT_THROWS( ws.getImageY(start,stop,width,indexStart,indexEnd), std::runtime_error ); + double startX = 1.0; + double endX = 0.0; + TS_ASSERT_THROWS( ws.getImageY(start,stop,width,startX,endX), std::runtime_error ); WorkspaceTester wsh; wsh.init(9,2,2); - indexStart = 0; - indexEnd = 2; - TS_ASSERT_THROWS( wsh.getImageY(start,stop,width,indexStart,indexEnd), std::runtime_error ); - indexEnd = 1; - TS_ASSERT_THROWS_NOTHING( wsh.getImageY(start,stop,width,indexStart,indexEnd) ); + auto &X1 = ws.dataX(0); + X1[0] = 1.0; + X1[1] = 2.0; + startX = 1.0; + endX = 0.0; + TS_ASSERT_THROWS( wsh.getImageY(start,stop,width,startX,endX), std::runtime_error ); } void test_getImage_single_bin_histo() { WorkspaceTester ws; ws.init(9,2,1); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; for(size_t i = 0; i < ws.getNumberHistograms(); ++i) { ws.dataY(i)[0] = static_cast( i + 1 ); @@ -913,10 +1051,10 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite const size_t start = 0; const size_t stop = 8; const size_t width = 3; - size_t indexStart = 0; - size_t indexEnd = 1; + double startX = 0; + double endX = 3; Mantid::API::MantidImage_sptr image; - TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width,indexStart,indexEnd) ); + TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width,startX,endX) ); if ( !image ) return; TS_ASSERT_EQUALS( image->size(), 3 ); TS_ASSERT_EQUALS( (*image)[0].size(), 3 ); @@ -939,6 +1077,8 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite { WorkspaceTester ws; ws.init(9,1,1); + auto &X = ws.dataX(0); + X[0] = 1.0; for(size_t i = 0; i < ws.getNumberHistograms(); ++i) { ws.dataY(i)[0] = static_cast( i + 1 ); @@ -946,10 +1086,10 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite const size_t start = 0; const size_t stop = 8; const size_t width = 3; - size_t indexStart = 0; - size_t indexEnd = 0; + double startX = 1; + double endX = 1; Mantid::API::MantidImage_sptr image; - TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width,indexStart,indexEnd) ); + TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width,startX,endX) ); if ( !image ) return; TS_ASSERT_EQUALS( image->size(), 3 ); TS_ASSERT_EQUALS( (*image)[0].size(), 3 ); @@ -972,6 +1112,11 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite { WorkspaceTester ws; ws.init(9,4,3); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; + X[2] = 3.0; + X[3] = 4.0; for(size_t i = 0; i < ws.getNumberHistograms(); ++i) { ws.dataY(i)[0] = static_cast( i + 1 ); @@ -981,10 +1126,8 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite const size_t start = 0; const size_t stop = 8; const size_t width = 3; - size_t indexStart = 0; - size_t indexEnd = 0; Mantid::API::MantidImage_sptr image; - TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width,indexStart,indexEnd) ); + TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width) ); if ( !image ) return; TS_ASSERT_EQUALS( image->size(), 3 ); TS_ASSERT_EQUALS( (*image)[0].size(), 3 ); @@ -1007,6 +1150,10 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite { WorkspaceTester ws; ws.init(9,3,3); + auto &X = ws.dataX(0); + X[0] = 1.0; + X[1] = 2.0; + X[2] = 3.0; for(size_t i = 0; i < ws.getNumberHistograms(); ++i) { ws.dataY(i)[0] = static_cast( i + 1 ); @@ -1016,10 +1163,8 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite const size_t start = 0; const size_t stop = 8; const size_t width = 3; - size_t indexStart = 0; - size_t indexEnd = 0; Mantid::API::MantidImage_sptr image; - TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width,indexStart,indexEnd) ); + TS_ASSERT_THROWS_NOTHING( image = ws.getImageY(start,stop,width) ); if ( !image ) return; TS_ASSERT_EQUALS( image->size(), 3 ); TS_ASSERT_EQUALS( (*image)[0].size(), 3 ); From cfb22f50b246d6e3b3d662836fc40a96e857b1b4 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 22 Oct 2014 15:28:51 +0100 Subject: [PATCH 158/284] Refs #10348 Refactor hint map creation --- .../MantidQtCustomInterfaces/QtReflMainView.h | 1 + .../MantidQtCustomInterfaces/ReflMainView.h | 2 + .../ReflOptionsDelegate.h | 59 ------------------- .../CustomInterfaces/src/QtReflMainView.cpp | 13 +++- .../src/ReflMainViewPresenter.cpp | 15 +++++ .../test/ReflMainViewMockObjects.h | 1 + .../AlgorithmHintStrategy.h | 45 ++++++++++++++ .../inc/MantidQtMantidWidgets/HintStrategy.h | 23 ++++++++ .../HintingLineEditFactory.h | 42 +++++++++++++ 9 files changed, 139 insertions(+), 62 deletions(-) delete mode 100644 Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h create mode 100644 Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h create mode 100644 Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h create mode 100644 Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index 2dcee3bf647c..d8dd8e235b8d 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -63,6 +63,7 @@ namespace MantidQt //Settor methods virtual void setInstrumentList(const std::vector& instruments, const std::string& defaultInstrument); + virtual void setOptionsHintStrategy(HintStrategy* hintStrategy); //Accessor methods virtual std::vector getSelectedRowIndexes() const; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index 7507cf17e664..374536c5f7c2 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -3,6 +3,7 @@ #include "MantidKernel/System.h" #include "MantidAPI/ITableWorkspace.h" +#include "MantidQtMantidWidgets/HintStrategy.h" namespace MantidQt { @@ -55,6 +56,7 @@ namespace MantidQt //Settor methods virtual void setInstrumentList(const std::vector& instruments, const std::string& defaultInstrument) = 0; + virtual void setOptionsHintStrategy(HintStrategy* hintStrategy) = 0; //Accessor methods virtual std::vector getSelectedRowIndexes() const = 0; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h deleted file mode 100644 index 7af51cc65ae8..000000000000 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef MANTID_CUSTOMINTERFACES_REFLOPTIONSDELEGATE_H -#define MANTID_CUSTOMINTERFACES_REFLOPTIONSDELEGATE_H - -#include - -#include "MantidAPI/AlgorithmManager.h" -#include "MantidQtMantidWidgets/HintingLineEdit.h" - -using namespace Mantid::API; -using namespace Mantid::Kernel; -using namespace MantidQt::MantidWidgets; - -namespace MantidQt -{ - namespace CustomInterfaces - { - class ReflOptionsDelegate : public QStyledItemDelegate - { - public: - ReflOptionsDelegate() {}; - virtual ~ReflOptionsDelegate() {}; - virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const - { - Q_UNUSED(option); - Q_UNUSED(index); - - std::map hints; - - //Dynamically produce a list of hints and their descriptions from the algorithm - IAlgorithm_sptr algReflOne = AlgorithmManager::Instance().create("ReflectometryReductionOneAuto"); - auto properties = algReflOne->getProperties(); - for(auto it = properties.begin(); it != properties.end(); ++it) - { - const std::string name = (*it)->name(); - - //Blacklist some properties from being suggested - //These are either useless to the user (such as ThetaOut), or are handled by the presenter - if(name == "ThetaIn" || - name == "ThetaOut" || - name == "InputWorkspace" || - name == "OutputWorkspace" || - name == "OutputWorkspaceWavelength" || - name == "FirstTransmissionRun" || - name == "SecondTransmissionRun") - continue; - - hints[name] = (*it)->briefDocumentation(); - } - - auto editor = new HintingLineEdit(parent, hints); - editor->setFrame(false); - - return editor; - } - }; - } -} - -#endif /* MANTID_CUSTOMINTERFACES_REFLOPTIONSDELEGATE_H */ diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index abc78ee6e688..6f23d2f9649c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -1,7 +1,7 @@ #include "MantidQtCustomInterfaces/QtReflMainView.h" #include "MantidQtCustomInterfaces/QReflTableModel.h" #include "MantidQtCustomInterfaces/ReflMainViewPresenter.h" -#include "MantidQtCustomInterfaces/ReflOptionsDelegate.h" +#include "MantidQtMantidWidgets/HintingLineEditFactory.h" #include "MantidAPI/ITableWorkspace.h" #include "MantidKernel/ConfigService.h" #include @@ -57,8 +57,6 @@ namespace MantidQt connect(ui.actionProcess, SIGNAL(triggered()), this, SLOT(actionProcess())); connect(ui.actionGroupRows, SIGNAL(triggered()), this, SLOT(actionGroupRows())); - ui.viewTable->setItemDelegateForColumn(ReflMainViewPresenter::COL_OPTIONS, new ReflOptionsDelegate()); - //Finally, create a presenter to do the thinking for us m_presenter = boost::shared_ptr(new ReflMainViewPresenter(this)); } @@ -242,6 +240,15 @@ namespace MantidQt ui.comboProcessInstrument->setCurrentIndex(index); } + /** + Set the strategy used for generating hints for the autocompletion in the options column. + @param hintStrategy The hinting strategy to use + */ + void QtReflMainView::setOptionsHintStrategy(HintStrategy* hintStrategy) + { + ui.viewTable->setItemDelegateForColumn(ReflMainViewPresenter::COL_OPTIONS, new HintingLineEditFactory(hintStrategy)); + } + /** Get the selected instrument for searching @returns the selected instrument to search for diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index ac8878d13fad..aa2344a6d198 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -7,6 +7,7 @@ #include "MantidKernel/TimeSeriesProperty.h" #include "MantidKernel/Utils.h" #include "MantidQtCustomInterfaces/ReflMainView.h" +#include "MantidQtMantidWidgets/AlgorithmHintStrategy.h" #include @@ -86,6 +87,20 @@ namespace MantidQt else m_view->setInstrumentList(instruments, "INTER"); + //Provide autocompletion hints for the options column. We use the algorithm's properties minus + //those we blacklist. We blacklist any useless properties or ones we're handling that the user + //should'nt touch. + IAlgorithm_sptr alg = AlgorithmManager::Instance().create("ReflectometryReductionOneAuto"); + std::set blacklist; + blacklist.insert("ThetaIn"); + blacklist.insert("ThetaOut"); + blacklist.insert("InputWorkspace"); + blacklist.insert("OutputWorkspace"); + blacklist.insert("OutputWorkspaceWavelength"); + blacklist.insert("FirstTransmissionRun"); + blacklist.insert("SecondTransmissionRun"); + m_view->setOptionsHintStrategy(new AlgorithmHintStrategy(alg, blacklist)); + newTable(); } diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h index 616829c8e952..b41952ecf7b5 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h @@ -34,6 +34,7 @@ class MockView : public ReflMainView public: MockView(){}; virtual void showTable(Mantid::API::ITableWorkspace_sptr model){ m_model = model;} + virtual void setOptionsHintStrategy(HintStrategy*) {}; MOCK_METHOD3(askUserString, std::string(const std::string& prompt, const std::string& title, const std::string& defaultValue)); MOCK_METHOD2(askUserYesNo, bool(std::string, std::string)); MOCK_METHOD2(giveUserCritical, void(std::string, std::string)); diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h new file mode 100644 index 000000000000..161168e5c460 --- /dev/null +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h @@ -0,0 +1,45 @@ +#ifndef MANTID_MANTIDWIDGETS_ALGORITHMHINTSTRATEGY_H +#define MANTID_MANTIDWIDGETS_ALGORITHMHINTSTRATEGY_H + +#include "MantidAPI/IAlgorithm.h" +#include "MantidQtMantidWidgets/HintStrategy.h" + +using namespace Mantid::API; + +namespace MantidQt +{ + namespace CustomInterfaces + { + class AlgorithmHintStrategy : public HintStrategy + { + public: + AlgorithmHintStrategy(IAlgorithm_sptr algorithm, std::set blacklist) : m_algorithm(algorithm), m_blacklist(blacklist) + { + } + + virtual ~AlgorithmHintStrategy() {}; + + virtual std::map createHints() + { + std::map hints; + + auto properties = m_algorithm->getProperties(); + for(auto it = properties.begin(); it != properties.end(); ++it) + { + const std::string name = (*it)->name(); + + //If it's not in the blacklist, add the property to our hints + if(m_blacklist.find(name) == m_blacklist.end()) + hints[name] = (*it)->briefDocumentation(); + } + + return hints; + } + private: + IAlgorithm_sptr m_algorithm; + std::set m_blacklist; + }; + } +} + +#endif /* MANTID_MANTIDWIDGETS_ALGORITHMHINTSTRATEGY_H */ diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h new file mode 100644 index 000000000000..9fbe15852f13 --- /dev/null +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h @@ -0,0 +1,23 @@ +#ifndef MANTID_MANTIDWIDGETS_HINTSTRATEGY_H +#define MANTID_MANTIDWIDGETS_HINTSTRATEGY_H + +#include +#include + +namespace MantidQt +{ + namespace CustomInterfaces + { + class HintStrategy + { + public: + HintStrategy() {}; + virtual ~HintStrategy() {}; + + //Provides a map of hints to be used by a HintingLineEdit widget + virtual std::map createHints() = 0; + }; + } +} + +#endif /* MANTID_MANTIDWIDGETS_HINTSTRATEGY_H */ diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h new file mode 100644 index 000000000000..ecf8f839026a --- /dev/null +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h @@ -0,0 +1,42 @@ +#ifndef MANTID_MANTIDWIDGETS_HINTINGLINEEDITFACTORY_H +#define MANTID_MANTIDWIDGETS_HINTINGLINEEDITFACTORY_H + +#include + +#include "MantidAPI/AlgorithmManager.h" +#include "MantidQtMantidWidgets/HintingLineEdit.h" +#include "MantidQtMantidWidgets/HintStrategy.h" + +using namespace Mantid::API; +using namespace Mantid::Kernel; +using namespace MantidQt::MantidWidgets; + +namespace MantidQt +{ + namespace CustomInterfaces + { + class HintingLineEditFactory : public QStyledItemDelegate + { + public: + HintingLineEditFactory(HintStrategy* hintStrategy) : m_strategy(hintStrategy) {}; + virtual ~HintingLineEditFactory() + { + delete m_strategy; + }; + virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const + { + Q_UNUSED(option); + Q_UNUSED(index); + + auto editor = new HintingLineEdit(parent, m_strategy->createHints()); + editor->setFrame(false); + + return editor; + } + protected: + HintStrategy* m_strategy; + }; + } +} + +#endif /* MANTID_MANTIDWIDGETS_HINTINGLINEEDITFACTORY_H */ From 9158daa74ea43635651c8e4eba9ad4719f23c532 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 22 Oct 2014 15:35:57 +0100 Subject: [PATCH 159/284] Refs #10348 Remove obsolete comment --- .../MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index aa2344a6d198..516878053c43 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -413,10 +413,6 @@ namespace MantidQt if(!transStr.empty()) transWS = makeTransWS(transStr); - /* If you add/remove any properties given to ReflectometryReductionOneAuto you should consider - * updating the list of suggestions provided by the options column in the UI. - * See Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDelegate.h - */ IAlgorithm_sptr algReflOne = AlgorithmManager::Instance().create("ReflectometryReductionOneAuto"); algReflOne->initialize(); algReflOne->setProperty("InputWorkspace", runWS); From 47f2b704dbdc8817f027625252cf9e0d24460195 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 22 Oct 2014 16:57:31 +0100 Subject: [PATCH 160/284] Refs #10348 Allow user to cycle through suggestions Up/Down arrow keys allow the user to switch between the available suggestions rapidly. --- .../MantidQtMantidWidgets/HintingLineEdit.h | 4 ++ .../MantidWidgets/src/HintingLineEdit.cpp | 61 ++++++++++++++++++- 2 files changed, 62 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h index a43c78436592..b5711092c7f5 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h @@ -26,7 +26,11 @@ namespace MantidQt virtual void keyPressEvent(QKeyEvent* e); void insertSuggestion(); void updateMatches(); + void clearSuggestion(); + void nextSuggestion(); + void prevSuggestion(); std::string m_curKey; + std::string m_curMatch; std::map m_matches; std::map m_hints; bool m_dontComplete; diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp index d955b432fef8..a798d0df1e6e 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp @@ -20,11 +20,23 @@ namespace MantidQt void HintingLineEdit::keyPressEvent(QKeyEvent* e) { m_dontComplete = (e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete || e->key() == Qt::Key_Space); + + if(e->key() == Qt::Key_Up) + { + prevSuggestion(); + } + + if(e->key() == Qt::Key_Down) + { + nextSuggestion(); + return; + } QLineEdit::keyPressEvent(e); } void HintingLineEdit::updateMatches() { + m_curMatch.clear(); m_matches.clear(); for(auto it = m_hints.begin(); it != m_hints.end(); ++it) @@ -64,7 +76,9 @@ namespace MantidQt if(m_curKey.length() < 1 || m_matches.size() < 1 || m_dontComplete) return; - const std::string key = m_matches.begin()->first; + if(m_curMatch.empty()) + m_curMatch = m_matches.begin()->first; + QString line = text(); const int curPos = cursorPosition(); @@ -72,10 +86,51 @@ namespace MantidQt if(curPos + 1 < line.size() && line[curPos+1].isLetterOrNumber()) return; - line = line.left(curPos) + QString::fromStdString(key).mid((int)m_curKey.size()) + line.mid(curPos); + line = line.left(curPos) + QString::fromStdString(m_curMatch).mid((int)m_curKey.size()) + line.mid(curPos); setText(line); - setSelection(curPos, (int)key.size()); + setSelection(curPos, (int)m_curMatch.size()); + } + + void HintingLineEdit::clearSuggestion() + { + if(!hasSelectedText()) + return; + + //Remove the selected text + QString line = text(); + line = line.left(selectionStart()) + line.mid(selectionStart() + selectedText().length()); + setText(line); + } + + void HintingLineEdit::nextSuggestion() + { + clearSuggestion(); + auto it = m_matches.find(m_curMatch); + if(it != m_matches.end()) + { + it++; + if(it == m_matches.end()) + m_curMatch = m_matches.begin()->first; + else + m_curMatch = it->first; + insertSuggestion(); + } + } + + void HintingLineEdit::prevSuggestion() + { + clearSuggestion(); + auto it = m_matches.find(m_curMatch); + if(it != m_matches.end()) + { + it--; + if(it == m_matches.end()) + m_curMatch = m_matches.rbegin()->first; + else + m_curMatch = it->first; + insertSuggestion(); + } } void HintingLineEdit::showHint() From 4d7a4fc50145e74d0f77eb071076b21467465b4d Mon Sep 17 00:00:00 2001 From: John Hill Date: Wed, 22 Oct 2014 17:17:54 +0100 Subject: [PATCH 161/284] Refs #10397 making changes to handle rotation file --- .../inc/MantidDataHandling/LoadFITS.h | 4 +- .../Framework/DataHandling/src/Load.cpp | 6 +- .../Framework/DataHandling/src/LoadFITS.cpp | 820 ++++++++++-------- .../Framework/DataHandling/src/SaveNXTomo.cpp | 35 +- 4 files changed, 486 insertions(+), 379 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadFITS.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadFITS.h index 1ed0521b9067..dcfc964b646f 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadFITS.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadFITS.h @@ -102,7 +102,9 @@ namespace DataHandling void loadChunkOfBinsFromFile(Mantid::API::MatrixWorkspace_sptr &workspace, vector > &yVals, vector > &eVals, void *&bufferAny, MantidVecPtr &x, size_t spetraCount, int bitsPerPixel, size_t binChunkStartIndex); /// Initialises a workspace with IDF and fills it with data API::MatrixWorkspace_sptr initAndPopulateHistogramWorkspace(); - + /// Creates a comma separated string of rotations from a file + std::string ReadRotations(std::string rotFilePath, size_t fileCount); + vector m_allHeaderInfo; size_t m_binChunkSize; static const int FIXED_HEADER_SIZE = 2880; diff --git a/Code/Mantid/Framework/DataHandling/src/Load.cpp b/Code/Mantid/Framework/DataHandling/src/Load.cpp index 0ee51f8d0b4b..9bb5bf5f6487 100644 --- a/Code/Mantid/Framework/DataHandling/src/Load.cpp +++ b/Code/Mantid/Framework/DataHandling/src/Load.cpp @@ -181,10 +181,11 @@ namespace Mantid // If it's loading into a single file, perform a cursory check on file extensions only. if((ifl && ifl->loadMutipleAsOne()) || (iflNexus && iflNexus->loadMutipleAsOne())) { - if( fileNames[i].substr(fileNames[i].find_last_of(".")) != ext) + // Currently disabled for ticket http://trac.mantidproject.org/mantid/ticket/10397 : should be put back in when completing 10231 + /* if( fileNames[i].substr(fileNames[i].find_last_of(".")) != ext) { throw std::runtime_error("Cannot load multiple files when more than one Loader is needed."); - } + }*/ } else { @@ -320,6 +321,7 @@ namespace Mantid exts.push_back(".h5"); exts.push_back(".hd5"); exts.push_back(".sqw"); + exts.push_back(".fits"); declareProperty(new MultipleFileProperty("Filename", exts), "The name of the file(s) to read, including the full or relative " diff --git a/Code/Mantid/Framework/DataHandling/src/LoadFITS.cpp b/Code/Mantid/Framework/DataHandling/src/LoadFITS.cpp index 5b200bba28a6..904cc0eb0899 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadFITS.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadFITS.cpp @@ -5,6 +5,7 @@ #include "MantidKernel/UnitFactory.h" #include #include +#include using namespace Mantid::DataHandling; using namespace Mantid::API; @@ -13,380 +14,463 @@ using namespace std; using namespace boost; using Poco::BinaryReader; +namespace +{ + /** + * Used with find_if to check a string isn't a fits file (by checking extension) + * @param s string to check for extension + * @returns bool Value indicating if the string ends with .fits or not + */ + bool IsNotFits(std::string s) + { + std::string tmp = s; + to_lower(tmp); + return !ends_with(tmp,".fits"); + } +} namespace Mantid { namespace DataHandling { - // Register the algorithm into the AlgorithmFactory - DECLARE_FILELOADER_ALGORITHM(LoadFITS); - - /** - * Return the confidence with with this algorithm can load the file - * @param descriptor A descriptor for the file - * @returns An integer specifying the confidence level. 0 indicates it will not be used - */ - int LoadFITS::confidence(Kernel::FileDescriptor & descriptor) const - { - // Should really improve this to check the file header (of first file at least) to make sure it contains the fields wanted - return (descriptor.extension() == ".fits" || descriptor.extension() == ".fit") ? 80 : 0; - } - - /** - * Initialise the algorithm. Declare properties which can be set before execution (input) or - * read from after the execution (output). - */ - void LoadFITS::init() - { - // Specify file extensions which can be associated with a FITS file. - std::vector exts; - - // Declare the Filename algorithm property. Mandatory. Sets the path to the file to load. - exts.clear(); - exts.push_back(".fits"); - exts.push_back(".fit"); - - declareProperty(new MultipleFileProperty("Filename", exts), "The input filename of the stored data"); - declareProperty(new PropertyWithValue("FileChunkSize", 100, Direction::Input), "Number of files to read into memory at a time - use lower values for machines with low memory"); - - declareProperty(new API::WorkspaceProperty("OutputWorkspace", "", Kernel::Direction::Output)); - } - - /** - * Execute the algorithm. - */ - void LoadFITS::exec() - { - // Create FITS file information for each file selected - std::vector paths; - string fName = getPropertyValue("Filename"); - boost::split(paths, fName, boost::is_any_of(",")); - m_binChunkSize = getProperty("FileChunkSize"); - - // Shrink chunk size to match number of files if it's over the amount (less memory allocated later) - if(m_binChunkSize > paths.size()) m_binChunkSize = static_cast(paths.size()); - - m_allHeaderInfo.resize(paths.size()); - - // Check each header is valid for this loader, - standard (no extension to FITS), and has two axis - bool headerValid = true; - - for(size_t i=0; i(m_allHeaderInfo[i].headerKeys["BITPIX"]); - m_allHeaderInfo[i].numberOfAxis = lexical_cast(m_allHeaderInfo[i].headerKeys["NAXIS"]); - - for(int j=0; j(j+1); - m_allHeaderInfo[i].axisPixelLengths.push_back(lexical_cast(m_allHeaderInfo[i].headerKeys[keyName])); - } - - m_allHeaderInfo[i].tof = lexical_cast(m_allHeaderInfo[i].headerKeys["TOF"]); - m_allHeaderInfo[i].timeBin = lexical_cast(m_allHeaderInfo[i].headerKeys["TIMEBIN"]); - m_allHeaderInfo[i].countsInImage = lexical_cast(m_allHeaderInfo[i].headerKeys["N_COUNTS"]); - m_allHeaderInfo[i].numberOfTriggers = lexical_cast(m_allHeaderInfo[i].headerKeys["N_TRIGS"]); - m_allHeaderInfo[i].extension = m_allHeaderInfo[i].headerKeys["XTENSION"]; // Various extensions are available to the FITS format, and must be parsed differently if this is present. Loader doesn't support this. - - } - catch(std::exception &) - { - //todo write error and fail this load with invalid data in file. - g_log.error("Unable to locate one or more valid BITPIX, NAXIS, TOF, TIMEBIN, N_COUNTS or N_TRIGS values in the FITS file header."); - throw std::runtime_error("Unable to locate one or more valid BITPIX, NAXIS, TOF, TIMEBIN, N_COUNTS or N_TRIGS values in the FITS file header."); - } - - if(m_allHeaderInfo[i].extension != "") headerValid = false; - if(m_allHeaderInfo[i].numberOfAxis != 2) headerValid = false; - - // Test current item has same axis values as first item. - if(m_allHeaderInfo[0].axisPixelLengths[0] != m_allHeaderInfo[i].axisPixelLengths[0]) headerValid = false; - if(m_allHeaderInfo[0].axisPixelLengths[1] != m_allHeaderInfo[i].axisPixelLengths[1]) headerValid = false; - } - else - { - // Unable to parse the header, throw. - g_log.error("Unable to open the FITS file."); - throw std::runtime_error("Unable to open the FITS file."); - } - - } - - // Check that the files use bit depths of either 8, 16 or 32 - if(m_allHeaderInfo[0].bitsPerPixel != 8 && m_allHeaderInfo[0].bitsPerPixel != 16 && m_allHeaderInfo[0].bitsPerPixel != 32) - { - g_log.error("FITS Loader only supports 8, 16 or 32 bits per pixel."); - throw std::runtime_error("FITS loader only supports 8, 16 or 32 bits per pixel."); - } - - // Check the format is correct and create the Workspace - if(headerValid) - { - // No extension is set, therefore it's the standard format which we can parse. - - // Delete the output workspace name if it existed - std::string outName = getPropertyValue("OutputWorkspace"); - if (AnalysisDataService::Instance().doesExist(outName)) AnalysisDataService::Instance().remove(outName); - - MatrixWorkspace_sptr ws; - - ws = initAndPopulateHistogramWorkspace(); - - // Assign it to the output workspace property - setProperty("OutputWorkspace",ws); - } - else - { - // Invalid files, record error - g_log.error("Loader currently doesn't support FITS files with non-standard extensions, greater than two axis of data, or has detected that all the files are not similar."); - throw std::runtime_error("Loader currently doesn't support FITS files with non-standard extensions, greater than two axis of data, or has detected that all the files are not similar."); - } - } - - /** - * Read a single files header and populate an object with the information - * @param headerInfo A FITSInfo file object to parse header information into - * @returns A bool specifying succes of the operation - */ - bool LoadFITS::parseHeader(FITSInfo &headerInfo) - { - bool ranSuccessfully = true; - try - { - ifstream istr(headerInfo.filePath.c_str(), ios::binary); - Poco::BinaryReader reader(istr); - - // Iterate 80 bytes at a time until header is parsed | 2880 bytes is the fixed header length of FITS - // 2880/80 = 36 iterations required - for(int i=0; i < 36; ++i) - { - // Keep vect of each header item, including comments, and also keep a map of individual keys. - string part; - reader.readRaw(80,part); - headerInfo.headerItems.push_back(part); - - // Add key/values - these are separated by the = symbol. - // If it doesn't have an = it's a comment to ignore. All keys should be unique - auto eqPos = part.find('='); - if(eqPos > 0) - { - string key = part.substr(0, eqPos); - string value = part.substr(eqPos+1); - - // Comments are added after the value separated by a / symbol. Remove. - auto slashPos = value.find('/'); - if(slashPos > 0) value = value.substr(0, slashPos); + // Register the algorithm into the AlgorithmFactory + DECLARE_FILELOADER_ALGORITHM(LoadFITS); + + /** + * Return the confidence with with this algorithm can load the file + * @param descriptor A descriptor for the file + * @returns An integer specifying the confidence level. 0 indicates it will not be used + */ + int LoadFITS::confidence(Kernel::FileDescriptor & descriptor) const + { + // Should really improve this to check the file header (of first file at least) to make sure it contains the fields wanted + return (descriptor.extension() == ".fits" || descriptor.extension() == ".fit") ? 80 : 0; + } + + /** + * Initialise the algorithm. Declare properties which can be set before execution (input) or + * read from after the execution (output). + */ + void LoadFITS::init() + { + // Specify file extensions which can be associated with a FITS file. + std::vector exts; + + // Declare the Filename algorithm property. Mandatory. Sets the path to the file to load. + exts.clear(); + exts.push_back(".fits"); + exts.push_back(".fit"); + + declareProperty(new MultipleFileProperty("Filename", exts), "The input filename of the stored data"); + declareProperty(new PropertyWithValue("FileChunkSize", 100, Direction::Input), "Number of files to read into memory at a time - use lower values for machines with low memory"); + + declareProperty(new API::WorkspaceProperty("OutputWorkspace", "", Kernel::Direction::Output)); + } + + /** + * Execute the algorithm. + */ + void LoadFITS::exec() + { + // Create FITS file information for each file selected + std::vector paths; + string fName = getPropertyValue("Filename"); + boost::split(paths, fName, boost::is_any_of(",")); + m_binChunkSize = getProperty("FileChunkSize"); + + // If paths contains a non fits file, assume (for now) that it contains information about the rotations + std::string rotFilePath = ""; + std::vector::iterator it = std::find_if(paths.begin(),paths.end(),IsNotFits); + if(it != paths.end()) + { + rotFilePath = *it; + paths.erase(it); + } + + // Shrink chunk size to match number of files if it's over the amount (less memory allocated later) + if(m_binChunkSize > paths.size()) m_binChunkSize = static_cast(paths.size()); + + m_allHeaderInfo.resize(paths.size()); + + // Check each header is valid for this loader, - standard (no extension to FITS), and has two axis + bool headerValid = true; + + for(size_t i=0; i(tmpBitPix); + m_allHeaderInfo[i].numberOfAxis = lexical_cast(m_allHeaderInfo[i].headerKeys["NAXIS"]); + + for(int j=0; j(j+1); + m_allHeaderInfo[i].axisPixelLengths.push_back(lexical_cast(m_allHeaderInfo[i].headerKeys[keyName])); + } + + //m_allHeaderInfo[i].tof = lexical_cast(m_allHeaderInfo[i].headerKeys["TOF"]); + //m_allHeaderInfo[i].timeBin = lexical_cast(m_allHeaderInfo[i].headerKeys["TIMEBIN"]); + //m_allHeaderInfo[i].countsInImage = lexical_cast(m_allHeaderInfo[i].headerKeys["N_COUNTS"]); + //m_allHeaderInfo[i].numberOfTriggers = lexical_cast(m_allHeaderInfo[i].headerKeys["N_TRIGS"]); + m_allHeaderInfo[i].extension = m_allHeaderInfo[i].headerKeys["XTENSION"]; // Various extensions are available to the FITS format, and must be parsed differently if this is present. Loader doesn't support this. + + } + catch(std::exception &) + { + //todo write error and fail this load with invalid data in file. + throw std::runtime_error("Unable to locate one or more valid BITPIX, NAXIS, TOF, TIMEBIN, N_COUNTS or N_TRIGS values in the FITS file header."); + } + + if(m_allHeaderInfo[i].extension != "") headerValid = false; + if(m_allHeaderInfo[i].numberOfAxis != 2) headerValid = false; + + // Test current item has same axis values as first item. + if(m_allHeaderInfo[0].axisPixelLengths[0] != m_allHeaderInfo[i].axisPixelLengths[0]) headerValid = false; + if(m_allHeaderInfo[0].axisPixelLengths[1] != m_allHeaderInfo[i].axisPixelLengths[1]) headerValid = false; + } + else + { + // Unable to parse the header, throw. + throw std::runtime_error("Unable to open the FITS file."); + } + + } + + // Check that the files use bit depths of either 8, 16 or 32 + if(m_allHeaderInfo[0].bitsPerPixel != 8 && m_allHeaderInfo[0].bitsPerPixel != 16 && m_allHeaderInfo[0].bitsPerPixel != 32) + { + throw std::runtime_error("FITS loader only supports 8, 16 or 32 bits per pixel."); + } + + // Check the format is correct and create the Workspace + if(headerValid) + { + // No extension is set, therefore it's the standard format which we can parse. + + // Delete the output workspace name if it existed + std::string outName = getPropertyValue("OutputWorkspace"); + if (AnalysisDataService::Instance().doesExist(outName)) AnalysisDataService::Instance().remove(outName); + + MatrixWorkspace_sptr ws; + + ws = initAndPopulateHistogramWorkspace(); + + // Set info in WS log to hold rotational information + if(rotFilePath != "") + { + string csvRotations = ReadRotations(rotFilePath, paths.size()); + Run &theRun = ws->mutableRun(); + theRun.addLogData(new PropertyWithValue("Rotations", csvRotations)); + } + + // Assign it to the output workspace property + setProperty("OutputWorkspace",ws); + } + else + { + // Invalid files, record error + throw std::runtime_error("Loader currently doesn't support FITS files with non-standard extensions, greater than two axis of data, or has detected that all the files are not similar."); + } + } + + /** + * Read a single files header and populate an object with the information + * @param headerInfo A FITSInfo file object to parse header information into + * @returns A bool specifying succes of the operation + */ + bool LoadFITS::parseHeader(FITSInfo &headerInfo) + { + bool ranSuccessfully = true; + try + { + ifstream istr(headerInfo.filePath.c_str(), ios::binary); + Poco::BinaryReader reader(istr); + + // Iterate 80 bytes at a time until header is parsed | 2880 bytes is the fixed header length of FITS + // 2880/80 = 36 iterations required + for(int i=0; i < 36; ++i) + { + // Keep vect of each header item, including comments, and also keep a map of individual keys. + string part; + reader.readRaw(80,part); + headerInfo.headerItems.push_back(part); + + // Add key/values - these are separated by the = symbol. + // If it doesn't have an = it's a comment to ignore. All keys should be unique + auto eqPos = part.find('='); + if(eqPos > 0) + { + string key = part.substr(0, eqPos); + string value = part.substr(eqPos+1); + + // Comments are added after the value separated by a / symbol. Remove. + auto slashPos = value.find('/'); + if(slashPos > 0) value = value.substr(0, slashPos); - boost::trim(key); - boost::trim(value); - headerInfo.headerKeys[key] = value; - } - } - - istr.close(); - } - catch(...) - { - // Unable to read the file - ranSuccessfully = false; - } - - return ranSuccessfully; - } - - /** - * Create histogram workspace - * @returns Created workspace - */ - MatrixWorkspace_sptr LoadFITS::initAndPopulateHistogramWorkspace() - { - MantidVecPtr x; - x.access().resize(m_allHeaderInfo.size() + 1); - - // Init time bins - double binCount = 0; - for(size_t i=0;i 0) spectraCount += m_allHeaderInfo[0].axisPixelLengths[0]; - - // Presumably 2 axis, but futureproofing. - for(int i=1;iinitialize(spectraCount, m_allHeaderInfo.size()+1, m_allHeaderInfo.size()); - - IAlgorithm_sptr loadInst = createChildAlgorithm("LoadInstrument"); + boost::trim(key); + boost::trim(value); + headerInfo.headerKeys[key] = value; + } + } + + istr.close(); + } + catch(...) + { + // Unable to read the file + ranSuccessfully = false; + } + + return ranSuccessfully; + } + + /** + * Create histogram workspace + * @returns Created workspace + */ + MatrixWorkspace_sptr LoadFITS::initAndPopulateHistogramWorkspace() + { + MantidVecPtr x; + x.access().resize(m_allHeaderInfo.size() + 1); + + // Init time bins + double binCount = 0; + for(size_t i=0;i 0) spectraCount += m_allHeaderInfo[0].axisPixelLengths[0]; + + // Presumably 2 axis, but futureproofing. + for(int i=1;iinitialize(spectraCount, m_allHeaderInfo.size()+1, m_allHeaderInfo.size()); + + IAlgorithm_sptr loadInst = createChildAlgorithm("LoadInstrument"); - try - { - std::string directoryName = Kernel::ConfigService::Instance().getInstrumentDirectory(); - directoryName = directoryName + "/IMAT_Definition.xml"; - - loadInst->setPropertyValue("Filename", directoryName); - loadInst->setProperty("Workspace", retVal); - loadInst->execute(); - } - catch (std::exception & ex) - { - g_log.information("Cannot load the instrument definition. " + string(ex.what()) ); - } - - int bitsPerPixel = m_allHeaderInfo[0].bitsPerPixel; // assumes all files have the same, which they should. - vector > yVals(spectraCount, std::vector(m_binChunkSize)); - vector > eVals(spectraCount, std::vector(m_binChunkSize)); - - // allocate memory to contain the data section of the file: - void * bufferAny = NULL; - bufferAny = malloc ((bitsPerPixel/8)*spectraCount); - - if (bufferAny == NULL) - { - throw std::runtime_error("FITS loader couldn't allocate enough memory to run. Try a smaller chunk size."); - } - - size_t steps = static_cast(ceil(m_allHeaderInfo.size()/m_binChunkSize)); - Progress prog(this,0.0,1.0,steps); - - // Load a chunk of files at a time into workspace - try - { - for(size_t i=0; imutableRun().addProperty("Filename", m_allHeaderInfo[0].filePath); - - // Set the Unit of the X Axis - try - { - retVal->getAxis(0)->unit() = UnitFactory::Instance().create("TOF"); - } - catch ( Exception::NotFoundError & ) - { - retVal->getAxis(0)->unit() = UnitFactory::Instance().create("Label"); - Unit_sptr unit = retVal->getAxis(0)->unit(); - boost::shared_ptr label = boost::dynamic_pointer_cast(unit); - label->setLabel("TOF", "TOF"); - } - - retVal->setYUnit("Counts"); - retVal->setTitle("Test Workspace"); - - return retVal; - } - - /** - * Loads data from a selection of the FITS files into the workspace - * @param workspace The workspace to insert data into - * @param yVals Reference to a pre-allocated vector to hold data values for the workspace - * @param eVals Reference to a pre-allocated vector to hold error values for the workspace - * @param bufferAny Pointer to an allocated memory region which will hold a files worth of data - * @param x Vector holding the X bin values - * @param spectraCount Number of data points in each file - * @param bitsPerPixel Number of bits used to represent one data point - * @param binChunkStartIndex Index for the first file to be processed in this chunk - */ - void LoadFITS::loadChunkOfBinsFromFile(MatrixWorkspace_sptr &workspace, vector > &yVals, vector > &eVals, void *&bufferAny, MantidVecPtr &x, size_t spectraCount, int bitsPerPixel, size_t binChunkStartIndex) - { - size_t binsThisChunk = m_binChunkSize; - if((binChunkStartIndex + m_binChunkSize) > m_allHeaderInfo.size()) - { - // No need to do extra processing if number of bins to process is lower than m_binChunkSize - // Also used to prevent out of bounds error where a greater number of elements have been reserved. - binsThisChunk = static_cast(m_allHeaderInfo.size() - binChunkStartIndex); - } - - uint8_t *buffer8 = NULL; - uint16_t *buffer16 = NULL; - uint32_t *buffer32 = NULL; - - // create pointer of correct data type to void pointer of the buffer: - buffer8 = static_cast(bufferAny); - buffer16 = static_cast(bufferAny); - buffer32 = static_cast(bufferAny); - - for(size_t i=binChunkStartIndex; i < binChunkStartIndex+binsThisChunk ; ++i) - { - // Read Data - bool fileErr = false; - FILE * currFile = fopen ( m_allHeaderInfo[i].filePath.c_str(), "rb" ); - if (currFile==NULL) fileErr = true; - - size_t result = 0; - if(!fileErr) - { - fseek (currFile , FIXED_HEADER_SIZE , SEEK_CUR); - result = fread(bufferAny, bitsPerPixel/8, spectraCount, currFile); - } - - if (result != spectraCount) fileErr = true; - - if(fileErr) - { - throw std::runtime_error("Error reading file; possibly invalid data."); - } - - for(size_t j=0; j(buffer8[j]); - if(bitsPerPixel == 16) val = static_cast(buffer16[j]); - if(bitsPerPixel == 32) val = static_cast(buffer32[j]); - - yVals[j][i-binChunkStartIndex] = val; - eVals[j][i-binChunkStartIndex] = sqrt(val); - } - - // Clear memory associated with the file load - fclose (currFile); - } - - // Now load chunk into workspace - PARALLEL_FOR1(workspace) - for (int64_t wi = 0; wi < static_cast(spectraCount); ++wi) - { - workspace->setX(wi, x); - MantidVec *currY = &workspace->dataY(wi); - MantidVec *currE = &workspace->dataE(wi); - - std::copy(yVals[wi].begin(), yVals[wi].end()-(m_binChunkSize-binsThisChunk), currY->begin()+binChunkStartIndex ); - std::copy(eVals[wi].begin(), eVals[wi].end()-(m_binChunkSize-binsThisChunk), currE->begin()+binChunkStartIndex ); - - // I expect this will be wanted once IDF is in a more useful state. - //workspace->getSpectrum(wi)->setDetectorID(detid_t(wi)); - //workspace->getSpectrum(wi)->setSpectrumNo(specid_t(wi+1)); - } - } + try + { + std::string directoryName = Kernel::ConfigService::Instance().getInstrumentDirectory(); + directoryName = directoryName + "/IMAT_Definition.xml"; + + loadInst->setPropertyValue("Filename", directoryName); + loadInst->setProperty("Workspace", retVal); + loadInst->execute(); + } + catch (std::exception & ex) + { + g_log.information("Cannot load the instrument definition. " + string(ex.what()) ); + } + + int bitsPerPixel = m_allHeaderInfo[0].bitsPerPixel; // assumes all files have the same, which they should. + vector > yVals(spectraCount, std::vector(m_binChunkSize)); + vector > eVals(spectraCount, std::vector(m_binChunkSize)); + + // allocate memory to contain the data section of the file: + void * bufferAny = NULL; + bufferAny = malloc ((bitsPerPixel/8)*spectraCount); + + if (bufferAny == NULL) + { + throw std::runtime_error("FITS loader couldn't allocate enough memory to run. Try a smaller chunk size."); + } + + size_t steps = static_cast(ceil(m_allHeaderInfo.size()/m_binChunkSize)); + Progress prog(this,0.0,1.0,steps); + + // Load a chunk of files at a time into workspace + try + { + for(size_t i=0; imutableRun().addProperty("Filename", m_allHeaderInfo[0].filePath); + + // Set the Unit of the X Axis + try + { + retVal->getAxis(0)->unit() = UnitFactory::Instance().create("TOF"); + } + catch ( Exception::NotFoundError & ) + { + retVal->getAxis(0)->unit() = UnitFactory::Instance().create("Label"); + Unit_sptr unit = retVal->getAxis(0)->unit(); + boost::shared_ptr label = boost::dynamic_pointer_cast(unit); + label->setLabel("TOF", "TOF"); + } + + retVal->setYUnit("Counts"); + retVal->setTitle("Test Workspace"); + + return retVal; + } + + /** + * Loads data from a selection of the FITS files into the workspace + * @param workspace The workspace to insert data into + * @param yVals Reference to a pre-allocated vector to hold data values for the workspace + * @param eVals Reference to a pre-allocated vector to hold error values for the workspace + * @param bufferAny Pointer to an allocated memory region which will hold a files worth of data + * @param x Vector holding the X bin values + * @param spectraCount Number of data points in each file + * @param bitsPerPixel Number of bits used to represent one data point + * @param binChunkStartIndex Index for the first file to be processed in this chunk + */ + void LoadFITS::loadChunkOfBinsFromFile(MatrixWorkspace_sptr &workspace, vector > &yVals, vector > &eVals, void *&bufferAny, MantidVecPtr &x, size_t spectraCount, int bitsPerPixel, size_t binChunkStartIndex) + { + size_t binsThisChunk = m_binChunkSize; + if((binChunkStartIndex + m_binChunkSize) > m_allHeaderInfo.size()) + { + // No need to do extra processing if number of bins to process is lower than m_binChunkSize + // Also used to prevent out of bounds error where a greater number of elements have been reserved. + binsThisChunk = static_cast(m_allHeaderInfo.size() - binChunkStartIndex); + } + + uint8_t *buffer8 = NULL; + uint16_t *buffer16 = NULL; + uint32_t *buffer32 = NULL; + + // create pointer of correct data type to void pointer of the buffer: + buffer8 = static_cast(bufferAny); + buffer16 = static_cast(bufferAny); + buffer32 = static_cast(bufferAny); + + for(size_t i=binChunkStartIndex; i < binChunkStartIndex+binsThisChunk ; ++i) + { + // Read Data + bool fileErr = false; + FILE * currFile = fopen ( m_allHeaderInfo[i].filePath.c_str(), "rb" ); + if (currFile==NULL) fileErr = true; + + size_t result = 0; + if(!fileErr) + { + fseek (currFile , FIXED_HEADER_SIZE , SEEK_CUR); + result = fread(bufferAny, bitsPerPixel/8, spectraCount, currFile); + } + + if (result != spectraCount) fileErr = true; + + if(fileErr) + { + throw std::runtime_error("Error reading file; possibly invalid data."); + } + + for(size_t j=0; j(buffer8[j]); + if(bitsPerPixel == 16) val = static_cast(buffer16[j]); + if(bitsPerPixel == 32) val = static_cast(buffer32[j]); + + yVals[j][i-binChunkStartIndex] = val; + eVals[j][i-binChunkStartIndex] = sqrt(val); + } + + // Clear memory associated with the file load + fclose (currFile); + } + + // Now load chunk into workspace + PARALLEL_FOR1(workspace) + for (int64_t wi = 0; wi < static_cast(spectraCount); ++wi) + { + workspace->setX(wi, x); + MantidVec *currY = &workspace->dataY(wi); + MantidVec *currE = &workspace->dataE(wi); + + std::copy(yVals[wi].begin(), yVals[wi].end()-(m_binChunkSize-binsThisChunk), currY->begin()+binChunkStartIndex ); + std::copy(eVals[wi].begin(), eVals[wi].end()-(m_binChunkSize-binsThisChunk), currE->begin()+binChunkStartIndex ); + + // I expect this will be wanted once IDF is in a more useful state. + //workspace->getSpectrum(wi)->setDetectorID(detid_t(wi)); + //workspace->getSpectrum(wi)->setSpectrumNo(specid_t(wi+1)); + } + } + + /** + * Reads a file containing rotation values for each image into a comma separated string + * @param rotFilePath The path to a file containing rotation values + * @param fileCount number of images which should have corresponding rotation values in the file + * + * @returns string A comma separated string of doubles + */ + std::string LoadFITS::ReadRotations(std::string rotFilePath, size_t fileCount) + { + ifstream fStream(rotFilePath); + std::string csvRotations = ""; + + try + { + // Ensure valid file + if(fStream.good()) + { + // Get lines, split words, verify and add to map. + string line; + vector lineSplit; + size_t ind = -1; + while(getline(fStream, line)) + { + ind++; + boost::split(lineSplit,line, boost::is_any_of("\t")); + + if(ind==0 || lineSplit[0] == "") + continue; // Skip first iteration or where rotation value is empty + + if(ind!=1) // append a comma to separate values if not the first index + csvRotations += ","; + + csvRotations += lineSplit[1]; + } + + // Check the number of rotations in file matches number of files + if(ind != fileCount) + throw std::runtime_error("File error, throw higher up."); + + fStream.close(); + } + else + { + throw std::runtime_error("File error, throw higher up."); + } + } + catch(...) + { + throw std::runtime_error("Invalid file path or file format: Expected a file with a line separated list of rotations with the same number of entries as other files."); + } + + return csvRotations; + } + } } - diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp index 836047e6fb05..70b590cd7334 100644 --- a/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SaveNXTomo.cpp @@ -152,19 +152,38 @@ namespace Mantid // TODO: Write sample info // name - std::vector rotationAngles(dims_array[0]); // Initialise rotations - if unknown, fill with equal steps from 0 to 180 over all frames. - // TODO: collect and use actual rotation values - - double step = static_cast(180/dims_array[0]); - rotationAngles[0] = step; + std::vector rotationAngles(dims_array[0]); + std::string rotValues = ""; + std::vector rotSplit; - for(auto it = rotationAngles.begin()+1; it != rotationAngles.end(); ++it) + if(inputWS->run().hasProperty("Rotations")) + { + rotValues = inputWS->run().getLogData("Rotations")->value(); + boost::split(rotSplit, rotValues, boost::is_any_of(",")); + } + + if(rotSplit.size() == static_cast(dims_array[0]) ) + { + for(size_t i=0; i(rotSplit[i]); + } + } + else { - *it = (*(it-1)) + step; + // Make some fake values + g_log.notice("Unable to find a correctly formatted rotation angle file with same entry count as input; creating fake values."); + double step = static_cast(180/dims_array[0]); + rotationAngles[0] = step; + + for(auto it = rotationAngles.begin()+1; it != rotationAngles.end(); ++it) + { + *it = (*(it-1)) + step; + } } - nxFile.writeData("rotation_angle", rotationAngles); + nxFile.writeData("rotation_angle", rotationAngles); // Create a link object for rotation_angle to use later nxFile.openData("rotation_angle"); From 790c02e8a1ac804bd528f87eab68d90cc045571d Mon Sep 17 00:00:00 2001 From: Raquel Alvarez Banos Date: Thu, 23 Oct 2014 09:16:23 +0100 Subject: [PATCH 162/284] Add log entry values to graph Re #5354 --- Code/Mantid/MantidPlot/src/LabelTool.cpp | 21 +++++++++++++++++++-- Code/Mantid/MantidPlot/src/LabelTool.h | 3 ++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/MantidPlot/src/LabelTool.cpp b/Code/Mantid/MantidPlot/src/LabelTool.cpp index 06db0963ebc0..b57a34d76aff 100644 --- a/Code/Mantid/MantidPlot/src/LabelTool.cpp +++ b/Code/Mantid/MantidPlot/src/LabelTool.cpp @@ -290,7 +290,9 @@ void LabelTool::blankRegionClicked() foreach(QString wsName, workspaceNames()) { - workspaces->addAction(new QAction(tr(wsName), this)); + QAction * qa = new QAction(tr(wsName),this); + workspaces->addAction(qa); + connect(qa,SIGNAL(triggered()),this,SLOT(insertLegend())); } // For viewing log values. @@ -298,7 +300,9 @@ void LabelTool::blankRegionClicked() foreach(QString logProperty, logValues()) { - logVals->addAction(new QAction(tr(logProperty), this)); + QAction * qa = new QAction(tr(logProperty),this); + logVals->addAction(qa); + connect(qa,SIGNAL(triggered()),this,SLOT(insertLegend())); } clickMenu->exec(QCursor::pos()); @@ -366,6 +370,19 @@ void LabelTool::dataPointClicked() clickMenu->exec(QCursor::pos()); } +/// Creates a label with size equal to the axisFont size +void LabelTool::insertLegend() +{ + QAction *action = qobject_cast(sender()); + if (action) + { + LegendWidget *label = new LegendWidget(d_graph->plotWidget()); + label->setOriginCoord(m_xPos,m_yPos); + label->setFont(d_graph->axisFont(0)); + label->setText(action->text()); + } +} + /// Displays a dialog box to input the contents of a label, then creates the label. void LabelTool::insertTextBox() { diff --git a/Code/Mantid/MantidPlot/src/LabelTool.h b/Code/Mantid/MantidPlot/src/LabelTool.h index 1ecc4848944f..2a6134e969bc 100644 --- a/Code/Mantid/MantidPlot/src/LabelTool.h +++ b/Code/Mantid/MantidPlot/src/LabelTool.h @@ -92,7 +92,8 @@ private slots: void xAxisClicked(const QwtPolygon &); void yAxisClicked(const QwtPolygon &); - void insertTextBox(); + void insertLegend(); + void insertTextBox(); void insertXCoord(); void insertYCoord(); void insertDataCoord(); From bbc9bd655ad5522a16982696d10cf8f26d7738f9 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Oct 2014 09:12:27 +0100 Subject: [PATCH 163/284] Refs #10348 Tidy up HintingLineEdit * Reorder and rename some methods for clarity * Improve commenting --- .../MantidQtMantidWidgets/HintingLineEdit.h | 8 +-- .../MantidWidgets/src/HintingLineEdit.cpp | 71 +++++++++++-------- 2 files changed, 45 insertions(+), 34 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h index b5711092c7f5..ab4821d7699c 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h @@ -24,8 +24,9 @@ namespace MantidQt virtual ~HintingLineEdit(); protected: virtual void keyPressEvent(QKeyEvent* e); - void insertSuggestion(); void updateMatches(); + void showToolTip(); + void insertSuggestion(); void clearSuggestion(); void nextSuggestion(); void prevSuggestion(); @@ -34,9 +35,8 @@ namespace MantidQt std::map m_matches; std::map m_hints; bool m_dontComplete; - public slots: - void showHint(); - void updateHint(const QString& text); + protected slots: + void updateHints(const QString& text); }; } //namespace MantidWidgets } //namepsace MantidQt diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp index a798d0df1e6e..083646c4bd6d 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp @@ -7,10 +7,9 @@ namespace MantidQt { namespace MantidWidgets { - HintingLineEdit::HintingLineEdit(QWidget *parent, const std::map &hints) : QLineEdit(parent), m_hints(hints), m_dontComplete(false) { - connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(updateHint(const QString&))); + connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(updateHints(const QString&))); } HintingLineEdit::~HintingLineEdit() @@ -24,6 +23,7 @@ namespace MantidQt if(e->key() == Qt::Key_Up) { prevSuggestion(); + return; } if(e->key() == Qt::Key_Down) @@ -34,6 +34,35 @@ namespace MantidQt QLineEdit::keyPressEvent(e); } + void HintingLineEdit::updateHints(const QString& text) + { + const size_t curPos = (size_t)cursorPosition(); + const std::string line = text.toStdString(); + + //Get everything before the cursor + std::string prefix = line.substr(0, curPos); + + //Now remove everything before the last ',' to give us the current word + std::size_t startPos = prefix.find_last_of(","); + if(startPos != std::string::npos) + prefix = prefix.substr(startPos + 1, prefix.size() - (startPos + 1)); + + //Remove any leading or trailing whitespace + boost::trim(prefix); + + //Set the current key/prefix + m_curKey = prefix; + + //Update our current list of matches + updateMatches(); + + //Show the potential matches in a tooltip + showToolTip(); + + //Suggest one of them to the user via auto-completion + insertSuggestion(); + } + void HintingLineEdit::updateMatches() { m_curMatch.clear(); @@ -53,22 +82,13 @@ namespace MantidQt } } - void HintingLineEdit::updateHint(const QString& text) + void HintingLineEdit::showToolTip() { - const size_t curPos = (size_t)cursorPosition(); - const std::string line = text.toStdString(); - - //Get text from start -> cursor - std::string prefix = line.substr(0, curPos); - - std::size_t startPos = prefix.find_last_of(","); - if(startPos != std::string::npos) - prefix = prefix.substr(startPos + 1, prefix.size() - (startPos + 1)); - - boost::trim(prefix); + QString hintList; + for(auto mIt = m_matches.begin(); mIt != m_matches.end(); ++mIt) + hintList += QString::fromStdString(mIt->first) + " : " + QString::fromStdString(mIt->second) + "\n"; - m_curKey = prefix; - showHint(); + QToolTip::showText(mapToGlobal(QPoint(0, 5)), hintList.trimmed()); } void HintingLineEdit::insertSuggestion() @@ -76,6 +96,7 @@ namespace MantidQt if(m_curKey.length() < 1 || m_matches.size() < 1 || m_dontComplete) return; + //If we don't have a match, just use the first one in the map if(m_curMatch.empty()) m_curMatch = m_matches.begin()->first; @@ -86,6 +107,7 @@ namespace MantidQt if(curPos + 1 < line.size() && line[curPos+1].isLetterOrNumber()) return; + //Insert a suggestion under the cursor, then select it line = line.left(curPos) + QString::fromStdString(m_curMatch).mid((int)m_curKey.size()) + line.mid(curPos); setText(line); @@ -97,7 +119,7 @@ namespace MantidQt if(!hasSelectedText()) return; - //Remove the selected text + //Carefully cut out the selected text QString line = text(); line = line.left(selectionStart()) + line.mid(selectionStart() + selectedText().length()); setText(line); @@ -106,6 +128,7 @@ namespace MantidQt void HintingLineEdit::nextSuggestion() { clearSuggestion(); + //Find the next suggestion in the hint map auto it = m_matches.find(m_curMatch); if(it != m_matches.end()) { @@ -121,6 +144,7 @@ namespace MantidQt void HintingLineEdit::prevSuggestion() { clearSuggestion(); + //Find the previous suggestion in the hint map auto it = m_matches.find(m_curMatch); if(it != m_matches.end()) { @@ -132,18 +156,5 @@ namespace MantidQt insertSuggestion(); } } - - void HintingLineEdit::showHint() - { - updateMatches(); - - QString hintList; - for(auto mIt = m_matches.begin(); mIt != m_matches.end(); ++mIt) - hintList += QString::fromStdString(mIt->first) + " : " + QString::fromStdString(mIt->second) + "\n"; - - QToolTip::showText(mapToGlobal(QPoint(0, 5)), hintList.trimmed()); - - insertSuggestion(); - } } //namespace MantidWidgets } //namepsace MantidQt From aa64548b4fb656b1ffccb93c7758ca852fe4b578 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Oct 2014 09:34:48 +0100 Subject: [PATCH 164/284] Refs #10348 Add copyright headers and doxygen comments --- .../AlgorithmHintStrategy.h | 22 +++++++++++++++ .../inc/MantidQtMantidWidgets/HintStrategy.h | 27 ++++++++++++++++++- .../MantidQtMantidWidgets/HintingLineEdit.h | 22 +++++++++++++++ .../HintingLineEditFactory.h | 22 +++++++++++++++ .../MantidWidgets/src/HintingLineEdit.cpp | 15 +++++++++++ 5 files changed, 107 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h index 161168e5c460..d4cc24b80664 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h @@ -10,6 +10,28 @@ namespace MantidQt { namespace CustomInterfaces { + /** AlgorithmHintStrategy : Produces hints using a given algorithm's properties. + + Copyright © 2014 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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. + + Mantid 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, see . + + File change history is stored at: + Code Documentation is available at: + */ class AlgorithmHintStrategy : public HintStrategy { public: diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h index 9fbe15852f13..204ba658e372 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h @@ -8,13 +8,38 @@ namespace MantidQt { namespace CustomInterfaces { + /** HintStrategy : Provides an interface for generating hints to be used by a HintingLineEdit. + + Copyright © 2014 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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. + + Mantid 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, see . + + File change history is stored at: + Code Documentation is available at: + */ class HintStrategy { public: HintStrategy() {}; virtual ~HintStrategy() {}; - //Provides a map of hints to be used by a HintingLineEdit widget + /** Create a list of hints for auto completion + + @returns A map of keywords to short descriptions for the keyword. + */ virtual std::map createHints() = 0; }; } diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h index ab4821d7699c..377573916d05 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h @@ -16,6 +16,28 @@ namespace MantidQt { namespace MantidWidgets { + /** HintingLineEdit : A QLineEdit widget providing autocompletion. + + Copyright © 2014 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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. + + Mantid 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, see . + + File change history is stored at: + Code Documentation is available at: + */ class EXPORT_OPT_MANTIDQT_MANTIDWIDGETS HintingLineEdit : public QLineEdit { Q_OBJECT diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h index ecf8f839026a..e63ddcebcc49 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h @@ -15,6 +15,28 @@ namespace MantidQt { namespace CustomInterfaces { + /** HintingLineEditFactory : A QStyledItemDelegate that produces HintingLineEdits using the given hint strategy. + + Copyright © 2014 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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. + + Mantid 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, see . + + File change history is stored at: + Code Documentation is available at: + */ class HintingLineEditFactory : public QStyledItemDelegate { public: diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp index 083646c4bd6d..be2abe0b1379 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp @@ -16,6 +16,10 @@ namespace MantidQt { } + /** Handle a key press event. + + @param e : A pointer to the event + */ void HintingLineEdit::keyPressEvent(QKeyEvent* e) { m_dontComplete = (e->key() == Qt::Key_Backspace || e->key() == Qt::Key_Delete || e->key() == Qt::Key_Space); @@ -34,6 +38,11 @@ namespace MantidQt QLineEdit::keyPressEvent(e); } + /** Rebuild a list of hints whenever the user edits the text, and use the hints + to make auto completion suggestions. + + @param text : The new contents of the QLineEdit + */ void HintingLineEdit::updateHints(const QString& text) { const size_t curPos = (size_t)cursorPosition(); @@ -63,6 +72,7 @@ namespace MantidQt insertSuggestion(); } + /** Updates the list of hints matching the user's current input */ void HintingLineEdit::updateMatches() { m_curMatch.clear(); @@ -82,6 +92,7 @@ namespace MantidQt } } + /** Show a tooltip with the current relevant hints */ void HintingLineEdit::showToolTip() { QString hintList; @@ -91,6 +102,7 @@ namespace MantidQt QToolTip::showText(mapToGlobal(QPoint(0, 5)), hintList.trimmed()); } + /** Insert an auto completion suggestion beneath the user's cursor and select it */ void HintingLineEdit::insertSuggestion() { if(m_curKey.length() < 1 || m_matches.size() < 1 || m_dontComplete) @@ -114,6 +126,7 @@ namespace MantidQt setSelection(curPos, (int)m_curMatch.size()); } + /** Remove any existing auto completion suggestion */ void HintingLineEdit::clearSuggestion() { if(!hasSelectedText()) @@ -125,6 +138,7 @@ namespace MantidQt setText(line); } + /** Change to the next available auto completion suggestion */ void HintingLineEdit::nextSuggestion() { clearSuggestion(); @@ -141,6 +155,7 @@ namespace MantidQt } } + /** Change to the previous auto completion suggestion */ void HintingLineEdit::prevSuggestion() { clearSuggestion(); From 740398fc7d947e2bed5744ebba2609e2e41927b4 Mon Sep 17 00:00:00 2001 From: Raquel Alvarez Banos Date: Thu, 23 Oct 2014 10:21:28 +0100 Subject: [PATCH 165/284] add log entry when data point clicked Re #5354 --- Code/Mantid/MantidPlot/src/LabelTool.cpp | 38 ++++++++---------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/Code/Mantid/MantidPlot/src/LabelTool.cpp b/Code/Mantid/MantidPlot/src/LabelTool.cpp index b57a34d76aff..48f7a4b2621c 100644 --- a/Code/Mantid/MantidPlot/src/LabelTool.cpp +++ b/Code/Mantid/MantidPlot/src/LabelTool.cpp @@ -334,39 +334,25 @@ void LabelTool::dataPointClicked() // For workspace information. QMenu * info = clickMenu->addMenu(tr("More info...")); - QMenu * workspaces = info->addMenu(tr("Workspace")); - - QAction * wsNameToDisplay = new QAction((tr(m_curveWsName)), this); - workspaces->addAction(wsNameToDisplay); - - - /* - - // Before final testing, make sure that when you select a datapoint, its respective Ws name is displayed + QMenu * workspaces = info->addMenu(tr("Workspaces")); foreach(QString wsName, workspaceNames()) { - QAction * wsNameToDisplay = new QAction((tr(wsName)), this); - workspaces->addAction(wsNameToDisplay); + QAction * qa = new QAction(tr(wsName),this); + workspaces->addAction(qa); + connect(qa,SIGNAL(triggered()),this,SLOT(insertLegend())); } - - // For displaying workspace title. - Mantid::API::Workspace *name; - std::string wsTitle = name->getTitle(); - - QMenu * workspaceTitle = workspaces->addMenu(tr(wsTitle), this); - */ - + // For viewing log values. + QMenu * logVals = info->addMenu(tr("Log values")); - // For viewing log values. - QMenu * logVals = info->addMenu(tr("Log values")); + foreach(QString logProperty, logValues()) + { + QAction * qa = new QAction(tr(logProperty),this); + logVals->addAction(qa); + connect(qa,SIGNAL(triggered()),this,SLOT(insertLegend())); + } - foreach(QString logProperty, logValues()) - { - logVals->addAction(new QAction(tr(logProperty), this)); - } - clickMenu->exec(QCursor::pos()); } From f4bba382b8567559dd9fb562e675e02e7e86c42f Mon Sep 17 00:00:00 2001 From: John Hill Date: Thu, 23 Oct 2014 10:45:45 +0100 Subject: [PATCH 166/284] Refs #10397 attempting to fix osx build --- Code/Mantid/Framework/DataHandling/src/LoadFITS.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadFITS.cpp b/Code/Mantid/Framework/DataHandling/src/LoadFITS.cpp index 904cc0eb0899..156624e62224 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadFITS.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadFITS.cpp @@ -427,7 +427,7 @@ namespace DataHandling */ std::string LoadFITS::ReadRotations(std::string rotFilePath, size_t fileCount) { - ifstream fStream(rotFilePath); + ifstream fStream(rotFilePath.c_str()); std::string csvRotations = ""; try From efb09799634ef6152a32cd07fed92f24e3faa87d Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Thu, 23 Oct 2014 10:57:45 +0100 Subject: [PATCH 167/284] Re #10390. Added image setting methods. --- .../API/inc/MantidAPI/MatrixWorkspace.h | 12 ++- .../Framework/API/src/MatrixWorkspace.cpp | 63 +++++++++++++ .../Framework/API/test/MatrixWorkspaceTest.h | 88 +++++++++++++++++++ 3 files changed, 161 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h b/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h index cad5a424c3bd..f8b18d632158 100644 --- a/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h +++ b/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h @@ -38,6 +38,8 @@ namespace Mantid typedef std::vector> MantidImage; /// shared pointer to MantidImage typedef boost::shared_ptr MantidImage_sptr; + /// shared pointer to const MantidImage + typedef boost::shared_ptr MantidImage_const_sptr; //---------------------------------------------------------------------- /** Base MatrixWorkspace Abstract Class. @@ -324,12 +326,16 @@ namespace Mantid // Image methods //===================================================================================== + /// Get start and end x indices for images + std::pair getImageStartEndXIndices( size_t i, double startX, double endX ) const; /// Create an image of Ys. MantidImage_sptr getImageY (size_t start = 0, size_t stop = 0, size_t width = 0, double startX = EMPTY_DBL(), double endX = EMPTY_DBL() ) const; /// Create an image of Es. MantidImage_sptr getImageE (size_t start = 0, size_t stop = 0, size_t width = 0, double startX = EMPTY_DBL(), double endX = EMPTY_DBL() ) const; - /// Get start and end x indices for images - std::pair getImageStartEndXIndices( size_t i, double startX, double endX ) const; + /// Copy the data (Y's) from an image to this workspace. + void setImageY( const MantidImage &image, size_t start = 0 ); + /// Copy the data from an image to this workspace's errors. + void setImageE( const MantidImage &image, size_t start = 0 ); //===================================================================================== // End image methods @@ -354,6 +360,8 @@ namespace Mantid MatrixWorkspace& operator=(const MatrixWorkspace&); /// Create an MantidImage instance. MantidImage_sptr getImage(const MantidVec& (MatrixWorkspace::*read)(std::size_t const) const, size_t start, size_t stop, size_t width, size_t indexStart, size_t indexEnd) const; + /// Copy data from an image. + void setImage( MantidVec& (MatrixWorkspace::*dataVec)(const std::size_t), const MantidImage &image, size_t start ); /// Has this workspace been initialised? bool m_isInitialized; diff --git a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp index 0cfbc850da79..89d0c103b42a 100644 --- a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp +++ b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp @@ -1927,6 +1927,69 @@ namespace Mantid return std::make_pair( nx, 0.0 ); } + /** + * Copy data from an image. + * @param dataVec :: A method returning non-const references to data vectors to copy the image to. + * @param image :: An image to copy the data from. + * @param start :: Startinf workspace indx to copy data to. + */ + void MatrixWorkspace::setImage( MantidVec& (MatrixWorkspace::*dataVec)(const std::size_t), const MantidImage &image, size_t start ) + { + + if ( image.empty() ) return; + if ( image[0].empty() ) return; + + if ( blocksize() != 1 ) + { + throw std::runtime_error("Cannot set image: a single bin workspace is expected."); + } + + size_t height = image.size(); + size_t width = image.front().size(); + size_t dataSize = width * height; + + if ( start + dataSize > getNumberHistograms() ) + { + throw std::runtime_error("Cannot set image: image is bigger than workspace."); + } + + size_t spec = start; + for(auto row = image.begin(); row != image.end(); ++row) + { + if ( row->size() != width ) + { + throw std::runtime_error("Canot set image: image is corrupted."); + } + auto rowBegin = row->begin(); + auto rowEnd = row->end(); + for(auto pixel = rowBegin; pixel != rowEnd; ++pixel,++spec) + { + (this->*dataVec)(spec)[0] = *pixel; + } + } + } + + /** + * Copy the data (Y's) from an image to this workspace. + * @param image :: An image to copy the data from. + * @param start :: Startinf workspace indx to copy data to. + */ + void MatrixWorkspace::setImageY( const MantidImage &image, size_t start ) + { + setImage( &MatrixWorkspace::dataY, image, start ); + } + + /** + * Copy the data from an image to this workspace's errors. + * @param image :: An image to copy the data from. + * @param start :: Startinf workspace indx to copy data to. + */ + void MatrixWorkspace::setImageE( const MantidImage &image, size_t start ) + { + setImage( &MatrixWorkspace::dataE, image, start ); + } + + } // namespace API } // Namespace Mantid diff --git a/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h b/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h index 2f8fc4dc51da..9824a77e5672 100644 --- a/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h +++ b/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h @@ -1183,7 +1183,95 @@ class MatrixWorkspaceTest : public CxxTest::TestSuite } + void test_setImage_too_large() + { + auto image = createImage(2,3); + WorkspaceTester ws; + ws.init(2,2,1); + TS_ASSERT_THROWS( ws.setImageY( *image ), std::runtime_error ); + } + + void test_setImage_not_single_bin() + { + auto image = createImage(2,3); + WorkspaceTester ws; + ws.init(20,3,2); + TS_ASSERT_THROWS( ws.setImageY( *image ), std::runtime_error ); + } + + void test_setImageY() + { + auto image = createImage(2,3); + WorkspaceTester ws; + ws.init(6,2,1); + TS_ASSERT_THROWS_NOTHING( ws.setImageY( *image ) ); + TS_ASSERT_EQUALS( ws.readY(0)[0], 1 ); + TS_ASSERT_EQUALS( ws.readY(1)[0], 2 ); + TS_ASSERT_EQUALS( ws.readY(2)[0], 3 ); + TS_ASSERT_EQUALS( ws.readY(3)[0], 4 ); + TS_ASSERT_EQUALS( ws.readY(4)[0], 5 ); + TS_ASSERT_EQUALS( ws.readY(5)[0], 6 ); + } + + void test_setImageE() + { + auto image = createImage(2,3); + WorkspaceTester ws; + ws.init(6,2,1); + TS_ASSERT_THROWS_NOTHING( ws.setImageE( *image ) ); + TS_ASSERT_EQUALS( ws.readE(0)[0], 1 ); + TS_ASSERT_EQUALS( ws.readE(1)[0], 2 ); + TS_ASSERT_EQUALS( ws.readE(2)[0], 3 ); + TS_ASSERT_EQUALS( ws.readE(3)[0], 4 ); + TS_ASSERT_EQUALS( ws.readE(4)[0], 5 ); + TS_ASSERT_EQUALS( ws.readE(5)[0], 6 ); + } + + void test_setImageY_start() + { + auto image = createImage(2,3); + WorkspaceTester ws; + ws.init(9,2,1); + TS_ASSERT_THROWS_NOTHING( ws.setImageY( *image, 3 ) ); + TS_ASSERT_EQUALS( ws.readY(3)[0], 1 ); + TS_ASSERT_EQUALS( ws.readY(4)[0], 2 ); + TS_ASSERT_EQUALS( ws.readY(5)[0], 3 ); + TS_ASSERT_EQUALS( ws.readY(6)[0], 4 ); + TS_ASSERT_EQUALS( ws.readY(7)[0], 5 ); + TS_ASSERT_EQUALS( ws.readY(8)[0], 6 ); + } + + void test_setImageE_start() + { + auto image = createImage(2,3); + WorkspaceTester ws; + ws.init(9,2,1); + TS_ASSERT_THROWS_NOTHING( ws.setImageE( *image, 2 ) ); + TS_ASSERT_EQUALS( ws.readE(2)[0], 1 ); + TS_ASSERT_EQUALS( ws.readE(3)[0], 2 ); + TS_ASSERT_EQUALS( ws.readE(4)[0], 3 ); + TS_ASSERT_EQUALS( ws.readE(5)[0], 4 ); + TS_ASSERT_EQUALS( ws.readE(6)[0], 5 ); + TS_ASSERT_EQUALS( ws.readE(7)[0], 6 ); + } + private: + + Mantid::API::MantidImage_sptr createImage(size_t width, size_t height) + { + auto image = new Mantid::API::MantidImage(height); + double value = 1.0; + for(auto row = image->begin(); row != image->end(); ++row) + { + row->resize( width ); + for(auto pixel = row->begin(); pixel != row->end(); ++pixel, value += 1.0) + { + *pixel = value; + } + } + return Mantid::API::MantidImage_sptr( image ); + } + boost::shared_ptr ws; }; From 11bdce3c2deeac5960ea09bc58d596fc2ba91e0b Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Thu, 23 Oct 2014 11:18:58 +0100 Subject: [PATCH 168/284] Re #10390. Changed loops to parallel --- .../Framework/API/src/MatrixWorkspace.cpp | 37 +++++++++++-------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp index 89d0c103b42a..5c97e14d21e3 100644 --- a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp +++ b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp @@ -1791,27 +1791,31 @@ namespace Mantid // deal separately with single-binned workspaces: no integration is required if ( isHisto && indexEnd == indexStart + 1 ) { - size_t spec = start; - for(auto row = image->begin(); row != image->end(); ++row) + PARALLEL_FOR_NO_WSP_CHECK() + for(int i = 0; i < height; ++i) { - row->resize( width ); - for(size_t i = 0; i < width; ++i, ++spec) + auto &row = (*image)[i]; + row.resize( width ); + size_t spec = start + static_cast(i) * width; + for(size_t j = 0; j< width; ++j, ++spec) { - (*row)[i] = (this->*read)(spec)[indexStart]; + row[j] = (this->*read)(spec)[indexStart]; } } } else { // each image pixel is integrated over the x-range [indexStart,indexEnd) - size_t spec = start; - for(auto row = image->begin(); row != image->end(); ++row) + PARALLEL_FOR_NO_WSP_CHECK() + for(int i = 0; i < height; ++i) { - row->resize( width ); - for(size_t i = 0; i < width; ++i, ++spec) + auto &row = (*image)[i]; + row.resize( width ); + size_t spec = start + static_cast(i) * width; + for(size_t j = 0; j < width; ++j, ++spec) { auto &V = (this->*read)(spec); - (*row)[i] = std::accumulate( V.begin() + indexStart, V.begin() + indexEnd, 0.0 ); + row[j] = std::accumulate( V.begin() + indexStart, V.begin() + indexEnd, 0.0 ); } } } @@ -1953,16 +1957,17 @@ namespace Mantid throw std::runtime_error("Cannot set image: image is bigger than workspace."); } - size_t spec = start; - for(auto row = image.begin(); row != image.end(); ++row) + PARALLEL_FOR_NO_WSP_CHECK() + for(int i = 0; i < height; ++i) { - if ( row->size() != width ) + auto &row = image[i]; + if ( row.size() != width ) { throw std::runtime_error("Canot set image: image is corrupted."); } - auto rowBegin = row->begin(); - auto rowEnd = row->end(); - for(auto pixel = rowBegin; pixel != rowEnd; ++pixel,++spec) + size_t spec = start + static_cast(i) * width; + auto rowEnd = row.end(); + for(auto pixel = row.begin(); pixel != rowEnd; ++pixel,++spec) { (this->*dataVec)(spec)[0] = *pixel; } From d15aea345cdae14a59d782346914ff8e25defbc0 Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Thu, 23 Oct 2014 11:30:15 +0100 Subject: [PATCH 169/284] Re #10390. Fixing include file name. --- Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h b/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h index f8b18d632158..7ec8edb85097 100644 --- a/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h +++ b/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h @@ -16,7 +16,7 @@ #include "MantidAPI/Run.h" #include "MantidAPI/Sample.h" #include "MantidAPI/SpectraDetectorTypes.h" -#include "MAntidKernel/EmptyValues.h" +#include "MantidKernel/EmptyValues.h" namespace Mantid From 971717dbb25e54a84a79b9b8d39dbe2e87db2f32 Mon Sep 17 00:00:00 2001 From: John Hill Date: Thu, 23 Oct 2014 11:53:56 +0100 Subject: [PATCH 170/284] Refs #10397 squashing cppcheck warning --- Code/Mantid/Framework/DataHandling/src/Load.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/src/Load.cpp b/Code/Mantid/Framework/DataHandling/src/Load.cpp index 9bb5bf5f6487..e9702b44c91c 100644 --- a/Code/Mantid/Framework/DataHandling/src/Load.cpp +++ b/Code/Mantid/Framework/DataHandling/src/Load.cpp @@ -171,7 +171,7 @@ namespace Mantid std::string name = loader->name(); int version = loader->version(); - std::string ext = fileNames[0].substr(fileNames[0].find_last_of(".")); + //std::string ext = fileNames[0].substr(fileNames[0].find_last_of(".")); auto ifl = boost::dynamic_pointer_cast>(loader); auto iflNexus = boost::dynamic_pointer_cast>(loader); From a12312cc6b31b2296817e7d377d64a6c3b23ef04 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Thu, 23 Oct 2014 12:09:55 +0100 Subject: [PATCH 171/284] Fix issue, based on find_if, , re #8085 This is now more robust to numerical errors in bin limits, it passes all tests, including new ones. --- .../Framework/Algorithms/src/Integration.cpp | 41 ++++++++++++++++--- 1 file changed, 36 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/Framework/Algorithms/src/Integration.cpp b/Code/Mantid/Framework/Algorithms/src/Integration.cpp index 5c9ce61cc666..d51f7359393f 100644 --- a/Code/Mantid/Framework/Algorithms/src/Integration.cpp +++ b/Code/Mantid/Framework/Algorithms/src/Integration.cpp @@ -46,6 +46,21 @@ void Integration::init() declareProperty("IncludePartialBins", false, "If true then partial bins from the beginning and end of the input range are also included in the integration."); } +/** + * Std-style comparision function object (satisfies the requirements of Compare) + * @return true if first argument < second argument (with some tolerance/epsilon) + */ +struct tolerant_less: public std::binary_function +{ +public: + bool operator()(const double &left, const double &right) const + { + // soft equal, if the diff left-right is below a numerical error (uncertainty) threshold, we cannot say + //std::cerr << " --- operator: " << left << ", " << right << " "; //std::endl; + return (left < right) && (std::abs(left - right) > std::numeric_limits::epsilon()); + } +}; + /** Executes the algorithm * * @throw runtime_error Thrown if algorithm cannot execute @@ -129,17 +144,33 @@ void Integration::exec() // Find the range [min,max] MantidVec::const_iterator lowit, highit; - if (m_MinRange == EMPTY_DBL()) lowit=X.begin(); - else lowit=std::lower_bound(X.begin(),X.end(),m_MinRange); + if (m_MinRange == EMPTY_DBL()) + { + lowit=X.begin(); + } else + { + MantidVec::const_reverse_iterator oit; + // note reverse iteration, mirror of the find_if used to find highit (below) + oit = (std::find_if(X.rbegin(), X.rend(), std::bind2nd(tolerant_less(),m_MinRange))); + // Lower limit is the bin after (decr in reverse iteration), i.e. the last (in reverse order) value not less than MinRange + oit--; + // turn reverse_iterator into forward/normal iterator + lowit = --(oit.base()); + } - if (m_MaxRange == EMPTY_DBL()) highit=X.end(); - else highit=std::find_if(lowit,X.end(),std::bind2nd(std::greater(),m_MaxRange)); + if (m_MaxRange == EMPTY_DBL()) + { + highit=X.end(); + } else + { + highit=std::find_if(lowit, X.end(), std::bind2nd(std::greater(),m_MaxRange)); + } // If range specified doesn't overlap with this spectrum then bail out if ( lowit == X.end() || highit == X.begin() ) continue; // Upper limit is the bin before, i.e. the last value smaller than MaxRange - --highit; + --highit; // (note: decrementing 'end()' is safe for vectors, at least according to the C++ standard) MantidVec::difference_type distmin = std::distance(X.begin(),lowit); MantidVec::difference_type distmax = std::distance(X.begin(),highit); From 10e3e5d01beab14c1ad82107b6b615bd8362b717 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 23 Oct 2014 12:14:22 +0100 Subject: [PATCH 172/284] Added check for NumericAxis and copy values Refs #10411 --- Code/Mantid/Framework/Algorithms/src/Integration.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Code/Mantid/Framework/Algorithms/src/Integration.cpp b/Code/Mantid/Framework/Algorithms/src/Integration.cpp index 5c9ce61cc666..aa9a1e7c7eb2 100644 --- a/Code/Mantid/Framework/Algorithms/src/Integration.cpp +++ b/Code/Mantid/Framework/Algorithms/src/Integration.cpp @@ -9,6 +9,7 @@ #include "MantidAPI/Progress.h" #include +#include "MantidAPI/NumericAxis.h" #include "MantidAPI/TextAxis.h" #include "MantidKernel/BoundedValidator.h" @@ -89,6 +90,7 @@ void Integration::exec() Progress progress(this, 0, 1, m_MaxSpec-m_MinSpec+1); const bool axisIsText = localworkspace->getAxis(1)->isText(); + const bool axisIsNumeric = localworkspace->getAxis(1)->isNumeric(); // Loop over spectra PARALLEL_FOR2(localworkspace,outputWorkspace) @@ -104,6 +106,11 @@ void Integration::exec() Mantid::API::TextAxis* newAxis = dynamic_cast(outputWorkspace->getAxis(1)); newAxis->setLabel(outWI, localworkspace->getAxis(1)->label(i)); } + else if ( axisIsNumeric ) + { + Mantid::API::NumericAxis* newAxis = dynamic_cast(outputWorkspace->getAxis(1)); + newAxis->setValue(outWI, (*(localworkspace->getAxis(1)))(i)); + } // This is the output ISpectrum * outSpec = outputWorkspace->getSpectrum(outWI); From 7773884ce6263bf5dec3964a9573e43fcefd2180 Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Thu, 23 Oct 2014 12:22:41 +0100 Subject: [PATCH 173/284] Re #10390. Fix compile warnings. --- Code/Mantid/Framework/API/src/MatrixWorkspace.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp index 5c97e14d21e3..a77b774b9f38 100644 --- a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp +++ b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp @@ -1792,7 +1792,7 @@ namespace Mantid if ( isHisto && indexEnd == indexStart + 1 ) { PARALLEL_FOR_NO_WSP_CHECK() - for(int i = 0; i < height; ++i) + for(int i = 0; i < static_cast(height); ++i) { auto &row = (*image)[i]; row.resize( width ); @@ -1807,7 +1807,7 @@ namespace Mantid { // each image pixel is integrated over the x-range [indexStart,indexEnd) PARALLEL_FOR_NO_WSP_CHECK() - for(int i = 0; i < height; ++i) + for(int i = 0; i < static_cast(height); ++i) { auto &row = (*image)[i]; row.resize( width ); @@ -1958,7 +1958,7 @@ namespace Mantid } PARALLEL_FOR_NO_WSP_CHECK() - for(int i = 0; i < height; ++i) + for(int i = 0; i < static_cast(height); ++i) { auto &row = image[i]; if ( row.size() != width ) From 91dff39e3e6c4458d828111739ddcfb3bca89b68 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Thu, 23 Oct 2014 14:25:20 +0100 Subject: [PATCH 174/284] RangeUpper: use std::upper_bound rather than find_if, re #8085 upper_bound will be faster if any, and find_if is deprecated --- Code/Mantid/Framework/Algorithms/src/Integration.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/Framework/Algorithms/src/Integration.cpp b/Code/Mantid/Framework/Algorithms/src/Integration.cpp index d51f7359393f..ae12aa484cab 100644 --- a/Code/Mantid/Framework/Algorithms/src/Integration.cpp +++ b/Code/Mantid/Framework/Algorithms/src/Integration.cpp @@ -56,7 +56,6 @@ struct tolerant_less: public std::binary_function bool operator()(const double &left, const double &right) const { // soft equal, if the diff left-right is below a numerical error (uncertainty) threshold, we cannot say - //std::cerr << " --- operator: " << left << ", " << right << " "; //std::endl; return (left < right) && (std::abs(left - right) > std::numeric_limits::epsilon()); } }; @@ -147,11 +146,12 @@ void Integration::exec() if (m_MinRange == EMPTY_DBL()) { lowit=X.begin(); - } else + } + else { MantidVec::const_reverse_iterator oit; // note reverse iteration, mirror of the find_if used to find highit (below) - oit = (std::find_if(X.rbegin(), X.rend(), std::bind2nd(tolerant_less(),m_MinRange))); + oit = (std::find_if(X.rbegin(), X.rend(), std::bind2nd(tolerant_less(), m_MinRange))); // Lower limit is the bin after (decr in reverse iteration), i.e. the last (in reverse order) value not less than MinRange oit--; // turn reverse_iterator into forward/normal iterator @@ -161,9 +161,10 @@ void Integration::exec() if (m_MaxRange == EMPTY_DBL()) { highit=X.end(); - } else + } + else { - highit=std::find_if(lowit, X.end(), std::bind2nd(std::greater(),m_MaxRange)); + highit = std::upper_bound(lowit, X.end(), m_MaxRange, tolerant_less()); } // If range specified doesn't overlap with this spectrum then bail out From 582b7575cb8e6bf9bc9e50ff641b609b7b184d9f Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 23 Oct 2014 14:29:19 +0100 Subject: [PATCH 175/284] Added ability to use Sqw to ElasticWindow Refs #10410 --- .../Algorithms/src/ElasticWindow.cpp | 143 ++++++++++++------ 1 file changed, 96 insertions(+), 47 deletions(-) diff --git a/Code/Mantid/Framework/Algorithms/src/ElasticWindow.cpp b/Code/Mantid/Framework/Algorithms/src/ElasticWindow.cpp index 7ca3cd780b56..247909847e36 100644 --- a/Code/Mantid/Framework/Algorithms/src/ElasticWindow.cpp +++ b/Code/Mantid/Framework/Algorithms/src/ElasticWindow.cpp @@ -14,7 +14,6 @@ namespace Algorithms // Register the algorithm into the AlgorithmFactory DECLARE_ALGORITHM(ElasticWindow) - using namespace Kernel; using namespace API; @@ -48,16 +47,31 @@ void ElasticWindow::exec() MatrixWorkspace_sptr outputQ; MatrixWorkspace_sptr outputQSquared; - + const bool childAlgLogging(true); - double startProgress(0.0), stepProgress(0.0), endProgress(0.0); + double startProgress(0.0), endProgress(0.0); + + // Determine if we are converting from spectra number (red) or Q (Sqw) + const bool axisIsSpectrumNumber = inputWorkspace->getAxis(1)->isSpectra(); + g_log.information() << "Axis is spectrum number: " << axisIsSpectrumNumber << std::endl; + // Determine if we need to use the second time range... - if ( ! ( ( enR2S == enR2E ) && ( enR2S == EMPTY_DBL() ) ) ) + const bool backgroundSubtraction = !((enR2S == enR2E) && (enR2S == EMPTY_DBL())); + g_log.information() << "Use background subtraction: " << backgroundSubtraction << std::endl; + + // Calculate number of steps + size_t numSteps = 4; + if(backgroundSubtraction) + numSteps += 1; + if(axisIsSpectrumNumber) + numSteps += 1; + + double stepProgress = 1.0 / static_cast(numSteps); + + if(backgroundSubtraction) { - stepProgress = 1.0/6.0; - // ... CalculateFlatBackground, Minus, Integration... - IAlgorithm_sptr flatBG = createChildAlgorithm("CalculateFlatBackground",startProgress, endProgress,childAlgLogging); + IAlgorithm_sptr flatBG = createChildAlgorithm("CalculateFlatBackground", startProgress, endProgress, childAlgLogging); flatBG->setProperty("InputWorkspace", inputWorkspace); flatBG->setProperty("StartX", enR2S); flatBG->setProperty("EndX", enR2E); @@ -69,7 +83,7 @@ void ElasticWindow::exec() MatrixWorkspace_sptr flatBGws = flatBG->getProperty("OutputWorkspace"); - IAlgorithm_sptr integ = createChildAlgorithm("Integration",startProgress, endProgress,childAlgLogging); + IAlgorithm_sptr integ = createChildAlgorithm("Integration", startProgress, endProgress, childAlgLogging); integ->setProperty("InputWorkspace", flatBGws); integ->setProperty("RangeLower", enR1S); integ->setProperty("RangeUpper", enR1E); @@ -80,10 +94,8 @@ void ElasticWindow::exec() } else { - stepProgress = 1.0/5.0; - // ... Just Integration ... - IAlgorithm_sptr integ = createChildAlgorithm("Integration",startProgress, endProgress,childAlgLogging); + IAlgorithm_sptr integ = createChildAlgorithm("Integration", startProgress, endProgress, childAlgLogging); integ->setProperty("InputWorkspace", inputWorkspace); integ->setProperty("RangeLower", enR1S); integ->setProperty("RangeUpper", enR1E); @@ -95,45 +107,82 @@ void ElasticWindow::exec() startProgress += stepProgress; endProgress += stepProgress; - // ... ConvertSpectrumAxis (ElasticQ). Version 2 to give the correct number - const int version = 2; - IAlgorithm_sptr csaQ = createChildAlgorithm("ConvertSpectrumAxis",startProgress,endProgress,childAlgLogging,version); - csaQ->setProperty("InputWorkspace", integWS); - csaQ->setPropertyValue("Target", "ElasticQ"); - csaQ->setPropertyValue("EMode", "Indirect"); - csaQ->setPropertyValue("OutputWorkspace", "csaQ"); - csaQ->execute(); - MatrixWorkspace_sptr csaQws = csaQ->getProperty("OutputWorkspace"); - startProgress += stepProgress; - endProgress += stepProgress; - - // ... ConvertSpectrumAxis (Q2) ... - IAlgorithm_sptr csaQ2 = createChildAlgorithm("ConvertSpectrumAxis",startProgress,endProgress,childAlgLogging,version); - csaQ2->setProperty("InputWorkspace", integWS); - csaQ2->setPropertyValue("Target", "ElasticQSquared"); - csaQ2->setPropertyValue("EMode", "Indirect"); - csaQ2->setPropertyValue("OutputWorkspace", "csaQ2"); - csaQ2->execute(); - MatrixWorkspace_sptr csaQ2ws = csaQ2->getProperty("OutputWorkspace"); - startProgress += stepProgress; - endProgress += stepProgress; + if(axisIsSpectrumNumber) + { + // Use ConvertSpectrumAxis v2 for correct result + const int version = 2; + + // ... ConvertSpectrumAxis (Q) ... + IAlgorithm_sptr csaQ = createChildAlgorithm("ConvertSpectrumAxis", startProgress, endProgress, childAlgLogging, version); + csaQ->setProperty("InputWorkspace", integWS); + csaQ->setPropertyValue("Target", "ElasticQ"); + csaQ->setPropertyValue("EMode", "Indirect"); + csaQ->setPropertyValue("OutputWorkspace", "csaQ"); + csaQ->execute(); + MatrixWorkspace_sptr csaQws = csaQ->getProperty("OutputWorkspace"); + startProgress += stepProgress; + endProgress += stepProgress; + // ... ConvertSpectrumAxis (Q2) ... + IAlgorithm_sptr csaQ2 = createChildAlgorithm("ConvertSpectrumAxis", startProgress, endProgress, childAlgLogging, version); + csaQ2->setProperty("InputWorkspace", integWS); + csaQ2->setPropertyValue("Target", "ElasticQSquared"); + csaQ2->setPropertyValue("EMode", "Indirect"); + csaQ2->setPropertyValue("OutputWorkspace", "csaQ2"); + csaQ2->execute(); + MatrixWorkspace_sptr csaQ2ws = csaQ2->getProperty("OutputWorkspace"); + startProgress += stepProgress; + endProgress += stepProgress; - // ... Transpose A ... - IAlgorithm_sptr tranQ = createChildAlgorithm("Transpose",startProgress,endProgress,childAlgLogging); - tranQ->setProperty("InputWorkspace",csaQws); - tranQ->setPropertyValue("OutputWorkspace", "outQ"); - tranQ->execute(); - outputQ = tranQ->getProperty("OutputWorkspace"); - startProgress += stepProgress; - endProgress += stepProgress; + // ... Transpose (Q) ... + IAlgorithm_sptr tranQ = createChildAlgorithm("Transpose", startProgress, endProgress, childAlgLogging); + tranQ->setProperty("InputWorkspace", csaQws); + tranQ->setPropertyValue("OutputWorkspace", "outQ"); + tranQ->execute(); + outputQ = tranQ->getProperty("OutputWorkspace"); + startProgress += stepProgress; + endProgress += stepProgress; - // ... Transpose B ... - IAlgorithm_sptr tranQ2 = createChildAlgorithm("Transpose", startProgress,endProgress,childAlgLogging); - tranQ2->setProperty("InputWorkspace",csaQ2ws); - tranQ2->setPropertyValue("OutputWorkspace", "outQSquared"); - tranQ2->execute(); - outputQSquared = tranQ2->getProperty("OutputWorkspace"); + // ... Transpose (Q2) ... + IAlgorithm_sptr tranQ2 = createChildAlgorithm("Transpose", startProgress, endProgress, childAlgLogging); + tranQ2->setProperty("InputWorkspace", csaQ2ws); + tranQ2->setPropertyValue("OutputWorkspace", "outQSquared"); + tranQ2->execute(); + outputQSquared = tranQ2->getProperty("OutputWorkspace"); + startProgress += stepProgress; + endProgress += stepProgress; + } + else + { + // ... Transpose (Q) ... + IAlgorithm_sptr tranQ = createChildAlgorithm("Transpose", startProgress, endProgress, childAlgLogging); + tranQ->setProperty("InputWorkspace", integWS); + tranQ->setPropertyValue("OutputWorkspace", "outQ"); + tranQ->execute(); + outputQ = tranQ->getProperty("OutputWorkspace"); + startProgress += stepProgress; + endProgress += stepProgress; + + // ... Convert to Histogram (Q2) ... + IAlgorithm_sptr histQ2 = createChildAlgorithm("ConvertToHistogram", startProgress, endProgress, childAlgLogging); + histQ2->setProperty("InputWorkspace", outputQ); + histQ2->setPropertyValue("OutputWorkspace", "outQ"); + histQ2->execute(); + MatrixWorkspace_sptr qHistWS = histQ2->getProperty("OutputWorkspace"); + startProgress += stepProgress; + endProgress += stepProgress; + + // ... Convert Units (Q2) ... + IAlgorithm_sptr convUnitQ2 = createChildAlgorithm("ConvertUnits", startProgress, endProgress, childAlgLogging); + convUnitQ2->setProperty("InputWorkspace", qHistWS); + convUnitQ2->setPropertyValue("Target", "QSquared"); + convUnitQ2->setPropertyValue("EMode", "Indirect"); + convUnitQ2->setPropertyValue("OutputWorkspace", "outQSquared"); + convUnitQ2->execute(); + outputQSquared = convUnitQ2->getProperty("OutputWorkspace"); + startProgress += stepProgress; + endProgress += stepProgress; + } setProperty("OutputInQ", outputQ); setProperty("OutputInQSquared", outputQSquared); From 666a1c53b777e175bb92dd6b99c86816586c22a7 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 23 Oct 2014 14:36:57 +0100 Subject: [PATCH 176/284] Fix minor cppcheck warning Refs #10410 --- Code/Mantid/Framework/Algorithms/src/ElasticWindow.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Code/Mantid/Framework/Algorithms/src/ElasticWindow.cpp b/Code/Mantid/Framework/Algorithms/src/ElasticWindow.cpp index 247909847e36..4e988cc057d9 100644 --- a/Code/Mantid/Framework/Algorithms/src/ElasticWindow.cpp +++ b/Code/Mantid/Framework/Algorithms/src/ElasticWindow.cpp @@ -180,8 +180,6 @@ void ElasticWindow::exec() convUnitQ2->setPropertyValue("OutputWorkspace", "outQSquared"); convUnitQ2->execute(); outputQSquared = convUnitQ2->getProperty("OutputWorkspace"); - startProgress += stepProgress; - endProgress += stepProgress; } setProperty("OutputInQ", outputQ); From fd64ec84a436e7b2fc4674322219e7c38e530d0b Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Wed, 15 Oct 2014 13:54:39 -0400 Subject: [PATCH 177/284] Re #10190. Adding generated algorithm code. --- .../Framework/DataHandling/CMakeLists.txt | 17 +++-- .../inc/MantidDataHandling/SavePDFGui.h | 56 +++++++++++++++++ .../Framework/DataHandling/src/SavePDFGui.cpp | 63 +++++++++++++++++++ .../DataHandling/test/SavePDFGuiTest.h | 61 ++++++++++++++++++ .../docs/source/algorithms/SavePDFGui-v1.rst | 44 +++++++++++++ 5 files changed, 235 insertions(+), 6 deletions(-) create mode 100644 Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SavePDFGui.h create mode 100644 Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp create mode 100644 Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h create mode 100644 Code/Mantid/docs/source/algorithms/SavePDFGui-v1.rst diff --git a/Code/Mantid/Framework/DataHandling/CMakeLists.txt b/Code/Mantid/Framework/DataHandling/CMakeLists.txt index 72aa94c182d8..5df27be94a93 100644 --- a/Code/Mantid/Framework/DataHandling/CMakeLists.txt +++ b/Code/Mantid/Framework/DataHandling/CMakeLists.txt @@ -25,7 +25,6 @@ set ( SRC_FILES src/LoadAscii2.cpp src/LoadBBY.cpp src/LoadCalFile.cpp - src/LoadVulcanCalFile.cpp src/LoadCanSAS1D.cpp src/LoadCanSAS1D2.cpp src/LoadDaveGrp.cpp @@ -94,6 +93,7 @@ set ( SRC_FILES src/LoadSpec.cpp src/LoadSpice2D.cpp src/LoadTOFRawNexus.cpp + src/LoadVulcanCalFile.cpp src/MaskDetectors.cpp src/MaskDetectorsInShape.cpp src/MergeLogs.cpp @@ -131,7 +131,9 @@ set ( SRC_FILES src/SaveNXTomo.cpp src/SaveParameterFile.cpp src/SavePAR.cpp + src/SavePDFGui.cpp src/SavePHX.cpp + src/SaveParameterFile.cpp src/SaveRKH.cpp src/SaveReflTBL.cpp src/SaveSPE.cpp @@ -167,9 +169,8 @@ set ( INC_FILES inc/MantidDataHandling/LoadANSTOHelper.h inc/MantidDataHandling/LoadAscii.h inc/MantidDataHandling/LoadAscii2.h - inc/MantidDataHandling/LoadBBY.h + inc/MantidDataHandling/LoadBBY.h inc/MantidDataHandling/LoadCalFile.h - inc/MantidDataHandling/LoadVulcanCalFile.h inc/MantidDataHandling/LoadCanSAS1D.h inc/MantidDataHandling/LoadCanSAS1D2.h inc/MantidDataHandling/LoadDaveGrp.h @@ -232,7 +233,8 @@ set ( INC_FILES inc/MantidDataHandling/LoadSassena.h inc/MantidDataHandling/LoadSpec.h inc/MantidDataHandling/LoadSpice2D.h - inc/MantidDataHandling/LoadTOFRawNexus.h + inc/MantidDataHandling/LoadTOFRawNexus.h + inc/MantidDataHandling/LoadVulcanCalFile.h inc/MantidDataHandling/MaskDetectors.h inc/MantidDataHandling/MaskDetectorsInShape.h inc/MantidDataHandling/MergeLogs.h @@ -270,7 +272,9 @@ set ( INC_FILES inc/MantidDataHandling/SaveNXTomo.h inc/MantidDataHandling/SaveParameterFile.h inc/MantidDataHandling/SavePAR.h + inc/MantidDataHandling/SavePDFGui.h inc/MantidDataHandling/SavePHX.h + inc/MantidDataHandling/SaveParameterFile.h inc/MantidDataHandling/SaveRKH.h inc/MantidDataHandling/SaveReflTBL.h inc/MantidDataHandling/SaveSPE.h @@ -310,7 +314,6 @@ set ( TEST_FILES LoadAsciiTest.h LoadBBYTest.h LoadCalFileTest.h - LoadVulcanCalFileTest.h LoadCanSAS1dTest.h LoadDaveGrpTest.h LoadDetectorInfoTest.h @@ -368,6 +371,7 @@ set ( TEST_FILES LoadSpice2dTest.h LoadTOFRawNexusTest.h LoadTest.h + LoadVulcanCalFileTest.h MaskDetectorsInShapeTest.h MaskDetectorsTest.h MergeLogsTest.h @@ -401,9 +405,10 @@ set ( TEST_FILES SaveNXSPETest.h SaveNexusProcessedTest.h SaveNexusTest.h - SaveParameterFileTest.h SavePARTest.h + SavePDFGuiTest.h SavePHXTest.h + SaveParameterFileTest.h SaveRKHTest.h SaveReflTBLTest.h SaveSPETest.h diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SavePDFGui.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SavePDFGui.h new file mode 100644 index 000000000000..35b60f87b047 --- /dev/null +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SavePDFGui.h @@ -0,0 +1,56 @@ +#ifndef MANTID_DATAHANDLING_SAVEPDFGUI_H_ +#define MANTID_DATAHANDLING_SAVEPDFGUI_H_ + +#include "MantidKernel/System.h" +#include "MantidAPI/Algorithm.h" + +namespace Mantid +{ +namespace DataHandling +{ + + /** SavePDFGui : TODO: DESCRIPTION + + Copyright © 2014 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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. + + Mantid 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, see . + + File change history is stored at: + Code Documentation is available at: + */ + class DLLExport SavePDFGui : public API::Algorithm + { + public: + SavePDFGui(); + virtual ~SavePDFGui(); + + virtual const std::string name() const; + virtual int version() const; + virtual const std::string category() const; + virtual const std::string summary() const; + + private: + void init(); + void exec(); + + + }; + + +} // namespace DataHandling +} // namespace Mantid + +#endif /* MANTID_DATAHANDLING_SAVEPDFGUI_H_ */ \ No newline at end of file diff --git a/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp b/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp new file mode 100644 index 000000000000..f79a0a82e02b --- /dev/null +++ b/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp @@ -0,0 +1,63 @@ +#include "MantidDataHandling/SavePDFGui.h" + +namespace Mantid +{ +namespace DataHandling +{ + + using Mantid::Kernel::Direction; + using Mantid::API::WorkspaceProperty; + + // Register the algorithm into the AlgorithmFactory + DECLARE_ALGORITHM(SavePDFGui) + + + + //---------------------------------------------------------------------------------------------- + /** Constructor + */ + SavePDFGui::SavePDFGui() + { + } + + //---------------------------------------------------------------------------------------------- + /** Destructor + */ + SavePDFGui::~SavePDFGui() + { + } + + + //---------------------------------------------------------------------------------------------- + + + /// Algorithm's version for identification. @see Algorithm::version + int SavePDFGui::version() const { return 1;}; + + /// Algorithm's category for identification. @see Algorithm::category + const std::string SavePDFGui::category() const { return TODO: FILL IN A CATEGORY;} + + /// Algorithm's summary for use in the GUI and help. @see Algorithm::summary + const std::string SavePDFGui::summary() const { return TODO: FILL IN A SUMMARY;}; + + //---------------------------------------------------------------------------------------------- + /** Initialize the algorithm's properties. + */ + void SavePDFGui::init() + { + declareProperty(new WorkspaceProperty<>("InputWorkspace","",Direction::Input), "An input workspace."); + declareProperty(new WorkspaceProperty<>("OutputWorkspace","",Direction::Output), "An output workspace."); + } + + //---------------------------------------------------------------------------------------------- + /** Execute the algorithm. + */ + void SavePDFGui::exec() + { + // TODO Auto-generated execute stub + } + + + +} // namespace DataHandling +} // namespace Mantid \ No newline at end of file diff --git a/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h b/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h new file mode 100644 index 000000000000..9ebbda97ba56 --- /dev/null +++ b/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h @@ -0,0 +1,61 @@ +#ifndef MANTID_DATAHANDLING_SAVEPDFGUITEST_H_ +#define MANTID_DATAHANDLING_SAVEPDFGUITEST_H_ + +#include + +#include "MantidDataHandling/SavePDFGui.h" + +using Mantid::DataHandling::SavePDFGui; +using namespace Mantid::API; + +class SavePDFGuiTest : public CxxTest::TestSuite +{ +public: + // This pair of boilerplate methods prevent the suite being created statically + // This means the constructor isn't called when running other tests + static SavePDFGuiTest *createSuite() { return new SavePDFGuiTest(); } + static void destroySuite( SavePDFGuiTest *suite ) { delete suite; } + + + void test_Init() + { + SavePDFGui alg; + TS_ASSERT_THROWS_NOTHING( alg.initialize() ) + TS_ASSERT( alg.isInitialized() ) + } + + void test_exec() + { + // Name of the output workspace. + std::string outWSName("SavePDFGuiTest_OutputWS"); + + SavePDFGui alg; + TS_ASSERT_THROWS_NOTHING( alg.initialize() ) + TS_ASSERT( alg.isInitialized() ) + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("REPLACE_PROPERTY_NAME_HERE!!!!", "value") ); + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("OutputWorkspace", outWSName) ); + TS_ASSERT_THROWS_NOTHING( alg.execute(); ); + TS_ASSERT( alg.isExecuted() ); + + // Retrieve the workspace from data service. TODO: Change to your desired type + Workspace_sptr ws; + TS_ASSERT_THROWS_NOTHING( ws = AnalysisDataService::Instance().retrieveWS(outWSName) ); + TS_ASSERT(ws); + if (!ws) return; + + // TODO: Check the results + + // Remove workspace from the data service. + AnalysisDataService::Instance().remove(outWSName); + } + + void test_Something() + { + TSM_ASSERT( "You forgot to write a test!", 0); + } + + +}; + + +#endif /* MANTID_DATAHANDLING_SAVEPDFGUITEST_H_ */ \ No newline at end of file diff --git a/Code/Mantid/docs/source/algorithms/SavePDFGui-v1.rst b/Code/Mantid/docs/source/algorithms/SavePDFGui-v1.rst new file mode 100644 index 000000000000..2872ec0cbe5e --- /dev/null +++ b/Code/Mantid/docs/source/algorithms/SavePDFGui-v1.rst @@ -0,0 +1,44 @@ + +.. algorithm:: + +.. summary:: + +.. alias:: + +.. properties:: + +Description +----------- + +TODO: Enter a full rst-markup description of your algorithm here. + + +Usage +----- +.. Try not to use files in your examples, + but if you cannot avoid it then the (small) files must be added to + autotestdata\UsageData and the following tag unindented + .. include:: ../usagedata-note.txt + +**Example - SavePDFGui** + +.. testcode:: SavePDFGuiExample + + # Create a host workspace + ws = CreateWorkspace(DataX=range(0,3), DataY=(0,2)) + or + ws = CreateSampleWorkspace() + + wsOut = SavePDFGui() + + # Print the result + print "The output workspace has %i spectra" % wsOut.getNumberHistograms() + +Output: + +.. testoutput:: SavePDFGuiExample + + The output workspace has ?? spectra + +.. categories:: + From a80245c02be3fdd44ea354df6f9c9345b3e0def8 Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Thu, 16 Oct 2014 08:46:27 -0400 Subject: [PATCH 178/284] Re #10190. Code compiles. --- .../Framework/DataHandling/src/SavePDFGui.cpp | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp b/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp index f79a0a82e02b..a2a9c4962948 100644 --- a/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp @@ -30,15 +30,29 @@ namespace DataHandling //---------------------------------------------------------------------------------------------- + ///Algorithm's name for identification. @see Algorithm::name + const std::string SavePDFGui::name() const + { + return "SavePDFGui"; + } /// Algorithm's version for identification. @see Algorithm::version - int SavePDFGui::version() const { return 1;}; + int SavePDFGui::version() const + { + return 1; + } /// Algorithm's category for identification. @see Algorithm::category - const std::string SavePDFGui::category() const { return TODO: FILL IN A CATEGORY;} + const std::string SavePDFGui::category() const + { + return "DataHandling"; + } /// Algorithm's summary for use in the GUI and help. @see Algorithm::summary - const std::string SavePDFGui::summary() const { return TODO: FILL IN A SUMMARY;}; + const std::string SavePDFGui::summary() const + { + return "Save files readable by PDFGui"; + } //---------------------------------------------------------------------------------------------- /** Initialize the algorithm's properties. @@ -60,4 +74,4 @@ namespace DataHandling } // namespace DataHandling -} // namespace Mantid \ No newline at end of file +} // namespace Mantid From 24b1b9cae6c663e5e45209c726e37e00fa665ad4 Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Tue, 21 Oct 2014 13:52:29 -0400 Subject: [PATCH 179/284] Refs #10190. First pass or writing out the data values. --- .../inc/MantidDataHandling/SavePDFGui.h | 5 +- .../Framework/DataHandling/src/SavePDFGui.cpp | 54 ++++++++++++++++++- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SavePDFGui.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SavePDFGui.h index 35b60f87b047..3d147e8dc442 100644 --- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SavePDFGui.h +++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SavePDFGui.h @@ -41,16 +41,15 @@ namespace DataHandling virtual int version() const; virtual const std::string category() const; virtual const std::string summary() const; + virtual std::map validateInputs(); private: void init(); void exec(); - - }; } // namespace DataHandling } // namespace Mantid -#endif /* MANTID_DATAHANDLING_SAVEPDFGUI_H_ */ \ No newline at end of file +#endif /* MANTID_DATAHANDLING_SAVEPDFGUI_H_ */ diff --git a/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp b/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp index a2a9c4962948..c8b6ce7c46da 100644 --- a/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp @@ -1,4 +1,7 @@ #include "MantidDataHandling/SavePDFGui.h" +#include "MantidAPI/FileProperty.h" +#include +#include namespace Mantid { @@ -60,7 +63,26 @@ namespace DataHandling void SavePDFGui::init() { declareProperty(new WorkspaceProperty<>("InputWorkspace","",Direction::Input), "An input workspace."); - declareProperty(new WorkspaceProperty<>("OutputWorkspace","",Direction::Output), "An output workspace."); + declareProperty(new API::FileProperty("Filename", "", API::FileProperty::Save, ".gr"), + "The filename to use for the saved data"); + } + + /// @copydoc Algorithm::validateInputs + std::map SavePDFGui::validateInputs(){ + std::map result; + + API::MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); + const int nHist = static_cast (inputWS->getNumberHistograms()); + if (nHist != 1) + { + result["InputWorkspace"] = "Workspace must contain only one spectrum"; + } + else if (std::string(inputWS->getAxis(0)->unit()->label()) != "Angstrom") + { + result["InputWorkspace"] = "Expected x-units of Angstrom"; + } + + return result; } //---------------------------------------------------------------------------------------------- @@ -68,7 +90,35 @@ namespace DataHandling */ void SavePDFGui::exec() { - // TODO Auto-generated execute stub + API::MatrixWorkspace_const_sptr inputWS = getProperty("InputWorkspace"); + const std::string filename = getProperty("Filename"); + + // --------- open the file + std::ofstream out; + out.open(filename.c_str(), std::ios_base::out); + + // --------- write the header + + // --------- write the label for the data + out << "##### start data\n"; + //out << "#O0 rg_int sig_rg_int low_int sig_low_int rmax rhofit\n"; // TODO + out << "#S 1 - PDF from Mantid\n"; // TODO should add version + //out << "#P0 -22.03808 1.10131 2556.26392 0.03422 1.50 0.5985\n"; // TODO + out << "#L r G(r) dr dG(r)\n"; + + // --------- write the data + auto x = inputWS->readX(0); + auto dx = inputWS->readDx(0); + auto y = inputWS->readY(0); + auto dy = inputWS->readE(0); + size_t length = x.size(); + for (size_t i = 0; i < length; ++i) + { + out << x[i] << " " << y[i] << " " << dx[i] << " " << dy[i] << "\n"; + } + + // --------- close the file + out.close(); } From 6c31ae98255a66e34b5079170b6eaf48d59dbb75 Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Tue, 21 Oct 2014 14:02:56 -0400 Subject: [PATCH 180/284] Refs #10190. Forgot leading whitespace. --- Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp b/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp index c8b6ce7c46da..1bf4a66ad05d 100644 --- a/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp @@ -114,7 +114,7 @@ namespace DataHandling size_t length = x.size(); for (size_t i = 0; i < length; ++i) { - out << x[i] << " " << y[i] << " " << dx[i] << " " << dy[i] << "\n"; + out << " " << x[i] << " " << y[i] << " " << dx[i] << " " << dy[i] << "\n"; } // --------- close the file From 9591ddfb0d18902d0cd277c89ab6e146fbe5544d Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Tue, 21 Oct 2014 16:23:18 -0400 Subject: [PATCH 181/284] Refs #10190. Added mantid version to the output. --- Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp b/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp index 1bf4a66ad05d..6d3b6480f173 100644 --- a/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp +++ b/Code/Mantid/Framework/DataHandling/src/SavePDFGui.cpp @@ -1,5 +1,6 @@ #include "MantidDataHandling/SavePDFGui.h" #include "MantidAPI/FileProperty.h" +#include "MantidKernel/MantidVersion.h" #include #include @@ -97,12 +98,12 @@ namespace DataHandling std::ofstream out; out.open(filename.c_str(), std::ios_base::out); - // --------- write the header + // --------- write the header // TODO // --------- write the label for the data out << "##### start data\n"; //out << "#O0 rg_int sig_rg_int low_int sig_low_int rmax rhofit\n"; // TODO - out << "#S 1 - PDF from Mantid\n"; // TODO should add version + out << "#S 1 - PDF from Mantid " << Kernel::MantidVersion::version() << "\n"; //out << "#P0 -22.03808 1.10131 2556.26392 0.03422 1.50 0.5985\n"; // TODO out << "#L r G(r) dr dG(r)\n"; @@ -111,7 +112,7 @@ namespace DataHandling auto dx = inputWS->readDx(0); auto y = inputWS->readY(0); auto dy = inputWS->readE(0); - size_t length = x.size(); + const size_t length = x.size(); for (size_t i = 0; i < length; ++i) { out << " " << x[i] << " " << y[i] << " " << dx[i] << " " << dy[i] << "\n"; From 03038b770efca289a48a178202f459a038eee90c Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Thu, 23 Oct 2014 15:14:54 +0100 Subject: [PATCH 182/284] Fix doxygen warnings Refs #10306 --- .../MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp | 2 +- .../MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp index 4b06fc7b8e9a..c063b3233783 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp @@ -405,7 +405,7 @@ void IndirectDataReduction::showMessageBox(const QString& message) * * @param enabled If the button is clickable * @param message Message shown on the button - * @parm tooltip Tooltip shown when hovering over button + * @param tooltip Tooltip shown when hovering over button */ void IndirectDataReduction::updateRunButton(bool enabled, QString message, QString tooltip) { diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp index 7072dab874d8..003ca1f0cac5 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReductionTab.cpp @@ -79,7 +79,7 @@ namespace CustomInterfaces /** * Slot used to update the run button when an algorithm that was strted by the Run button complete. * - * @parm error Unused + * @param error Unused */ void IndirectDataReductionTab::tabExecutionComplete(bool error) { From ae43f3d93ddf932e20f716f00a065f84f990038e Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Thu, 23 Oct 2014 10:23:13 -0400 Subject: [PATCH 183/284] Refs #10190. Adding meaningful unit test. --- .../DataHandling/test/SavePDFGuiTest.h | 74 +++++++++++++----- Test/AutoTestData/nom_gr.nxs | Bin 0 -> 73924 bytes 2 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 Test/AutoTestData/nom_gr.nxs diff --git a/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h b/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h index 9ebbda97ba56..3018a4bc4948 100644 --- a/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h +++ b/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h @@ -2,10 +2,14 @@ #define MANTID_DATAHANDLING_SAVEPDFGUITEST_H_ #include +#include +#include #include "MantidDataHandling/SavePDFGui.h" +#include "MantidDataHandling/LoadNexusProcessed.h" using Mantid::DataHandling::SavePDFGui; +using Mantid::DataHandling::LoadNexusProcessed; using namespace Mantid::API; class SavePDFGuiTest : public CxxTest::TestSuite @@ -24,38 +28,70 @@ class SavePDFGuiTest : public CxxTest::TestSuite TS_ASSERT( alg.isInitialized() ) } + size_t read( std::istream & is, std::vector & buff ) { + is.read( &buff[0], buff.size() ); + return is.gcount(); + } + + size_t countEOL( const std::vector & buff, size_t sz ) { + size_t newlines = 0; + const char * p = &buff[0]; + for ( size_t i = 0; i < sz; i++ ) { + if ( p[i] == '\n' ) { + newlines++; + } + } + return newlines; + } + + size_t countLines(const std::string &filename) + { + const size_t BUFFER_SIZE = 1024 * 1024; + std::vector buffer( BUFFER_SIZE ); + std::ifstream in( filename ); + size_t n = 0; + while( size_t cc = read( in, buffer ) ) { + n += countEOL( buffer, cc ); + } + return n; + } + void test_exec() { - // Name of the output workspace. - std::string outWSName("SavePDFGuiTest_OutputWS"); + // name of workspace to create and save + const std::string wsName("SavePDFGuiTest_OutputWS"); + // name of the output file + const std::string outFilename("SavePDFGuiTest_Output.gr"); + // Load a file to save out + LoadNexusProcessed load; + load.initialize(); + load.setProperty("Filename", "nom_gr.nxs"); + load.setProperty("OutputWorkspace", wsName); + load.execute(); + + // save the file SavePDFGui alg; TS_ASSERT_THROWS_NOTHING( alg.initialize() ) TS_ASSERT( alg.isInitialized() ) - TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("REPLACE_PROPERTY_NAME_HERE!!!!", "value") ); - TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("OutputWorkspace", outWSName) ); + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("InputWorkspace", wsName) ); + TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("Filename", outFilename) ); TS_ASSERT_THROWS_NOTHING( alg.execute(); ); TS_ASSERT( alg.isExecuted() ); - // Retrieve the workspace from data service. TODO: Change to your desired type - Workspace_sptr ws; - TS_ASSERT_THROWS_NOTHING( ws = AnalysisDataService::Instance().retrieveWS(outWSName) ); - TS_ASSERT(ws); - if (!ws) return; - - // TODO: Check the results + // do the checks + Poco::File outFile(outFilename); + TS_ASSERT( outFile.isFile()); + TS_ASSERT_EQUALS( countLines(outFilename), 1003); // Remove workspace from the data service. - AnalysisDataService::Instance().remove(outWSName); - } - - void test_Something() - { - TSM_ASSERT( "You forgot to write a test!", 0); - } + AnalysisDataService::Instance().remove(wsName); + // remove the output file + outFile.remove(false); + } }; -#endif /* MANTID_DATAHANDLING_SAVEPDFGUITEST_H_ */ \ No newline at end of file +#endif /* MANTID_DATAHANDLING_SAVEPDFGUITEST_H_ */ diff --git a/Test/AutoTestData/nom_gr.nxs b/Test/AutoTestData/nom_gr.nxs new file mode 100644 index 0000000000000000000000000000000000000000..fddaadeccf5d26dfb9fb2b5b30173e6d99c1e9b6 GIT binary patch literal 73924 zcmeEv1whox7B{JMhk~?pmo$j9w4^A_5`xsy9U>v!2ofTK($bv*3Q~%IbR*K;e7o$f z-s`*Gc<=kZ_wIZCb$9Aa{pQS>GiT<%1j|ZFW1^9u!GRwX6gVU}oO3Vi>kRs|Qo^4{ z!NRa~1E>d*3I`Vi4d)<0Jn(QA;J|5@pz%1+@+lD^5&Y1M>bIn%;6RkH@?kDC8{DOf z5FZLG;-~vRg@CM-xC*$#+R$E8LfsB1pFx9g_YJKbEKKyBZR{<9wuZ(4eNIRUj6eBd zgn!b-h4Sn7e2oFeab5yE92Oi3=${fm+YzYm1h5BM*jR&7@IfDB&<9p84;wcdI0pu_ z2k>xc=lM)6tN{AfhW7!WH1Gq?#|rwu^0AxS+y}7RnhLN>+S}L~*|<0O{GxnLHhwlv5JnhqvY=RS zy}xLegT=4fb@>(RRAVQGAfrfuN|J?|{=6w;gn?6vN5<0J8>q##(TnSD8 zHV;tG=Yf*8zOj`d5IjZBAMiW_vm$JsDQN=@@7r3zrXie~lCmT`C>6@CaN0!3&N+!aFo!N zTq5}WCc)%02jTD2K~@7exa&j^x^u8VUUO(T2rAeOpv81R3x?6HOF|NGWFRg~e%lp8 z!Z5mF=(r_8G6;<*ArsbX(q3;+TFCX`w*RpR%OC@CEPE)MK2_pP)Q z6)25utQ|n?3Z%3#rF1X{P+C|69qb+NgQ6(qB&8|AYd#w#vGqF0j+QPhGy#pG1PT>JAgwl`_ln-F+0P=$V zQ+gQN+_z=@1?e9aU<0lm1j2n=8*4BOZ0Fe6S{YhcQ~s+1`-=kB#avR14GauGMIyn$ zgZw7veiS%_-|-tXVu3d!@DM!_I@nUyP8Rky*5?CcV(4Hf4F(siLQ+CCCqYVXHZC^s zfN^qgak6pp@p7Rlt5JeM5u{YGuy%9-2cg;@n3(e#8#gN#2M3#}F&77$3;#9!YdmPb zs#Dy`%*GxxQ1>apHGU0&inB2^p>*OzlX3wVJD!iZq@e?-nsathHg*81Tp&M~U%0q` zN#tmM&LM)79BiDteEeKolt2K85lw(-DlldN3ZhX`DxEi48pMO(=Ce?0f_X!b@-Hcx zER>P}Q$t592QfiPB^yx4!XCshApR7jl(V*Vbog40vZDhi_;m_>tqn5Sey12n#;@go zK>^r*s{YmDpo9ChM9x27fSN6+zo03tXkq=^*>3}YzXQwH?1nC1 zvvYCs@bU0-U*qBXWi$R|K95 z`){(w@63XKRXF_2{}X|K5`lk3uLSFexWx^Ws2u4~BCOc&7*c2Q!s`>j7`^VD)gGTW`Q& z$bJHr@P7{%mOqJ$3beidhzrv%+WQM!EPxh3HhU{JLt{2a%X1{;v>`(H8w`ILhx109 z*9X$QKrVDU0J4_hK$5`5BG3~FaiDgdAKQ1+Ng#x<{q|2g4-~ln5$Ah5k2$p8hJ_Fh zjIVHuAYsTX0NXA3&m-XBer)FfA8x?rv641ya|0;{W}okJlj?sCfFd#T#h&a{(kC!VPe6K39KDmjexV&_UuUAr71^4b<}k2P)0r7NN@(tX`ZekPIB; z5Emx5BB65c2gUu{qJLzM&w;idHlP0J91evN(gheUKjrklZAkwu6~p8-Y(6qTTcHBw zBUq!rMh&nZY%Bu1CIFzZy@f5o81Cs8Ibn{=YT!ukaNZ`ya30a!|g4 zjSvLE|Md0yU%>+`TYij(DijYe)wk!r84s}T@nbw(|CVwGyuSzc3nousdj55K$e0E} zhxU*3k|8J?z_{V3UIGQ~f5iD-FM;g?7NPn+3<@xtNe!=vT@Ant~tX}dh-+#)!(d}<3S77JjD9|D6fXb7996?A7Ob=B7U%vXC z2d2+Zf{ksz^T6a82lMX`fs$bI>N?Bs)BU?r|CRNd4Akf!uUGC+z5-Kyd;Xi(?{}bX z{uqx$C>~&{Z_j@-9$>rNkMRJ2&1;|sO!e*gZ^q;I^*b9V9RJ<3}j@SI5D^;rw#ww~OWA+cRMO(bU4);;UKf7h!!X8)HK&SOLF29e{&_-8Qwd zF$02WzLpEk06nVwr|o1xY>ae|5sxOLIrFYgjGc~a!}>HcggY(M>dd%nq)KWpcQoIrfb_t*B* ze^p-o^?ee~xxB*x0Ry>l4)*ossA{bxF^8G#? z12nlv@b~Fp^Q%|*_vv8kL?if8(SP9c|DLbx|5kkU*YSY7-+@ah20h!l4#$HI$8&}V z8SEeLKOLaBz&H~^|Bw4EmwzkQ{Qtwl<0l@Vk^c6+(1ZU{JfQ0mi0yxQPwB_=BovAR zgc>#({&Al8z>@y0?q8oTe-)3&pLl>q_}e^*{afJyV@}YkQ~-O6Z~J%9en9{Hy(WFg z&i#DT4kA8}x3>UoB>*P+R)!7^7RKir1Tz5Wt!xVuxO3OR+``z>8nj`6gM`fi7G~xS z=T)7jJ6o7Im_urY>Ekf{8`hp5xqqFX|Jn60@xN5w{j+$a|HK2tl;7rg&ffx$Ke8X? z+=R?DnAZ2x&io_E^WPc&z5R#*+D#6q9U0bZdq-=1m`xZQXJ%t<0s5s5(4qmM_^Wap zX7~91z3FfEiyzxPE`q9r)u*IwW^dzY`%l|%|7d=wC_?)8bACW@_+R_}ettl#R&a1C zP`L@ibsqlbe~$xP){pm~GeLAD!oFt3o;w3GL4xtylZEAcQb^@Kc}rn=!(_*xc{eE7*Ai z9F&h>#e?_phAsfuw*IS}yAC7xi!Myge!njL_4f*GZ9pfGpx0&~n&me+{nyU3{<@vu zuiCweq4N6gVF&zPPA`7P4}WpE|7Xd6be{%J3jzsL9s9%gzYVk@^greF|0XMaFQ*xx zFyv_d8jtgR1xQK*?CovrL9U^T1&|X&0(QYy7+~5WRPFzD=HCdxUT-d~3n2dx!$F9zxBzU}hMuSvh@p@hb|=Kf~#*GL?w55xa!)NguV@Z`(0$1YxM{3X{MX}x^v(28w{UcQ~eD6MBpa^KN0wez)u8zBJdM| zp9uV25kLfK-e8^YNB1AU>G|ND1qx^%1+jtQgYtl1NQCK&=ld%b*lr8_`&N)08rZG` z&gTev2?lID1Lp(hf#m~v&!2Dgpns(Y-Ip-}fc6yN2b>SQC4%Ksk(35U!?~njCOGpG z-6d$$uN^mRxHim9LlYb19@nw2^MEUQfJZ(Whmb4!fx5JRh%6OtRRY&rw9Aac?rR$) zX<}=@H22hnl!eqSp@vn7YP$h}TO9Y8cGjzF1Z#!yT{0fLBIWvobhR{R)%OsSB>PZ* z?I9tX7nxK%iETHV5|x!Ms^F`+;c+oWO!SJiI{YWJ7v}6LdG@sIT&^mbHSJ^(EE8g> z@N`A``ZsxMy&5u^Og))HD^uvmBN7gRG;oUyuwO z;#e)ro?Or>zI^f~8=i9dz|H@Hh_9yE#!+VsB15Z3zu8EIg`}d#j=F|BiO8n6ZU6Qn z!*tBdoAN^uzgu_b^muoADD7R^R*Rbnw*ww;^sRK$Edg`AwxpwdFyG;+SsZ`qpr;!U zYqll~X8eMF_uf+)(}i$Dz)t;YPuk}@I>8TAKUbfAr;pMG*jJinzU{5QKl-Kat(A2Oj_)|k1H=)k^sHE*M z9G;>FESqWa!6ED!!~ilGt~8cR#I3|hSt?0=;m)5*T-LN<1yXrSDbRM^)W5wEoQin)l?FA zDVN`@FDZywPdII%*T3aZW>uMmdTsELv{0y)N_L zc&1d{ZodSg>@x$J-A^v;)8uAzV&1i68mS8wM%*VTm$0u|kd}t|FX=vHynPcX@$-@s z-K_}1YNR~xck^=rrRwtvM`|MmgvB+{Vybw0F9Z!`D&hlDx;HN7Dq9D#+!eitsSwhu z>{RY!p$mVAoDO%PW`*N&ZYp0yOu(-3jz5#ov-B6Hno70B3<|M4!EF3J*raUbDepeb zK1l6}{xIVoWUKZ52>Z;9*r%^OT8*h$*T8*3LNjd#p|nRw?z&+CVju6b!MTBpIJtTs z^3~^2B}+0az3-<=rID7gb#I>ZoYG=mY*6j%n9p?h&{S7b!|jOq=Gv^($i6k@ z0Htcwpf8f}Gh_9by(IYDfOm!-F}U1kTseb>Z9%Nrh$1vHmp42ExjrMRDh!=w-j+MF zp`OR(uDB;E-wYf@9B3OiVc{Ha$o>!$dPf5*RVeCubAbTW^t?@?ozY4J&Vqp{#-+E^ z-mA2RC-mg8V(lG?svNnW@*+Z!6WKa0yF}T&(V};_$A_vvLbIFJA>%;Ka1Qgl|Xw z1^t2@5w+$^_wJ$icMlLfEX&lbE^j=E9l6Jgn=I=;YQZsC75eZV9RZS91?ldLqA8hY~XBR3{nxJi6!`-8n_xB-H zWO?(tOS1N5@?k=}Wb->mxtPlM&?FIxScR7=>$l?OE-;4s)fB#kdk4ql6je)ztJ30^ z&^l4hdS>`~OaF=yVbzdrR+ayrD6^)panYB$;tS~3H0EymWSP?=F;SxTItfOtR%U2M zt~XVP>YEq$KQ|D6dlLSV2ygZN9UUTTs_8b<>h&h}GQH2$Bc={LwGo7Tg_eCNHt6R4q$_<5%5OoSQaBLOwkwCoegL8 zLC}HTI{8wm;uU@^Cvh|<`p&xx!tCh9QYT0P+T@2FZ05r6$FM98D+K*+%uVSWe>S#R z?QFg()zZMJdu!b;ioIl#+3r%)M|+oqFr3kOo;f zIxukBvf;RdKfGY~{9^FIT%Jg4Nynv*x-(CE}ObhBBQb6-z|*(>H2l zU$^d_lw8ze*dG`t-|Rp`&CT9p$9#Fl#wy*BzH)XfkPNY_$wt&sW*1LlY7lQd?$uLRF8# zbV7}XIhiTd`@pXR?n7p(PUV(d= zf34Mzx4%DjW%Px%nqpv}bLaznu?4Pj9_D19CigP9rYtS>#=h4SE@Es43nIF|P& zREvz;7G~PMILo>MB|WcnaaQAbiMID<0(H%HXZO4p9{O6j6{6Hzt&i7K`!$(JFGi2K zITYJnC{=jkWuxtgE;X0*CB-3G`nB4v(<>{ai$l`XTP0hF>o+X)(XtFL+<9tzT?{jg=T;bIrk%0x$kWtJRvwm>&+i(g zGpEKLj}|w%rtFt}<_xbBvC@tnq*>c;%CFokMwSX8s0}KJV@RVnRBUR`-(wE0RAdaN zEDJ=f33adkOlZNqo_2qp^(dB+jrd@88YG&uSkbKtE>|}M-B8`^9DWHuU|Ei1Su)kSo zVjf>1G21IYwB)OqU9z4XH|b7YTN=oFnTEFI-Wnmw?wUMteq$66teJ5`QdE>dBzGu} zg#nEwk2#`RG|ErGeK((!Jl4O5dy9G{i*Pb=MJZ{XN@`yx!Y*sO8gE%{-oTqT2gNaz zKhC3!U@{zTgr-Mgb`n*du)U7?maWITK9M{{f@|wp6^};e{i6|y_NJd|8x}7-P9Ax~ z%aMJj>>9xc)^w-krdJpijZg?)&BH+w5)2Rdl?lpeUAG0K&>d~tG~)V^*sgH>=XaDg zJME09D)LA-`S^=-gfrZ>uhGv_eOMZ^nrkH+N&sEN&>(`Awvj)~& z={?FTa=UW{b$48KT3P3*e>8zwi}#Yh!P;%Uj5k2XpwikIpv)#xwb;|+>3bg#jD+lz zwIugDBd|E^c{q0;V2a5}GO7{(eV!&P>b0J$_@D zFQ|?d)sOcJ-#vK-BsgAf73dbA!z-W1mj$GA88%z{3fJ9FHg^>6F8yeUI+wg$#;?X3 za7|VSL0b4w1%cIAgFlO`ZWqO|r*`1 zhpcDZWF3$_LViX!wZe_JJ5tV{b1KStM0Ho96Mm(^Sl6tNV#k?8UdAo5RYk2;tcJj( z$2%Y@?8RksIbpq}vJ=dEX_G>a%ij4^8P^(VKfN-WI>o)8NQ7!+>6qyR2=p_X)6kmD zXYz^ka!qxRAr2~?+3(q&<{3IV3DU9~B&q!L%=?*YB8E-w;Y}ij-gJqq{MBR<_?(pd z+Wm56jQXY7YZYhA$Y~XNvO*fn=w)N^1!USWfe#-fVbi)3PKqEqXPUDk50x8f%Rl;r zRdTxGJr_xNk(J17_k=a_A*wPL+qhP&&k8$}=L=`#DXS5`gN%y1MS1C5Jws8r*3#;< zY{y@a^HnsG6|E37!eb-i_cs{Xq|rN55teQV4yDF-XbgYHR5ni>n^?SsdF45NS*RC^j(e8n zi8xo%c!tukr@_g*>xGpGd4q${IiU&E3;VYcEhfd0P+xX!N7a6K!J)g}5$3I%&cP9oE18#{s;K5%r`Wk#hr z7Y^^@sfrrFW;;G)us&ZcpCG7GnWbmC@B$g<=q7)Oxq#mVl+#-w`GCpKPR72EgtD6= z5LhdKp_T?3_Qr<=A~Y{Pj0cMs{(9(s46W65N3`y|-f|Nb}!#cI=+qT9$YyT6)Q| zOXOfi%%LZfN~k>dvhGRURqb2*$Ombo*_kgAvFXT7a#E~v5%WpiZk(p+TtCTJ)IQ8T&d9`9!B|Jb9l6sKgeY;sLSpat*@9rm>So#YB*rTk6rA!wl z@&lgD5eD6;%9SB!Rw-}F9`=GKx`t5H;9EOI{}z!DbL1wHbxF%SauOn4NLO#VK}Lq^ zW32wx7uzmRhFlEicQ+u%8k2JlCR%;i0d-Z^6y+F}0?0Yk?yu=urvgUC^7vZX2tu9?#(z4~S*&F(jH^K0TXH&J@6=9g* zsy;K8uH=#BQ}#zn`585Ugd5SWmx^Y0K03Kt&c8bA}dAz`cK1?+5RdnZjUqS+A&Fqf*1 zF_O#^(xQ8;(dcvg)Fte|GCvb-0N2~~Oe&UMTxo2EBP=}jRbGM(7L~3eTRvKum-?r( z^gBh?aDCmoswNcSnQq<6>bz~P4oegwmQ{)2@df%vsm=+wHpGJrp8Yr4-f~g4jXxwa zW4)@~Q1Wc5HaY1gf8fP5rQv~1ju7mNx4T4>EvDNCKLhq83(zK&Im5N+kCAN|Mv9XY z&en~SC$1Erz3@o9YRFf!hK`Mu7|n>M`P|TSEo>D#ATM#Uv>fvx=Ts)f^V=6Zfs1zz z9^duubzd(KX|Ul2;9^JSBMK}1pqYO4*j_?; zt)CZ_!T!!ERSzqt3uV@)@X!kJinYDz2S8*)Tz!GTP*RFx!t}-th8E2CI(nkcClQEx zKuYCtqVyY7J553K*}?0p)1kvkzKYjzcWLug=Y4PMINe*xSBgBL{^D~Xi>%7B?lv$t zMT){cLH-jeX^{Gzw^cO>sHB*Q6He=ylklEBAFUmogs&=`4!6s+jFz$HGxiDZpOoNd ztH0b|AJQLTin$BFypfciZOZ{DS((Q_=BCWPqHE*ePmOGE^tg9|rf4ICI%NN-w zM{Y$mK7*&t-o!uCsVe8O+KTP`Q9hbqo%Q;s57KyRaqMxCw-XwXC!$PzULa}SrMikn z5;BD;&r4HGWvHNbFn1*COR-fZuf-?&%usop{>H+pYLV`aHiFCrvN>S`F7BJF*W2-| z)0{-P(3YLsb}rP7!#R6=?4O;J<)97nbe|L@>X20`wdpkrU}CyVckNI;haoTN#;N>+ z=Jsc?_@ae~8m9w=h2x6w_g2_n7~gX>P!;8osWQZR1N7mF3T_4`r8%O-NrsN zdqZ~ktd4Y2;>KX*HBIrxFe8>LihkR#nAKkiTvS)|))G*je8`++_}ne=qN%6i!76zZ z`at^;8n2P-)C_%^XeZlxqr^Skw_91Gy;{t-L`J< zO}Lz;u7y-!&y$;arK{qDw9dsM<>QY@Z{+D7C#q zT4sr!|L6?g30$1N9(iVEL@Gh{HNJZ!f!De*{q52YguFB)0pd9=)lMi0()c#^h z`OL9W1b&CQ{cP_tj^ai_wNB`I^P}at(duRy?j5A`)-x z)b1$l&wFjJWFB7a*lLc-bh9RWFuVUIew7SvEH9Oij9g5$$neGEbt3%-HyV`cai7vW z+F$9^CCA{u#h)-{dJz|!ta(qYUv_^s(%<(X_T`4dT&?9DAHU>+T$auHp--JH>}ixn zL|3{t66<20V9F3|Zv=Z9wqsGyu{#m2%1R(7K8$n(Tz?=-p_6`BMi-Q<)%){d4;}oc4oS{K9y+fk=LmxyzeEOaQ7KI z-*eIVo1e|HraD~*{Ub{FB4I1sDAPf#dT+1vBJcic;22= z6U#BV#Tr%X@SOL9wYag>J{keMnBSEz0#aQf|s;O^JR> zOH0LoH2;&MHx6!FJ7eh8c8@pWppeDLHVbl$wQ$?$Dj#VACJco{W^ z@7G-WO!#BBCoPJ&n5_sx?8b?E;Qjfw2>0mhoA_1*JmGbC7BL=|zBR2h*j#p!pf^+E zpXJ7hFYiJ~8y+G8hT<3|xa0O=_rkldQfWE5;*=ir^a_Z0We8yiz9#kEGVhVd?|OF+ zVb|hA!F154>C^Vu_c8$t+Mc5G6t9E*ygz#`d_0nE#+-P{ZyJ(l8%#|b+$h&rz-t=+ zzPNLdbwK&*dKX52e$F1xWwPr`bye3Q%=69f#P<Wa7oVbfh#t#;M0sB-q1C6;OQf#IoZr338}^Br8~xF=4EhaQw> zgzh2n!H2Yqv#VZ zG9uJ2)vI4hErNGC%>(d;k0agj-UsBg2woa5Z_8n=#UQBWeg$-R?%S`f(5&KdF%f;Q zd|+Jdk-`}!E3I_+Q=2dV{ymIG45Jn8OAbwf_f)#ostsC#fH%2_yy&@&i#>t#LpG{K z&Ql}YRYAxRZV&3XNljkk8{RtZoY3ANKTC8P8(|qLoQ>IxB0zh-EzNKeL_0-a;7Y~s zAB25pp$zBoWxLPPc^f9^@a=b!M8ebVNC>rA#6@Gr_iDdwQ{+v${p{$`%$tZ5)!0S( zkP(R$iT&yUqy8ZqlY9HL%_Wss@A{Plu3UN}E%c6|hId)MX+3|e{fvmmhX{+7m$s0u zsNE}hMk+%mU5mrJAu<)+$pKB2aac3l)T-pY^IaQpVpd>9!2NeE0kr1fO4bLB{z({b zyWkEBOI{`%d!Ph_tk7>4U}O}S3|hMRBg*bc4q{6sS@UE?t#pd%2ir$))AV%k`G0x# z=>~TkYP$96iKp3Xw8c%fJ5TAkn!WWjT(7(~xm1EYt<|GFg(_h9@*cj>gGW}lL|3j9 znF#LPsKzH>@1<@9)~CJ9 zBxyt^&v6raIGm1${8KqO(tw9M1fHFxLM7~H6zLBZ?z)|tBg6&;DlB4j`))R+@u~F_ ziwi4H0hQBeZM$X)pU=Oboy4(@Us7~12rS3m>IidRcNc2rV*zQVt*g*ufKON#tB9#c79DzLGn znl$2|%B^W2ae1$dSV!E}IsNq|@5?wlUNpsNME<)B(V0PHmlrQ@NcU09B&*8KEi`DxMTyb*T@6J3uzSD<`nG`S4 zudh3Oq=;}nk&1GE_i<*dEy}s(QP$C^fXUA6_M-VALbQ!>)n%$;A3Xunyh|b7)P2wN z(Ij4H<|IEFTrHL(Zhl=ZoBi~PE?(_cebgpltwv|C{N#Paw!>o8FOJ^6pSN`_>f^5A zkZBg*7hS{8>3;a-;?9Vw%6lZ`vjGbp9A3x9B<2lPErU~{Y$SyhXb zCTG16;vN4C_oP@tVz)}p1i#_QT3?&`D`oYY8B45EZZAK7c$mLYyEurB89{JMa7c5u zk~&U(nQO$hgeJH{o8-eI?#a>Nl9GDjTd4AmQJ)`vG{)$x3kvyt0LkOREsAtnu~I{<*A5P}}dnBx~A`A0OIPS)* zV_=S)BgqT%u@!Q~z98|#Rl4FLf*VT_CVH!xxGj$a5L^6so~C+rIcDEPd$aJCx3f+* zD#@6-1RnUt#9HGef`&p=cia4|-vHxm)mX+`DO{2&cZueXCt=hxUYIs&&e@T(TB-;n z2^NyspENbu{iIVZ%PufmW=CRhidni+g_wwSnU7@NqhI(+beZaQ97a#IOmQsaIxo#-3R8E znmKE1Vd^4-OJ455)Y#X)ymh3=?BF2HE%g=+OQB%)h%3W(qT@!$>}RBQ5;q@OXABEs zbn=)q$>=CQr0IL;%&_^)Dp``~P{XG_t816{@Z-BCB2ji7^)iaDOm zR|89j55%ODp2!iqvD06%tBzezgJ4?S8 z+fmKbm|V(hPO+%S{?^sV&nvzl>9Zc37%bI#zn9Q<48Sh6U+OS(fuc9)b9m&Dyc5Bc z!^it>Bp7uc6Zld1e0u`P23=_*E1cltyyK`>?&v(1ukQ~^d%gY0^_bWB6Nydag_G4S z9G2HrPx-1|9_et%)CRC|rDX+G%4IJHNDv4Jj3kv~@8I9T6^;bR;%53E-wN!TsEEI& zan+$uR{J(*j3BX;)fzuHu?j(-`fd%oxH7JnkY!n{;r1|dzVj((QOsOpet0eE0|0WR zzLDt3M>!E6(MsKls)xwlB0@4wqvEN2i7bI1XGZBi;!PR%5+_@a#;Gmpch(mKb0=oM zwLS^iu_KV1vOd^|Po`G$m!i0(>YQEqV6S_#)L=J;u|!%OLG=K;2Vd&6 zuKZ%!5DkmXgLGz!gC_;-bs3hZH&Oei%VMk(DMikqydhv87ir#7MSw|Ulb*l9&a9+p;m2^|( z3BWGKPW*~szXnE-JIhV?_lX#XL(d`wF-6uzT(kuJTtC`)*-=>|OIZ`-@e(w8;F|GR zI7Le~?9b(nQDotM&T!V!%1Fi2fAHxftdBShUVld=ZMub|V9=qD!YFO&fe2%>2W^|W zMTqq3YxT%f$H_ONxD3)oly+?brfCloqx zd?0--NN`oI`1NU!d3ROFp=Ri^wW@2M={NALKTw&fN$H#SFgj*lDVF?evV(|Bx zCaKVx#!L^I$@7(uhLgJTl8{a8$?I`WlB%r_n4X_L=UN2_I7`y@EMaeExU)4q53J%) zxt!2%8X+oI-MMFh2b_PYDdNv^xY9WtI8aZpF{bs{5PeMlc5Mq+(4m{Vq%*OP^Vs!P zUy^myRiKc@MwoQ$G>v3oW&zC=+K)oTX7Z1-S0*GTl<;4^8P1WH=wV3~T@?z|2)SYk zOw2yIf|)3lKJnT-%6?I6q0md5Nl5D1{lQNt?^S1$3 z2k9EjB=8e6$+~PB!XK+%O&X})pgtT=;BHgZd_ui(BpT#scq-t+=>0@mS1irgfK*aU zgZZ*p;`&orH4QSMi%UjNZ};n`TjzGB+IBs&C*Nbj z47^`tGjto>`Q&<ME(tZQ>72_cxd#rjwE*-H&mMV}MiMTNJC*kR^> z*%#=!H@`pK=l!(5OxdeBeBj~YJL|=48&~A5hIE_U67Hr7m4v+orIEYRV#ljm)xZtx zFb@Mj)E8pp3IyXFwT|}D3Hvj%E*dt`N70U<1XU$;%kae0_0RVg?$vS~wr~%(TBk}! z^HNu|`^h7x1?N&bFr6w_v7pp4*SW0K1$c$()uw9-+%nlQcv^oXjEpI7h8kJLE{;X($qO59UaS)j zYZgW;$tMm9CC|%mtn~?{e(DituL%fP*l)}SzWmr^a&cA8PV>v^olMcXrmWjTU+Q?> z?+hB9m9^2Hm5SYnBJ(>~$Z}=ad_No{g5WsRV(ckR?4~fflHQ;jOpV&Fr^wRKC-W-G zL65FCW^6p4JICfAB#Yatw<$3xrb1x9%bl-YuGOoua(;M2)0XJ7_QIBAB=sJ*e@h`{ zT6jcko37y~cb6-{ps_W#mMc@9c*81Z`D3jmoxQ;}wmo_U%Pp?kQ zZ*{Wt1!Xem^W-8(B0J9?r_gc(VF=B)uuH())}QjVa-&ENP8S ziSSa9r)Q%8v90w?QArMU;vG$emFC{y=k4O3nS1XC*UKGHuQnCflM6Fz8m28VZrB>s z%b$!TO`?k>Mcp`QN=&YuSn6clM-M@9CK3xe81r0T%AuBeC8>+9*z0^_xttbrs3l^a z#|C9)+&nuq!4cgq(A~ji4PdQO1e6{6N8@*54|-B)zV z7cDP8vSMTP@Sbz4@}ug$Saxl-tj$ANEb`P7Yd3`U!m`2+1J^9+_}P_H4}FoN`BFSL zkrSrRCBjnb*ItkkW$N3jyNjY-=eu~xM$%j6m=4YA^d%re26>UE-6s#op_{s@#1*8 z*GaQX)``vynOarG^>1X5Dw@Y=_LTy!Y<#nLBF5G#noJ2H&s7)WkZb3 zkkej#6pbowxS}!e#d7<~N{+-eng{y4q9TBd16v$$8da1rCl@q9ytJ8T+ zdvaY(50DqU-z5|%HXhpxkSS_3rNZT==GS5EN?+Gs#9ri)3u{s#vx|5nhd%D-Mb2B$ zPyuYcD{o_Z^t)FCid-lAW_)k{7R3xzM)of3)7n4bwF+19TNd)8}q72fO)$5I`#e3|&-OIylN z@3mM>Y;PGr2%w_bd%p5zi17611%fe4|9y1_b{$tLy-b&rmq$Tj4uVb7Ovjb=J@;dg z(&Efg@4t~I<5~*1!8R>oq1|ecfes88y!7lUf>;}M&oyPgg!^-S4@f+0T5X37;{@g> z@?Yv!za%hZWUVbh-Z2%VViqrQz8LPp$T~6Mf`ElSWF+3d%)px}b^$ zuiYinoG$V9pIyT6P(JEh$`3f|xKR*rn_~a@*qmt{vY6s!R35tJI3I2B)@$~5SO;?A#Al}e{23^DuCjmT^*;UM>z3`Hg#~lcBRLcB=l~IIR{mo*K1PC zcQd6_#MYFztM&{g3{&dn1y{p9qSvHqQz}P%778ir1@>DOmJ_Ij6lsNt6za=Id1_o3 zd5j~r7oi)N)Fi}bWu%VgVd~f%AodhXhrAtO@5bH}U+mP^Ga}}``oXb{%4o_eiER7Y z)@Vd`{i~G&xlw_W!fD-j`Ph4Th+W3{u9K1OW`|u!^Eo3PL@~4uJX&iT%}A#b&R7#V z$fEal3fSiwH9QoK#(}Lu|t-;*K}{$LsHWI%EA zY+0`kdo5TF{?>TG`ukhnJ$%R>sbL;2OFq>JU1+Sgr;p{^XV+0iOPY=Nw+9;|svOO1 z8JE9woaTlEh6{TaR2?D!i&dq|O)xyJv3Xi?-Vh5Cu6h+mxDldxw4WoM;KW9A%Z9UO zMkg;>Uga#?h(?Vm2XSqnaK^7AO-t+f5SDv-$7~Fc&V|A``W<@9cvtRJhe(*~A@h9Z zgzJYL++24;vQ^w|Y$XP^hO~n>*l9 z*dU~OmZm2*9e3v3+>5mKWi`{y`ErvGC#S+whe z)QjS6L-?d7J9vTa#pNU|I|_82LDNH=hLVZ8rw#;%xX}p~6%rI{6%=z}7bu#Hg<^n3 z-j#Id6sOv$6H2e7$0l1?*Q#f(?q0Xi(=CKwQhDVv-a~OXtm-m8Na$%;yS?dyv56r+ z;BbH@n#PnHONd*M<$L^+qBr}CJU6@RBE!z9sw>|InY}S*CHnQ?9XEH23w!Mi(}Afs zjoHxe$4*{>Pn)?>x6Imkq+!?N!Md$R#FX2IDB2QCjJKMpjEPQj?-uUDjj{Q8l%bdi zlgb04Lp#AQc0+Ei;}%!5*e38->qlkPu8$9U5BM8RwR7;cT}3}+ydOEuflTp+prC|r zy*6kAm?Xr%6!(T-Aw!=9$(igJLugP4v z$(R`tW!uT}mm0GJZ|9acRAEhMEtmUy?LI%PnRrwi%2cwnpK(-?b;gF_-!pq+tk&QA z2H*eb7x>DAE1nKr?}$@&Kaeb|i+kQ9mOoMUSC+lsRHOG{>hLI7J}$9y>W&$;mVeKU zzSq5Mt)9U2Tl$zDSB5`0I^woh)JNuU_qLO^bLlEAX1@fKQxWYRp19x%_1b9hMO4=q z>OWj_n0@=&^`nvuKx`e?h1=QO;vkjSK`e*VopvSh*2vY>3j4SxR6MO@3Svh9n*E^D zn(5(36B{<#3G1kCg&pIaOei&l1Y(W{KFQ@*7c8!=A2g;A#Q5>AMu_#K`-{3YT(IO2 zUs#QD3T%*|KTOVI`qG$fyik{r(a||QrVxqX(uR%fp4Kc9E99?5z-X^Km?9v$H()`G{|p$7U%=R(X^nLLII1#}5kSj(pRHrPZrM3>~=WCTxg zPgH0CE^S$)X6Uq2I6CqylWK?YM;t~RTR&7{qdWD83=@uB<)1L|QEK-hn8Tv69`8Wx z*^J`zX4HMbdOV9V+c|MD4Lf2wP;a`B$v^Gv1%S*XS&4u8Zpu3rPcEgO?;Hewn$d0d?~zzhHUuEMWg3 zjXQBhE+1fS@Okkjfcxq`_esKKxZQy3W89&1Kw& zUf1%O`nsi43G=-1h@&bNZ|Xf9C`x$M$zn=!myY#XA83Z;&K_Da2;1=X>4d&Mdd0X^ z9mKQvK{jLMSjRS%v*NHG*S%5E)if9BSfQZSqXDOS&Q;j03gvLx#bjUsQ}nG?`>a$E zy<;Xn^^k$`=4>w=_xgc@%`_78u_w8?ODU@BZVCxYwjsMz`Cx}@Q$&hPb~?l1J;J>y zLM$%ux2@cP>3P&!`ci*zH8kw{Q-Cin4v)2ozJK3TPHNEm!$;V-Y~J zV2{QD)lM=bX6X(;MZ>2L)Z`vsy7tc>N$K{;0T?Y=8}{ag#ReqC9_jDO)+43yZ3Y|> zHZ7zk;~*kVTMOc>j>4S`b=;3fy+E;A_C!^;x3I`J&L7=j_W+P7LhSH1LtJB{vAedl z9L;ilLOI!f!YC9OEW$r4qmxhj-p&s8!#gC_Sh zeR!KKsr3z)-~*cH>qY|Od^g+3}R7i`_FQ~C(7 zPh1Wq_mZz?M+B5>JrfViq{HXq^J`!196EN{&p5M~=?*!ypIlI{LG#oV+WWGG-C9P! z;Fw6T?~>3ts6lDnv}*X4$kSkexy2S|Cr3cM{#o-`y3i9QkyYOJ*KWBD;-u9ot$x_7 zo2Y4;J*HVsz#|G=yPab>Tvzm%vCB?*uDsdw!&KV?#XFq)iJrZuJLGGKJCCKOme%o8 z?JDT;4;d%%3WNRY7n6}As{JE4X8MWmtiKS(qua&VU0hv`8bK2s_Z(r7Zlt&KS=~8ULTm@2ccYB6?ogl8`ily^{(3(Tig!$` zK?ZueW!{&okwg_;H>Tm&CEkcd<04at_swMAYgAsy?k2yJl6Ek7)v7$N;f963?9kEl zp(8cLZtjB}`jXzByD3|!gOh1mv`+qn`?e!_b*Bg(_0r4XBB-Js#1Uddh!k^0tk>8# zYP;Sj+{fRR*k&KosV5Fdx_rifWELJT@hPE+{?#&(GRAUUNHJr~#kB7JIM>ugV~vpp z5uOkCHzm4z=qE`RSRHk)>=KYM<+>*v$+LgrMm(MWRP$E7vE9V%hLgbb8>?F9eZnP! z+0t17bWv-Yuw3Hw_j(scu+cm^fsPUq{F`c{^m)5vjxL88{_NNX*k4q-MkfsgTjZ*n z%-V?xZ{GIs;;RG#;Odn(jEa(*4uq2;@om=KWvX;8;tq}ES6FW`4`KJe-B5v}NX^3g zD7=5>`Cd$kc%!mfncak1Gz*xbZ;Dg6U54zW+S)VW`20G?fi2<6hpy&h*D^0^JJQYk z-37LN?Ell=oj_Mr-w7OlAq0|;ecyB6zV9dq*7vB|f(u}!A{0trLx7Cgcu8oaw01ev ztsP2bJklzRrB0ctr8;!xfD{m>_9)2S^x(pQho8}qL#%6|IiWp2;X ziYeg&C zz5D9@^LFRmI>j+O;r3Ts8^`}?bi&Dv|FS*qpO>~BAKm$Q`#0YDdea-LGW;ig>t8xM zlzcSxdFH-EqRcgr5i>nxaZdd9kW=R0P-b8BH*pnTHy z1xtT2cCXdkF-%uG^1Dw@v%T&`yHKo){H3mQrxX)DYMa>`H)^7UV;oUEfx#`4*YbNaYbwbj12_O`TJTlQ29cHK4d+{k84(_@FXo$t)q@%8`q{AJ`1 zcl=-O+|>LH-`KqJrkzFe4(sPW``q}w^|!44)m?4JJ*UPkmO7T%T&D}NPrv^AX%k); zymVu6$)A7m%$8wgbB!-ZM;_n%`>E&Ndup=dmS@tRTQPC!`t=15pS*uz-Meoted>+! z|9JY;y1h^472ex6Y5nG(=cU|MeQxa^A86Y;Z=vmQ!flRM*3bV@#@=%)*WA5o!+}R$ zT3j$MPLmXU%4|GOZ^bc$V;mz*Di3oh%gcWFZGafKvTH!fxWfMwfA9>J_x!_W>;WlL zqXWoHuWD!vSADxlnR;0sKt`S#Q+e1-8344efoggVXnzl5(R2?~BM)nnsHq6mM|UCD zpVp)PQH^yqRTXzcS`n(1r+n(YA7yMCc{}-mH>F*pYG+0oURNUq>WoZy93#F;d1ZO! z@%=9bX1?&TyV&u)ctD@j9_??audHYchsH+d$BnG-c3&K?p6>gj+cnj6mlyl#87JAQ zcq89NU$G{JUd~9~j2nE(0fr~Fi28<8uR0Jsfw(~yy$2Xp`dQK+E)2l*$Q(WujdkH^ zRkhPAo8<}Kd0$c2R2!MIt?PYtUKy{w;lg^A3D>(Pf)}%*_jun>*Ay1B z$3-^nvA#YOj?6V5nObOCO{iX}RcVLvUh#}pR$Spy84!8vi=u)LSBPcL^I}Tmj5en- z+z=U+{*nU%U;I$DIB=Egh|+Fl8Lzp-!1Gr;@bQ4>|5s4tU3HC8-}^kM(I{sWQTST_ z8*9MyQ3)af%HEa!`VtKo&+=t17)qWB^Tc+yu)aG_mpgEEZCzxX=!;(8%~|o)*13xU zV)>iEsy!l>+b!ED zzdi7q$frA(y~%bh0e|%MSGIpE@LIbivc=ofvor9uXaoL6eY*m!bL9r^rrte)*>ZLD z?^6HY0|N9O`*|-gT5Q1nS_5)xrYv}${r)2mZSKy0u>TJN#_Sc5%DEmE%?9A|Ny#c>wLIUMJ3oWpS*$9Wv*acF{~KWl=bUuuHlIMD<}zt#jreleZ97l0M(H{l`ML!x46#Z{NQ1sgYL2*0|2#Rh!ASjNv z_@FqB;)A09#0N#ciw}za8Xpw>JU%FnkAXM_;uwfyAdZ1J2I3fqBLPPOjszSDI1+Fq z;24Bs5RO4O2H_ZlV-SwPI0oYwjAJm4!8iuvNW_tdBN0a;jzk=ZI1+Ir;Yh-fgd+(@ z5{@Js$vBd6BnL&mOvaInBN@jK97Avn!7&8K5FA5rq~J)wk%A)yM+%M<94RVDxl4BLiOs z{UHNq2JOhen?ZXraA(l2O#GR&FOxWA(#}lckx6?qiAyH!&LlpWv_F$LW#Y)fk%c1* zM;4AO;+KUZ3r7}?EF4)lvT$VK$ik70BO6CHj%*y+II?kMM?Q{x9Qio%apdF3$B~aCA4fipd>r{W@^KX4 zD8NyGqX0(%jshG79G?X^3UCzQD8NyGqX0)CjzS!TI0|tT;wZ#Xh@%ikA&x>Eg*Xav z6yYesQG}xiM-h%997Q;aa1`Mv!cl~y2uBf)VjRUdig6UWjM-ll;bGJQI4Y=M>&pi9OXF5ag^gI z$5D<$Vm}fdiTz2qB=#%eli0t6Q=%Ob*BOcSNVp~1C2@X`XrDwJB-$wv4~h0l#6_ar z67i8}zeJoQ99kS&99kS&99kS&99kS&99kS&@}|Y1#i7Na#i7Na#i7Na#i7Na#i7Na z#i7Na#i7Na!=b~W!=b~W!=b~W!=b~W!=b~W!=b~W!=b~W!=b~W!=b~W!=b~W!=b~W z!=b~W!=cBa$Dzle$Dzle$Dzle$Dzle$Dzle$Dzle$Dzle$Dzle$Dzle$Dzle$Dzle z$Dzkzz+u2)z+u2)z+u2)z+u2)z+u2)z+u2)z+u2)z+u2)z+u2)z+u2)z+u2)z+u2) zz+uE;#9_o?#9_o?#9_o?#9_o?#9_o?#9_o?#9_o?#9_o?#9_o?#9_o?#9_o?#9_o? z!ePQ;!ePQ;!ePQ;!ePQ;!ePQ;!ePQ;!ePQ;!ePQ;!ePQ;!ePQ;!ePQ;!ePQ;!ePc? z#$m=`#$m=`#$m=`#$m=`#$m=`#$m=`#$m=`#$m=`#$m=`#$m=`#$m=`#$m=`!C}E+ z!C}E+!C}E+!C}E+!C}E+!C}E+!C~S0X~AK^VZmX+VZmX+VZmX+VZmX+VZmX=VZ~v^ zVZ~v^VZ~v^VZ~v^VZ~v^VZ~v^VZ~v^VZ~v^VZ~v^VZ~v^VZ~v^VZ~v^VZ&j=VZ&j= zVZ&j=VZ&j=VZ&j=VZ&j=VZ&j=VZ&j=VZ&j=VZ&j=VZ&j=VZ&j=VZ&j^VaH*|VaH*| zVaH*|VaH*|VaH*|VaH*|VaH*|VaH*|VaH*|VaH*|VaH*|VaH*|;lSa*;lSa*;lSa* z;lSa*;lSa*;lSa*;lSa*;lSa*;lSa*;lSa*;lSa*;lSa*;lSa<;l$y@;l$y@;l$y@ z;l$y@;l$y@;l$y@;l$y@;l$y@;l$y@;l$y@;l$y@;l$y@;lkm<;lkm<;lkm<;lkm< z;lkm<;lkm<;lkm<;lkm<;lkm<;lkm<;lkm<;lkm<;lkm@;l|;{;l|;{;l|;{;l|;{ z;l|;{;l|;{;l|;{;l|;{;SR2j{=LGD!;Qm@!;Qm@!;Qm@!z1>S;KAb&*Q<07E|1u6 zp$DHw>|gJ}=@IR4dGLBfT!(vbdqlgw?7{C5?YqZA96X|(6FtPkBibAC@bipEwEH0s z@$rcEH+hJYM>u|fV?K^2a4f*F2*+X^OK>d1u^h(=94m3G!m$>|MjTskY{SulV<(P1 zI9hS+$8iWp8;*7y9XK>z^5G>PUh?53A71j|B_Ce$;Uynl^5G>PUh?53A71j|B_Ce$ z;Uynl^5G>PUh?6kpL)rMmwb51hnIYK$p?=4IG(_<0LLO6i*YQ$u?)v@94m0F#IXv; zS{xg3Y{9V&M+=UfIQHOZ#jzj9AslTu+HrK?(D=xQk9_#ZhmU;t$cK-7_{fKkeE7(R zk9_#ZhmU;t$cK-7_{fKkeE7(Rk9_#ZhmU;t$cK-7_{fKkeE7%*j`=vAz_9?wA{>ix zEWxo1$8sDiaID0!3ddR;8*yyGu?@w1xGVAH*oY>LAO7C;KipoR9DOxbJdb z)Tglqq2r;pi<-5z*9YS1h#n7oT(pI{LXChL0W|_@1k?zq5$Nv`xQ?DTZGA@sQ@#cH z!k#z%y!TIA)%&OZeh8@TS0kWCK#hPJ0W|`jI|A3y{gZZ|XnnuBe|lTJfBM{gPTfF_ zfEocc0%`=*2=w;|Tu1j$p(7%g{p$XyRlR@e?}vceel-GW1k?zq5l|!Wxg&7#{gZg& zDNYO<)-^ss1Z;jphlpdL_of8lt)uN-|M9`e^R2jb5`yH z)$vf3$lMr9@&8i>c8zxVEthaBKTkcz`{f?7Ug;+8A^29L`;gi@o?|0ZGw_|5+oCqb-k&Jodq971g1J28AiJlOkVAyvIIRAFivY z>?#mzoY3c!#1`YJ=u*dd+z?S-iMM*3D;c;kmdZG?%DA!?*m0cyl_-Ro8fVpo7mAuyj1!rrvrIapD%HKiPuP!s!9_zDD^Dl{mU6*jq?A{j^Mi*=tD<(d-Z{#7ZLmg~=nd@0%UdAviN<0=}RKCk4xd4%6H zVyI6pr_qcSi)-|+(odCsb(HgKtm-8`n3Srt^s`GU=i4zUeV6;}t^42FxJd7aO5ygN zFG7ievW%x6$$8I@e8uip=jc~*sqR$)&nq z*MB_Xqy0miZ8VWl-o+7O%@jRiJd{h_&pe(b$}7j0dOy?M2X2J#V%^WQa37(>;9B3$ zDA(cM_bpd`9lrAOW#8A~YR(URUx%-^^JVYr@WY%JlzjGHN~~zjQLZSxONjT%d7>q| z?{c5Lb^lv?HP@Zo2sie1CrrPROLf1l|Le|`A7_Um6H3L7$D_nUF4g_I{^Rl4*WuOt z-r{nv!?TOj>u`70Z@lkfU56(r6Pgi{YkeJ7B7JYDwy|pZowakS!gaMZmGaa~(U(|1 zs(NN!xTGP^P$4Nugek%*;>+fIpsRP zy14Ih*E+vnRDD;|ull~uHxo+rIxqL6__$rAqDS?w>wMQ4aD;S!XinwW%I2nq@!~HG zmD8m;-sC%*D=VV2XG(WOeg!u|>iG*dpGW+{t!JU8a7dmAbA;sdN)442b+ywQlE*7E z(>07pmZY(fS?WeeV`}T08Yk9;A8M!%Ra82p2SU|Nk=39nu|@GeS+(je!x; z*t*EOs&Hhsy=b-3?Ye6DN>z2GJY`7AHI?rA8MnCa2-nqryRKQXjQiTyd#vv2 zs>aCFc##!uu?tsibHiotWt|eCUx_o2gSpx5^s_km0=ZY%{HFs6w z^9~(0bh!WKp~J4UwtFJ86LwX1`IU^Sudl3~-nHT9z>E)9HdKb^RNgr!axIR8j Date: Thu, 23 Oct 2014 15:24:42 +0100 Subject: [PATCH 184/284] Address complaint from cppcheck, prefer prefix--, re #8051 --- Code/Mantid/Framework/Algorithms/src/Integration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/Algorithms/src/Integration.cpp b/Code/Mantid/Framework/Algorithms/src/Integration.cpp index ae12aa484cab..48a258146143 100644 --- a/Code/Mantid/Framework/Algorithms/src/Integration.cpp +++ b/Code/Mantid/Framework/Algorithms/src/Integration.cpp @@ -153,7 +153,7 @@ void Integration::exec() // note reverse iteration, mirror of the find_if used to find highit (below) oit = (std::find_if(X.rbegin(), X.rend(), std::bind2nd(tolerant_less(), m_MinRange))); // Lower limit is the bin after (decr in reverse iteration), i.e. the last (in reverse order) value not less than MinRange - oit--; + --oit; // turn reverse_iterator into forward/normal iterator lowit = --(oit.base()); } From 8d091cb521f0a8ccbdce743327cf9083611aaca3 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Thu, 23 Oct 2014 16:23:42 +0100 Subject: [PATCH 185/284] find RangeLower with std::lower_bound, neat, re #8085 This also fixes some issues in ChopDataTest --- Code/Mantid/Framework/Algorithms/src/Integration.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/Code/Mantid/Framework/Algorithms/src/Integration.cpp b/Code/Mantid/Framework/Algorithms/src/Integration.cpp index 48a258146143..ed6e23d947eb 100644 --- a/Code/Mantid/Framework/Algorithms/src/Integration.cpp +++ b/Code/Mantid/Framework/Algorithms/src/Integration.cpp @@ -56,7 +56,7 @@ struct tolerant_less: public std::binary_function bool operator()(const double &left, const double &right) const { // soft equal, if the diff left-right is below a numerical error (uncertainty) threshold, we cannot say - return (left < right) && (std::abs(left - right) > std::numeric_limits::epsilon()); + return (left < right) && (std::abs(left - right) > 1*std::numeric_limits::epsilon()); } }; @@ -149,13 +149,7 @@ void Integration::exec() } else { - MantidVec::const_reverse_iterator oit; - // note reverse iteration, mirror of the find_if used to find highit (below) - oit = (std::find_if(X.rbegin(), X.rend(), std::bind2nd(tolerant_less(), m_MinRange))); - // Lower limit is the bin after (decr in reverse iteration), i.e. the last (in reverse order) value not less than MinRange - --oit; - // turn reverse_iterator into forward/normal iterator - lowit = --(oit.base()); + lowit = std::lower_bound(X.begin(), X.end(), m_MinRange, tolerant_less()); } if (m_MaxRange == EMPTY_DBL()) From 710bd8caf0485b28d6985a0396b8ffdd041c2239 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 22 Oct 2014 13:41:45 +0100 Subject: [PATCH 186/284] =?UTF-8?q?Refs=20#10349=20Rename=20processRow=20?= =?UTF-8?q?=E2=86=92=20reduceRow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let's increase clarity here. Reducing is running ReflectometryReductionOne. Stitching is running Stitch2D. Processing is reducing AND then stitching. --- .../ReflMainViewPresenter.h | 4 ++-- .../CustomInterfaces/src/ReflMainViewPresenter.cpp | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 1652ad9565de..eb0cee9eba4a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -60,6 +60,8 @@ namespace MantidQt //process selected rows virtual void process(); + //Reduce a row + void reduceRow(size_t rowNo); //load a run into the ADS, or re-use one in the ADS if possible Mantid::API::Workspace_sptr loadRun(const std::string& run, const std::string& instrument); //get the run number of a TOF workspace @@ -74,8 +76,6 @@ namespace MantidQt void autofillRow(size_t rowNo); //calculates qmin and qmax static std::vector calcQRange(Mantid::API::MatrixWorkspace_sptr ws, double theta); - //Process a row - void processRow(size_t rowNo); //Stitch some rows void stitchRows(std::vector rows); //insert a row in the model before the given index diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 659de7c9796f..c7c8c3a8c634 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -285,12 +285,12 @@ namespace MantidQt { const std::vector groupRows = gIt->second; - //Process each row individually + //Reduce each row for(auto rIt = groupRows.begin(); rIt != groupRows.end(); ++rIt) { try { - processRow(*rIt); + reduceRow(*rIt); m_view->setProgress(++progress); } catch(std::exception& ex) @@ -489,11 +489,11 @@ namespace MantidQt } /** - Process a row - @param rowNo : The row in the model to process - @throws std::runtime_error if processing fails + Reduce a row + @param rowNo : The row in the model to reduce + @throws std::runtime_error if reduction fails */ - void ReflMainViewPresenter::processRow(size_t rowNo) + void ReflMainViewPresenter::reduceRow(size_t rowNo) { const std::string run = m_model->String(rowNo, COL_RUNS); const std::string transStr = m_model->String(rowNo, COL_TRANSMISSION); @@ -555,7 +555,7 @@ namespace MantidQt throw std::runtime_error("Failed to run Scale algorithm"); } - //Processing has completed. Put Qmin and Qmax into the table if needed, for stitching. + //Reduction has completed. Put Qmin and Qmax into the table if needed, for stitching. if(m_model->String(rowNo, COL_QMIN).empty() || m_model->String(rowNo, COL_QMAX).empty()) { MatrixWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS("IvsQ_" + runNo); From d1feaa9dc358520819ca516b7f2238034c49d5a2 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 22 Oct 2014 14:13:51 +0100 Subject: [PATCH 187/284] Refs #10349 Allow non-contiguous selections --- .../inc/MantidQtCustomInterfaces/ReflMainWidget.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index 961e5271ff19..30feb1727fdf 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -287,7 +287,7 @@ true - QAbstractItemView::ContiguousSelection + QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows From 79b21b500beaae938e47b1358b88f8dd0ae80b9f Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Oct 2014 12:25:46 +0100 Subject: [PATCH 188/284] Refs #10349 Add numRowsInGroup method This method counts how many rows there are in a particular group. --- .../ReflMainViewPresenter.h | 2 ++ .../CustomInterfaces/src/ReflMainViewPresenter.cpp | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index eb0cee9eba4a..6dc2ef5e6910 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -76,6 +76,8 @@ namespace MantidQt void autofillRow(size_t rowNo); //calculates qmin and qmax static std::vector calcQRange(Mantid::API::MatrixWorkspace_sptr ws, double theta); + //get the number of rows in a group + size_t numRowsInGroup(int groupId) const; //Stitch some rows void stitchRows(std::vector rows); //insert a row in the model before the given index diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index c7c8c3a8c634..f6f3cc6768d7 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -974,5 +974,18 @@ namespace MantidQt if(m_view) m_view->setTableList(m_workspaceList); } + + /** Returns how many rows there are in a given group + @param groupId : The id of the group to count the rows of + @returns The number of rows in the group + */ + size_t ReflMainViewPresenter::numRowsInGroup(int groupId) const + { + size_t count = 0; + for(size_t i = 0; i < m_model->rowCount(); ++i) + if(m_model->Int(i, COL_GROUP) == groupId) + count++; + return count; + } } } From aaffae54953685b2b1439716110ac118166428a6 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Oct 2014 12:26:17 +0100 Subject: [PATCH 189/284] Refs #10349 Warn when user tries to partially process a group --- .../CustomInterfaces/src/ReflMainViewPresenter.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index f6f3cc6768d7..560941d88c7c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -285,6 +285,17 @@ namespace MantidQt { const std::vector groupRows = gIt->second; + //Are we only partially processing a group? + if(groupRows.size() < numRowsInGroup(gIt->first)) + { + std::stringstream err; + err << "You have only selected " << groupRows.size() << " of the "; + err << numRowsInGroup(gIt->first) << " rows in group " << gIt->first << "."; + err << " Are you sure you want to continue?"; + if(!m_view->askUserYesNo(err.str(), "Continue Processing?")) + return; + } + //Reduce each row for(auto rIt = groupRows.begin(); rIt != groupRows.end(); ++rIt) { From dc92620cd9c270f30109ffd6aaed42bee97e0112 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Oct 2014 14:28:50 +0100 Subject: [PATCH 190/284] Refs #10349 Change selectedRows container to set --- .../MantidQtCustomInterfaces/QtReflMainView.h | 2 +- .../MantidQtCustomInterfaces/ReflMainView.h | 2 +- .../ReflMainViewPresenter.h | 2 +- .../CustomInterfaces/src/QtReflMainView.cpp | 14 ++-- .../src/ReflMainViewPresenter.cpp | 26 +++---- .../test/ReflMainViewMockObjects.h | 2 +- .../test/ReflMainViewPresenterTest.h | 74 +++++++++---------- 7 files changed, 59 insertions(+), 63 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index 0a4bba20105e..396d80fbf985 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -70,7 +70,7 @@ namespace MantidQt virtual void setOptionsHintStrategy(HintStrategy* hintStrategy); //Accessor methods - virtual std::vector getSelectedRowIndexes() const; + virtual std::set getSelectedRows() const; virtual std::string getSearchInstrument() const; virtual std::string getProcessInstrument() const; virtual std::string getWorkspaceToOpen() const; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index f02663b027d2..62ba3772086b 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -62,7 +62,7 @@ namespace MantidQt virtual void setOptionsHintStrategy(HintStrategy* hintStrategy) = 0; //Accessor methods - virtual std::vector getSelectedRowIndexes() const = 0; + virtual std::set getSelectedRows() const = 0; virtual std::string getSearchInstrument() const = 0; virtual std::string getProcessInstrument() const = 0; virtual std::string getWorkspaceToOpen() const = 0; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 6dc2ef5e6910..7062ebcc3700 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -67,7 +67,7 @@ namespace MantidQt //get the run number of a TOF workspace std::string getRunNumber(const Mantid::API::Workspace_sptr& ws); //get an unused group id - int getUnusedGroup(std::vector ignoredRows = std::vector()) const; + int getUnusedGroup(std::set ignoredRows = std::set()) const; //make a transmission workspace Mantid::API::MatrixWorkspace_sptr makeTransWS(const std::string& transString); //Validate a row diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 1ecff07a22e8..051dc4f9cf11 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -306,16 +306,14 @@ namespace MantidQt Get the indices of the highlighted rows @returns a vector of unsigned ints contianing the highlighted row numbers */ - std::vector QtReflMainView::getSelectedRowIndexes() const + std::set QtReflMainView::getSelectedRows() const { auto selectedRows = ui.viewTable->selectionModel()->selectedRows(); - //auto selectedType = ui.viewTable->selectionModel()->; - std::vector rowIndexes; - for (auto idx = selectedRows.begin(); idx != selectedRows.end(); ++idx) - { - rowIndexes.push_back(idx->row()); - } - return rowIndexes; + std::set rows; + for(auto it = selectedRows.begin(); it != selectedRows.end(); ++it) + rows.insert(it->row()); + + return rows; } /** diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 560941d88c7c..406fd25f0a45 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -165,24 +165,24 @@ namespace MantidQt /** * Finds the first unused group id */ - int ReflMainViewPresenter::getUnusedGroup(std::vector ignoredRows) const + int ReflMainViewPresenter::getUnusedGroup(std::set ignoredRows) const { - std::vector usedGroups; + std::set usedGroups; //Scan through all the rows, working out which group ids are used for(size_t idx = 0; idx < m_model->rowCount(); ++idx) { - if(std::find(ignoredRows.begin(), ignoredRows.end(), idx) != ignoredRows.end()) + if(ignoredRows.find(idx) != ignoredRows.end()) continue; //This is an unselected row. Add it to the list of used group ids - usedGroups.push_back(m_model->Int(idx, COL_GROUP)); + usedGroups.insert(m_model->Int(idx, COL_GROUP)); } int groupId = 0; //While the group id is one of the used ones, increment it by 1 - while(std::find(usedGroups.begin(), usedGroups.end(), groupId) != usedGroups.end()) + while(usedGroups.find(groupId) != usedGroups.end()) groupId++; return groupId; @@ -243,7 +243,7 @@ namespace MantidQt return; } - std::vector rows = m_view->getSelectedRowIndexes(); + std::set rows = m_view->getSelectedRows(); if(rows.size() == 0) { //Does the user want to abort? @@ -252,7 +252,7 @@ namespace MantidQt //They want to process all rows, so populate rows with every index in the model for(size_t idx = 0; idx < m_model->rowCount(); ++idx) - rows.push_back(idx); + rows.insert(idx); } //Maps group numbers to the list of rows in that group we want to process @@ -762,8 +762,7 @@ namespace MantidQt */ void ReflMainViewPresenter::addRow() { - std::vector rows = m_view->getSelectedRowIndexes(); - std::sort(rows.begin(), rows.end()); + std::set rows = m_view->getSelectedRows(); if(rows.size() == 0) insertRow(m_model->rowCount()); else @@ -776,10 +775,9 @@ namespace MantidQt */ void ReflMainViewPresenter::deleteRow() { - std::vector rows = m_view->getSelectedRowIndexes(); - std::sort(rows.begin(), rows.end()); - for(size_t idx = rows.size(); 0 < idx; --idx) - m_model->removeRow(rows.at(0)); + std::set rows = m_view->getSelectedRows(); + for(auto row = rows.rbegin(); row != rows.rend(); ++row) + m_model->removeRow(*row); m_view->showTable(m_model); m_tableDirty = true; @@ -790,7 +788,7 @@ namespace MantidQt */ void ReflMainViewPresenter::groupRows() { - const std::vector rows = m_view->getSelectedRowIndexes(); + const std::set rows = m_view->getSelectedRows(); //Find the first unused group id, ignoring the selected rows const int groupId = getUnusedGroup(rows); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h index 2b7941af7efe..c95b372009b3 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h @@ -45,7 +45,7 @@ class MockView : public ReflMainView MOCK_METHOD1(setTableList, void(const std::set& tableList)); MOCK_METHOD2(setInstrumentList, void(const std::vector& instruments, const std::string& defaultInstrument)); MOCK_METHOD1(setInstrument, void(const std::string&)); - MOCK_CONST_METHOD0(getSelectedRowIndexes, std::vector()); + MOCK_CONST_METHOD0(getSelectedRows, std::set()); MOCK_CONST_METHOD0(getSearchInstrument, std::string()); MOCK_CONST_METHOD0(getProcessInstrument, std::string()); MOCK_CONST_METHOD0(getWorkspaceToOpen, std::string()); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index e37bce7b1a31..b2a7d03cbb52 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -196,7 +196,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_THROWS(ws->Int(6, GroupCol), std::runtime_error); //The user hits "add row" twice with no rows selected - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(2).WillRepeatedly(Return(std::vector())); + EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); presenter.notify(AddRowFlag); presenter.notify(AddRowFlag); @@ -229,8 +229,8 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::vector rowlist; - rowlist.push_back(1); + std::set rowlist; + rowlist.insert(1); //We should not receive any errors EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); @@ -247,7 +247,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_THROWS(ws->Int(6, GroupCol), std::runtime_error); //The user hits "add row" twice, with the second row selected - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(2).WillRepeatedly(Return(rowlist)); + EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(rowlist)); presenter.notify(AddRowFlag); presenter.notify(AddRowFlag); @@ -282,10 +282,10 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::vector rowlist; - rowlist.push_back(1); - rowlist.push_back(2); - rowlist.push_back(3); + std::set rowlist; + rowlist.insert(1); + rowlist.insert(2); + rowlist.insert(3); //We should not receive any errors EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); @@ -303,7 +303,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_THROWS(ws->Int(7, GroupCol), std::runtime_error); //The user hits "add row" once, with the second, third, and fourth row selected. - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(rowlist)); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(rowlist)); presenter.notify(AddRowFlag); //The user hits "save" @@ -347,7 +347,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_EQUALS(ws->Int(1, GroupCol), 3); //The user hits "delete row" with no rows selected - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(std::vector())); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); presenter.notify(DeleteRowFlag); //The user hits save @@ -374,8 +374,8 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::vector rowlist; - rowlist.push_back(1); + std::set rowlist; + rowlist.insert(1); //We should not receive any errors EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); @@ -387,7 +387,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_EQUALS(ws->Int(1, GroupCol), 3); //The user hits "delete row" with the second row selected - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(rowlist)); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(rowlist)); presenter.notify(DeleteRowFlag); //The user hits "save" @@ -414,10 +414,10 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::vector rowlist; - rowlist.push_back(0); - rowlist.push_back(1); - rowlist.push_back(2); + std::set rowlist; + rowlist.insert(0); + rowlist.insert(1); + rowlist.insert(2); //We should not receive any errors EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); @@ -429,7 +429,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_EQUALS(ws->Int(0, GroupCol), 3); //The user hits "delete row" with the first three rows selected - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(rowlist)); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(rowlist)); presenter.notify(DeleteRowFlag); //The user hits save @@ -459,15 +459,15 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::vector rowlist; - rowlist.push_back(0); - rowlist.push_back(1); + std::set rowlist; + rowlist.insert(0); + rowlist.insert(1); //We should not receive any errors EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); //The user hits the "process" button with the first two rows selected - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(rowlist)); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(rowlist)); EXPECT_CALL(mockView, getProcessInstrument()).WillRepeatedly(Return("INTER")); EXPECT_CALL(mockView, setProgressRange(_,_)); EXPECT_CALL(mockView, setProgress(_)).Times(4); @@ -524,15 +524,15 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::vector rowlist; - rowlist.push_back(0); - rowlist.push_back(1); + std::set rowlist; + rowlist.insert(0); + rowlist.insert(1); //We should not receive any errors EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); //The user hits the "process" button with the first two rows selected - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(rowlist)); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(rowlist)); EXPECT_CALL(mockView, getProcessInstrument()).WillRepeatedly(Return("INTER")); EXPECT_CALL(mockView, setProgressRange(_,_)); EXPECT_CALL(mockView, setProgress(_)).Times(4); @@ -576,15 +576,15 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::vector rowlist; - rowlist.push_back(0); - rowlist.push_back(1); + std::set rowlist; + rowlist.insert(0); + rowlist.insert(1); //We should not receive any errors EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); //The user hits the "process" button with the first two rows selected - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(rowlist)); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(rowlist)); EXPECT_CALL(mockView, getProcessInstrument()).WillRepeatedly(Return("INTER")); EXPECT_CALL(mockView, setProgressRange(_,_)); EXPECT_CALL(mockView, setProgress(_)).Times(4); @@ -708,7 +708,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite ReflMainViewPresenter presenter(&mockView); //User hits "add row" - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(std::vector())); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); presenter.notify(AddRowFlag); //The user will decide not to discard their changes @@ -734,7 +734,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite ReflMainViewPresenter presenter(&mockView); //User hits "add row" a couple of times - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(2).WillRepeatedly(Return(std::vector())); + EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); presenter.notify(AddRowFlag); presenter.notify(AddRowFlag); @@ -743,9 +743,9 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite presenter.notify(SaveFlag); //...then deletes the 2nd row - std::vector rows; - rows.push_back(1); - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(rows)); + std::set rows; + rows.insert(1); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(rows)); presenter.notify(DeleteRowFlag); //The user will decide not to discard their changes when asked @@ -770,7 +770,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite ReflMainViewPresenter presenter(&mockView); //User hits "add row" a couple of times - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(2).WillRepeatedly(Return(std::vector())); + EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); presenter.notify(AddRowFlag); presenter.notify(AddRowFlag); @@ -793,7 +793,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite createPrefilledWorkspace("TestWorkspace"); //User hits "add row" - EXPECT_CALL(mockView, getSelectedRowIndexes()).Times(1).WillRepeatedly(Return(std::vector())); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); presenter.notify(AddRowFlag); //and tries to open a workspace, but gets prompted and decides not to discard From 9cd204c7617078ab11c1bd7e6257b1499a534311 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Oct 2014 13:48:52 +0100 Subject: [PATCH 191/284] Refs #10349 Add setSelection method to ReflMainView --- .../inc/MantidQtCustomInterfaces/QtReflMainView.h | 5 ++--- .../inc/MantidQtCustomInterfaces/ReflMainView.h | 5 ++--- .../ReflMainViewPresenter.h | 2 ++ .../CustomInterfaces/src/QtReflMainView.cpp | 13 +++++++++++++ .../CustomInterfaces/test/ReflMainViewMockObjects.h | 1 + 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index 396d80fbf985..dfacdab2c71e 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -51,9 +51,6 @@ namespace MantidQt //Connect the model virtual void showTable(Mantid::API::ITableWorkspace_sptr model); - //Set the list of available tables to open - virtual void setTableList(const std::set& tables); - //Dialog/Prompt methods virtual std::string askUserString(const std::string& prompt, const std::string& title, const std::string& defaultValue); virtual bool askUserYesNo(std::string prompt, std::string title); @@ -66,6 +63,8 @@ namespace MantidQt virtual void setProgress(int progress); //Settor methods + virtual void setSelection(const std::set& rows); + virtual void setTableList(const std::set& tables); virtual void setInstrumentList(const std::vector& instruments, const std::string& defaultInstrument); virtual void setOptionsHintStrategy(HintStrategy* hintStrategy); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index 62ba3772086b..e079ac60695e 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -43,9 +43,6 @@ namespace MantidQt //Connect the model virtual void showTable(Mantid::API::ITableWorkspace_sptr model) = 0; - //Set the list of available tables to open - virtual void setTableList(const std::set& tables) = 0; - //Dialog/Prompt methods virtual std::string askUserString(const std::string& prompt, const std::string& title, const std::string& defaultValue) = 0; virtual bool askUserYesNo(std::string prompt, std::string title) = 0; @@ -58,6 +55,8 @@ namespace MantidQt virtual void setProgress(int progress) = 0; //Settor methods + virtual void setSelection(const std::set& rows) = 0; + virtual void setTableList(const std::set& tables) = 0; virtual void setInstrumentList(const std::vector& instruments, const std::string& defaultInstrument) = 0; virtual void setOptionsHintStrategy(HintStrategy* hintStrategy) = 0; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 7062ebcc3700..0b6db997078a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -88,6 +88,8 @@ namespace MantidQt virtual void deleteRow(); //group selected rows together virtual void groupRows(); + //expand selection to group + virtual void expandSelection(); //table io methods virtual void newTable(); virtual void openTable(); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 051dc4f9cf11..411a7a11748e 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -253,6 +253,19 @@ namespace MantidQt ui.progressBar->setValue(progress); } + /** + Set which rows are selected + @param rows : The set of rows to select + */ + void QtReflMainView::setSelection(const std::set& rows) + { + ui.viewTable->clearSelection(); + auto selectionModel = ui.viewTable->selectionModel(); + + for(auto row = rows.begin(); row != rows.end(); ++row) + selectionModel->select(ui.viewTable->model()->index((int)(*row), 0), QItemSelectionModel::Select | QItemSelectionModel::Rows); + } + /** Set the list of available instruments to search and process for @param instruments : The list of instruments available diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h index c95b372009b3..8d2789884105 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h @@ -45,6 +45,7 @@ class MockView : public ReflMainView MOCK_METHOD1(setTableList, void(const std::set& tableList)); MOCK_METHOD2(setInstrumentList, void(const std::vector& instruments, const std::string& defaultInstrument)); MOCK_METHOD1(setInstrument, void(const std::string&)); + MOCK_METHOD1(setSelection, void(const std::set& rows)); MOCK_CONST_METHOD0(getSelectedRows, std::set()); MOCK_CONST_METHOD0(getSearchInstrument, std::string()); MOCK_CONST_METHOD0(getProcessInstrument, std::string()); From b593cd9ed9746fbba0d0a2499fb38986f56d24a9 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Oct 2014 14:14:55 +0100 Subject: [PATCH 192/284] Refs #10349 Add expandSelection action to Refl UI --- .../MantidQtCustomInterfaces/QtReflMainView.h | 1 + .../MantidQtCustomInterfaces/ReflMainView.h | 21 ++++++++------- .../ReflMainWidget.ui | 21 ++++++++++++++- .../CustomInterfaces/src/QtReflMainView.cpp | 26 +++++++++++++------ .../src/ReflMainViewPresenter.cpp | 21 ++++++++++++++- 5 files changed, 70 insertions(+), 20 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index dfacdab2c71e..77fc26d944ea 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -94,6 +94,7 @@ namespace MantidQt void actionDeleteRow(); void actionProcess(); void actionGroupRows(); + void actionExpandSelection(); void tableUpdated(const QModelIndex& topLeft, const QModelIndex& bottomRight); }; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index e079ac60695e..06ed4ccceebd 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -66,16 +66,17 @@ namespace MantidQt virtual std::string getProcessInstrument() const = 0; virtual std::string getWorkspaceToOpen() const = 0; - static const int NoFlags = 0; - static const int SaveFlag = 1; - static const int SaveAsFlag = 2; - static const int AddRowFlag = 3; - static const int DeleteRowFlag = 4; - static const int ProcessFlag = 5; - static const int GroupRowsFlag = 6; - static const int OpenTableFlag = 7; - static const int NewTableFlag = 8; - static const int TableUpdatedFlag = 9; + static const int NoFlags = 0; + static const int SaveFlag = 1; + static const int SaveAsFlag = 2; + static const int AddRowFlag = 3; + static const int DeleteRowFlag = 4; + static const int ProcessFlag = 5; + static const int GroupRowsFlag = 6; + static const int OpenTableFlag = 7; + static const int NewTableFlag = 8; + static const int TableUpdatedFlag = 9; + static const int ExpandSelectionFlag = 10; }; } } diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index 30feb1727fdf..62cd6ba2a71b 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -254,6 +254,13 @@ + + + + ExpandSelection + + + @@ -376,7 +383,7 @@ - false + false @@ -461,6 +468,18 @@ Process + + + + :/fit_frame.png:/fit_frame.png + + + Expand Selection + + + Select an entire group + + comboSearchInstrument diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 411a7a11748e..714822d9790d 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -39,6 +39,7 @@ namespace MantidQt ui.buttonAddRow->setDefaultAction(ui.actionAddRow); ui.buttonDeleteRow->setDefaultAction(ui.actionDeleteRow); ui.buttonGroupRows->setDefaultAction(ui.actionGroupRows); + ui.buttonExpandSelection->setDefaultAction(ui.actionExpandSelection); //Expand the process runs column at the expense of the search column ui.splitterTables->setStretchFactor(0, 0); @@ -51,13 +52,14 @@ namespace MantidQt //Allow rows to be reordered ui.viewTable->verticalHeader()->setMovable(true); - connect(ui.actionSaveTable, SIGNAL(triggered()), this, SLOT(actionSave())); - connect(ui.actionSaveTableAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); - connect(ui.actionNewTable, SIGNAL(triggered()), this, SLOT(actionNewTable())); - connect(ui.actionAddRow, SIGNAL(triggered()), this, SLOT(actionAddRow())); - connect(ui.actionDeleteRow, SIGNAL(triggered()), this, SLOT(actionDeleteRow())); - connect(ui.actionProcess, SIGNAL(triggered()), this, SLOT(actionProcess())); - connect(ui.actionGroupRows, SIGNAL(triggered()), this, SLOT(actionGroupRows())); + connect(ui.actionSaveTable, SIGNAL(triggered()), this, SLOT(actionSave())); + connect(ui.actionSaveTableAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); + connect(ui.actionNewTable, SIGNAL(triggered()), this, SLOT(actionNewTable())); + connect(ui.actionAddRow, SIGNAL(triggered()), this, SLOT(actionAddRow())); + connect(ui.actionDeleteRow, SIGNAL(triggered()), this, SLOT(actionDeleteRow())); + connect(ui.actionProcess, SIGNAL(triggered()), this, SLOT(actionProcess())); + connect(ui.actionGroupRows, SIGNAL(triggered()), this, SLOT(actionGroupRows())); + connect(ui.actionExpandSelection, SIGNAL(triggered()), this, SLOT(actionExpandSelection())); //Finally, create a presenter to do the thinking for us m_presenter = boost::shared_ptr(new ReflMainViewPresenter(this)); @@ -155,13 +157,21 @@ namespace MantidQt } /** - This slot notifies the presenter that the "new table" button as been pressed + This slot notifies the presenter that the "new table" button has been pressed */ void QtReflMainView::actionNewTable() { m_presenter->notify(NewTableFlag); } + /** + This slot notifies the presenter that the "expand selection" button has been pressed + */ + void QtReflMainView::actionExpandSelection() + { + m_presenter->notify(ExpandSelectionFlag); + } + /** This slot notifies the presenter that the table has been updated/changed by the user */ diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 406fd25f0a45..b0924fb88eb6 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -816,7 +816,8 @@ namespace MantidQt case ReflMainView::GroupRowsFlag: groupRows(); break; case ReflMainView::OpenTableFlag: openTable(); break; case ReflMainView::NewTableFlag: newTable(); break; - case ReflMainView::TableUpdatedFlag: m_tableDirty = true; break; + case ReflMainView::TableUpdatedFlag: m_tableDirty = true; break; + case ReflMainView::ExpandSelectionFlag: expandSelection(); break; case ReflMainView::NoFlags: return; } @@ -996,5 +997,23 @@ namespace MantidQt count++; return count; } + + /** Expands the current selection to all the rows in the selected groups */ + void ReflMainViewPresenter::expandSelection() + { + std::set groupIds; + + std::set rows = m_view->getSelectedRows(); + for(auto row = rows.begin(); row != rows.end(); ++row) + groupIds.insert(m_model->Int(*row, COL_GROUP)); + + std::set selection; + + for(size_t i = 0; i < m_model->rowCount(); ++i) + if(groupIds.find(m_model->Int(i, COL_GROUP)) != groupIds.end()) + selection.insert(i); + + m_view->setSelection(selection); + } } } From 23a40a80758c1f8772b78d277d2338dc794b7a48 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Oct 2014 15:40:25 +0100 Subject: [PATCH 193/284] Refs #10349 Unit test selection expansion --- .../test/ReflMainViewMockObjects.h | 1 + .../test/ReflMainViewPresenterTest.h | 102 ++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h index 8d2789884105..7906d06e07af 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h @@ -17,6 +17,7 @@ const int ProcessFlag = ReflMainView::ProcessFlag; const int AddRowFlag = ReflMainView::AddRowFlag; const int DeleteRowFlag = ReflMainView::DeleteRowFlag; const int GroupRowsFlag = ReflMainView::GroupRowsFlag; +const int ExpandSelectionFlag = ReflMainView::ExpandSelectionFlag; //Clean column ids for use within tests const int RunCol = ReflMainViewPresenter::COL_RUNS; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index b2a7d03cbb52..d942ee451654 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -810,6 +810,108 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(0); presenter.notify(OpenTableFlag); } + + void testExpandSelection() + { + auto ws = createWorkspace("TestWorkspace"); + TableRow row = ws->appendRow(); + row << "" << "" << "" << "" << "" << "" << 1.0 << 0 << ""; //Row 0 + row = ws->appendRow(); + row << "" << "" << "" << "" << "" << "" << 1.0 << 1 << ""; //Row 1 + row = ws->appendRow(); + row << "" << "" << "" << "" << "" << "" << 1.0 << 1 << ""; //Row 2 + row = ws->appendRow(); + row << "" << "" << "" << "" << "" << "" << 1.0 << 2 << ""; //Row 3 + row = ws->appendRow(); + row << "" << "" << "" << "" << "" << "" << 1.0 << 2 << ""; //Row 4 + row = ws->appendRow(); + row << "" << "" << "" << "" << "" << "" << 1.0 << 2 << ""; //Row 5 + row = ws->appendRow(); + row << "" << "" << "" << "" << "" << "" << 1.0 << 3 << ""; //Row 6 + row = ws->appendRow(); + row << "" << "" << "" << "" << "" << "" << 1.0 << 4 << ""; //Row 7 + row = ws->appendRow(); + row << "" << "" << "" << "" << "" << "" << 1.0 << 4 << ""; //Row 8 + row = ws->appendRow(); + row << "" << "" << "" << "" << "" << "" << 1.0 << 5 << ""; //Row 9 + + MockView mockView; + EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); + ReflMainViewPresenter presenter(&mockView); + + EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); + presenter.notify(OpenTableFlag); + + //We should not receive any errors + EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); + + std::set selection; + std::set expected; + + selection.insert(0); + expected.insert(0); + + //With row 0 selected, we shouldn't expand at all + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(selection)); + EXPECT_CALL(mockView, setSelection(ContainerEq(expected))).Times(1); + presenter.notify(ExpandSelectionFlag); + + //With 0,1 selected, we should finish with 0,1,2 selected + selection.clear(); + selection.insert(0); + selection.insert(1); + + expected.clear(); + expected.insert(0); + expected.insert(1); + expected.insert(2); + + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(selection)); + EXPECT_CALL(mockView, setSelection(ContainerEq(expected))).Times(1); + presenter.notify(ExpandSelectionFlag); + + //With 1,6 selected, we should finish with 1,2,6 selected + selection.clear(); + selection.insert(1); + selection.insert(6); + + expected.clear(); + expected.insert(1); + expected.insert(2); + expected.insert(6); + + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(selection)); + EXPECT_CALL(mockView, setSelection(ContainerEq(expected))).Times(1); + presenter.notify(ExpandSelectionFlag); + + //With 4,8 selected, we should finish with 3,4,5,7,8 selected + selection.clear(); + selection.insert(4); + selection.insert(8); + + expected.clear(); + expected.insert(3); + expected.insert(4); + expected.insert(5); + expected.insert(7); + expected.insert(8); + + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(selection)); + EXPECT_CALL(mockView, setSelection(ContainerEq(expected))).Times(1); + presenter.notify(ExpandSelectionFlag); + + //With nothing selected, we should finish with nothing selected + selection.clear(); + expected.clear(); + + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(selection)); + EXPECT_CALL(mockView, setSelection(ContainerEq(expected))).Times(1); + presenter.notify(ExpandSelectionFlag); + + //Tidy up + AnalysisDataService::Instance().remove("TestWorkspace"); + } }; #endif /* MANTID_CUSTOMINTERFACES_REFLMAINVIEWPRESENTERTEST_H */ From 7b132fa8b60562b3578e7ef1870b56b454617736 Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Thu, 23 Oct 2014 19:40:42 +0100 Subject: [PATCH 194/284] New tests for Integration alg, (ab)using real numbers, re #8085 --- .../Algorithms/test/IntegrationTest.h | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/Code/Mantid/Framework/Algorithms/test/IntegrationTest.h b/Code/Mantid/Framework/Algorithms/test/IntegrationTest.h index ab4498a01145..7239cc9f12b9 100644 --- a/Code/Mantid/Framework/Algorithms/test/IntegrationTest.h +++ b/Code/Mantid/Framework/Algorithms/test/IntegrationTest.h @@ -354,6 +354,102 @@ class IntegrationTest : public CxxTest::TestSuite doTestRebinned("-1.5", "1.75", 0, 3, true, 4, truth); } + void makeRealBinBoundariesWorkspace(const std::string inWsName) + { + unsigned int lenX = 11, lenY = 10, lenE = lenY; + + Workspace_sptr wsAsWs = WorkspaceFactory::Instance().create("Workspace2D", 1, lenX, lenY); + Workspace2D_sptr ws = boost::dynamic_pointer_cast(wsAsWs); + + double x[lenX] = {-1, -0.8, -0.6, -0.4, -0.2, -2.22045e-16, 0.2, 0.4, 0.6, 0.8, 1}; + for (unsigned int i = 0; i < lenX; i++) + { + ws->dataX(0)[i] = x[i]; + // Generate some rounding errors. Note: if you increase errors by making this more complicated, + // you'll eventually make Integration "fail". + // Q is: how much tolerance should it have to inprecise numbers? For example, replace the 13.3 + // multiplier/divisor by 13, and you'll get a -0.199999... sufficiently different from the + // initial -0.2 that Integration will fail to catch one bin and because of that some tests will fail. + ws->dataX(0)[i] /= 2.5671; + ws->dataX(0)[i] *= 13.3; + ws->dataX(0)[i] /= 13.3; + ws->dataX(0)[i] *= 2.5671; + } + double y[lenY] = {0, 0, 0, 2, 2, 2, 2, 0 , 0, 0}; + for (unsigned int i = 0; i < lenY; i++) + { + ws->dataY(0)[i] = y[i]; + } + double e[lenE] = {0, 0, 0, 0, 0, 0, 0, 0 , 0, 0}; + for (unsigned int i = 0; i < lenE; i++) + { + ws->dataE(0)[i] = e[i]; + } + AnalysisDataService::Instance().add(inWsName, ws); + } + + void doTestRealBinBoundaries(const std::string inWsName, + const std::string rangeLower, + const std::string rangeUpper, + const double expectedVal, + const bool checkRanges = false, + const bool IncPartialBins = false) + { + Workspace_sptr auxWs; + TS_ASSERT_THROWS_NOTHING(auxWs = AnalysisDataService::Instance().retrieve(inWsName)); + Workspace2D_sptr inWs = boost::dynamic_pointer_cast(auxWs); + + std::string outWsName = "out_real_boundaries_ws"; + + Integration integ; + integ.initialize(); + integ.setPropertyValue("InputWorkspace", inWs->getName()); + integ.setPropertyValue("OutputWorkspace", outWsName); + integ.setPropertyValue("RangeLower", rangeLower); + integ.setPropertyValue("RangeUpper", rangeUpper); + integ.setProperty("IncludePartialBins", IncPartialBins); + integ.execute(); + + // should have created output work space + TS_ASSERT_THROWS_NOTHING(auxWs = AnalysisDataService::Instance().retrieve(outWsName)); + Workspace2D_sptr outWs = boost::dynamic_pointer_cast(auxWs); + TS_ASSERT_EQUALS(inWs->getNumberHistograms(), outWs->getNumberHistograms()); + + if (checkRanges) + { + TS_ASSERT_LESS_THAN_EQUALS(atof(rangeLower.c_str()), outWs->dataX(0).front()); + TS_ASSERT_LESS_THAN_EQUALS(outWs->dataX(0).back(), atof(rangeUpper.c_str())); + } + // At last, check numerical results + TS_ASSERT_DELTA(outWs->dataY(0)[0], expectedVal, 1e-8 ); + } + + void testProperHandlingOfIntegrationBoundaries() + { + std::string inWsName = "in_real_boundaries_ws"; + makeRealBinBoundariesWorkspace(inWsName); + + doTestRealBinBoundaries(inWsName, "-0.4", "-0.2", 2, true); + doTestRealBinBoundaries(inWsName, "-0.2", "-0.0", 2, true); + doTestRealBinBoundaries(inWsName, "-0.2", "0.2", 4, true); + doTestRealBinBoundaries(inWsName, "-0.2", "0.4", 6, true); + doTestRealBinBoundaries(inWsName, "-0.4", "0.2", 6, true); + doTestRealBinBoundaries(inWsName, "-0.4", "0.4", 8, true); + doTestRealBinBoundaries(inWsName, "-1", "1", 8, true); + doTestRealBinBoundaries(inWsName, "-1.8", "1.2", 8, true); + + doTestRealBinBoundaries(inWsName, "-0.4", "-0.200001", 0, true); + doTestRealBinBoundaries(inWsName, "-0.399999", "-0.2", 0, true); + doTestRealBinBoundaries(inWsName, "-0.399999", "-0.200001", 0, true); + doTestRealBinBoundaries(inWsName, "-0.3999", "-0.2", 0, true); + + doTestRealBinBoundaries(inWsName, "0.6", "6.5", 0, true); + doTestRealBinBoundaries(inWsName, "-1", "-0.8", 0, true); + doTestRealBinBoundaries(inWsName, "2.2", "3.03", 0); + doTestRealBinBoundaries(inWsName, "-42.2", "-3.03", 0); + + } + private: Integration alg; // Test with range limits Integration alg2; // Test without limits From d3191486ec677c8dcfed59b2396fedaf267a796e Mon Sep 17 00:00:00 2001 From: Federico Montesino Pouzols Date: Thu, 23 Oct 2014 19:45:12 +0100 Subject: [PATCH 195/284] constness fix, re #8085 --- Code/Mantid/Framework/Algorithms/test/IntegrationTest.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/Algorithms/test/IntegrationTest.h b/Code/Mantid/Framework/Algorithms/test/IntegrationTest.h index 7239cc9f12b9..d3e1809ecb16 100644 --- a/Code/Mantid/Framework/Algorithms/test/IntegrationTest.h +++ b/Code/Mantid/Framework/Algorithms/test/IntegrationTest.h @@ -356,7 +356,7 @@ class IntegrationTest : public CxxTest::TestSuite void makeRealBinBoundariesWorkspace(const std::string inWsName) { - unsigned int lenX = 11, lenY = 10, lenE = lenY; + const unsigned int lenX = 11, lenY = 10, lenE = lenY; Workspace_sptr wsAsWs = WorkspaceFactory::Instance().create("Workspace2D", 1, lenX, lenY); Workspace2D_sptr ws = boost::dynamic_pointer_cast(wsAsWs); From ebd4ed50dff762c84ff4328c5c07c4758175d79d Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Thu, 23 Oct 2014 14:53:41 -0400 Subject: [PATCH 196/284] Refs #10190. Fixing osx build. --- Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h b/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h index 3018a4bc4948..db962a619bbb 100644 --- a/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h +++ b/Code/Mantid/Framework/DataHandling/test/SavePDFGuiTest.h @@ -48,7 +48,7 @@ class SavePDFGuiTest : public CxxTest::TestSuite { const size_t BUFFER_SIZE = 1024 * 1024; std::vector buffer( BUFFER_SIZE ); - std::ifstream in( filename ); + std::ifstream in( filename.c_str() ); size_t n = 0; while( size_t cc = read( in, buffer ) ) { n += countEOL( buffer, cc ); From 0a660e9bcc147ed5ac52b52447001df50b34adcf Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 08:48:43 +0100 Subject: [PATCH 197/284] Refs #10349 Resolve cppcheck warning --- .../MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index b0924fb88eb6..fdd158359653 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -244,7 +244,7 @@ namespace MantidQt } std::set rows = m_view->getSelectedRows(); - if(rows.size() == 0) + if(rows.empty()) { //Does the user want to abort? if(!m_view->askUserYesNo("This will process all rows in the table. Continue?","Process all rows?")) @@ -763,7 +763,7 @@ namespace MantidQt void ReflMainViewPresenter::addRow() { std::set rows = m_view->getSelectedRows(); - if(rows.size() == 0) + if(rows.empty()) insertRow(m_model->rowCount()); else insertRow(*rows.rbegin() + 1); From 195276ecb5ac33afe81f5c623dc5c06686510cf6 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Fri, 24 Oct 2014 09:15:02 +0100 Subject: [PATCH 198/284] Add unit test for using S(Q,w) Refs #10410 --- .../Algorithms/test/ElasticWindowTest.h | 50 +++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/Framework/Algorithms/test/ElasticWindowTest.h b/Code/Mantid/Framework/Algorithms/test/ElasticWindowTest.h index 3a6747b79b47..9c0104fb8b98 100644 --- a/Code/Mantid/Framework/Algorithms/test/ElasticWindowTest.h +++ b/Code/Mantid/Framework/Algorithms/test/ElasticWindowTest.h @@ -9,6 +9,7 @@ #include "MantidKernel/System.h" #include "MantidAlgorithms/ConvertUnits.h" +#include "MantidAlgorithms/ConvertSpectrumAxis.h" #include "MantidAlgorithms/CreateSampleWorkspace.h" #include "MantidAlgorithms/ElasticWindow.h" #include "MantidAlgorithms/Rebin.h" @@ -64,6 +65,23 @@ class ElasticWindowTest : public CxxTest::TestSuite setParamAlg.execute(); } + /** + * Converts the generated sample workspace spectra axis to Q. + */ + void convertSampleWsToQ() + { + ConvertSpectrumAxis convQAlg; + convQAlg.initialize(); + + TS_ASSERT_THROWS_NOTHING( convQAlg.setProperty("InputWorkspace", "__ElasticWindowTest_sample") ); + TS_ASSERT_THROWS_NOTHING( convQAlg.setProperty("Target", "MomentumTransfer") ); + TS_ASSERT_THROWS_NOTHING( convQAlg.setProperty("EMode", "Indirect") ); + TS_ASSERT_THROWS_NOTHING( convQAlg.setProperty("OutputWorkspace", "__ElasticWindowTest_sample") ); + + TS_ASSERT_THROWS_NOTHING( convQAlg.execute() ); + TS_ASSERT( convQAlg.isExecuted() ); + } + /** * Test initialization of the algorithm is successful. */ @@ -75,9 +93,9 @@ class ElasticWindowTest : public CxxTest::TestSuite } /** - * Test running ElasticWindow with just the peak range defined. + * Test running ElasticWindow with just the peak range defined using reduced data. */ - void test_peakOnly() + void test_redPeakOnly() { ElasticWindow elwinAlg; elwinAlg.initialize(); @@ -96,9 +114,33 @@ class ElasticWindowTest : public CxxTest::TestSuite } /** - * Test running ElasticWindow with both the peak and background ranges defined. + * Test running ElasticWindow with just the peak range defined using S(Q,w) data. + */ + void test_sqwPeakOnly() + { + // First convert the sample workspace from spectra number to elastic Q + convertSampleWsToQ(); + + ElasticWindow elwinAlg; + elwinAlg.initialize(); + + TS_ASSERT_THROWS_NOTHING( elwinAlg.setProperty("InputWorkspace", "__ElasticWindowTest_sample") ); + TS_ASSERT_THROWS_NOTHING( elwinAlg.setProperty("Range1Start", -0.1) ); + TS_ASSERT_THROWS_NOTHING( elwinAlg.setProperty("Range1End", 0.1) ); + TS_ASSERT_THROWS_NOTHING( elwinAlg.setProperty("OutputInQ", "__ElasticWindowTest_outputQ") ); + TS_ASSERT_THROWS_NOTHING( elwinAlg.setProperty("OutputInQSquared", "__ElasticWindowTest_outputQsq") ); + + TS_ASSERT_THROWS_NOTHING( elwinAlg.execute() ); + TS_ASSERT( elwinAlg.isExecuted() ); + + MatrixWorkspace_sptr qWs = AnalysisDataService::Instance().retrieveWS("__ElasticWindowTest_outputQ"); + verifyQworkspace(qWs); + } + + /** + * Test running ElasticWindow with both the peak and background ranges defined using reduced data. */ - void test_peakAndBackground() + void test_redPeakAndBackground() { ElasticWindow elwinAlg; elwinAlg.initialize(); From ab8759ae21fd973b6edcc6dcfe04c2de6d89f484 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 09:27:28 +0100 Subject: [PATCH 199/284] Refs #10349 Check for partial group processing early We don't want to do any loading/validation/autofilling before we've checked for partial processing of a group/ " + ex.what(), "Error"); --- .../src/ReflMainViewPresenter.cpp | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index fdd158359653..33a55fc1d3c6 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -257,15 +257,33 @@ namespace MantidQt //Maps group numbers to the list of rows in that group we want to process std::map > groups; + for(auto it = rows.begin(); it != rows.end(); ++it) + groups[m_model->Int(*it, COL_GROUP)].push_back(*it); + + //Check each group and warn if we're only partially processing it + for(auto gIt = groups.begin(); gIt != groups.end(); ++gIt) + { + const int& groupId = gIt->first; + const std::vector& groupRows = gIt->second; + //Are we only partially processing a group? + if(groupRows.size() < numRowsInGroup(gIt->first)) + { + std::stringstream err; + err << "You have only selected " << groupRows.size() << " of the "; + err << numRowsInGroup(groupId) << " rows in group " << groupId << "."; + err << " Are you sure you want to continue?"; + if(!m_view->askUserYesNo(err.str(), "Continue Processing?")) + return; + } + } + + //Validate the rows for(auto it = rows.begin(); it != rows.end(); ++it) { try { validateRow(*it); autofillRow(*it); - - const int group = m_model->Int(*it, COL_GROUP); - groups[group].push_back(*it); } catch(std::exception& ex) { @@ -285,17 +303,6 @@ namespace MantidQt { const std::vector groupRows = gIt->second; - //Are we only partially processing a group? - if(groupRows.size() < numRowsInGroup(gIt->first)) - { - std::stringstream err; - err << "You have only selected " << groupRows.size() << " of the "; - err << numRowsInGroup(gIt->first) << " rows in group " << gIt->first << "."; - err << " Are you sure you want to continue?"; - if(!m_view->askUserYesNo(err.str(), "Continue Processing?")) - return; - } - //Reduce each row for(auto rIt = groupRows.begin(); rIt != groupRows.end(); ++rIt) { From 4fe99d9ba85c5c8c4c3c2652c0be715931c98e47 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 09:29:44 +0100 Subject: [PATCH 200/284] Refs #10349 Use a set of rows instead of vector In this case, std::set is more appropriate than std::vector. --- .../ReflMainViewPresenter.h | 2 +- .../src/ReflMainViewPresenter.cpp | 17 +++++++---------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 0b6db997078a..3432c43ca8d6 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -79,7 +79,7 @@ namespace MantidQt //get the number of rows in a group size_t numRowsInGroup(int groupId) const; //Stitch some rows - void stitchRows(std::vector rows); + void stitchRows(std::set rows); //insert a row in the model before the given index virtual void insertRow(size_t before); //add row(s) to the model diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 33a55fc1d3c6..f1722337a62c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -255,16 +255,16 @@ namespace MantidQt rows.insert(idx); } - //Maps group numbers to the list of rows in that group we want to process - std::map > groups; + //Map group numbers to the set of rows in that group we want to process + std::map > groups; for(auto it = rows.begin(); it != rows.end(); ++it) - groups[m_model->Int(*it, COL_GROUP)].push_back(*it); + groups[m_model->Int(*it, COL_GROUP)].insert(*it); //Check each group and warn if we're only partially processing it for(auto gIt = groups.begin(); gIt != groups.end(); ++gIt) { const int& groupId = gIt->first; - const std::vector& groupRows = gIt->second; + const std::set& groupRows = gIt->second; //Are we only partially processing a group? if(groupRows.size() < numRowsInGroup(gIt->first)) { @@ -301,7 +301,7 @@ namespace MantidQt for(auto gIt = groups.begin(); gIt != groups.end(); ++gIt) { - const std::vector groupRows = gIt->second; + const std::set groupRows = gIt->second; //Reduce each row for(auto rIt = groupRows.begin(); rIt != groupRows.end(); ++rIt) @@ -624,15 +624,12 @@ namespace MantidQt Stitches the workspaces created by the given rows together. @param rows : the list of rows */ - void ReflMainViewPresenter::stitchRows(std::vector rows) + void ReflMainViewPresenter::stitchRows(std::set rows) { //If we can get away with doing nothing, do. if(rows.size() < 2) return; - //Ensure the rows are in order. - std::sort(rows.begin(), rows.end()); - //Properties for Stitch1DMany std::vector workspaceNames; std::vector runs; @@ -668,7 +665,7 @@ namespace MantidQt } double dqq; - std::string dqqStr = m_model->String(rows.front(), COL_DQQ); + std::string dqqStr = m_model->String(*(rows.begin()), COL_DQQ); Mantid::Kernel::Strings::convert(dqqStr, dqq); //params are qmin, -dqq, qmax for the final output From 773f8463e4d7b90e435db0ae98a0937d5fa98177 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Oct 2014 16:20:10 +0100 Subject: [PATCH 201/284] Refs #10408 Use scoped_ptr in HintingLineEditFactory --- .../inc/MantidQtMantidWidgets/HintingLineEditFactory.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h index e63ddcebcc49..1b14d6e39397 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEditFactory.h @@ -41,10 +41,7 @@ namespace MantidQt { public: HintingLineEditFactory(HintStrategy* hintStrategy) : m_strategy(hintStrategy) {}; - virtual ~HintingLineEditFactory() - { - delete m_strategy; - }; + virtual ~HintingLineEditFactory() {}; virtual QWidget* createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const { Q_UNUSED(option); @@ -56,7 +53,7 @@ namespace MantidQt return editor; } protected: - HintStrategy* m_strategy; + boost::scoped_ptr m_strategy; }; } } From 1cdc745a13c5ac0735bb4d3476d5fe0c4da9b9db Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 23 Oct 2014 16:38:30 +0100 Subject: [PATCH 202/284] Refs #10408 Correct HintStrategy namespace --- .../inc/MantidQtCustomInterfaces/QtReflMainView.h | 2 +- .../inc/MantidQtCustomInterfaces/ReflMainView.h | 2 +- .../MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp | 1 + .../inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h | 2 +- .../MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h | 2 +- 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index 0a4bba20105e..27367b845976 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -67,7 +67,7 @@ namespace MantidQt //Settor methods virtual void setInstrumentList(const std::vector& instruments, const std::string& defaultInstrument); - virtual void setOptionsHintStrategy(HintStrategy* hintStrategy); + virtual void setOptionsHintStrategy(MantidQt::MantidWidgets::HintStrategy* hintStrategy); //Accessor methods virtual std::vector getSelectedRowIndexes() const; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index f02663b027d2..630f6d39a1a1 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -59,7 +59,7 @@ namespace MantidQt //Settor methods virtual void setInstrumentList(const std::vector& instruments, const std::string& defaultInstrument) = 0; - virtual void setOptionsHintStrategy(HintStrategy* hintStrategy) = 0; + virtual void setOptionsHintStrategy(MantidQt::MantidWidgets::HintStrategy* hintStrategy) = 0; //Accessor methods virtual std::vector getSelectedRowIndexes() const = 0; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 659de7c9796f..7633801a7a25 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -15,6 +15,7 @@ using namespace Mantid::API; using namespace Mantid::Geometry; using namespace Mantid::Kernel; +using namespace MantidQt::MantidWidgets; namespace { diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h index d4cc24b80664..760595d95611 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h @@ -8,7 +8,7 @@ using namespace Mantid::API; namespace MantidQt { - namespace CustomInterfaces + namespace MantidWidgets { /** AlgorithmHintStrategy : Produces hints using a given algorithm's properties. diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h index 204ba658e372..0554ac3609d3 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintStrategy.h @@ -6,7 +6,7 @@ namespace MantidQt { - namespace CustomInterfaces + namespace MantidWidgets { /** HintStrategy : Provides an interface for generating hints to be used by a HintingLineEdit. From 1a4efa51641147c493dbbd4ba1933f8ced12bc5e Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 10:47:08 +0100 Subject: [PATCH 203/284] Refs #10408 Unit test AlgorithmHintStrategy --- .../MantidQt/MantidWidgets/CMakeLists.txt | 10 +-- .../test/AlgorithmHintStrategyTest.h | 64 +++++++++++++++++++ .../MantidWidgets/test/CMakeLists.txt | 16 +++++ 3 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 Code/Mantid/MantidQt/MantidWidgets/test/AlgorithmHintStrategyTest.h create mode 100644 Code/Mantid/MantidQt/MantidWidgets/test/CMakeLists.txt diff --git a/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt b/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt index bde84dac1206..4cf46ffd1c49 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt +++ b/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt @@ -115,6 +115,10 @@ set ( TEST_PY_FILES test/MWRunFilesTest.py ) +set ( TEST_FILES + AlgorithmHintStrategyTest.h +) + find_package (Qt4 REQUIRED QtHelp QtWebKit QtNetwork QUIET) include(${QT_USE_FILE}) @@ -143,12 +147,10 @@ target_link_libraries ( MantidWidgets MantidQtAPI QtPropertyBrowser ) ########################################################################### -# Unit tests setup +# Testing ########################################################################### -if ( PYUNITTEST_FOUND ) - pyunittest_add_test (${CMAKE_CURRENT_SOURCE_DIR}/test MantidWidgetsTest ${TEST_PY_FILES} ) -endif () +add_subdirectory ( test ) ########################################################################### # Installation settings diff --git a/Code/Mantid/MantidQt/MantidWidgets/test/AlgorithmHintStrategyTest.h b/Code/Mantid/MantidQt/MantidWidgets/test/AlgorithmHintStrategyTest.h new file mode 100644 index 000000000000..c0da65e6b89c --- /dev/null +++ b/Code/Mantid/MantidQt/MantidWidgets/test/AlgorithmHintStrategyTest.h @@ -0,0 +1,64 @@ +#ifndef MANTID_MANTIDWIDGETS_ALGORITHMHINTSTRATEGYTEST_H +#define MANTID_MANTIDWIDGETS_ALGORITHMHINTSTRATEGYTEST_H + +#include +#include "MantidAPI/FrameworkManager.h" +#include "MantidAPI/AlgorithmManager.h" +#include "MantidQtMantidWidgets/HintStrategy.h" +#include "MantidQtMantidWidgets/AlgorithmHintStrategy.h" + +using namespace MantidQt::MantidWidgets; +using namespace Mantid::API; + +//===================================================================================== +// Functional tests +//===================================================================================== +class AlgorithmHintStrategyTest : public CxxTest::TestSuite +{ +public: + // This pair of boilerplate methods prevent the suite being created statically + // This means the constructor isn't called when running other tests + static AlgorithmHintStrategyTest *createSuite() { return new AlgorithmHintStrategyTest(); } + static void destroySuite( AlgorithmHintStrategyTest *suite ) { delete suite; } + + AlgorithmHintStrategyTest() + { + FrameworkManager::Instance(); + m_propAlg = AlgorithmManager::Instance().create("PropertyAlgorithm"); + //Expected hints for PropertyAlgorithm + m_propMap["IntValue"] = ""; + m_propMap["DoubleValue"] = ""; + m_propMap["BoolValue"] = ""; + m_propMap["StringValue"] = ""; + m_propMap["PositiveIntValue"] = ""; + m_propMap["PositiveIntValue1"] = ""; + m_propMap["IntArray"] = ""; + m_propMap["DoubleArray"] = ""; + m_propMap["StringArray"] = ""; + } + + void testCreateHints() + { + boost::scoped_ptr strategy(new AlgorithmHintStrategy(m_propAlg, std::set())); + TS_ASSERT_EQUALS(m_propMap, strategy->createHints()); + } + + void testBlacklist() + { + std::set blacklist; + blacklist.insert("DoubleValue"); + blacklist.insert("IntArray"); + + boost::scoped_ptr strategy(new AlgorithmHintStrategy(m_propAlg, blacklist)); + auto expected = m_propMap; + expected.erase("DoubleValue"); + expected.erase("IntArray"); + TS_ASSERT_EQUALS(expected, strategy->createHints()); + } + +protected: + IAlgorithm_sptr m_propAlg; + std::map m_propMap; +}; + +#endif /*MANTID_MANTIDWIDGETS_ALGORITHMHINTSTRATEGYTEST_H */ diff --git a/Code/Mantid/MantidQt/MantidWidgets/test/CMakeLists.txt b/Code/Mantid/MantidQt/MantidWidgets/test/CMakeLists.txt new file mode 100644 index 000000000000..53371dda8da8 --- /dev/null +++ b/Code/Mantid/MantidQt/MantidWidgets/test/CMakeLists.txt @@ -0,0 +1,16 @@ +if ( PYUNITTEST_FOUND ) + pyunittest_add_test (${CMAKE_CURRENT_SOURCE_DIR} MantidWidgetsTest ${TEST_PY_FILES} ) +endif () + +if ( CXXTEST_FOUND ) + include_directories ( SYSTEM ${CXXTEST_INCLUDE_DIR} ${GMOCK_INCLUDE_DIR} ${GTEST_INCLUDE_DIR} ) + + if ( GMOCK_FOUND AND GTEST_FOUND ) + cxxtest_add_test ( MantidWidgetsTest ${TEST_FILES} ${GMOCK_TEST_FILES} ) + target_link_libraries( MantidWidgetsTest MantidWidgets ${GMOCK_LIBRARIES} ${GTEST_LIBRARIES} ) + + # Add to the 'UnitTests' group in VS + set_property( TARGET MantidWidgetsTest PROPERTY FOLDER "UnitTests" ) + endif () + +endif () From 48d737a32abf8a77930277f3ea4ac3a2fe71d8f4 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 10:52:43 +0100 Subject: [PATCH 204/284] Refs #10408 Fix the build --- .../MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h index 2b7941af7efe..677fd3015950 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h @@ -34,7 +34,7 @@ class MockView : public ReflMainView public: MockView(){}; virtual void showTable(Mantid::API::ITableWorkspace_sptr model){ m_model = model;} - virtual void setOptionsHintStrategy(HintStrategy*) {}; + virtual void setOptionsHintStrategy(MantidQt::MantidWidgets::HintStrategy*) {}; MOCK_METHOD3(askUserString, std::string(const std::string& prompt, const std::string& title, const std::string& defaultValue)); MOCK_METHOD2(askUserYesNo, bool(std::string, std::string)); MOCK_METHOD2(giveUserCritical, void(std::string, std::string)); From e9f5645fa42b8d44a35950a4da331ed835c20c7d Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 11:12:23 +0100 Subject: [PATCH 205/284] Refs #10408 Rework MantidWidgetsTest makefile --- .../MantidQt/MantidWidgets/test/CMakeLists.txt | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/test/CMakeLists.txt b/Code/Mantid/MantidQt/MantidWidgets/test/CMakeLists.txt index 53371dda8da8..33347b2cbb92 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/test/CMakeLists.txt +++ b/Code/Mantid/MantidQt/MantidWidgets/test/CMakeLists.txt @@ -1,16 +1,13 @@ -if ( PYUNITTEST_FOUND ) - pyunittest_add_test (${CMAKE_CURRENT_SOURCE_DIR} MantidWidgetsTest ${TEST_PY_FILES} ) -endif () - if ( CXXTEST_FOUND ) include_directories ( SYSTEM ${CXXTEST_INCLUDE_DIR} ${GMOCK_INCLUDE_DIR} ${GTEST_INCLUDE_DIR} ) - if ( GMOCK_FOUND AND GTEST_FOUND ) - cxxtest_add_test ( MantidWidgetsTest ${TEST_FILES} ${GMOCK_TEST_FILES} ) - target_link_libraries( MantidWidgetsTest MantidWidgets ${GMOCK_LIBRARIES} ${GTEST_LIBRARIES} ) + cxxtest_add_test ( MantidWidgetsTest ${TEST_FILES} ) + target_link_libraries( MantidWidgetsTest MantidWidgets ) - # Add to the 'UnitTests' group in VS - set_property( TARGET MantidWidgetsTest PROPERTY FOLDER "UnitTests" ) - endif () + # Add to the 'UnitTests' group in VS + set_property( TARGET MantidWidgetsTest PROPERTY FOLDER "UnitTests" ) +endif () +if ( PYUNITTEST_FOUND ) + pyunittest_add_test (${CMAKE_CURRENT_SOURCE_DIR} MantidWidgetsTest ${TEST_PY_FILES} ) endif () From 56c6dc91f02242b657863eb3f913e10113cd9066 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 11:29:03 +0100 Subject: [PATCH 206/284] Refs #10408 Add (Algorithm)HintStrategy to CMakeLists --- Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt b/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt index 4cf46ffd1c49..d81e332cfdc2 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt +++ b/Code/Mantid/MantidQt/MantidWidgets/CMakeLists.txt @@ -89,8 +89,10 @@ set ( MOC_FILES # Add the include files are NOT already in MOC_FILES set ( INC_FILES ${MOC_FILES} + inc/MantidQtMantidWidgets/AlgorithmHintStrategy.h inc/MantidQtMantidWidgets/CatalogHelper.h inc/MantidQtMantidWidgets/WidgetDllOption.h + inc/MantidQtMantidWidgets/HintStrategy.h ) # QtDesigner UI files to process From d1029b7cab1de3dc871cb0d8dfbe01d275a40d2a Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 11:51:39 +0100 Subject: [PATCH 207/284] Refs #10408 GUITests depends upon MantidWidgetsTest MantidWidgetsTest is now built as part of AllTests --- Code/Mantid/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Mantid/CMakeLists.txt b/Code/Mantid/CMakeLists.txt index ea8af240f8b7..2a19d9eb65ee 100644 --- a/Code/Mantid/CMakeLists.txt +++ b/Code/Mantid/CMakeLists.txt @@ -121,6 +121,7 @@ set ( CORE_MANTIDLIBS Kernel Geometry API ) # Add a target for all GUI tests add_custom_target ( GUITests ) +add_dependencies ( GUITests MantidWidgetsTest) add_dependencies ( check GUITests ) # Collect all tests together add_custom_target ( AllTests ) From 0dac5ef876644ca0f938531adce2cb5bb28d5ef2 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 13:35:14 +0100 Subject: [PATCH 208/284] Refs #10408 Tweak formatting of HintingLineEdit hints Hint keywords are shown in bold and descriptions are placed upon their own line. --- Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp index be2abe0b1379..5759348605c4 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp @@ -97,7 +97,11 @@ namespace MantidQt { QString hintList; for(auto mIt = m_matches.begin(); mIt != m_matches.end(); ++mIt) - hintList += QString::fromStdString(mIt->first) + " : " + QString::fromStdString(mIt->second) + "\n"; + { + hintList += "" + QString::fromStdString(mIt->first) + "
          \n"; + if(!mIt->second.empty()) + hintList += QString::fromStdString(mIt->second) + "
          \n"; + } QToolTip::showText(mapToGlobal(QPoint(0, 5)), hintList.trimmed()); } From 9106dc568aa29197b3388bd24aade3817e8ee3fe Mon Sep 17 00:00:00 2001 From: John Hill Date: Fri, 24 Oct 2014 13:47:38 +0100 Subject: [PATCH 209/284] Refs #8698 adding delete key shortcut and confirmation prompt --- .../MantidPlot/src/ApplicationWindow.cpp | 8 +++ .../Mantid/MantidPlot/src/ApplicationWindow.h | 6 +- Code/Mantid/MantidPlot/src/ConfigDialog.cpp | 6 +- Code/Mantid/MantidPlot/src/ConfigDialog.h | 2 +- .../MantidPlot/src/Mantid/MantidDock.cpp | 61 ++++++++++++++----- .../Mantid/MantidPlot/src/Mantid/MantidDock.h | 2 + .../Mantid/MantidPlot/src/Mantid/MantidUI.cpp | 11 ++++ Code/Mantid/MantidPlot/src/Mantid/MantidUI.h | 3 +- 8 files changed, 79 insertions(+), 20 deletions(-) diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp index 33e894cc0a41..9d8018dfc87a 100644 --- a/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp +++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.cpp @@ -828,6 +828,7 @@ void ApplicationWindow::initGlobalConstants() confirmClosePlot2D = false; confirmClosePlot3D = false; confirmCloseNotes = false; + d_inform_delete_workspace = true; d_inform_rename_table = false; confirmCloseInstrWindow=false; @@ -3093,6 +3094,11 @@ Table* ApplicationWindow::newTable(const QString& caption, int r, int c) return w; } +bool ApplicationWindow::isDeleteWorkspacePromptEnabled() +{ + return d_inform_delete_workspace; +} + Table* ApplicationWindow::newTable(int r, int c, const QString& name, const QString& legend) { Table* w = new Table(scriptingEnv(), r, c, legend, this, 0); @@ -5211,6 +5217,7 @@ void ApplicationWindow::readSettings() confirmClosePlot2D = settings.value("/Plot2D", false).toBool(); confirmClosePlot3D = settings.value("/Plot3D", false).toBool(); confirmCloseNotes = settings.value("/Note", false).toBool(); + d_inform_delete_workspace = settings.value("/DeleteWorkspace", true).toBool(); d_inform_rename_table = settings.value("/RenameTable", false).toBool(); confirmCloseInstrWindow=settings.value("/InstrumentWindow", false).toBool(); settings.endGroup(); // Confirmations @@ -5633,6 +5640,7 @@ void ApplicationWindow::saveSettings() settings.setValue("/Plot2D", confirmClosePlot2D); settings.setValue("/Plot3D", confirmClosePlot3D); settings.setValue("/Note", confirmCloseNotes); + settings.setValue("/DeleteWorkspace",d_inform_delete_workspace); settings.setValue("/RenameTable", d_inform_rename_table); settings.value("/InstrumentWindow", confirmCloseInstrWindow).toBool(); settings.endGroup(); // Confirmations diff --git a/Code/Mantid/MantidPlot/src/ApplicationWindow.h b/Code/Mantid/MantidPlot/src/ApplicationWindow.h index c27bf6582ac3..11aa20883421 100644 --- a/Code/Mantid/MantidPlot/src/ApplicationWindow.h +++ b/Code/Mantid/MantidPlot/src/ApplicationWindow.h @@ -199,6 +199,9 @@ class ApplicationWindow: public QMainWindow, public Scripted int matrixUndoStackSize(){return d_matrix_undo_stack_size;}; void setMatrixUndoStackSize(int size); + + // Check if delete workspace prompt is enabled + bool isDeleteWorkspacePromptEnabled(); QString endOfLine(); bool autoUpdateTableValues(){return d_auto_update_table_values;}; @@ -413,6 +416,7 @@ public slots: //@{ //! Creates an empty table Table* newTable(); + //! Used when loading a table from a project file Table* newTable(const QString& caption,int r, int c); Table* newTable(int r, int c, const QString& name = QString(),const QString& legend = QString()); @@ -1226,7 +1230,7 @@ public slots: QPoint d_script_win_pos; QSize d_script_win_size; bool d_script_win_arrow; - bool d_inform_rename_table; + bool d_inform_rename_table, d_inform_delete_workspace; QString d_export_col_separator; bool d_export_col_names, d_export_table_selection, d_export_col_comment; diff --git a/Code/Mantid/MantidPlot/src/ConfigDialog.cpp b/Code/Mantid/MantidPlot/src/ConfigDialog.cpp index 1743a0b12c8e..f0ff62bef193 100644 --- a/Code/Mantid/MantidPlot/src/ConfigDialog.cpp +++ b/Code/Mantid/MantidPlot/src/ConfigDialog.cpp @@ -1656,11 +1656,13 @@ void ConfigDialog::initConfirmationsPage() boxPromptRenameTables = new QCheckBox(); boxPromptRenameTables->setChecked(app->d_inform_rename_table); - + boxPromptDeleteWorkspace = new QCheckBox(); + boxPromptDeleteWorkspace->setChecked(app->d_inform_delete_workspace); QVBoxLayout * confirmPageLayout = new QVBoxLayout( confirm ); confirmPageLayout->addWidget(groupBoxConfirm); + confirmPageLayout->addWidget(boxPromptDeleteWorkspace); confirmPageLayout->addWidget(boxPromptRenameTables); confirmPageLayout->addStretch(); } @@ -1819,6 +1821,7 @@ void ConfigDialog::languageChange() buttonNumbersFont->setText( tr( "Axes &Numbers" ) ); buttonLegendFont->setText( tr( "&Legend" ) ); buttonTitleFont->setText( tr( "T&itle" ) ); + boxPromptDeleteWorkspace->setText( tr( "Prompt when deleting Workspaces" ) ); boxPromptRenameTables->setText( tr( "Prompt on &renaming tables when appending projects" ) ); //application page appTabWidget->setTabText(appTabWidget->indexOf(application), tr("Application")); @@ -2124,6 +2127,7 @@ void ConfigDialog::apply() QApplication::restoreOverrideCursor(); } // general page: confirmations tab + app->d_inform_delete_workspace = boxPromptDeleteWorkspace->isChecked(); app->d_inform_rename_table = boxPromptRenameTables->isChecked(); app->confirmCloseFolder = boxFolders->isChecked(); app->updateConfirmOptions(boxTables->isChecked(), boxMatrices->isChecked(), diff --git a/Code/Mantid/MantidPlot/src/ConfigDialog.h b/Code/Mantid/MantidPlot/src/ConfigDialog.h index c066b146b7dc..4bad67ddbe9e 100644 --- a/Code/Mantid/MantidPlot/src/ConfigDialog.h +++ b/Code/Mantid/MantidPlot/src/ConfigDialog.h @@ -234,7 +234,7 @@ class ConfigDialog : public QDialog QLabel *lblScriptingLanguage, *lblInitWindow; QComboBox *boxScriptingLanguage, *boxInitWindow; QCheckBox *boxAntialiasing, *boxAutoscale3DPlots, *boxTableComments, *boxThousandsSeparator; - QCheckBox *boxPromptRenameTables, *boxBackupProject, *boxLabelsEditing; + QCheckBox *boxPromptRenameTables, *boxBackupProject, *boxLabelsEditing, *boxPromptDeleteWorkspace; QWidget *fileLocationsPage; QLabel *lblTranslationsPath, *lblHelpPath, *lblUndoStackSize, *lblEndOfLine; QLineEdit *translationsPathLine, *helpPathLine; diff --git a/Code/Mantid/MantidPlot/src/Mantid/MantidDock.cpp b/Code/Mantid/MantidPlot/src/Mantid/MantidDock.cpp index 50e3fb85f3d6..c18c040073f2 100644 --- a/Code/Mantid/MantidPlot/src/Mantid/MantidDock.cpp +++ b/Code/Mantid/MantidPlot/src/Mantid/MantidDock.cpp @@ -45,6 +45,8 @@ MantidDockWidget::MantidDockWidget(MantidUI *mui, ApplicationWindow *parent) : setMinimumWidth(200); parent->addDockWidget( Qt::RightDockWidgetArea, this ); + m_appParent = parent; + QFrame *f = new QFrame(this); setWidget(f); @@ -878,26 +880,53 @@ deleteWorkspaces void MantidDockWidget::deleteWorkspaces() { QList items = m_tree->selectedItems(); - if(items.empty()) + MantidMatrix* m = dynamic_cast(m_mantidUI->appWindow()->activeWindow()); + + bool deleteExplorer = false; + bool deleteActive = false; + + if((m_deleteButton->hasFocus() || m_tree->hasFocus()) && !items.empty()) { - MantidMatrix* m = dynamic_cast(m_mantidUI->appWindow()->activeWindow()); - if (!m || !m->isA("MantidMatrix")) return; - if(m->workspaceName().isEmpty()) return; + deleteExplorer = true; + } + if((m && m->isA("MantidMatrix")) && (!m->workspaceName().isEmpty() && m_ads.doesExist(m->workspaceName().toStdString()))) + { + deleteActive = true; + } - if(m_ads.doesExist(m->workspaceName().toStdString())) - { - m_mantidUI->deleteWorkspace(m->workspaceName()); + if(deleteActive || deleteExplorer) + { + QMessageBox::StandardButton reply; + + if(m_appParent->isDeleteWorkspacePromptEnabled()) + { + reply = QMessageBox::question(this, "Delete Workspaces", "Are you sure you want to delete the selected Workspaces?\n\nThis prompt can be disabled from:\nPreferences->General->Confirmations", + QMessageBox::Yes|QMessageBox::No); + } + else + { + reply = QMessageBox::Yes; + } + + if (reply == QMessageBox::Yes) + { + if(deleteExplorer) + { + //loop through multiple items selected from the mantid tree + QList::iterator itr=items.begin(); + for (itr = items.begin(); itr != items.end(); ++itr) + { + //Sometimes we try to delete a workspace that's already been deleted. + if(m_ads.doesExist((*itr)->text(0).toStdString())) + m_mantidUI->deleteWorkspace((*itr)->text(0)); + }//end of for loop for selected items + } + else if(deleteActive) + { + m_mantidUI->deleteWorkspace(m->workspaceName()); + } } - return; } - //loop through multiple items selected from the mantid tree - QList::iterator itr=items.begin(); - for (itr = items.begin(); itr != items.end(); ++itr) - { - //Sometimes we try to delete a workspace that's already been deleted. - if(m_ads.doesExist((*itr)->text(0).toStdString())) - m_mantidUI->deleteWorkspace((*itr)->text(0)); - }//end of for loop for selected items } void MantidDockWidget::sortAscending() diff --git a/Code/Mantid/MantidPlot/src/Mantid/MantidDock.h b/Code/Mantid/MantidPlot/src/Mantid/MantidDock.h index 4253a657ec4d..f492d63f3293 100644 --- a/Code/Mantid/MantidPlot/src/Mantid/MantidDock.h +++ b/Code/Mantid/MantidPlot/src/Mantid/MantidDock.h @@ -141,6 +141,8 @@ private slots: *m_convertToMatrixWorkspace, *m_convertMDHistoToMatrixWorkspace, *m_clearUB; + + ApplicationWindow *m_appParent; QAtomicInt m_updateCount; bool m_treeUpdating; diff --git a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp index 856098872299..777db23148a8 100644 --- a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp +++ b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp @@ -177,6 +177,9 @@ MantidUI::MantidUI(ApplicationWindow *aw): //connect(mantidMenu, SIGNAL(aboutToShow()), this, SLOT(mantidMenuAboutToShow())); mantidMenuAboutToShow(); + QShortcut* sc = new QShortcut(QKeySequence(QKeySequence::Delete), m_appWindow); + connect(sc, SIGNAL(activated()), this, SLOT(deletePressEvent())); + menuMantidMatrix = new QMenu(m_appWindow); connect(menuMantidMatrix, SIGNAL(aboutToShow()), this, SLOT(menuMantidMatrixAboutToShow())); @@ -1246,6 +1249,14 @@ Table* MantidUI::createDetectorTable(const QString & wsName, const Mantid::API:: return t; } +/** + * Triggered by a delete key press, and attempts to delete a workspace if it passes the focus checks + */ +void MantidUI::deletePressEvent() +{ + m_exploreMantid->deleteWorkspaces(); +} + /** * Check if drop event can be accepted */ diff --git a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.h b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.h index 7b55d0b50767..bfff7d0b09b4 100644 --- a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.h +++ b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.h @@ -243,7 +243,8 @@ class MantidUI:public QObject const std::vector& indices, bool include_data = false); /// Create a table of detectors from a PeaksWorkspace Table* createDetectorTable(const QString & wsName, const Mantid::API::IPeaksWorkspace_sptr & ws); - + /// Triggers a workspace delete check + void deletePressEvent(); // Determine whether the workspace has a UB matrix bool hasUB(const QString& wsName); From 04982c332f3d8098815e0f7645c4eefa0d609536 Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Fri, 24 Oct 2014 10:23:20 -0400 Subject: [PATCH 210/284] Refs #10427. The bug was accessing values from a dict. --- .../plugins/algorithms/ExportExperimentLog.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/ExportExperimentLog.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/ExportExperimentLog.py index f618c0848a3c..c5ba13a1e7fc 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/ExportExperimentLog.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/ExportExperimentLog.py @@ -242,7 +242,10 @@ def _appendExpLog(self, logvaluedict): logname = self._sampleLogNames[il] optype = self._sampleLogOperations[il] key = logname + "-" + optype - value = logvaluedict[key] + if key in logvaluedict.keys(): + value = logvaluedict[key] + elif logname in logvaluedict.keys(): + value = logvaluedict[logname] wbuf += "%s%s" % (str(value), self._valuesep) wbuf = wbuf[0:-1] From 230ea923887b7184c353eae05b4e345f5197b32a Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 14:28:23 +0100 Subject: [PATCH 211/284] Refs #10373 Add context menu to Refl UI table --- .../MantidQtCustomInterfaces/QtReflMainView.h | 1 + .../ReflMainWidget.ui | 3 +++ .../CustomInterfaces/src/QtReflMainView.cpp | 20 +++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index 77fc26d944ea..b18fc35be982 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -96,6 +96,7 @@ namespace MantidQt void actionGroupRows(); void actionExpandSelection(); void tableUpdated(const QModelIndex& topLeft, const QModelIndex& bottomRight); + void showContextMenu(const QPoint& pos); }; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index 62cd6ba2a71b..59e0ecd6e048 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -284,6 +284,9 @@ 0 + + Qt::CustomContextMenu + Runs to process diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 714822d9790d..2df3ced4bdba 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -52,6 +52,9 @@ namespace MantidQt //Allow rows to be reordered ui.viewTable->verticalHeader()->setMovable(true); + //Custom context menu for table + connect(ui.viewTable, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint&))); + connect(ui.actionSaveTable, SIGNAL(triggered()), this, SLOT(actionSave())); connect(ui.actionSaveTableAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); connect(ui.actionNewTable, SIGNAL(triggered()), this, SLOT(actionNewTable())); @@ -182,6 +185,23 @@ namespace MantidQt m_presenter->notify(TableUpdatedFlag); } + /** + This slot is triggered when the user right clicks on the table + @param pos : The position of the right click within the table + */ + void QtReflMainView::showContextMenu(const QPoint& pos) + { + QModelIndex index = ui.viewTable->indexAt(pos); + + //parent widget takes ownership of QMenu + QMenu* menu = new QMenu(this); + menu->addAction(ui.actionGroupRows); + menu->addSeparator(); + menu->addAction(ui.actionDeleteRow); + + menu->popup(ui.viewTable->viewport()->mapToGlobal(pos)); + } + /** Show an information dialog @param prompt : The prompt to appear on the dialog From 7590987baf8c24bccd5ec61a5fb1da1dd8e302a8 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 14:28:55 +0100 Subject: [PATCH 212/284] Refs #10373 Add icon to Open Table items --- Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 2df3ced4bdba..2bdb1a0656e8 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -102,6 +102,7 @@ namespace MantidQt for(auto it = tables.begin(); it != tables.end(); ++it) { QAction* openTable = ui.menuOpenTable->addAction(QString::fromStdString(*it)); + openTable->setIcon(QIcon("://worksheet.png")); //Map this action to the table name m_openMap->setMapping(openTable, QString::fromStdString(*it)); From 8c468eaa0ec5a71250976820e96f4a45a5ba2ca9 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 14:29:34 +0100 Subject: [PATCH 213/284] Refs #10373 Add process to context menu --- .../ReflMainWidget.ui | 35 +++++-------------- .../CustomInterfaces/src/QtReflMainView.cpp | 2 ++ 2 files changed, 11 insertions(+), 26 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index 59e0ecd6e048..f0cc84fc4e65 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -345,25 +345,16 @@
          - - - - 0 - 0 - - - - - 0 - 0 - - - - Process the selected rows - + Process + + Qt::ToolButtonTextBesideIcon + + + Qt::NoArrow + @@ -465,7 +456,7 @@ - :/play.png:/play.png + :/stat_rows.png:/stat_rows.png Process @@ -488,17 +479,9 @@ comboSearchInstrument tableRuns viewTable - buttonProcess - - - buttonProcess - clicked() - actionProcess - trigger() - - + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 2bdb1a0656e8..7e8dcddf13f8 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -40,6 +40,7 @@ namespace MantidQt ui.buttonDeleteRow->setDefaultAction(ui.actionDeleteRow); ui.buttonGroupRows->setDefaultAction(ui.actionGroupRows); ui.buttonExpandSelection->setDefaultAction(ui.actionExpandSelection); + ui.buttonProcess->setDefaultAction(ui.actionProcess); //Expand the process runs column at the expense of the search column ui.splitterTables->setStretchFactor(0, 0); @@ -197,6 +198,7 @@ namespace MantidQt //parent widget takes ownership of QMenu QMenu* menu = new QMenu(this); menu->addAction(ui.actionGroupRows); + menu->addAction(ui.actionProcess); menu->addSeparator(); menu->addAction(ui.actionDeleteRow); From 2c041f1dd38d49eb5fa4c911b89f27d3d3870f16 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 14:58:55 +0100 Subject: [PATCH 214/284] =?UTF-8?q?Refs=20#10373=20Split=20AddRow=20?= =?UTF-8?q?=E2=86=92=20AppendRow/PrependRow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MantidQtCustomInterfaces/QtReflMainView.h | 3 +- .../MantidQtCustomInterfaces/ReflMainView.h | 17 +++++----- .../ReflMainViewPresenter.h | 3 +- .../ReflMainWidget.ui | 23 ++++++++++--- .../CustomInterfaces/src/QtReflMainView.cpp | 19 ++++++++--- .../src/ReflMainViewPresenter.cpp | 34 +++++++++++++------ 6 files changed, 70 insertions(+), 29 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index b18fc35be982..d8b40be26d72 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -90,7 +90,8 @@ namespace MantidQt void actionNewTable(); void actionSave(); void actionSaveAs(); - void actionAddRow(); + void actionAppendRow(); + void actionPrependRow(); void actionDeleteRow(); void actionProcess(); void actionGroupRows(); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index 06ed4ccceebd..43bd1f6c666d 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -69,14 +69,15 @@ namespace MantidQt static const int NoFlags = 0; static const int SaveFlag = 1; static const int SaveAsFlag = 2; - static const int AddRowFlag = 3; - static const int DeleteRowFlag = 4; - static const int ProcessFlag = 5; - static const int GroupRowsFlag = 6; - static const int OpenTableFlag = 7; - static const int NewTableFlag = 8; - static const int TableUpdatedFlag = 9; - static const int ExpandSelectionFlag = 10; + static const int AppendRowFlag = 3; + static const int PrependRowFlag = 4; + static const int DeleteRowFlag = 5; + static const int ProcessFlag = 6; + static const int GroupRowsFlag = 7; + static const int OpenTableFlag = 8; + static const int NewTableFlag = 9; + static const int TableUpdatedFlag = 10; + static const int ExpandSelectionFlag = 11; }; } } diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 3432c43ca8d6..83dacb84c295 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -83,7 +83,8 @@ namespace MantidQt //insert a row in the model before the given index virtual void insertRow(size_t before); //add row(s) to the model - virtual void addRow(); + virtual void appendRow(); + virtual void prependRow(); //delete row(s) from the model virtual void deleteRow(); //group selected rows together diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index f0cc84fc4e65..5cae9c9eee52 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -234,9 +234,9 @@ - + - AddRow + AppendRow @@ -426,13 +426,28 @@ Save Table As - + :/insert_row.png:/insert_row.png - Add Row + Insert Row After + + + Insert Row After + + + + + + :/insert_row.png:/insert_row.png + + + Insert Row Before + + + Insert Row Before diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 7e8dcddf13f8..847e9f31ae0a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -36,7 +36,7 @@ namespace MantidQt { ui.setupUi(this); - ui.buttonAddRow->setDefaultAction(ui.actionAddRow); + ui.buttonAppendRow->setDefaultAction(ui.actionAppendRow); ui.buttonDeleteRow->setDefaultAction(ui.actionDeleteRow); ui.buttonGroupRows->setDefaultAction(ui.actionGroupRows); ui.buttonExpandSelection->setDefaultAction(ui.actionExpandSelection); @@ -59,7 +59,8 @@ namespace MantidQt connect(ui.actionSaveTable, SIGNAL(triggered()), this, SLOT(actionSave())); connect(ui.actionSaveTableAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); connect(ui.actionNewTable, SIGNAL(triggered()), this, SLOT(actionNewTable())); - connect(ui.actionAddRow, SIGNAL(triggered()), this, SLOT(actionAddRow())); + connect(ui.actionAppendRow, SIGNAL(triggered()), this, SLOT(actionAppendRow())); + connect(ui.actionPrependRow, SIGNAL(triggered()), this, SLOT(actionPrependRow())); connect(ui.actionDeleteRow, SIGNAL(triggered()), this, SLOT(actionDeleteRow())); connect(ui.actionProcess, SIGNAL(triggered()), this, SLOT(actionProcess())); connect(ui.actionGroupRows, SIGNAL(triggered()), this, SLOT(actionGroupRows())); @@ -130,11 +131,19 @@ namespace MantidQt } /** - This slot notifies the presenter that the "add row" button has been pressed + This slot notifies the presenter that the "append row" button has been pressed */ - void QtReflMainView::actionAddRow() + void QtReflMainView::actionAppendRow() { - m_presenter->notify(AddRowFlag); + m_presenter->notify(AppendRowFlag); + } + + /** + This slot notifies the presenter that the "prepend row" button has been pressed + */ + void QtReflMainView::actionPrependRow() + { + m_presenter->notify(PrependRowFlag); } /** diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index f1722337a62c..7ed3680af6dc 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -762,9 +762,9 @@ namespace MantidQt } /** - Add row(s) to the model + Insert a row after the last selected row */ - void ReflMainViewPresenter::addRow() + void ReflMainViewPresenter::appendRow() { std::set rows = m_view->getSelectedRows(); if(rows.empty()) @@ -774,6 +774,19 @@ namespace MantidQt m_tableDirty = true; } + /** + Insert a row before the first selected row + */ + void ReflMainViewPresenter::prependRow() + { + std::set rows = m_view->getSelectedRows(); + if(rows.empty()) + insertRow(0); + else + insertRow(*rows.begin()); + m_tableDirty = true; + } + /** Delete row(s) from the model */ @@ -812,14 +825,15 @@ namespace MantidQt { switch(flag) { - case ReflMainView::SaveAsFlag: saveTableAs(); break; - case ReflMainView::SaveFlag: saveTable(); break; - case ReflMainView::AddRowFlag: addRow(); break; - case ReflMainView::DeleteRowFlag: deleteRow(); break; - case ReflMainView::ProcessFlag: process(); break; - case ReflMainView::GroupRowsFlag: groupRows(); break; - case ReflMainView::OpenTableFlag: openTable(); break; - case ReflMainView::NewTableFlag: newTable(); break; + case ReflMainView::SaveAsFlag: saveTableAs(); break; + case ReflMainView::SaveFlag: saveTable(); break; + case ReflMainView::AppendRowFlag: appendRow(); break; + case ReflMainView::PrependRowFlag: prependRow(); break; + case ReflMainView::DeleteRowFlag: deleteRow(); break; + case ReflMainView::ProcessFlag: process(); break; + case ReflMainView::GroupRowsFlag: groupRows(); break; + case ReflMainView::OpenTableFlag: openTable(); break; + case ReflMainView::NewTableFlag: newTable(); break; case ReflMainView::TableUpdatedFlag: m_tableDirty = true; break; case ReflMainView::ExpandSelectionFlag: expandSelection(); break; From 758af2e59ccc28c3b2bd3e02209327327710763f Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 14:59:18 +0100 Subject: [PATCH 215/284] Refs #10373 Improve context menu * Reposition GroupRows * Add AppendRow * Add PrependRow * Add ExpandSelection --- .../Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 847e9f31ae0a..fb8dc4fd9119 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -206,8 +206,12 @@ namespace MantidQt //parent widget takes ownership of QMenu QMenu* menu = new QMenu(this); - menu->addAction(ui.actionGroupRows); menu->addAction(ui.actionProcess); + menu->addAction(ui.actionExpandSelection); + menu->addSeparator(); + menu->addAction(ui.actionPrependRow); + menu->addAction(ui.actionAppendRow); + menu->addAction(ui.actionGroupRows); menu->addSeparator(); menu->addAction(ui.actionDeleteRow); From b2eec60913dde18c505e257af933be3f1a9513dd Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 14:59:58 +0100 Subject: [PATCH 216/284] Refs #10373 Add Row menu to menubar --- .../inc/MantidQtCustomInterfaces/ReflMainWidget.ui | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index 5cae9c9eee52..82a2b3a8936b 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -397,7 +397,21 @@ + + + Row + + + + + + + + + + + From 922a18db2596a6550ab11a42a6350e64d17ab392 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 15:54:24 +0100 Subject: [PATCH 217/284] Refs #10373 Update unit test for ReflMainViewPresenter --- .../test/ReflMainViewMockObjects.h | 17 +++---- .../test/ReflMainViewPresenterTest.h | 44 +++++++++---------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h index 7906d06e07af..a278619c935c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h @@ -9,14 +9,15 @@ using namespace MantidQt::CustomInterfaces; using namespace Mantid::API; //Clean flag aliases for use within tests. -const int NewTableFlag = ReflMainView::NewTableFlag; -const int OpenTableFlag = ReflMainView::OpenTableFlag; -const int SaveAsFlag = ReflMainView::SaveAsFlag; -const int SaveFlag = ReflMainView::SaveFlag; -const int ProcessFlag = ReflMainView::ProcessFlag; -const int AddRowFlag = ReflMainView::AddRowFlag; -const int DeleteRowFlag = ReflMainView::DeleteRowFlag; -const int GroupRowsFlag = ReflMainView::GroupRowsFlag; +const int NewTableFlag = ReflMainView::NewTableFlag; +const int OpenTableFlag = ReflMainView::OpenTableFlag; +const int SaveAsFlag = ReflMainView::SaveAsFlag; +const int SaveFlag = ReflMainView::SaveFlag; +const int ProcessFlag = ReflMainView::ProcessFlag; +const int AppendRowFlag = ReflMainView::AppendRowFlag; +const int PrependRowFlag = ReflMainView::PrependRowFlag; +const int DeleteRowFlag = ReflMainView::DeleteRowFlag; +const int GroupRowsFlag = ReflMainView::GroupRowsFlag; const int ExpandSelectionFlag = ReflMainView::ExpandSelectionFlag; //Clean column ids for use within tests diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index d942ee451654..4e747dafd236 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -172,7 +172,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite AnalysisDataService::Instance().remove("Workspace"); } - void testAddRow() + void testAppendRow() { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); @@ -195,10 +195,10 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_THROWS(ws->Int(5, GroupCol), std::runtime_error); TS_ASSERT_THROWS(ws->Int(6, GroupCol), std::runtime_error); - //The user hits "add row" twice with no rows selected + //The user hits "append row" twice with no rows selected EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); - presenter.notify(AddRowFlag); - presenter.notify(AddRowFlag); + presenter.notify(AppendRowFlag); + presenter.notify(AppendRowFlag); //The user hits "save" presenter.notify(SaveFlag); @@ -218,7 +218,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite AnalysisDataService::Instance().remove("TestWorkspace"); } - void testAddRowSpecify() + void testAppendRowSpecify() { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); @@ -246,10 +246,10 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_THROWS(ws->Int(5, GroupCol), std::runtime_error); TS_ASSERT_THROWS(ws->Int(6, GroupCol), std::runtime_error); - //The user hits "add row" twice, with the second row selected + //The user hits "append row" twice, with the second row selected EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(rowlist)); - presenter.notify(AddRowFlag); - presenter.notify(AddRowFlag); + presenter.notify(AppendRowFlag); + presenter.notify(AppendRowFlag); //The user hits "save" presenter.notify(SaveFlag); @@ -271,7 +271,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite AnalysisDataService::Instance().remove("TestWorkspace"); } - void testAddRowSpecifyPlural() + void testAppendRowSpecifyPlural() { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); @@ -302,9 +302,9 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_THROWS(ws->Int(6, GroupCol), std::runtime_error); TS_ASSERT_THROWS(ws->Int(7, GroupCol), std::runtime_error); - //The user hits "add row" once, with the second, third, and fourth row selected. + //The user hits "append row" once, with the second, third, and fourth row selected. EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(rowlist)); - presenter.notify(AddRowFlag); + presenter.notify(AppendRowFlag); //The user hits "save" presenter.notify(SaveFlag); @@ -700,16 +700,16 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_THROWS(ReflMainViewPresenter::parseKeyValueString("=,=,="), std::runtime_error); } - void testPromptSaveAfterAddRow() + void testPromptSaveAfterAppendRow() { MockView mockView; EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); - //User hits "add row" + //User hits "append row" EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); - presenter.notify(AddRowFlag); + presenter.notify(AppendRowFlag); //The user will decide not to discard their changes EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(1).WillOnce(Return(false)); @@ -733,10 +733,10 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); - //User hits "add row" a couple of times + //User hits "append row" a couple of times EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); - presenter.notify(AddRowFlag); - presenter.notify(AddRowFlag); + presenter.notify(AppendRowFlag); + presenter.notify(AppendRowFlag); //The user saves EXPECT_CALL(mockView, askUserString(_,_,"Workspace")).Times(1).WillOnce(Return("Workspace")); @@ -769,10 +769,10 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); ReflMainViewPresenter presenter(&mockView); - //User hits "add row" a couple of times + //User hits "append row" a couple of times EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); - presenter.notify(AddRowFlag); - presenter.notify(AddRowFlag); + presenter.notify(AppendRowFlag); + presenter.notify(AppendRowFlag); //Then hits "new table", and decides to discard EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(1).WillOnce(Return(true)); @@ -792,9 +792,9 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite createPrefilledWorkspace("TestWorkspace"); - //User hits "add row" + //User hits "append row" EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); - presenter.notify(AddRowFlag); + presenter.notify(AppendRowFlag); //and tries to open a workspace, but gets prompted and decides not to discard EXPECT_CALL(mockView, askUserYesNo(_,_)).Times(1).WillOnce(Return(false)); From 8ccd13f3c2296d54b41bec073cceb00b0aca05ff Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 24 Oct 2014 16:26:13 +0100 Subject: [PATCH 218/284] Refs #10373 Test prepending rows --- .../test/ReflMainViewPresenterTest.h | 114 ++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index 4e747dafd236..0698662c4651 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -326,6 +326,120 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite AnalysisDataService::Instance().remove("TestWorkspace"); } + void testPrependRow() + { + MockView mockView; + EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); + ReflMainViewPresenter presenter(&mockView); + + createPrefilledWorkspace("TestWorkspace"); + EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); + presenter.notify(OpenTableFlag); + + //We should not receive any errors + EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); + + //The user hits "prepend row" twice with no rows selected + EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); + presenter.notify(PrependRowFlag); + presenter.notify(PrependRowFlag); + + //The user hits "save" + presenter.notify(SaveFlag); + + //Check that the table has been modified correctly + ITableWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); + TS_ASSERT_EQUALS(ws->rowCount(), 6); + TS_ASSERT_EQUALS(ws->Int(0, GroupCol), 2); + TS_ASSERT_EQUALS(ws->Int(1, GroupCol), 0); + TS_ASSERT_EQUALS(ws->Int(2, GroupCol), 3); + TS_ASSERT_EQUALS(ws->Int(3, GroupCol), 3); + TS_ASSERT_EQUALS(ws->Int(4, GroupCol), 1); + TS_ASSERT_EQUALS(ws->Int(5, GroupCol), 1); + + //Tidy up + AnalysisDataService::Instance().remove("TestWorkspace"); + } + + void testPrependRowSpecify() + { + MockView mockView; + EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); + ReflMainViewPresenter presenter(&mockView); + + createPrefilledWorkspace("TestWorkspace"); + EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); + presenter.notify(OpenTableFlag); + + std::set rowlist; + rowlist.insert(1); + + //We should not receive any errors + EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); + + //The user hits "prepend row" twice, with the second row selected + EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(rowlist)); + presenter.notify(PrependRowFlag); + presenter.notify(PrependRowFlag); + + //The user hits "save" + presenter.notify(SaveFlag); + + //Check that the table has been modified correctly + ITableWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); + TS_ASSERT_EQUALS(ws->rowCount(), 6); + TS_ASSERT_EQUALS(ws->Int(0, GroupCol), 3); + TS_ASSERT_EQUALS(ws->Int(1, GroupCol), 2); + TS_ASSERT_EQUALS(ws->Int(2, GroupCol), 0); + TS_ASSERT_EQUALS(ws->Int(3, GroupCol), 3); + TS_ASSERT_EQUALS(ws->Int(4, GroupCol), 1); + TS_ASSERT_EQUALS(ws->Int(5, GroupCol), 1); + + //Tidy up + AnalysisDataService::Instance().remove("TestWorkspace"); + } + + void testPrependRowSpecifyPlural() + { + MockView mockView; + EXPECT_CALL(mockView, setInstrumentList(_,_)).Times(1); + EXPECT_CALL(mockView, setTableList(_)).Times(AnyNumber()); + ReflMainViewPresenter presenter(&mockView); + + createPrefilledWorkspace("TestWorkspace"); + EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); + presenter.notify(OpenTableFlag); + + std::set rowlist; + rowlist.insert(1); + rowlist.insert(2); + rowlist.insert(3); + + //We should not receive any errors + EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); + + //The user hits "prepend row" once, with the second, third, and fourth row selected. + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(rowlist)); + presenter.notify(PrependRowFlag); + + //The user hits "save" + presenter.notify(SaveFlag); + + //Check that the table was modified correctly + ITableWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); + TS_ASSERT_EQUALS(ws->rowCount(), 5); + TS_ASSERT_EQUALS(ws->Int(0, GroupCol), 3); + TS_ASSERT_EQUALS(ws->Int(1, GroupCol), 0); + TS_ASSERT_EQUALS(ws->Int(2, GroupCol), 3); + TS_ASSERT_EQUALS(ws->Int(3, GroupCol), 1); + TS_ASSERT_EQUALS(ws->Int(4, GroupCol), 1); + + //Tidy up + AnalysisDataService::Instance().remove("TestWorkspace"); + } + void testDeleteRowNone() { MockView mockView; From 539a9caf736d87ed5c382d1346369de3c57991bb Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Fri, 24 Oct 2014 15:41:38 -0400 Subject: [PATCH 219/284] Refs #9392. Adding proposal and sample information. --- .../DataHandling/src/LoadEventNexus.cpp | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp index 9bb12b2449b7..03e4ea316e36 100644 --- a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp +++ b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp @@ -1798,6 +1798,40 @@ namespace Mantid } file.closeData(); + // get the experiment identifier + try { + file.openData("experiment_identifier"); + string expId(""); + if (file.getInfo().type == ::NeXus::CHAR) + { + expId = file.getStrData(); + } + if (!expId.empty()) { + WS->mutableRun().addProperty("experiment_identifier", expId); + } + file.closeData(); + } catch (::NeXus::Exception &) { + // let it drop on floor + } + + // get the sample name + try { + file.openGroup("sample", "NXsample"); + file.openData("name"); + string name(""); + if (file.getInfo().type == ::NeXus::CHAR) + { + name = file.getStrData(); + } + if (!name.empty()) { + WS->mutableSample().setName(name); + } + file.closeData(); + file.closeGroup(); + } catch (::NeXus::Exception &) { + // let it drop on floor + } + // get the duration file.openData("duration"); std::vector duration; From 145174fe38c73199e4ba89cf0d0439f1aa6e968f Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Fri, 24 Oct 2014 16:26:39 -0400 Subject: [PATCH 220/284] Refs #10190. Hopefully fixing the usage example. --- .../docs/source/algorithms/SavePDFGui-v1.rst | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/Code/Mantid/docs/source/algorithms/SavePDFGui-v1.rst b/Code/Mantid/docs/source/algorithms/SavePDFGui-v1.rst index 2872ec0cbe5e..f81febe8d360 100644 --- a/Code/Mantid/docs/source/algorithms/SavePDFGui-v1.rst +++ b/Code/Mantid/docs/source/algorithms/SavePDFGui-v1.rst @@ -10,8 +10,8 @@ Description ----------- -TODO: Enter a full rst-markup description of your algorithm here. - +This algorithm saves G(r) files consistent with `PDFGui `_. +The body of the file is of the form ``r Gr dr dGr``. Usage ----- @@ -25,20 +25,33 @@ Usage .. testcode:: SavePDFGuiExample # Create a host workspace - ws = CreateWorkspace(DataX=range(0,3), DataY=(0,2)) - or - ws = CreateSampleWorkspace() + ws = CreateWorkspace(DataX=range(0,3), DataY=range(0,3), UnitX="Angstrom") + + # Create a filename + import os + path = os.path.join(os.path.expanduser("~"), "savepdfgui.gr") - wsOut = SavePDFGui() + # Save as G(r) file + SavePDFGui(ws, path) - # Print the result - print "The output workspace has %i spectra" % wsOut.getNumberHistograms() + # Check that the file exists + print os.path.isfile(path) Output: .. testoutput:: SavePDFGuiExample - The output workspace has ?? spectra + True + +.. testcleanup:: SavePDFGuiExample + + DeleteWorkspace(ws) + import os + try: + path = os.path.join(os.path.expanduser("~"), "savepdfgui.gr") + os.remove(path) + except: + pass .. categories:: From 5f60b5cd9529fc38ebd1ae7c076a42818011b7cd Mon Sep 17 00:00:00 2001 From: JeanBilheux Date: Sat, 25 Oct 2014 08:54:55 -0400 Subject: [PATCH 221/284] Fixed an issue in wrong name of variable. This refs #10429 --- .../PythonInterface/plugins/algorithms/RefLReduction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/RefLReduction.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/RefLReduction.py index 028b3815f7f1..9c173170f685 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/RefLReduction.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/RefLReduction.py @@ -176,7 +176,7 @@ def PyExec(self): print '-> retrieving general informations' data_central_pixel = wks_utility.getCentralPixel(ws_event_data, dataPeakRange, - is_nexus_detector_rotated) + is_nexus_detector_rotated_flag) # get the distance moderator-detector and sample-detector [dMD, dSD] = wks_utility.getDistances(ws_event_data) # get theta From bdeb6a25f216082747c2c70ccdae8e8bb1b09524 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 27 Oct 2014 08:57:42 +0000 Subject: [PATCH 222/284] Better X range checking Refs #7860 --- .../plugins/algorithms/Symmetrise.py | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py index 6787d7e1cdb1..c8a761f780ef 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/Symmetrise.py @@ -60,15 +60,11 @@ def PyExec(self): sample_x = mtd[self._sample].readX(0) - if self._x_max > sample_x[len(sample_x) - 1]: - raise ValueError('XMax value (%f) is greater than largest X value (%f)' % - (self._x_max, sample_x[len(sample_x) - 1])) - - if self._x_min < sample_x[0]: - raise ValueError('XMin value (%f) is less than smallest X value (%f)' % - (self._x_min, sample_x[0])) - - self._calculate_array_points(sample_x, sample_array_len) + # Get slice bounds of array + try: + self._calculate_array_points(sample_x, sample_array_len) + except Exception as e: + raise RuntimeError('Failed to calculate array slice boundaries: %s' % e.message) max_sample_index = sample_array_len - 1 centre_range_len = self._positive_min_index + self._negative_min_index @@ -103,7 +99,6 @@ def PyExec(self): # Copy logs and properties from sample workspace CopyLogs(InputWorkspace=self._sample, OutputWorkspace=temp_ws_name) CopyInstrumentParameters(InputWorkspace=self._sample, OutputWorkspace=temp_ws_name) - # CopySample(InputWorkspace=self._sample, OutputWorkspace=temp_ws_name) # For each spectrum copy positive values to the negative output_spectrum_index = 0 @@ -206,6 +201,15 @@ def validateInputs(self): issues['XMin'] = 'XMin must be less than XMax' issues['XMax'] = 'XMax must be greater than XMin' + # Valudate X range against workspace X range + sample_x = mtd[input_workspace_name].readX(0) + + if x_max > sample_x[len(sample_x) - 1]: + issues['XMax'] = 'XMax value (%f) is greater than largest X value (%f)' % (self._x_max, sample_x[len(sample_x) - 1]) + + if -x_min < sample_x[0]: + issues['XMin'] = 'Negative XMin value (%f) is less than smallest X value (%f)' % (-x_min, sample_x[0]) + return issues From f535f731de683aea41c8f12394f63eef74f7a453 Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Mon, 27 Oct 2014 09:55:19 +0000 Subject: [PATCH 223/284] Re #10430. Some performance improvements. In the test that I run the speed up is about 3 times. --- .../inc/MantidMDAlgorithms/SXDMDNorm.h | 2 + .../Framework/MDAlgorithms/src/SXDMDNorm.cpp | 80 ++++++++++++++----- 2 files changed, 64 insertions(+), 18 deletions(-) diff --git a/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/SXDMDNorm.h b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/SXDMDNorm.h index 3ff33b52b277..a6d7c3e12182 100644 --- a/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/SXDMDNorm.h +++ b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/SXDMDNorm.h @@ -66,6 +66,8 @@ namespace MDAlgorithms double KincidentMin,KincidentMax; ///index of h,k,l dimensions in the output workspaces size_t hIndex,kIndex,lIndex; + /// cached x values along dimensions h,k,l + std::vector m_hX, m_kX, m_lX; }; diff --git a/Code/Mantid/Framework/MDAlgorithms/src/SXDMDNorm.cpp b/Code/Mantid/Framework/MDAlgorithms/src/SXDMDNorm.cpp index fefd5bc9731a..db7097947641 100644 --- a/Code/Mantid/Framework/MDAlgorithms/src/SXDMDNorm.cpp +++ b/Code/Mantid/Framework/MDAlgorithms/src/SXDMDNorm.cpp @@ -17,7 +17,7 @@ namespace MDAlgorithms using namespace Mantid::Kernel; ///function to compare two intersections (h,k,l,Momentum) by Momentum - bool compareMomentum(Mantid::Kernel::VMD v1, Mantid::Kernel::VMD v2) + bool compareMomentum(const Mantid::Kernel::VMD &v1, const Mantid::Kernel::VMD &v2) { return (v1[3]getDimension(hIndex); + m_hX.resize( hDim.getNBins() ); + for(size_t i = 0; i < m_hX.size(); ++i) + { + m_hX[i] = hDim.getX(i); + } + + auto &kDim = *m_normWS->getDimension(kIndex); + m_kX.resize( kDim.getNBins() ); + for(size_t i = 0; i < m_kX.size(); ++i) + { + m_kX[i] = kDim.getX(i); + } + + auto &lDim = *m_normWS->getDimension(lIndex); + m_lX.resize( lDim.getNBins() ); + for(size_t i = 0; i < m_lX.size(); ++i) + { + m_lX[i] = lDim.getX(i); + } + Mantid::API::MatrixWorkspace_const_sptr fW=getProperty("FluxWorkspace"); Mantid::DataObjects::EventWorkspace_const_sptr fluxW = boost::dynamic_pointer_cast(fW); KincidentMin=fluxW->getEventXMin(); @@ -266,16 +287,18 @@ namespace MDAlgorithms Mantid::API::Progress *prog=new Mantid::API::Progress(this,0.3,1,static_cast(detIDS.size())); const detid2index_map d2m=fluxW->getDetectorIDToWorkspaceIndexMap(); const detid2index_map d2mSA=sA->getDetectorIDToWorkspaceIndexMap(); + auto instrument = m_normWS->getExperimentInfo(0)->getInstrument(); PARALLEL_FOR1(m_normWS) for(int i=0;i(detIDS.size());i++) { PARALLEL_START_INTERUPT_REGION - Mantid::Geometry::IDetector_const_sptr detector=m_normWS->getExperimentInfo(0)->getInstrument()->getDetector(detIDS[i]); + Mantid::Geometry::IDetector_const_sptr detector=instrument->getDetector(detIDS[i]); if(!detector->isMonitor()&&!detector->isMasked()) { //get intersections std::vector intersections=calculateIntersections(detector); + if(!intersections.empty()) { //calculate indices @@ -287,21 +310,35 @@ namespace MDAlgorithms std::vector el=fluxW->getEventList(sp).getWeightedEventsNoTime(); //get iterator to the first event that has momentum >= (*intersections.begin())[3] std::vector::iterator start=el.begin(); + // check that el isn't empty + if ( start == el.end() ) continue; while((*start).tof()<(*intersections.begin())[3]) ++start; double solid=sA->readY(d2mSA.find(detIDS[i])->second)[0]*PC; - std::vector::iterator it; - for (it=intersections.begin()+1;it!=intersections.end();++it) + + const size_t sizeOfMVD = intersections.front().size(); + // pre-allocate for efficiency + std::vector pos( sizeOfMVD + otherValues.size() ); + + for (auto it=intersections.begin()+1;it!=intersections.end();++it) { - Mantid::Kernel::VMD deltav=(*it)-(*(it-1));//difference between consecutive intersections - Mantid::Kernel::VMD avev=((*it)+(*(it-1)))*0.5;//average between two intersection (to get position) + //Mantid::Kernel::VMD deltav=(*it)-(*(it-1));//difference between consecutive intersections + // the full vector isn't used so compute only what is necessary + double delta = (*it)[3] - (*(it-1))[3]; + double eps=1e-7;//do not integrate if momemntum difference is smaller than eps, assume contribution is 0 - if (deltav[3]>eps) + if (delta > eps) { - std::vector pos=avev.toVector(); - pos.insert(pos.end()-1,otherValues.begin(),otherValues.end()); - VMD posNew=mat*pos; - size_t linIndex=m_normWS->getLinearIndexAtCoord(posNew.toVector().data()); + //Mantid::Kernel::VMD avev=((*it)+(*(it-1)))*0.5;//average between two intersection (to get position) + //std::vector pos=avev.toVector(); + //pos.insert(pos.end()-1,otherValues.begin(),otherValues.end()); + // a bit longer and less readable but faster version of the above + std::transform( it->getBareArray(), it->getBareArray() + sizeOfMVD, (it-1)->getBareArray(), pos.begin(), std::plus() ); + std::transform( pos.begin(), pos.begin() + sizeOfMVD, pos.begin(), std::bind2nd( std::multiplies(), 0.5 ) ); + std::copy( otherValues.begin(), otherValues.end(), pos.begin() + sizeOfMVD ); + + std::vector posNew = mat*pos; + size_t linIndex=m_normWS->getLinearIndexAtCoord(posNew.data()); if(linIndex!=size_t(-1)) { @@ -351,6 +388,11 @@ namespace MDAlgorithms double eps=1e-7; + auto hNBins = m_hX.size(); + auto kNBins = m_kX.size(); + auto lNBins = m_lX.size(); + intersections.reserve( hNBins + kNBins + lNBins + 8 ); + //calculate intersections with planes perpendicular to h if (fabs(hStart-hEnd)>eps) { @@ -359,9 +401,9 @@ namespace MDAlgorithms double fl=(lEnd-lStart)/(hEnd-hStart); if(!hIntegrated) { - for(size_t i=0;igetDimension(hIndex)->getNBins();i++) + for(size_t i=0;igetDimension(hIndex)->getX(i); + double hi = m_hX[i]; if ((hi>=hMin)&&(hi<=hMax)&&((hStart-hi)*(hEnd-hi)<0)) { // if hi is between hStart and hEnd, then ki and li will be between kStart, kEnd and lStart, lEnd and momi will be between KincidentMin and KnincidemtmMax @@ -411,9 +453,9 @@ namespace MDAlgorithms double fl=(lEnd-lStart)/(kEnd-kStart); if(!kIntegrated) { - for(size_t i=0;igetDimension(kIndex)->getNBins();i++) + for(size_t i=0;igetDimension(kIndex)->getX(i); + double ki = m_kX[i]; if ((ki>=kMin)&&(ki<=kMax)&&((kStart-ki)*(kEnd-ki)<0)) { // if ki is between kStart and kEnd, then hi and li will be between hStart, hEnd and lStart, lEnd @@ -463,9 +505,9 @@ namespace MDAlgorithms double fk=(kEnd-kStart)/(lEnd-lStart); if(!lIntegrated) { - for(size_t i=0;igetDimension(lIndex)->getNBins();i++) + for(size_t i=0;igetDimension(lIndex)->getX(i); + double li = m_lX[i]; if ((li>=lMin)&&(li<=lMax)&&((lStart-li)*(lEnd-li)<0)) { // if li is between lStart and lEnd, then hi and ki will be between hStart, hEnd and kStart, kEnd @@ -520,7 +562,9 @@ namespace MDAlgorithms } //sort intersections by momentum - std::stable_sort(intersections.begin(),intersections.end(),compareMomentum); + typedef std::vector::iterator IterType; + std::stable_sort(intersections.begin(),intersections.end(),compareMomentum); + return intersections; } From 6f5a68928ca55f2cf5f786324006d325bd60e07a Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Mon, 27 Oct 2014 10:28:36 +0000 Subject: [PATCH 224/284] Refs #10431 Extend QReflTableModel * Add insertRows * Add deleteRows --- .../QReflTableModel.h | 16 +++++-- .../CustomInterfaces/src/QReflTableModel.cpp | 48 ++++++++++++++++++- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QReflTableModel.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QReflTableModel.h index 13a724714405..3e66f90a96f8 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QReflTableModel.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QReflTableModel.h @@ -44,16 +44,20 @@ namespace MantidQt //emit a signal saying things have changed void update(); //row and column counts - int rowCount(const QModelIndex &parent) const; - int columnCount(const QModelIndex &parent) const; + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent = QModelIndex()) const; //get data fro a cell - QVariant data(const QModelIndex &index, int role) const; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; //get header data for the table QVariant headerData(int section, Qt::Orientation orientation, int role) const; //get flags for a cell Qt::ItemFlags flags(const QModelIndex &index) const; - //chage or add data to the model - bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ); + //change or add data to the model + bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole); + //add new rows to the model + bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex()); + //remove rows from the model + bool removeRows(int row, int count, const QModelIndex& parent = QModelIndex()); private: typedef QString ColumnNameType; @@ -119,6 +123,8 @@ namespace MantidQt ColumnIndexNameMap m_columnNameMap; }; + /// Typedef for a shared pointer to \c QReflTableModel + typedef boost::shared_ptr QReflTableModel_sptr; } // namespace CustomInterfaces } // namespace Mantid diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QReflTableModel.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QReflTableModel.cpp index 960261203cb7..b6d0412a07eb 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QReflTableModel.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QReflTableModel.cpp @@ -59,7 +59,7 @@ namespace MantidQt void QReflTableModel::invalidateDataCache(const int row) const { //If the row is in the cache, invalidate the cache. - if(row == m_dataCachePeakIndex) + if(row == m_dataCachePeakIndex || row == -1) m_dataCachePeakIndex = -1; } @@ -221,5 +221,51 @@ namespace MantidQt return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable; } + /** + Insert the given number of rows at the specified position + @param row : The row to insert before + @param count : The number of rows to insert + @param parent : The parent index + */ + bool QReflTableModel::insertRows(int row, int count, const QModelIndex& parent) + { + if(count < 1) + return true; + + if(row < 0) + return false; + + beginInsertRows(parent, row, row + count - 1); + for(int i = 0; i < count; ++i) + m_tWS->insertRow(row + i); + endInsertRows(); + + invalidateDataCache(-1); + return true; + } + + /** + Remove the given number of rows from the specified position + @param row : The row index to remove from + @param count : The number of rows to remove + @param parent : The parent index + */ + bool QReflTableModel::removeRows(int row, int count, const QModelIndex& parent) + { + if(count < 1) + return true; + + if(row < 0) + return false; + + beginRemoveRows(parent, row, row + count - 1); + for(int i = 0; i < count; ++i) + m_tWS->removeRow(row); + endRemoveRows(); + + invalidateDataCache(-1); + return true; + } + } // namespace CustomInterfaces } // namespace Mantid From bef0927e6d57f751dc4d820375cdeb9034f771da Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Mon, 27 Oct 2014 10:38:36 +0000 Subject: [PATCH 225/284] Refs #10431 Create default table in helper --- .../CustomInterfaces/src/ReflMainViewPresenter.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index f1722337a62c..a8a4fd36b4dd 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -82,6 +82,15 @@ namespace return ws; } + + ITableWorkspace_sptr createDefaultWorkspace() + { + //Create a blank workspace with one line and set the scale column to 1 + auto ws = createWorkspace(); + ws->appendRow(); + ws->Double(0, MantidQt::CustomInterfaces::ReflMainViewPresenter::COL_SCALE) = 1.0; + return ws; + } } namespace MantidQt @@ -866,13 +875,10 @@ namespace MantidQt if(!m_view->askUserYesNo("Your current table has unsaved changes. Are you sure you want to discard them?","Start New Table?")) return; - m_model = createWorkspace(); + m_model = createDefaultWorkspace(); m_wsName.clear(); m_view->showTable(m_model); - //Start with one blank row - insertRow(0); - m_tableDirty = false; } From 66971df5187aff6afdc3b3d652c27c106e4e58c5 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Mon, 27 Oct 2014 10:46:09 +0000 Subject: [PATCH 226/284] Refs #10431 Replace size_t with int Qt uses `int` instead of `size_t` for row indices. Change our usage to match Qt's to prepare for using QReflTableModel. --- .../MantidQtCustomInterfaces/QtReflMainView.h | 4 +- .../MantidQtCustomInterfaces/ReflMainView.h | 4 +- .../ReflMainViewPresenter.h | 12 +++--- .../CustomInterfaces/src/QtReflMainView.cpp | 8 ++-- .../src/ReflMainViewPresenter.cpp | 42 +++++++++---------- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index 77fc26d944ea..1f06bfb9915f 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -63,13 +63,13 @@ namespace MantidQt virtual void setProgress(int progress); //Settor methods - virtual void setSelection(const std::set& rows); + virtual void setSelection(const std::set& rows); virtual void setTableList(const std::set& tables); virtual void setInstrumentList(const std::vector& instruments, const std::string& defaultInstrument); virtual void setOptionsHintStrategy(HintStrategy* hintStrategy); //Accessor methods - virtual std::set getSelectedRows() const; + virtual std::set getSelectedRows() const; virtual std::string getSearchInstrument() const; virtual std::string getProcessInstrument() const; virtual std::string getWorkspaceToOpen() const; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index 06ed4ccceebd..bc11d63d7dda 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -55,13 +55,13 @@ namespace MantidQt virtual void setProgress(int progress) = 0; //Settor methods - virtual void setSelection(const std::set& rows) = 0; + virtual void setSelection(const std::set& rows) = 0; virtual void setTableList(const std::set& tables) = 0; virtual void setInstrumentList(const std::vector& instruments, const std::string& defaultInstrument) = 0; virtual void setOptionsHintStrategy(HintStrategy* hintStrategy) = 0; //Accessor methods - virtual std::set getSelectedRows() const = 0; + virtual std::set getSelectedRows() const = 0; virtual std::string getSearchInstrument() const = 0; virtual std::string getProcessInstrument() const = 0; virtual std::string getWorkspaceToOpen() const = 0; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 3432c43ca8d6..b71ff71b49bd 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -61,27 +61,27 @@ namespace MantidQt //process selected rows virtual void process(); //Reduce a row - void reduceRow(size_t rowNo); + void reduceRow(int rowNo); //load a run into the ADS, or re-use one in the ADS if possible Mantid::API::Workspace_sptr loadRun(const std::string& run, const std::string& instrument); //get the run number of a TOF workspace std::string getRunNumber(const Mantid::API::Workspace_sptr& ws); //get an unused group id - int getUnusedGroup(std::set ignoredRows = std::set()) const; + int getUnusedGroup(std::set ignoredRows = std::set()) const; //make a transmission workspace Mantid::API::MatrixWorkspace_sptr makeTransWS(const std::string& transString); //Validate a row - void validateRow(size_t rowNo) const; + void validateRow(int rowNo) const; //Autofill a row with sensible values - void autofillRow(size_t rowNo); + void autofillRow(int rowNo); //calculates qmin and qmax static std::vector calcQRange(Mantid::API::MatrixWorkspace_sptr ws, double theta); //get the number of rows in a group size_t numRowsInGroup(int groupId) const; //Stitch some rows - void stitchRows(std::set rows); + void stitchRows(std::set rows); //insert a row in the model before the given index - virtual void insertRow(size_t before); + virtual void insertRow(int before); //add row(s) to the model virtual void addRow(); //delete row(s) from the model diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 714822d9790d..d9006cf835de 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -267,13 +267,13 @@ namespace MantidQt Set which rows are selected @param rows : The set of rows to select */ - void QtReflMainView::setSelection(const std::set& rows) + void QtReflMainView::setSelection(const std::set& rows) { ui.viewTable->clearSelection(); auto selectionModel = ui.viewTable->selectionModel(); for(auto row = rows.begin(); row != rows.end(); ++row) - selectionModel->select(ui.viewTable->model()->index((int)(*row), 0), QItemSelectionModel::Select | QItemSelectionModel::Rows); + selectionModel->select(ui.viewTable->model()->index((*row), 0), QItemSelectionModel::Select | QItemSelectionModel::Rows); } /** @@ -329,10 +329,10 @@ namespace MantidQt Get the indices of the highlighted rows @returns a vector of unsigned ints contianing the highlighted row numbers */ - std::set QtReflMainView::getSelectedRows() const + std::set QtReflMainView::getSelectedRows() const { auto selectedRows = ui.viewTable->selectionModel()->selectedRows(); - std::set rows; + std::set rows; for(auto it = selectedRows.begin(); it != selectedRows.end(); ++it) rows.insert(it->row()); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index a8a4fd36b4dd..17f3aff75303 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -174,12 +174,12 @@ namespace MantidQt /** * Finds the first unused group id */ - int ReflMainViewPresenter::getUnusedGroup(std::set ignoredRows) const + int ReflMainViewPresenter::getUnusedGroup(std::set ignoredRows) const { std::set usedGroups; //Scan through all the rows, working out which group ids are used - for(size_t idx = 0; idx < m_model->rowCount(); ++idx) + for(int idx = 0; idx < m_model->rowCount(); ++idx) { if(ignoredRows.find(idx) != ignoredRows.end()) continue; @@ -252,7 +252,7 @@ namespace MantidQt return; } - std::set rows = m_view->getSelectedRows(); + std::set rows = m_view->getSelectedRows(); if(rows.empty()) { //Does the user want to abort? @@ -260,12 +260,12 @@ namespace MantidQt return; //They want to process all rows, so populate rows with every index in the model - for(size_t idx = 0; idx < m_model->rowCount(); ++idx) + for(int idx = 0; idx < m_model->rowCount(); ++idx) rows.insert(idx); } //Map group numbers to the set of rows in that group we want to process - std::map > groups; + std::map > groups; for(auto it = rows.begin(); it != rows.end(); ++it) groups[m_model->Int(*it, COL_GROUP)].insert(*it); @@ -273,7 +273,7 @@ namespace MantidQt for(auto gIt = groups.begin(); gIt != groups.end(); ++gIt) { const int& groupId = gIt->first; - const std::set& groupRows = gIt->second; + const std::set& groupRows = gIt->second; //Are we only partially processing a group? if(groupRows.size() < numRowsInGroup(gIt->first)) { @@ -296,7 +296,7 @@ namespace MantidQt } catch(std::exception& ex) { - const std::string rowNo = Mantid::Kernel::Strings::toString(*it + 1); + const std::string rowNo = Mantid::Kernel::Strings::toString(*it + 1); m_view->giveUserCritical("Error found in row " + rowNo + ":\n" + ex.what(), "Error"); return; } @@ -310,7 +310,7 @@ namespace MantidQt for(auto gIt = groups.begin(); gIt != groups.end(); ++gIt) { - const std::set groupRows = gIt->second; + const std::set groupRows = gIt->second; //Reduce each row for(auto rIt = groupRows.begin(); rIt != groupRows.end(); ++rIt) @@ -322,7 +322,7 @@ namespace MantidQt } catch(std::exception& ex) { - const std::string rowNo = Mantid::Kernel::Strings::toString(*rIt + 1); + const std::string rowNo = Mantid::Kernel::Strings::toString(*rIt + 1); const std::string message = "Error encountered while processing row " + rowNo + ":\n"; m_view->giveUserCritical(message + ex.what(), "Error"); m_view->setProgress(0); @@ -353,7 +353,7 @@ namespace MantidQt @param rowNo : The row in the model to validate @throws std::invalid_argument if the row fails validation */ - void ReflMainViewPresenter::validateRow(size_t rowNo) const + void ReflMainViewPresenter::validateRow(int rowNo) const { if(rowNo >= m_model->rowCount()) throw std::invalid_argument("Invalid row"); @@ -367,7 +367,7 @@ namespace MantidQt @param rowNo : The row in the model to autofill @throws std::runtime_error if the row could not be auto-filled */ - void ReflMainViewPresenter::autofillRow(size_t rowNo) + void ReflMainViewPresenter::autofillRow(int rowNo) { if(rowNo >= m_model->rowCount()) throw std::runtime_error("Invalid row"); @@ -520,7 +520,7 @@ namespace MantidQt @param rowNo : The row in the model to reduce @throws std::runtime_error if reduction fails */ - void ReflMainViewPresenter::reduceRow(size_t rowNo) + void ReflMainViewPresenter::reduceRow(int rowNo) { const std::string run = m_model->String(rowNo, COL_RUNS); const std::string transStr = m_model->String(rowNo, COL_TRANSMISSION); @@ -633,7 +633,7 @@ namespace MantidQt Stitches the workspaces created by the given rows together. @param rows : the list of rows */ - void ReflMainViewPresenter::stitchRows(std::set rows) + void ReflMainViewPresenter::stitchRows(std::set rows) { //If we can get away with doing nothing, do. if(rows.size() < 2) @@ -758,7 +758,7 @@ namespace MantidQt Inserts a new row in the specified location @param before The index to insert the new row before */ - void ReflMainViewPresenter::insertRow(size_t before) + void ReflMainViewPresenter::insertRow(int index) { const int groupId = getUnusedGroup(); size_t row = m_model->insertRow(before); @@ -775,7 +775,7 @@ namespace MantidQt */ void ReflMainViewPresenter::addRow() { - std::set rows = m_view->getSelectedRows(); + std::set rows = m_view->getSelectedRows(); if(rows.empty()) insertRow(m_model->rowCount()); else @@ -788,7 +788,7 @@ namespace MantidQt */ void ReflMainViewPresenter::deleteRow() { - std::set rows = m_view->getSelectedRows(); + std::set rows = m_view->getSelectedRows(); for(auto row = rows.rbegin(); row != rows.rend(); ++row) m_model->removeRow(*row); @@ -801,7 +801,7 @@ namespace MantidQt */ void ReflMainViewPresenter::groupRows() { - const std::set rows = m_view->getSelectedRows(); + const std::set rows = m_view->getSelectedRows(); //Find the first unused group id, ignoring the selected rows const int groupId = getUnusedGroup(rows); @@ -1002,7 +1002,7 @@ namespace MantidQt size_t ReflMainViewPresenter::numRowsInGroup(int groupId) const { size_t count = 0; - for(size_t i = 0; i < m_model->rowCount(); ++i) + for(int i = 0; i < m_model->rowCount(); ++i) if(m_model->Int(i, COL_GROUP) == groupId) count++; return count; @@ -1013,13 +1013,13 @@ namespace MantidQt { std::set groupIds; - std::set rows = m_view->getSelectedRows(); + std::set rows = m_view->getSelectedRows(); for(auto row = rows.begin(); row != rows.end(); ++row) groupIds.insert(m_model->Int(*row, COL_GROUP)); - std::set selection; + std::set selection; - for(size_t i = 0; i < m_model->rowCount(); ++i) + for(int i = 0; i < m_model->rowCount(); ++i) if(groupIds.find(m_model->Int(i, COL_GROUP)) != groupIds.end()) selection.insert(i); From 29b26824017a1fd286cad58ff30ce6cf0c2e4848 Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Mon, 27 Oct 2014 10:46:35 +0000 Subject: [PATCH 227/284] Re #10017. Axes check to fix the error. --- Code/Mantid/MantidPlot/src/Mantid/MantidMatrix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidPlot/src/Mantid/MantidMatrix.cpp b/Code/Mantid/MantidPlot/src/Mantid/MantidMatrix.cpp index 750b2bc5d40f..64557708ea18 100644 --- a/Code/Mantid/MantidPlot/src/Mantid/MantidMatrix.cpp +++ b/Code/Mantid/MantidPlot/src/Mantid/MantidMatrix.cpp @@ -1366,7 +1366,7 @@ QVariant MantidMatrixModel::data(const QModelIndex &index, int role) const bool MantidMatrixModel::checkMonitorCache(int row) const { row += m_startRow; //correctly offset the row - if (m_workspace->getAxis(1)->isSpectra()) + if (m_workspace->axes() > 1 && m_workspace->getAxis(1)->isSpectra()) { bool isMon = false; if (m_monCache.contains(row)) From 14d9842b42c886df1d1f2d711e5bde93017bae79 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Mon, 27 Oct 2014 10:47:46 +0000 Subject: [PATCH 228/284] Refs #10431 Pass QReflTableModel to QtReflMainView The view will now automatically stay in sync with the model, because we're not going behind the model's back in the presenter. --- .../MantidQtCustomInterfaces/QtReflMainView.h | 5 +- .../MantidQtCustomInterfaces/ReflMainView.h | 4 +- .../ReflMainViewPresenter.h | 7 +- .../CustomInterfaces/src/QtReflMainView.cpp | 8 +- .../src/ReflMainViewPresenter.cpp | 91 ++++++++----------- 5 files changed, 55 insertions(+), 60 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index 1f06bfb9915f..626af27f6e45 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -5,6 +5,7 @@ #include "MantidQtAPI/UserSubWindow.h" #include "MantidQtCustomInterfaces/ReflMainView.h" #include "MantidQtCustomInterfaces/IReflPresenter.h" +#include "MantidQtCustomInterfaces/QReflTableModel.h" #include #include #include "ui_ReflMainWidget.h" @@ -49,7 +50,7 @@ namespace MantidQt static QString categoryInfo() { return "Reflectometry"; } //Connect the model - virtual void showTable(Mantid::API::ITableWorkspace_sptr model); + virtual void showTable(QReflTableModel_sptr model); //Dialog/Prompt methods virtual std::string askUserString(const std::string& prompt, const std::string& title, const std::string& defaultValue); @@ -79,6 +80,8 @@ namespace MantidQt virtual void initLayout(); //the presenter boost::shared_ptr m_presenter; + //the model + QReflTableModel_sptr m_model; //the interface Ui::reflMainWidget ui; //the workspace the user selected to open diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index bc11d63d7dda..651a91392cfa 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -2,7 +2,7 @@ #define MANTID_CUSTOMINTERFACES_REFLMAINVIEW_H #include "MantidKernel/System.h" -#include "MantidAPI/ITableWorkspace.h" +#include "MantidQtCustomInterfaces/QReflTableModel.h" #include "MantidQtMantidWidgets/HintStrategy.h" namespace MantidQt @@ -41,7 +41,7 @@ namespace MantidQt virtual ~ReflMainView() {}; //Connect the model - virtual void showTable(Mantid::API::ITableWorkspace_sptr model) = 0; + virtual void showTable(QReflTableModel_sptr model) = 0; //Dialog/Prompt methods virtual std::string askUserString(const std::string& prompt, const std::string& title, const std::string& defaultValue) = 0; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index b71ff71b49bd..837410b659ac 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -5,8 +5,9 @@ #include "MantidAPI/ITableWorkspace.h" #include "MantidAPI/MatrixWorkspace.h" #include "MantidKernel/System.h" -#include "MantidQtCustomInterfaces/ReflMainView.h" #include "MantidQtCustomInterfaces/IReflPresenter.h" +#include "MantidQtCustomInterfaces/ReflMainView.h" +#include "MantidQtCustomInterfaces/QReflTableModel.h" #include #include @@ -49,8 +50,10 @@ namespace MantidQt //Public for the purposes of unit testing static std::map parseKeyValueString(const std::string& str); protected: + //the workspace the model is currently representing + Mantid::API::ITableWorkspace_sptr m_ws; //the model the table is currently representing - Mantid::API::ITableWorkspace_sptr m_model; + QReflTableModel_sptr m_model; //the name of the workspace/table/model in the ADS, blank if unsaved std::string m_wsName; //the view we're managing diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index d9006cf835de..008f8888212f 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -79,12 +79,12 @@ namespace MantidQt Set a new model in the tableview @param model : the model to be attached to the tableview */ - void QtReflMainView::showTable(ITableWorkspace_sptr model) + void QtReflMainView::showTable(QReflTableModel_sptr model) { - QAbstractItemModel* qModel = new QReflTableModel(model); + m_model = model; //So we can notify the presenter when the user updates the table - connect(qModel, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(tableUpdated(const QModelIndex&, const QModelIndex&))); - ui.viewTable->setModel(qModel); + connect(m_model.get(), SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), this, SLOT(tableUpdated(const QModelIndex&, const QModelIndex&))); + ui.viewTable->setModel(m_model.get()); ui.viewTable->resizeColumnsToContents(); } diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 17f3aff75303..dfbc9c922348 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -7,6 +7,7 @@ #include "MantidKernel/TimeSeriesProperty.h" #include "MantidKernel/Utils.h" #include "MantidQtCustomInterfaces/ReflMainView.h" +#include "MantidQtCustomInterfaces/QReflTableModel.h" #include "MantidQtMantidWidgets/AlgorithmHintStrategy.h" #include @@ -185,7 +186,7 @@ namespace MantidQt continue; //This is an unselected row. Add it to the list of used group ids - usedGroups.insert(m_model->Int(idx, COL_GROUP)); + usedGroups.insert(m_model->data(m_model->index(idx, COL_GROUP)).toInt()); } int groupId = 0; @@ -267,7 +268,7 @@ namespace MantidQt //Map group numbers to the set of rows in that group we want to process std::map > groups; for(auto it = rows.begin(); it != rows.end(); ++it) - groups[m_model->Int(*it, COL_GROUP)].insert(*it); + groups[m_model->data(m_model->index(*it, COL_GROUP)).toInt()].insert(*it); //Check each group and warn if we're only partially processing it for(auto gIt = groups.begin(); gIt != groups.end(); ++gIt) @@ -358,7 +359,7 @@ namespace MantidQt if(rowNo >= m_model->rowCount()) throw std::invalid_argument("Invalid row"); - if(m_model->String(rowNo, COL_RUNS).empty()) + if(m_model->data(m_model->index(rowNo, COL_RUNS)).toString().isEmpty()) throw std::invalid_argument("Run column may not be empty."); } @@ -372,11 +373,11 @@ namespace MantidQt if(rowNo >= m_model->rowCount()) throw std::runtime_error("Invalid row"); - const std::string runStr = m_model->String(rowNo, COL_RUNS); + const std::string runStr = m_model->data(m_model->index(rowNo, COL_RUNS)).toString().toStdString(); MatrixWorkspace_sptr run = boost::dynamic_pointer_cast(loadRun(runStr, m_view->getProcessInstrument())); //Fetch two theta from the log if needed - if(m_model->String(rowNo, COL_ANGLE).empty()) + if(m_model->data(m_model->index(rowNo, COL_ANGLE)).toString().isEmpty()) { Property* logData = NULL; @@ -402,26 +403,23 @@ namespace MantidQt throw std::runtime_error("Value for two theta could not be found in log."); //Update the model - m_model->String(rowNo, COL_ANGLE) = Strings::toString(Utils::roundToDP(thetaVal, 3)); + m_model->setData(m_model->index(rowNo, COL_ANGLE), Utils::roundToDP(thetaVal, 3)); m_tableDirty = true; } //If we need to calculate the resolution, do. - if(m_model->String(rowNo, COL_DQQ).empty()) + if(m_model->data(m_model->index(rowNo, COL_DQQ)).toString().isEmpty()) { IAlgorithm_sptr calcResAlg = AlgorithmManager::Instance().create("CalculateResolution"); calcResAlg->setProperty("Workspace", run); - calcResAlg->setProperty("TwoTheta", m_model->String(rowNo, COL_ANGLE)); + calcResAlg->setProperty("TwoTheta", m_model->data(m_model->index(rowNo, COL_ANGLE)).toString().toStdString()); calcResAlg->execute(); //Update the model double dqqVal = calcResAlg->getProperty("Resolution"); - m_model->String(rowNo, COL_DQQ) = Strings::toString(dqqVal); + m_model->setData(m_model->index(rowNo, COL_DQQ), dqqVal); m_tableDirty = true; } - - //Make sure the view updates - m_view->showTable(m_model); } /** @@ -522,16 +520,16 @@ namespace MantidQt */ void ReflMainViewPresenter::reduceRow(int rowNo) { - const std::string run = m_model->String(rowNo, COL_RUNS); - const std::string transStr = m_model->String(rowNo, COL_TRANSMISSION); - const std::string options = m_model->String(rowNo, COL_OPTIONS); + const std::string run = m_model->data(m_model->index(rowNo, COL_RUNS)).toString().toStdString(); + const std::string transStr = m_model->data(m_model->index(rowNo, COL_TRANSMISSION)).toString().toStdString(); + const std::string options = m_model->data(m_model->index(rowNo, COL_OPTIONS)).toString().toStdString(); double theta = 0; - const bool thetaGiven = !m_model->String(rowNo, COL_ANGLE).empty(); + const bool thetaGiven = !m_model->data(m_model->index(rowNo, COL_ANGLE)).toString().isEmpty(); if(thetaGiven) - Mantid::Kernel::Strings::convert(m_model->String(rowNo, COL_ANGLE), theta); + theta = m_model->data(m_model->index(rowNo, COL_ANGLE)).toDouble(); Workspace_sptr runWS = loadRun(run, m_view->getProcessInstrument()); const std::string runNo = getRunNumber(runWS); @@ -568,7 +566,7 @@ namespace MantidQt if(!algReflOne->isExecuted()) throw std::runtime_error("Failed to run ReflectometryReductionOneAuto."); - const double scale = m_model->Double(rowNo, COL_SCALE); + const double scale = m_model->data(m_model->index(rowNo, COL_SCALE)).toDouble(); if(scale != 1.0) { IAlgorithm_sptr algScale = AlgorithmManager::Instance().create("Scale"); @@ -583,19 +581,18 @@ namespace MantidQt } //Reduction has completed. Put Qmin and Qmax into the table if needed, for stitching. - if(m_model->String(rowNo, COL_QMIN).empty() || m_model->String(rowNo, COL_QMAX).empty()) + if(m_model->data(m_model->index(rowNo, COL_QMIN)).toString().isEmpty() || m_model->data(m_model->index(rowNo, COL_QMAX)).toString().isEmpty()) { MatrixWorkspace_sptr ws = AnalysisDataService::Instance().retrieveWS("IvsQ_" + runNo); std::vector qrange = calcQRange(ws, theta); - if(m_model->String(rowNo, COL_QMIN).empty()) - m_model->String(rowNo, COL_QMIN) = Strings::toString(qrange[0]); + if(m_model->data(m_model->index(rowNo, COL_QMIN)).toString().isEmpty()) + m_model->setData(m_model->index(rowNo, COL_QMIN), qrange[0]); - if(m_model->String(rowNo, COL_QMAX).empty()) - m_model->String(rowNo, COL_QMAX) = Strings::toString(qrange[1]); + if(m_model->data(m_model->index(rowNo, COL_QMAX)).toString().isEmpty()) + m_model->setData(m_model->index(rowNo, COL_QMAX), qrange[1]); m_tableDirty = true; - m_view->showTable(m_model); } } @@ -650,13 +647,9 @@ namespace MantidQt //Go through each row and prepare the properties for(auto rowIt = rows.begin(); rowIt != rows.end(); ++rowIt) { - const std::string runStr = m_model->String(*rowIt, COL_RUNS); - const std::string qMinStr = m_model->String(*rowIt, COL_QMIN); - const std::string qMaxStr = m_model->String(*rowIt, COL_QMAX); - - double qmin, qmax; - Mantid::Kernel::Strings::convert(qMinStr, qmin); - Mantid::Kernel::Strings::convert(qMaxStr, qmax); + const std::string runStr = m_model->data(m_model->index(*rowIt, COL_RUNS)).toString().toStdString(); + const double qmin = m_model->data(m_model->index(*rowIt, COL_QMIN)).toDouble(); + const double qmax = m_model->data(m_model->index(*rowIt, COL_QMAX)).toDouble(); Workspace_sptr runWS = loadRun(runStr); if(runWS) @@ -673,9 +666,7 @@ namespace MantidQt endOverlaps.push_back(qmax); } - double dqq; - std::string dqqStr = m_model->String(*(rows.begin()), COL_DQQ); - Mantid::Kernel::Strings::convert(dqqStr, dqq); + double dqq = m_model->data(m_model->index(*(rows.begin()), COL_DQQ)).toDouble(); //params are qmin, -dqq, qmax for the final output params.push_back(*std::min_element(startOverlaps.begin(), startOverlaps.end())); @@ -761,13 +752,12 @@ namespace MantidQt void ReflMainViewPresenter::insertRow(int index) { const int groupId = getUnusedGroup(); - size_t row = m_model->insertRow(before); + if(!m_model->insertRow(index)) + return; //Set the default scale to 1.0 - m_model->Double(row, COL_SCALE) = 1.0; + m_model->setData(m_model->index(index, COL_SCALE), 1.0); //Set the group id of the new row - m_model->Int(row, COL_GROUP) = groupId; - //Make sure the view updates - m_view->showTable(m_model); + m_model->setData(m_model->index(index, COL_GROUP), groupId); } /** @@ -792,7 +782,6 @@ namespace MantidQt for(auto row = rows.rbegin(); row != rows.rend(); ++row) m_model->removeRow(*row); - m_view->showTable(m_model); m_tableDirty = true; } @@ -807,10 +796,8 @@ namespace MantidQt //Now we just have to set the group id on the selected rows for(auto it = rows.begin(); it != rows.end(); ++it) - m_model->Int(*it, COL_GROUP) = groupId; + m_model->setData(m_model->index(*it, COL_GROUP), groupId); - //Make sure the view updates - m_view->showTable(m_model); m_tableDirty = true; } @@ -844,7 +831,7 @@ namespace MantidQt { if(!m_wsName.empty()) { - AnalysisDataService::Instance().addOrReplace(m_wsName,boost::shared_ptr(m_model->clone())); + AnalysisDataService::Instance().addOrReplace(m_wsName,boost::shared_ptr(m_ws->clone())); m_tableDirty = false; } else @@ -875,7 +862,8 @@ namespace MantidQt if(!m_view->askUserYesNo("Your current table has unsaved changes. Are you sure you want to discard them?","Start New Table?")) return; - m_model = createDefaultWorkspace(); + m_ws = createDefaultWorkspace(); + m_model.reset(new QReflTableModel(m_ws)); m_wsName.clear(); m_view->showTable(m_model); @@ -906,11 +894,12 @@ namespace MantidQt ITableWorkspace_sptr origTable = AnalysisDataService::Instance().retrieveWS(toOpen); //We create a clone of the table for live editing. The original is not updated unless we explicitly save. - ITableWorkspace_sptr newModel = boost::shared_ptr(origTable->clone()); + ITableWorkspace_sptr newTable = boost::shared_ptr(origTable->clone()); try { - validateModel(newModel); - m_model = newModel; + validateModel(newTable); + m_ws = newTable; + m_model.reset(new QReflTableModel(m_ws)); m_wsName = toOpen; m_view->showTable(m_model); m_tableDirty = false; @@ -1003,7 +992,7 @@ namespace MantidQt { size_t count = 0; for(int i = 0; i < m_model->rowCount(); ++i) - if(m_model->Int(i, COL_GROUP) == groupId) + if(m_model->data(m_model->index(i, COL_GROUP)).toInt() == groupId) count++; return count; } @@ -1015,12 +1004,12 @@ namespace MantidQt std::set rows = m_view->getSelectedRows(); for(auto row = rows.begin(); row != rows.end(); ++row) - groupIds.insert(m_model->Int(*row, COL_GROUP)); + groupIds.insert(m_model->data(m_model->index(*row, COL_GROUP)).toInt()); std::set selection; for(int i = 0; i < m_model->rowCount(); ++i) - if(groupIds.find(m_model->Int(i, COL_GROUP)) != groupIds.end()) + if(groupIds.find(m_model->data(m_model->index(i, COL_GROUP)).toInt()) != groupIds.end()) selection.insert(i); m_view->setSelection(selection); From 94444493c680411e8259072103c291c549a64440 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Mon, 27 Oct 2014 10:57:36 +0000 Subject: [PATCH 229/284] Refs #10431 Resynchronise documentation --- .../inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h | 2 +- .../MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 837410b659ac..5ee87aa3a403 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -84,7 +84,7 @@ namespace MantidQt //Stitch some rows void stitchRows(std::set rows); //insert a row in the model before the given index - virtual void insertRow(int before); + virtual void insertRow(int index); //add row(s) to the model virtual void addRow(); //delete row(s) from the model diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index dfbc9c922348..102d57dbd9c5 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -747,7 +747,7 @@ namespace MantidQt /** Inserts a new row in the specified location - @param before The index to insert the new row before + @param index The index to insert the new row before */ void ReflMainViewPresenter::insertRow(int index) { From 4e5752a0c0d85e6a42e7c3ccad5dd0ecec113683 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Mon, 27 Oct 2014 11:17:05 +0000 Subject: [PATCH 230/284] Refs #10431 Update unit tests --- .../test/ReflMainViewMockObjects.h | 23 ++++-------- .../test/ReflMainViewPresenterTest.h | 36 +++++++++---------- 2 files changed, 24 insertions(+), 35 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h index 7906d06e07af..dbdab5a093b8 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h @@ -3,6 +3,7 @@ #include #include "MantidQtCustomInterfaces/ReflMainView.h" +#include "MantidQtCustomInterfaces/QReflTableModel.h" #include "MantidAPI/TableRow.h" using namespace MantidQt::CustomInterfaces; @@ -34,7 +35,8 @@ class MockView : public ReflMainView { public: MockView(){}; - virtual void showTable(Mantid::API::ITableWorkspace_sptr model){ m_model = model;} + virtual ~MockView(){} + virtual void showTable(QReflTableModel_sptr model){ m_model = model;} virtual void setOptionsHintStrategy(HintStrategy*) {}; MOCK_METHOD3(askUserString, std::string(const std::string& prompt, const std::string& title, const std::string& defaultValue)); MOCK_METHOD2(askUserYesNo, bool(std::string, std::string)); @@ -46,26 +48,13 @@ class MockView : public ReflMainView MOCK_METHOD1(setTableList, void(const std::set& tableList)); MOCK_METHOD2(setInstrumentList, void(const std::vector& instruments, const std::string& defaultInstrument)); MOCK_METHOD1(setInstrument, void(const std::string&)); - MOCK_METHOD1(setSelection, void(const std::set& rows)); - MOCK_CONST_METHOD0(getSelectedRows, std::set()); + MOCK_METHOD1(setSelection, void(const std::set& rows)); + MOCK_CONST_METHOD0(getSelectedRows, std::set()); MOCK_CONST_METHOD0(getSearchInstrument, std::string()); MOCK_CONST_METHOD0(getProcessInstrument, std::string()); MOCK_CONST_METHOD0(getWorkspaceToOpen, std::string()); - virtual ~MockView(){} - void addDataForTest() - { - TableRow row = m_model->appendRow(); - row << "13460" << "0.7" << "13463,13464" << "0.01" << "0.06" << "0.04" << 1.0 << 3 << ""; - row = m_model->appendRow(); - row << "13462" << "2.3" << "13463,13464" << "0.035" << "0.3" << "0.04" << 1.0 << 3 << ""; - row = m_model->appendRow(); - row << "13469" << "0.7" << "13463,13464" << "0.01" << "0.06" << "0.04" << 1.0 << 1 << ""; - row = m_model->appendRow(); - row << "13470" << "2.3" << "13463,13464" << "0.035" << "0.3" << "0.04" << 1.0 << 1 << ""; - m_model->removeRow(0); - } private: - Mantid::API::ITableWorkspace_sptr m_model; + QReflTableModel_sptr m_model; }; #endif /*MANTID_CUSTOMINTERFACES_REFLMAINVIEWMOCKOBJECTS_H*/ diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index d942ee451654..4c1ae13c27cc 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -196,7 +196,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_THROWS(ws->Int(6, GroupCol), std::runtime_error); //The user hits "add row" twice with no rows selected - EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); + EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); presenter.notify(AddRowFlag); presenter.notify(AddRowFlag); @@ -229,7 +229,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::set rowlist; + std::set rowlist; rowlist.insert(1); //We should not receive any errors @@ -282,7 +282,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::set rowlist; + std::set rowlist; rowlist.insert(1); rowlist.insert(2); rowlist.insert(3); @@ -347,7 +347,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite TS_ASSERT_EQUALS(ws->Int(1, GroupCol), 3); //The user hits "delete row" with no rows selected - EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); presenter.notify(DeleteRowFlag); //The user hits save @@ -374,7 +374,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::set rowlist; + std::set rowlist; rowlist.insert(1); //We should not receive any errors @@ -414,7 +414,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::set rowlist; + std::set rowlist; rowlist.insert(0); rowlist.insert(1); rowlist.insert(2); @@ -459,7 +459,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::set rowlist; + std::set rowlist; rowlist.insert(0); rowlist.insert(1); @@ -524,7 +524,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::set rowlist; + std::set rowlist; rowlist.insert(0); rowlist.insert(1); @@ -576,7 +576,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite EXPECT_CALL(mockView, getWorkspaceToOpen()).Times(1).WillRepeatedly(Return("TestWorkspace")); presenter.notify(OpenTableFlag); - std::set rowlist; + std::set rowlist; rowlist.insert(0); rowlist.insert(1); @@ -596,12 +596,12 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //Check the table was updated as expected ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); TS_ASSERT_EQUALS(ws->String(0, ThetaCol), "0.7"); - TS_ASSERT_EQUALS(ws->String(0, DQQCol), "0.0340301"); + TS_ASSERT_EQUALS(ws->String(0, DQQCol), "0.0340301395749668"); TS_ASSERT_EQUALS(ws->String(0, QMinCol), "0.009"); TS_ASSERT_EQUALS(ws->String(0, QMaxCol), "0.154"); TS_ASSERT_EQUALS(ws->String(1, ThetaCol), "2.3"); - TS_ASSERT_EQUALS(ws->String(1, DQQCol), "0.0340505"); + TS_ASSERT_EQUALS(ws->String(1, DQQCol), "0.0340504661681226"); TS_ASSERT_EQUALS(ws->String(1, QMinCol), "0.03"); TS_ASSERT_EQUALS(ws->String(1, QMaxCol), "0.504"); @@ -708,7 +708,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite ReflMainViewPresenter presenter(&mockView); //User hits "add row" - EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); presenter.notify(AddRowFlag); //The user will decide not to discard their changes @@ -734,7 +734,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite ReflMainViewPresenter presenter(&mockView); //User hits "add row" a couple of times - EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); + EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); presenter.notify(AddRowFlag); presenter.notify(AddRowFlag); @@ -743,7 +743,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite presenter.notify(SaveFlag); //...then deletes the 2nd row - std::set rows; + std::set rows; rows.insert(1); EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(rows)); presenter.notify(DeleteRowFlag); @@ -770,7 +770,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite ReflMainViewPresenter presenter(&mockView); //User hits "add row" a couple of times - EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); + EXPECT_CALL(mockView, getSelectedRows()).Times(2).WillRepeatedly(Return(std::set())); presenter.notify(AddRowFlag); presenter.notify(AddRowFlag); @@ -793,7 +793,7 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite createPrefilledWorkspace("TestWorkspace"); //User hits "add row" - EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); + EXPECT_CALL(mockView, getSelectedRows()).Times(1).WillRepeatedly(Return(std::set())); presenter.notify(AddRowFlag); //and tries to open a workspace, but gets prompted and decides not to discard @@ -846,8 +846,8 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //We should not receive any errors EXPECT_CALL(mockView, giveUserCritical(_,_)).Times(0); - std::set selection; - std::set expected; + std::set selection; + std::set expected; selection.insert(0); expected.insert(0); From 72e8fb5d3ab22b9d9a1bbfb75dbba04ecd6f9ae7 Mon Sep 17 00:00:00 2001 From: Roman Tolchenov Date: Mon, 27 Oct 2014 11:24:31 +0000 Subject: [PATCH 231/284] Re #10249. Fixed link to help pages. --- Code/Mantid/MantidQt/MantidWidgets/src/FitPropertyBrowser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/FitPropertyBrowser.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/FitPropertyBrowser.cpp index 7569e77f952b..a722a10d84c6 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/FitPropertyBrowser.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/FitPropertyBrowser.cpp @@ -3250,7 +3250,7 @@ void FitPropertyBrowser::functionHelp() if ( handler ) { // Create and open the URL of the help page - QString url = QString::fromStdString( "http://www.mantidproject.org/" + handler->ifun()->name() ); + QString url = QString::fromStdString( "http://docs.mantidproject.org/fitfunctions/" + handler->ifun()->name() ); QDesktopServices::openUrl(QUrl(url)); } } From 4af46c03a570a868a4897c11b63d724c9e581371 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Mon, 27 Oct 2014 12:08:37 +0000 Subject: [PATCH 232/284] Refs #10373 Remove unused variable --- Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index fb8dc4fd9119..bfcf3dcf08ba 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -202,8 +202,6 @@ namespace MantidQt */ void QtReflMainView::showContextMenu(const QPoint& pos) { - QModelIndex index = ui.viewTable->indexAt(pos); - //parent widget takes ownership of QMenu QMenu* menu = new QMenu(this); menu->addAction(ui.actionProcess); From ecd6f8850c6455837a08eaebd89630e6efd63c94 Mon Sep 17 00:00:00 2001 From: Pete Peterson Date: Mon, 27 Oct 2014 10:41:24 -0400 Subject: [PATCH 233/284] Refs #10434. Using default value if the supplied one is empty. --- .../algorithms/PDDetermineCharacterizations.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PDDetermineCharacterizations.py b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PDDetermineCharacterizations.py index bd271db0e2fb..9bb2ba9ed9a7 100644 --- a/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PDDetermineCharacterizations.py +++ b/Code/Mantid/Framework/PythonInterface/plugins/algorithms/PDDetermineCharacterizations.py @@ -143,11 +143,14 @@ def processInformation(self, prop_man, info_dict): # Convert comma-delimited list to array, else return the original # value. if type("") == type(val): - try: - val = [float(x) for x in val.split(',')] - except ValueError, err: - self.log().error("Error to parse key = %s value = %s. " % (str(key), str(val))) - raise NotImplementedError(str(err)) + if (len(val)==0) and (key in DEF_INFO.keys()): + val = DEF_INFO[key] + else: + try: + val = [float(x) for x in val.split(',')] + except ValueError, err: + self.log().error("Error to parse key: '%s' value = '%s'. " % (str(key), str(val))) + raise NotImplementedError(str(err)) try: prop_man[key] = val From b4d795fd68d7e48d290aea997581ffda5b07bace Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Mon, 27 Oct 2014 16:28:36 +0000 Subject: [PATCH 234/284] Moving by 1 spectra working, needs refactoring Refs #10324 --- .../inc/MantidQtSpectrumViewer/SliderHandler.h | 4 ++++ .../MantidQtSpectrumViewer/SpectrumDisplay.h | 6 +++--- .../SpectrumViewer/src/SliderHandler.cpp | 17 +++++++++++++++++ .../SpectrumViewer/src/SpectrumDisplay.cpp | 11 +++++++++-- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SliderHandler.h b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SliderHandler.h index c4e7b2199168..ca1ca8c7b266 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SliderHandler.h +++ b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SliderHandler.h @@ -55,6 +55,10 @@ class EXPORT_OPT_MANTIDQT_SPECTRUMVIEWER SliderHandler : public ISliderHandler void ConfigureSliders( QRect draw_area, SpectrumDataSource* data_source ); + /// Configure the image scrollbars for the specified data and drawing area + void ReConfigureSliders( QRect draw_area, + SpectrumDataSource* data_source ); + /// Configure the horizontal scrollbar to cover the specified range void ConfigureHSlider( int n_data_steps, int n_pixels ); diff --git a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h index 1def9ccdeb2b..7f74d2c8661f 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h +++ b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h @@ -95,6 +95,9 @@ class EXPORT_OPT_MANTIDQT_SPECTRUMVIEWER SpectrumDisplay /// Set vertical graph with data from the array at the specified x value void SetVGraph( double x ); + /// Show information about the point (x, y) on the image in the table + std::vector ShowInfoList( double x, double y ); + QPoint GetPlotTransform( QPair values ); QPair GetPlotInvTransform( QPoint point ); @@ -108,9 +111,6 @@ class EXPORT_OPT_MANTIDQT_SPECTRUMVIEWER SpectrumDisplay /// Get the rectangle currently covered by the image in pixel coordinates void GetDisplayRectangle( QRect &rect ); - /// Show information about the point (x, y) on the image in the table - void ShowInfoList( double x, double y ); - std::vector positive_color_table; std::vector negative_color_table; std::vector intensity_table; diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SliderHandler.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SliderHandler.cpp index e2ce4353c19e..3221556d2321 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SliderHandler.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SliderHandler.cpp @@ -19,6 +19,23 @@ SliderHandler::SliderHandler( Ui_SpectrumViewer* sv_ui ) : ISliderHandler() } +/** + * Reconfigure the image scrollbars for the specified data and drawing area. + * + * @param draw_area Rectangle specifiying the region where the image will + * be drawn + * @param data_source SpectrumDataSource that provides the data to be drawn + */ +void SliderHandler::ReConfigureSliders( QRect draw_area, + SpectrumDataSource* data_source ) +{ + QScrollBar* v_scroll = sv_ui->imageVerticalScrollBar; + double old_v_value = v_scroll->value(); + int n_rows = (int)data_source->GetNRows(); + ConfigureSlider( v_scroll, n_rows, draw_area.height(), old_v_value ); +} + + /** * Configure the image scrollbars for the specified data and drawing area. * diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp index 648e911f934f..c1677e5cbe79 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp @@ -14,6 +14,7 @@ #include "MantidQtSpectrumViewer/ColorMaps.h" #include "MantidQtSpectrumViewer/QtUtils.h" #include "MantidQtSpectrumViewer/SVUtils.h" +#include "MantidQtSpectrumViewer/SliderHandler.h" namespace MantidQt { @@ -102,7 +103,7 @@ void SpectrumDisplay::SetDataSource( SpectrumDataSource* data_source ) pointed_at_x = DBL_MAX; pointed_at_y = DBL_MAX; - int n_rows = 500; // get reasonable size initial image data + int n_rows = total_y_max - total_y_min; // get reasonable size initial image data int n_cols = 500; // data_array is deleted in the SpectrumPlotItem data_array = data_source->GetDataArray( total_x_min, total_x_max, @@ -182,6 +183,10 @@ void SpectrumDisplay::UpdateImage() SetDataSource( data_source ); // re-initialize with the altered source } + QRect draw_area; + GetDisplayRectangle( draw_area ); + dynamic_cast(slider_handler)->ReConfigureSliders( draw_area, data_source ); + QRect display_rect; GetDisplayRectangle( display_rect ); @@ -495,7 +500,7 @@ void SpectrumDisplay::SetVGraph( double x ) * @param x The x coordinate of the pointed at location on the image. * @param y The y coordinate of the pointed at location on the image. */ -void SpectrumDisplay::ShowInfoList( double x, double y ) +std::vector SpectrumDisplay::ShowInfoList( double x, double y ) { std::vector info_list; data_source->GetInfoList( x, y, info_list ); @@ -520,6 +525,8 @@ void SpectrumDisplay::ShowInfoList( double x, double y ) } image_table->resizeColumnsToContents(); + + return info_list; } From 5f23e4b0145b84ada9d98db853060165ff763769 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 28 Oct 2014 10:19:40 +0000 Subject: [PATCH 235/284] Update scroll bars on resize Refs #10324 --- .../inc/MantidQtSpectrumViewer/SpectrumView.h | 4 +++ .../SpectrumViewer/src/SVConnections.cpp | 3 +- .../SpectrumViewer/src/SpectrumView.cpp | 33 ++++++++++++------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumView.h b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumView.h index 346a1eddf169..64df84aadf0f 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumView.h +++ b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumView.h @@ -58,6 +58,7 @@ class RangeHandler; class SliderHandler; class SpectrumDisplay; class SVConnections; +class MatrixWSDataSource; class EXPORT_OPT_MANTIDQT_SPECTRUMVIEWER SpectrumView : public QMainWindow, public MantidQt::API::WorkspaceObserver { @@ -75,6 +76,7 @@ protected slots: void updateWorkspace(); protected: + virtual void resizeEvent(QResizeEvent * event); void preDeleteHandle(const std::string& wsName,const boost::shared_ptr ws); void afterReplaceHandle(const std::string& wsName,const boost::shared_ptr ws); @@ -84,6 +86,8 @@ protected slots: GraphDisplay* h_graph; GraphDisplay* v_graph; + MatrixWSDataSource *m_data_source; + // keep void pointers to the following objects, to avoid having to // include ui_SpectrumView.h, which disappears by the time MantidPlot is // being built. We need the pointers so we can delete them in the diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp index ca7b898b8fea..c3299f966c47 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp @@ -337,7 +337,7 @@ bool SVConnections::eventFilter(QObject *object, QEvent *event) QPoint newPoint = spectrum_display->GetPlotTransform(newPositionData); int newY = newPoint.y(); - // see if we should react + // Ignore the event if the position is outside of the plot area if (newX < 0) return false; if (newY < 0) return false; const QSize canvasSize = sv_ui->spectrumPlot->canvas()->size(); @@ -354,6 +354,7 @@ bool SVConnections::eventFilter(QObject *object, QEvent *event) sv_ui->spectrumPlot->canvas()->cursor().setPos(QPoint(canvasPos.x()+m_picker_x, canvasPos.y()+m_picker_y)); // update the pointed at position spectrum_display->SetPointedAtPoint( QPoint(m_picker_x, m_picker_y) ); + // consume the event return true; } diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumView.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumView.cpp index 12297305815a..aa3ba8aeeeeb 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumView.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumView.cpp @@ -3,7 +3,6 @@ #include "MantidQtSpectrumViewer/SpectrumView.h" #include "MantidQtSpectrumViewer/ColorMaps.h" -#include "ui_SpectrumView.h" #include "MantidQtSpectrumViewer/SVConnections.h" #include "MantidQtSpectrumViewer/SpectrumDisplay.h" #include "MantidQtSpectrumViewer/SliderHandler.h" @@ -30,6 +29,7 @@ namespace SpectrumView SpectrumView::SpectrumView(QWidget *parent) : QMainWindow(parent, 0), WorkspaceObserver(), + m_data_source(NULL), m_ui(new Ui::SpectrumViewer()) { m_ui->setupUi(this); @@ -39,23 +39,33 @@ SpectrumView::~SpectrumView() { // std::cout << "SpectrumView destructor called" << std::endl; - delete h_graph; - delete v_graph; + delete h_graph; + delete v_graph; - delete m_ui; - delete m_slider_handler; - delete m_range_handler; - delete m_spectrum_display; - delete m_sv_connections; + delete m_ui; + delete m_slider_handler; + delete m_range_handler; + delete m_spectrum_display; + delete m_sv_connections; + delete m_data_source; if ( m_emode_handler) { delete m_emode_handler; } } + +void SpectrumView::resizeEvent(QResizeEvent * event) +{ + QMainWindow::resizeEvent(event); + + if(m_data_source) + m_spectrum_display->UpdateImage(); +} + void SpectrumView::renderWorkspace(Mantid::API::MatrixWorkspace_const_sptr wksp) { - MatrixWSDataSource* data_source = new MatrixWSDataSource(wksp); - this->updateHandlers(data_source); + m_data_source = new MatrixWSDataSource(wksp); + this->updateHandlers(m_data_source); // Watch for the deletion of the associated workspace observeAfterReplace(); @@ -84,7 +94,7 @@ void SpectrumView::renderWorkspace(Mantid::API::MatrixWorkspace_const_sptr wksp) m_sv_connections = new SVConnections( m_ui, this, m_spectrum_display, h_graph, v_graph ); - m_spectrum_display->SetDataSource( data_source ); + m_spectrum_display->SetDataSource( m_data_source ); } /// Setup the various handlers (energy-mode, slider, range) @@ -109,7 +119,6 @@ void SpectrumView::updateHandlers(SpectrumDataSource* data_source) m_slider_handler = new SliderHandler( m_ui ); m_range_handler = new RangeHandler( m_ui ); - } /** Slot to close the window */ From e63c5a3b9ba7f03d44df28452fcb9fd0e1d06689 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 28 Oct 2014 10:23:36 +0000 Subject: [PATCH 236/284] Correct compiler warning Refs #10324 --- Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp index c1677e5cbe79..47c877f16228 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp @@ -103,8 +103,8 @@ void SpectrumDisplay::SetDataSource( SpectrumDataSource* data_source ) pointed_at_x = DBL_MAX; pointed_at_y = DBL_MAX; - int n_rows = total_y_max - total_y_min; // get reasonable size initial image data - int n_cols = 500; + int n_rows = static_cast(total_y_max - total_y_min); // get reasonable size initial image data + int n_cols = 500; // data_array is deleted in the SpectrumPlotItem data_array = data_source->GetDataArray( total_x_min, total_x_max, total_y_min, total_y_max, From 524f81d1cee099b2870760683476e89ebf8f7ada Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 28 Oct 2014 10:50:11 +0000 Subject: [PATCH 237/284] Refs #10408 Remove run table tooltip It suppresses the autocompletion tooltip in some cases. --- .../inc/MantidQtCustomInterfaces/ReflMainWidget.ui | 3 --- 1 file changed, 3 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index 961e5271ff19..014b6ab52d06 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -277,9 +277,6 @@ 0 - - Runs to process - QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked|QAbstractItemView::EditKeyPressed|QAbstractItemView::SelectedClicked From 4f48f6d74c72f0142e4a3566054551226b3558d5 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 28 Oct 2014 11:09:55 +0000 Subject: [PATCH 238/284] Correct scroll bar movement Refs #10324 --- .../inc/MantidQtSpectrumViewer/SpectrumDisplay.h | 3 +++ .../MantidQt/SpectrumViewer/src/SliderHandler.cpp | 10 +++++++++- .../SpectrumViewer/src/SpectrumDisplay.cpp | 14 ++++++++++---- .../MantidQt/SpectrumViewer/src/SpectrumView.cpp | 2 +- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h index 7f74d2c8661f..b2eecd85ec4c 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h +++ b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h @@ -76,6 +76,9 @@ class EXPORT_OPT_MANTIDQT_SPECTRUMVIEWER SpectrumDisplay /// Rebuild the scroll bars and image due to change of xmin, xmax, step void UpdateRange(); + /// Updates scroll bars when window is resized + void HandleResize(); + /// Rebuild image from data source, due to resize or scroll bar movement void UpdateImage(); diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SliderHandler.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SliderHandler.cpp index 3221556d2321..cd74df61297b 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SliderHandler.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SliderHandler.cpp @@ -3,6 +3,7 @@ #include #include "MantidQtSpectrumViewer/SliderHandler.h" +#include "MantidQtSpectrumViewer/SVUtils.h" namespace MantidQt { @@ -22,6 +23,8 @@ SliderHandler::SliderHandler( Ui_SpectrumViewer* sv_ui ) : ISliderHandler() /** * Reconfigure the image scrollbars for the specified data and drawing area. * + * Used when the size of the plot area has changed. + * * @param draw_area Rectangle specifiying the region where the image will * be drawn * @param data_source SpectrumDataSource that provides the data to be drawn @@ -30,9 +33,14 @@ void SliderHandler::ReConfigureSliders( QRect draw_area, SpectrumDataSource* data_source ) { QScrollBar* v_scroll = sv_ui->imageVerticalScrollBar; - double old_v_value = v_scroll->value(); + + int old_v_value = v_scroll->value(); int n_rows = (int)data_source->GetNRows(); + int step = v_scroll->pageStep(); + ConfigureSlider( v_scroll, n_rows, draw_area.height(), old_v_value ); + + v_scroll->setValue(old_v_value + (step / 2)); } diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp index 47c877f16228..4ec876af1cb5 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp @@ -165,6 +165,16 @@ void SpectrumDisplay::UpdateRange() UpdateImage(); } +/** + * Updates the rnages of the scroll bars when the window is resized. + */ +void SpectrumDisplay::HandleResize() +{ + QRect draw_area; + GetDisplayRectangle( draw_area ); + dynamic_cast(slider_handler)->ReConfigureSliders( draw_area, data_source ); +} + /** * This will rebuild the image from the data source. It should be invoked * when the scroll bar is moved, the plot area is resize or the color or @@ -183,10 +193,6 @@ void SpectrumDisplay::UpdateImage() SetDataSource( data_source ); // re-initialize with the altered source } - QRect draw_area; - GetDisplayRectangle( draw_area ); - dynamic_cast(slider_handler)->ReConfigureSliders( draw_area, data_source ); - QRect display_rect; GetDisplayRectangle( display_rect ); diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumView.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumView.cpp index aa3ba8aeeeeb..4001f5c1690c 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumView.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumView.cpp @@ -59,7 +59,7 @@ void SpectrumView::resizeEvent(QResizeEvent * event) QMainWindow::resizeEvent(event); if(m_data_source) - m_spectrum_display->UpdateImage(); + m_spectrum_display->HandleResize(); } void SpectrumView::renderWorkspace(Mantid::API::MatrixWorkspace_const_sptr wksp) From 7a84ddf84fdf8b7609d77eea5c8caaf487181172 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Tue, 28 Oct 2014 11:33:00 +0000 Subject: [PATCH 239/284] Fix problems with computing the final detector position. Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 2 +- .../CurveFitting/src/CalculateMSVesuvio.cpp | 118 +++++++++--------- 2 files changed, 61 insertions(+), 59 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index 110b218c70ce..53f0fe78d23b 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -165,7 +165,7 @@ namespace Mantid Kernel::V3D &scatterPt) const; std::pair calculateE1Range(const double theta, const double en0) const; double partialDiffXSec(const double en0, const double en1, const double theta) const; - Kernel::V3D generateDetectorPos(const double l2, const double angle, const double energy) const; + Kernel::V3D generateDetectorPos(const Kernel::V3D & nominalPos, const double energy) const; double generateE1(const double angle, const double e1nom, const double e1res) const; // Member Variables diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 0aea4ca37dfc..719b9dba52d4 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -601,6 +601,7 @@ namespace Mantid // -- Geometry -- const auto instrument = m_inputWS->getInstrument(); m_beamDir = instrument->getSample()->getPos() - instrument->getSource()->getPos(); + m_beamDir.normalize(); const auto rframe = instrument->getReferenceFrame(); m_acrossIdx = rframe->pointingHorizontal(); @@ -830,8 +831,7 @@ namespace Mantid // track various variables during calculation std::vector weights(nscatters, 1.0), // start at 1.0 - tofs(nscatters, 0.0), - scAngs(nscatters, 0.0), // scattering angles between each order + tofs(nscatters, 0.0), // tof accumulates for each piece of the calculation en1(nscatters, 0.0); const double vel2 = sqrt(detpar.efixed/MASS_TO_MEV); @@ -840,14 +840,12 @@ namespace Mantid tofs[0] = generateTOF(en1[0], respar.dtof, respar.dl1); // correction for resolution in l1 // Neutron path - // Algorithm has initial direction pointing to origin - V3D particleDir = V3D() - srcPos; - particleDir.normalize(); - - // first scatter - std::vector scatterPts(nscatters); // track origin of each scatter + std::vector scatterPts(nscatters), // track origin of each scatter + neutronDirs(nscatters); // neutron directions V3D startPos(srcPos); - generateScatter(startPos, particleDir, weights[0], scatterPts[0]); + neutronDirs[0] = m_beamDir; + + generateScatter(startPos, neutronDirs[0], weights[0], scatterPts[0]); double distFromStart = startPos.distance(scatterPts[0]); // Compute TOF for first scatter event const double vel0 = sqrt(en1[0]/MASS_TO_MEV); @@ -860,20 +858,20 @@ namespace Mantid tofs[i] = tofs[i-1]; // Generate a new direction of travel - V3D oldDir = particleDir; + const V3D & prevSc = scatterPts[i-1]; + V3D & curSc = scatterPts[i-1]; + const V3D & oldDir = neutronDirs[i-1]; + V3D & newDir = neutronDirs[i]; size_t ntries(0); do { - double randth = acos(2.0*m_randgen->flat() - 1.0); - double randphi = 2.0*M_PI*m_randgen->flat(); - - particleDir.azimuth_polar_SNS(1.0, randth, randphi); - particleDir.normalize(); - scAngs[i-1] = particleDir.angle(oldDir); + const double randth = acos(2.0*m_randgen->flat() - 1.0); + const double randphi = 2.0*M_PI*m_randgen->flat(); + newDir.azimuth_polar_SNS(1.0, randphi, randth); // Update weight const double wgt = weights[i]; - if(generateScatter(scatterPts[i-1], particleDir, weights[i], scatterPts[i])) + if(generateScatter(prevSc, newDir, weights[i], curSc)) break; else { @@ -887,9 +885,10 @@ namespace Mantid throw std::runtime_error("Unable to generate scatter point in sample. Check sample shape."); } - auto e1range = calculateE1Range(scAngs[i-1], en1[i-1]); + const double scang = newDir.angle(oldDir); + auto e1range = calculateE1Range(scang, en1[i-1]); en1[i] = e1range.first + m_randgen->flat()*(e1range.second - e1range.first); - const double d2sig = partialDiffXSec(en1[i-1], en1[i], scAngs[i-1]); + const double d2sig = partialDiffXSec(en1[i-1], en1[i], scang); double weight = d2sig*4.0*M_PI*(e1range.second - e1range.first)/m_sampleProps->totalxsec; // accumulate total weight weightSum += weight; @@ -897,41 +896,49 @@ namespace Mantid // Increment time of flight... const double veli = sqrt(en1[i]/MASS_TO_MEV); - tofs[i] += (scatterPts[i].distance(scatterPts[i-1])*1e6/veli); + tofs[i] += (curSc.distance(prevSc)*1e6/veli); } // force all orders in to current detector const auto & inX = m_inputWS->readX(0); for(size_t i = 0; i < nscatters; ++i) { - V3D detPos = generateDetectorPos(detpar.l2, detpar.theta, en1[i]); - // transform to sample frame - detPos.rotate(*m_goniometer); - // Distance to exit the sample for this order - V3D detDirection = detPos - scatterPts[i]; - detDirection.normalize(); - Geometry::Track scatterToDet(scatterPts[i], detDirection); - if(m_sampleShape->interceptSurface(scatterToDet) == 0) + V3D detPos; + double scang(0.0), distToExit(0.0); + size_t ntries(0); + do + { + V3D detPos = generateDetectorPos(detpar.pos, en1[i]); + // transform to sample frame + detPos.rotate(*m_goniometer); + // Distance to exit the sample for this order + V3D scToDet = detPos - scatterPts[i]; + scToDet.normalize(); + Geometry::Track scatterToDet(scatterPts[i], scToDet); + if(m_sampleShape->interceptSurface(scatterToDet) > 0) + { + scang = neutronDirs[i].angle(scToDet); + const auto & link = scatterToDet.begin(); + distToExit = link->distInsideObject; + break; + } + // if point is very close surface then there may be no valid intercept so try again + } + while(ntries < MAX_SCATTER_PT_TRIES); + if(ntries == MAX_SCATTER_PT_TRIES) { - throw std::logic_error("CalculateMSVesuvio::calculateCounts() - " - "Logical error. No intersection with sample, despite track " - "originating from with sample."); + throw std::runtime_error("Unable to create track from sample to detector. " + "Detector shape may be too small."); } - // Calculate final scattering angle - scAngs[i] = detDirection.angle(scatterPts[i]); - const auto & link = scatterToDet.begin(); - double distToExit = link->distInsideObject; + // Weight by probability neutron leaves sample weights[i] *= exp(-m_sampleProps->mu*distToExit); - // Weight by cross-section for the final energy const double efinal = generateE1(detpar.theta, detpar.efixed, m_foilRes); - weights[i] *= partialDiffXSec(en1[i], efinal, scAngs[i])/m_sampleProps->totalxsec; - + weights[i] *= partialDiffXSec(en1[i], efinal, scang)/m_sampleProps->totalxsec; // final TOF const double veli = sqrt(efinal/MASS_TO_MEV); tofs[i] += detpar.t0 + (scatterPts[i].distance(detPos)*1e6)/veli; - // "Bin" weight into appropriate place std::vector &counts = simulation.counts[i]; const double finalTOF = tofs[i]; @@ -944,7 +951,6 @@ namespace Mantid break; } } - } return weightSum; @@ -1064,13 +1070,13 @@ namespace Mantid // Select a random point on the track that is the actual scatter point // from the scattering probability distribution const double dist = -log(1.0 - m_randgen->flat()*scatterProb)/m_sampleProps->mu; - // From start point advance in direction of travel by computed distance to find scatter point - // Track is defined as set of links and exit point of first link is entry to sample! + const double fraction = dist/totalObjectDist; + // Scatter point is then entry point + fraction of width in each direction scatterPt = link->entryPoint; - scatterPt += direc*dist; + V3D edgeDistances = (link->exitPoint - link->entryPoint); + scatterPt += edgeDistances*fraction; // Update weight weight *= scatterProb; - return true; } @@ -1151,26 +1157,22 @@ namespace Mantid /** * Generate a random position within the final detector in the lab frame - * @param l2 The nominal distance from sample to detector - * @param angle The The scattering angle from the sample + * @param nominalPos The poisiton of the centre point of the detector * @param energy The final energy of the neutron * @return A new position in the detector */ - V3D CalculateMSVesuvio::generateDetectorPos(const double l2, const double angle, const double energy) const + V3D CalculateMSVesuvio::generateDetectorPos(const V3D &nominalPos, const double energy) const { const double mu = 7430.0/sqrt(energy); // Inverse attenuation length (m-1) for vesuvio det. - const double ps = 1.0 - exp(-mu*m_detThick); // Probability of detection in path length YD. - - const double width = -0.5*m_detWidth + m_detWidth*m_randgen->flat(); - const double beam = -log(1.0 - m_randgen->flat()*ps)/mu; - const double height = -0.5*m_detHeight + m_detHeight*m_randgen->flat(); - const double widthLab = (l2 + beam)*sin(angle) + width*cos(angle); - const double beamLab = (l2 + beam)*cos(angle) - width*sin(angle); + const double ps = 1.0 - exp(-mu*m_detThick); // Probability of detection in path thickness. V3D detPos; - detPos[m_beamIdx] = beamLab; - detPos[m_acrossIdx] = widthLab; - detPos[m_upIdx] = height; - + // Beam direction by moving to front of "box"define by detector dimensions and then + // computing expected distance travelled based on probability + detPos[m_beamIdx] = (nominalPos[m_beamIdx] - 0.5*m_detThick) - \ + (log(1.0 - m_randgen->flat()*ps)/mu); + // perturb away from nominal position + detPos[m_acrossIdx] = nominalPos[m_acrossIdx] + (m_randgen->flat() - 0.5)*m_detWidth; + detPos[m_upIdx] = nominalPos[m_upIdx] + (m_randgen->flat() - 0.5)*m_detHeight; return detPos; } From 4cf175b7df7c136984277c09eecacab386fd7b4d Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 28 Oct 2014 11:33:03 +0000 Subject: [PATCH 240/284] Resize scroll bars when image split is moved Refs #10324 --- Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp index c3299f966c47..ce69535281ad 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp @@ -376,6 +376,7 @@ void SVConnections::toggle_Hscroll() sv_ui->imageHorizontalScrollBar->setVisible( is_on ); sv_ui->imageHorizontalScrollBar->setEnabled( is_on ); spectrum_display->UpdateImage(); + spectrum_display->HandleResize(); } @@ -385,6 +386,7 @@ void SVConnections::toggle_Vscroll() sv_ui->imageVerticalScrollBar->setVisible( is_on ); sv_ui->imageVerticalScrollBar->setEnabled( is_on ); spectrum_display->UpdateImage(); + spectrum_display->HandleResize(); } @@ -430,6 +432,7 @@ void SVConnections::imageSplitter_moved() vgraph_sizes.append( sizes[1] ); sv_ui->vgraphSplitter->setSizes( vgraph_sizes ); spectrum_display->UpdateImage(); + spectrum_display->HandleResize(); } /** From 8a6602d338ff565c93f23b9149ac776b60a9fe9a Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Tue, 28 Oct 2014 13:16:50 +0000 Subject: [PATCH 241/284] Fix indexing bug with scatter points. Refs #10169 --- Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 719b9dba52d4..1839c17bba11 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -859,7 +859,7 @@ namespace Mantid // Generate a new direction of travel const V3D & prevSc = scatterPts[i-1]; - V3D & curSc = scatterPts[i-1]; + V3D & curSc = scatterPts[i]; const V3D & oldDir = neutronDirs[i-1]; V3D & newDir = neutronDirs[i]; size_t ntries(0); From e45704d8a36ea152301e7c583b3f590229a6ba22 Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Tue, 28 Oct 2014 14:11:20 +0000 Subject: [PATCH 242/284] Fix buggy spectra moving Refs #10324 --- .../MantidQtSpectrumViewer/SpectrumDisplay.h | 5 +++++ .../SpectrumViewer/src/SVConnections.cpp | 17 +++++++++++------ .../SpectrumViewer/src/SpectrumDisplay.cpp | 14 +++++++++++++- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h index b2eecd85ec4c..0e79a47189bc 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h +++ b/Code/Mantid/MantidQt/SpectrumViewer/inc/MantidQtSpectrumViewer/SpectrumDisplay.h @@ -104,6 +104,9 @@ class EXPORT_OPT_MANTIDQT_SPECTRUMVIEWER SpectrumDisplay QPoint GetPlotTransform( QPair values ); QPair GetPlotInvTransform( QPoint point ); + // Gets the last Y value pointed at + double GetLastY(); + protected: SpectrumPlotItem* spectrum_plot_item; @@ -140,6 +143,8 @@ class EXPORT_OPT_MANTIDQT_SPECTRUMVIEWER SpectrumDisplay double total_y_max; double total_x_min; double total_x_max; + + double m_lastY; }; } // namespace SpectrumView diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp index ce69535281ad..0e63b331036a 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SVConnections.cpp @@ -309,18 +309,18 @@ bool SVConnections::eventFilter(QObject *object, QEvent *event) if (m_picker_y < 0) return false; // Convert Y position to values so that a change of 1 corresponds to a change in spec. no by 1 - QPair newPositionData = spectrum_display->GetPlotInvTransform(QPoint(m_picker_x, m_picker_y)); int newX = m_picker_x; + double lastY = spectrum_display->GetLastY(); QKeyEvent *keyEvent = dynamic_cast(event); int key = keyEvent->key(); switch (key) { case Qt::Key_Up: - newPositionData.second++; + lastY += 1.0; break; case Qt::Key_Down: - newPositionData.second--; + lastY -= 1.0; break; case Qt::Key_Left: newX--; @@ -334,7 +334,7 @@ bool SVConnections::eventFilter(QObject *object, QEvent *event) } // Convert Y position back to pixel position - QPoint newPoint = spectrum_display->GetPlotTransform(newPositionData); + QPoint newPoint = spectrum_display->GetPlotTransform(qMakePair(0.0, lastY)); int newY = newPoint.y(); // Ignore the event if the position is outside of the plot area @@ -352,8 +352,13 @@ bool SVConnections::eventFilter(QObject *object, QEvent *event) QPoint canvasPos = sv_ui->spectrumPlot->canvas()->mapToGlobal(QPoint(0,0)); // move the cursor to the correct position sv_ui->spectrumPlot->canvas()->cursor().setPos(QPoint(canvasPos.x()+m_picker_x, canvasPos.y()+m_picker_y)); - // update the pointed at position - spectrum_display->SetPointedAtPoint( QPoint(m_picker_x, m_picker_y) ); + + QPair transPoints = spectrum_display->GetPlotInvTransform(QPoint(newX, newY)); + + spectrum_display->SetHGraph( lastY ); + spectrum_display->SetVGraph( transPoints.first ); + + spectrum_display->ShowInfoList( transPoints.first, lastY ); // consume the event return true; diff --git a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp index 4ec876af1cb5..0274180673c9 100644 --- a/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp +++ b/Code/Mantid/MantidQt/SpectrumViewer/src/SpectrumDisplay.cpp @@ -43,7 +43,8 @@ SpectrumDisplay::SpectrumDisplay( QwtPlot* spectrum_plot, QTableWidget* table_widget ) : data_source(0), spectrum_plot(spectrum_plot), slider_handler(slider_handler), range_handler(range_handler), h_graph_display(h_graph), v_graph_display(v_graph), - image_table(table_widget) + image_table(table_widget), + m_lastY(0.0) { ColorMaps::GetColorMap( ColorMaps::HEAT, 256, @@ -508,6 +509,8 @@ void SpectrumDisplay::SetVGraph( double x ) */ std::vector SpectrumDisplay::ShowInfoList( double x, double y ) { + m_lastY = y; + std::vector info_list; data_source->GetInfoList( x, y, info_list ); int n_infos = (int)info_list.size() / 2; @@ -536,6 +539,15 @@ std::vector SpectrumDisplay::ShowInfoList( double x, double y ) } +/** + * Gets the last Y value (i.e. data row) the crosshair was pointed at. + */ +double SpectrumDisplay::GetLastY() +{ + return m_lastY; +} + + /** * Get the rectangle currently covered by the image in pixel coordinates. * From 2f1b158caa2767501002e7c618ef583579ca28e4 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 28 Oct 2014 14:54:54 +0000 Subject: [PATCH 243/284] Refs #10237 Add empty Options dialog The user is now able to open an empty options dialog. The dialog uses the QtReflMainView as its parent and gets a copy of the shared pointer to the presenter. The ui of the new dialog is defined by ReflOptionsDialog.ui. --- .../MantidQt/CustomInterfaces/CMakeLists.txt | 3 + .../MantidQtCustomInterfaces/QtReflMainView.h | 3 + .../QtReflOptionsDialog.h | 56 +++++++++++++ .../MantidQtCustomInterfaces/ReflMainView.h | 4 + .../ReflMainViewPresenter.h | 2 + .../ReflMainWidget.ui | 14 ++++ .../ReflOptionsDialog.ui | 83 +++++++++++++++++++ .../CustomInterfaces/src/QtReflMainView.cpp | 18 ++++ .../src/QtReflOptionsDialog.cpp | 29 +++++++ .../src/ReflMainViewPresenter.cpp | 9 ++ .../test/ReflMainViewMockObjects.h | 1 + 11 files changed, 222 insertions(+) create mode 100644 Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h create mode 100644 Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui create mode 100644 Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp diff --git a/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt b/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt index 645399d4964a..066eb0974dcb 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt +++ b/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt @@ -51,6 +51,7 @@ set ( SRC_FILES src/Muon/MuonAnalysisResultTableTab.cpp src/QReflTableModel.cpp src/QtReflMainView.cpp + src/QtReflOptionsDialog.cpp src/QtWorkspaceMementoModel.cpp src/Quasi.cpp src/RawFileMemento.cpp @@ -134,6 +135,7 @@ set ( INC_FILES inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h inc/MantidQtCustomInterfaces/QReflTableModel.h inc/MantidQtCustomInterfaces/QtReflMainView.h + inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h inc/MantidQtCustomInterfaces/QtWorkspaceMementoModel.h inc/MantidQtCustomInterfaces/Quasi.h inc/MantidQtCustomInterfaces/RawFileMemento.h @@ -234,6 +236,7 @@ set ( UI_FILES inc/MantidQtCustomInterfaces/CreateMDWorkspace.ui inc/MantidQtCustomInterfaces/Muon/MuonAnalysis.ui inc/MantidQtCustomInterfaces/Quasi.ui inc/MantidQtCustomInterfaces/ReflMainWidget.ui + inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui inc/MantidQtCustomInterfaces/ReflWindow.ui inc/MantidQtCustomInterfaces/ResNorm.ui inc/MantidQtCustomInterfaces/SANSPlotSpecial.ui diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index d8b40be26d72..8c3976f3200c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -74,6 +74,8 @@ namespace MantidQt virtual std::string getProcessInstrument() const; virtual std::string getWorkspaceToOpen() const; + virtual boost::shared_ptr getPresenter() const; + private: //initialise the interface virtual void initLayout(); @@ -96,6 +98,7 @@ namespace MantidQt void actionProcess(); void actionGroupRows(); void actionExpandSelection(); + void actionOptionsDialog(); void tableUpdated(const QModelIndex& topLeft, const QModelIndex& bottomRight); void showContextMenu(const QPoint& pos); }; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h new file mode 100644 index 000000000000..9c24a702ae88 --- /dev/null +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h @@ -0,0 +1,56 @@ +#ifndef MANTID_CUSTOMINTERFACES_QTREFLOPTIONSDIALOG_H +#define MANTID_CUSTOMINTERFACES_QTREFLOPTIONSDIALOG_H + +#include "MantidKernel/System.h" +#include "MantidQtCustomInterfaces/IReflPresenter.h" +#include "MantidQtCustomInterfaces/ReflMainView.h" + +#include + +#include "ui_ReflOptionsDialog.h" + +namespace MantidQt +{ + namespace CustomInterfaces + { + + /** QtReflOptionsDialog : Provides a dialog for setting Reflectometry UI options. + + Copyright © 2014 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory + + This file is part of Mantid. + + Mantid 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. + + Mantid 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, see . + + File change history is stored at: + Code Documentation is available at: + */ + + class DLLExport QtReflOptionsDialog : public QDialog + { + public: + QtReflOptionsDialog(ReflMainView* view, boost::shared_ptr presenter); + virtual ~QtReflOptionsDialog(); + protected: + void initLayout(); + //the interface + Ui::reflOptionsDialog ui; + //the presenter + boost::shared_ptr m_presenter; + }; + + } //CustomInterfaces +} //MantidQt + +#endif /* MANTID_CUSTOMINTERFACES_QTREFLOPTIONSDIALOG_H */ diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h index 43bd1f6c666d..9adddb698ca0 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainView.h @@ -3,6 +3,7 @@ #include "MantidKernel/System.h" #include "MantidAPI/ITableWorkspace.h" +#include "MantidQtCustomInterfaces/IReflPresenter.h" #include "MantidQtMantidWidgets/HintStrategy.h" namespace MantidQt @@ -66,6 +67,8 @@ namespace MantidQt virtual std::string getProcessInstrument() const = 0; virtual std::string getWorkspaceToOpen() const = 0; + virtual boost::shared_ptr getPresenter() const = 0; + static const int NoFlags = 0; static const int SaveFlag = 1; static const int SaveAsFlag = 2; @@ -78,6 +81,7 @@ namespace MantidQt static const int NewTableFlag = 9; static const int TableUpdatedFlag = 10; static const int ExpandSelectionFlag = 11; + static const int OptionsDialogFlag = 12; }; } } diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 83dacb84c295..5d2ffead4e14 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -96,6 +96,8 @@ namespace MantidQt virtual void openTable(); virtual void saveTable(); virtual void saveTableAs(); + //options + virtual void showOptionsDialog(); //List of workspaces the user can open std::set m_workspaceList; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index 82a2b3a8936b..e4d2eed4bba5 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -396,6 +396,8 @@ + + @@ -503,6 +505,18 @@ Select an entire group + + + + :/configure.png:/configure.png + + + Options... + + + Set options for the Reflectometry UI + + comboSearchInstrument diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui new file mode 100644 index 000000000000..c8e3360cc78e --- /dev/null +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui @@ -0,0 +1,83 @@ + + + reflOptionsDialog + + + + 0 + 0 + 500 + 200 + + + + + 0 + 0 + + + + Reflectometry UI Options + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + reflOptionsDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + reflOptionsDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index bfcf3dcf08ba..1bd142faf6dd 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -65,6 +65,7 @@ namespace MantidQt connect(ui.actionProcess, SIGNAL(triggered()), this, SLOT(actionProcess())); connect(ui.actionGroupRows, SIGNAL(triggered()), this, SLOT(actionGroupRows())); connect(ui.actionExpandSelection, SIGNAL(triggered()), this, SLOT(actionExpandSelection())); + connect(ui.actionOptionsDialog, SIGNAL(triggered()), this, SLOT(actionOptionsDialog())); //Finally, create a presenter to do the thinking for us m_presenter = boost::shared_ptr(new ReflMainViewPresenter(this)); @@ -196,6 +197,14 @@ namespace MantidQt m_presenter->notify(TableUpdatedFlag); } + /** + This slot notifies the presenter that the "options..." button has been pressed + */ + void QtReflMainView::actionOptionsDialog() + { + m_presenter->notify(OptionsDialogFlag); + } + /** This slot is triggered when the user right clicks on the table @param pos : The position of the right click within the table @@ -382,5 +391,14 @@ namespace MantidQt return m_toOpen; } + /** + Get a pointer to the presenter that's currently controlling this view. + @returns A pointer to the presenter + */ + boost::shared_ptr QtReflMainView::getPresenter() const + { + return m_presenter; + } + } // namespace CustomInterfaces } // namespace Mantid diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp new file mode 100644 index 000000000000..65fb7c9dba77 --- /dev/null +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp @@ -0,0 +1,29 @@ +#include "MantidQtCustomInterfaces/QtReflOptionsDialog.h" +#include "MantidQtCustomInterfaces/QtReflMainView.h" + +namespace MantidQt +{ + namespace CustomInterfaces + { + /** Constructor */ + QtReflOptionsDialog::QtReflOptionsDialog(ReflMainView* view, boost::shared_ptr presenter) : + QDialog(dynamic_cast(view)), + m_presenter(presenter) + { + initLayout(); + } + + /** Destructor */ + QtReflOptionsDialog::~QtReflOptionsDialog() + { + } + + /** Initialise the ui */ + void QtReflOptionsDialog::initLayout() + { + ui.setupUi(this); + } + + } //CustomInterfaces +} //MantidQt + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 7ed3680af6dc..c10f06389576 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -7,6 +7,7 @@ #include "MantidKernel/TimeSeriesProperty.h" #include "MantidKernel/Utils.h" #include "MantidQtCustomInterfaces/ReflMainView.h" +#include "MantidQtCustomInterfaces/QtReflOptionsDialog.h" #include "MantidQtMantidWidgets/AlgorithmHintStrategy.h" #include @@ -836,6 +837,7 @@ namespace MantidQt case ReflMainView::NewTableFlag: newTable(); break; case ReflMainView::TableUpdatedFlag: m_tableDirty = true; break; case ReflMainView::ExpandSelectionFlag: expandSelection(); break; + case ReflMainView::OptionsDialogFlag: showOptionsDialog(); break; case ReflMainView::NoFlags: return; } @@ -1033,5 +1035,12 @@ namespace MantidQt m_view->setSelection(selection); } + + /** Shows the Refl Options dialog */ + void ReflMainViewPresenter::showOptionsDialog() + { + auto options = new QtReflOptionsDialog(m_view, m_view->getPresenter()); + options->exec(); + } } } diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h index a278619c935c..2e6a54f347ea 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h @@ -52,6 +52,7 @@ class MockView : public ReflMainView MOCK_CONST_METHOD0(getSearchInstrument, std::string()); MOCK_CONST_METHOD0(getProcessInstrument, std::string()); MOCK_CONST_METHOD0(getWorkspaceToOpen, std::string()); + MOCK_CONST_METHOD0(getPresenter, boost::shared_ptr()); virtual ~MockView(){} void addDataForTest() { From 9e3ecceacd6a9736af65a846d580edbfc4c99126 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 28 Oct 2014 15:09:26 +0000 Subject: [PATCH 244/284] Refs #10237 Add options to ReflMainViewPresenter --- .../MantidQtCustomInterfaces/IReflPresenter.h | 5 +++++ .../ReflMainViewPresenter.h | 5 ++++- .../src/ReflMainViewPresenter.cpp | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h index f561c8168c48..8a73ccb7f4a1 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h @@ -1,6 +1,9 @@ #ifndef MANTID_CUSTOMINTERFACES_IREFLPRESENTER_H #define MANTID_CUSTOMINTERFACES_IREFLPRESENTER_H +#include +#include + #include "MantidKernel/System.h" namespace MantidQt { @@ -36,6 +39,8 @@ namespace MantidQt virtual ~IReflPresenter() {}; //Tell the presenter something happened virtual void notify(int flag) = 0; + virtual const std::map& options() const = 0; + virtual void setOptions(const std::map& options) = 0; private: }; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 5d2ffead4e14..c3d02ec5293c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -45,7 +45,8 @@ namespace MantidQt ReflMainViewPresenter(ReflMainView* view); virtual ~ReflMainViewPresenter(); virtual void notify(int flag); - + virtual const std::map& options() const; + virtual void setOptions(const std::map& options); //Public for the purposes of unit testing static std::map parseKeyValueString(const std::string& str); protected: @@ -57,6 +58,8 @@ namespace MantidQt ReflMainView* m_view; //stores whether or not the table has changed since it was last saved bool m_tableDirty; + //stores the user options for the presenter + std::map m_options; //process selected rows virtual void process(); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index c10f06389576..9ebe9861d475 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -1042,5 +1042,22 @@ namespace MantidQt auto options = new QtReflOptionsDialog(m_view, m_view->getPresenter()); options->exec(); } + + /** Gets the options used by the presenter + @returns The options used by the presenter + */ + const std::map& ReflMainViewPresenter::options() const + { + return m_options; + } + + /** Sets the options used by the presenter + @param options : The new options for the presenter to use + */ + void ReflMainViewPresenter::setOptions(const std::map& options) + { + //Optionally check the validity of the new options + m_options = options; + } } } From 3cd1e03308093d4868eef31f86fbf7d63d259a4a Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 28 Oct 2014 16:01:32 +0000 Subject: [PATCH 245/284] Refs #10237 Use options in Refl UI To demonstrate the basic functionality a "WarnProcessAll" options has been added. This allows the user to decide whether or not they wish to be warned when they try to process all the rows (by not selecting any before hitting process). --- .../MantidQt/CustomInterfaces/CMakeLists.txt | 1 + .../QtReflOptionsDialog.h | 5 ++++ .../ReflMainViewPresenter.h | 3 +- .../ReflOptionsDialog.ui | 28 +++++++++---------- .../src/QtReflOptionsDialog.cpp | 24 ++++++++++++++++ .../src/ReflMainViewPresenter.cpp | 24 ++++++++++++++-- 6 files changed, 66 insertions(+), 19 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt b/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt index 066eb0974dcb..12a8fb442fcf 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt +++ b/Code/Mantid/MantidQt/CustomInterfaces/CMakeLists.txt @@ -205,6 +205,7 @@ set ( MOC_FILES inc/MantidQtCustomInterfaces/Background.h inc/MantidQtCustomInterfaces/Muon/MuonAnalysisResultTableTab.h inc/MantidQtCustomInterfaces/QReflTableModel.h inc/MantidQtCustomInterfaces/QtReflMainView.h + inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h inc/MantidQtCustomInterfaces/Quasi.h inc/MantidQtCustomInterfaces/ResNorm.h inc/MantidQtCustomInterfaces/SANSAddFiles.h diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h index 9c24a702ae88..94b90bc3ed7b 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h @@ -39,11 +39,16 @@ namespace MantidQt class DLLExport QtReflOptionsDialog : public QDialog { + Q_OBJECT public: QtReflOptionsDialog(ReflMainView* view, boost::shared_ptr presenter); virtual ~QtReflOptionsDialog(); protected: void initLayout(); + protected slots: + void saveOptions(); + void loadOptions(); + protected: //the interface Ui::reflOptionsDialog ui; //the presenter diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index c3d02ec5293c..6694cc5382e2 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -100,7 +100,8 @@ namespace MantidQt virtual void saveTable(); virtual void saveTableAs(); //options - virtual void showOptionsDialog(); + void showOptionsDialog(); + void initOptions(); //List of workspaces the user can open std::set m_workspaceList; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui index c8e3360cc78e..7fa7828940fc 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui @@ -6,12 +6,12 @@ 0 0 - 500 - 200 + 420 + 141 - + 0 0 @@ -21,17 +21,15 @@ - - - Qt::Vertical - - - - 20 - 40 - - - + + + + + Warn when processing all rows + + + + @@ -39,7 +37,7 @@ Qt::Horizontal - QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp index 65fb7c9dba77..ccf1a5a81589 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp @@ -11,6 +11,7 @@ namespace MantidQt m_presenter(presenter) { initLayout(); + loadOptions(); } /** Destructor */ @@ -22,6 +23,29 @@ namespace MantidQt void QtReflOptionsDialog::initLayout() { ui.setupUi(this); + connect(ui.buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(saveOptions())); + connect(ui.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(saveOptions())); + } + + /** This slot saves the currently configured options to the presenter */ + void QtReflOptionsDialog::saveOptions() + { + std::map options = m_presenter->options(); + + //Set the options map to match the UI + options["WarnProcessAll"] = ui.checkWarnProcessAll->isChecked() ? "true" : "false"; + + //Update the presenter's options + m_presenter->setOptions(options); + } + + /** This slot sets the ui to match the presenter's options */ + void QtReflOptionsDialog::loadOptions() + { + std::map options = m_presenter->options(); + + //Set the values from the options + ui.checkWarnProcessAll->setChecked(options["WarnProcessAll"] == "true"); } } //CustomInterfaces diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 9ebe9861d475..32703c804ef4 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -98,6 +98,9 @@ namespace MantidQt m_renameObserver(*this, &ReflMainViewPresenter::handleRenameEvent), m_replaceObserver(*this, &ReflMainViewPresenter::handleReplaceEvent) { + //Initialise options + initOptions(); + //Set up the instrument selectors std::vector instruments; instruments.push_back("INTER"); @@ -247,9 +250,12 @@ namespace MantidQt std::set rows = m_view->getSelectedRows(); if(rows.empty()) { - //Does the user want to abort? - if(!m_view->askUserYesNo("This will process all rows in the table. Continue?","Process all rows?")) - return; + if(m_options["WarnProcessAll"] == "true") + { + //Does the user want to abort? + if(!m_view->askUserYesNo("This will process all rows in the table. Continue?","Process all rows?")) + return; + } //They want to process all rows, so populate rows with every index in the model for(size_t idx = 0; idx < m_model->rowCount(); ++idx) @@ -1059,5 +1065,17 @@ namespace MantidQt //Optionally check the validity of the new options m_options = options; } + + /** Load options from disk if possible, or set to defaults */ + void ReflMainViewPresenter::initOptions() + { + m_options.clear(); + + //Set defaults + m_options["WarnProcessAll"] = "true"; + + //Load from disk + //TODO + } } } From 3af0c90d1dc0fca4df5bbb1e43ecebda70823de8 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Tue, 28 Oct 2014 16:52:38 +0000 Subject: [PATCH 246/284] Refs #10237 Expedite options dialog deallocation --- .../MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 32703c804ef4..75b5b941979a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -1046,6 +1046,9 @@ namespace MantidQt void ReflMainViewPresenter::showOptionsDialog() { auto options = new QtReflOptionsDialog(m_view, m_view->getPresenter()); + //By default the dialog is only destroyed when ReflMainView is and so they'll stack up. + //This way, they'll be deallocated as soon as they've been closed. + options->setAttribute(Qt::WA_DeleteOnClose, true); options->exec(); } From d62913cde043a7523b7f4579861ba3e0f3174f9c Mon Sep 17 00:00:00 2001 From: Ross Whitfield Date: Tue, 28 Oct 2014 13:27:09 -0400 Subject: [PATCH 247/284] Refs #10439 Update FindPyQt.py and FindPyQt4.cmake from kdelibs. Source https://projects.kde.org/projects/kde/kdelibs/repository/revisions/a7e47438d4e3469dc9df70d613826cb360fc8d19 --- Code/Mantid/Build/CMake/FindPyQt.py | 57 +++++++++++++++++-------- Code/Mantid/Build/CMake/FindPyQt4.cmake | 53 ++++++++++++++++------- 2 files changed, 78 insertions(+), 32 deletions(-) diff --git a/Code/Mantid/Build/CMake/FindPyQt.py b/Code/Mantid/Build/CMake/FindPyQt.py index 3c24b73afb84..fa5618d045c7 100644 --- a/Code/Mantid/Build/CMake/FindPyQt.py +++ b/Code/Mantid/Build/CMake/FindPyQt.py @@ -1,25 +1,48 @@ # Copyright (c) 2007, Simon Edwards +# Copyright (c) 2014, Raphael Kubo da Costa # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. -import PyQt4.pyqtconfig +import PyQt4.QtCore +import os +import sys -pyqtcfg = PyQt4.pyqtconfig.Configuration() -print("pyqt_version:%06.0x" % pyqtcfg.pyqt_version) -print("pyqt_version_str:%s" % pyqtcfg.pyqt_version_str) - -pyqt_version_tag = "" -in_t = False -for item in pyqtcfg.pyqt_sip_flags.split(' '): - if item=="-t": - in_t = True - elif in_t: - if item.startswith("Qt_4"): - pyqt_version_tag = item +def get_default_sip_dir(): + # This is based on QScintilla's configure.py, and only works for the + # default case where installation paths have not been changed in PyQt's + # configuration process. + if sys.platform == 'win32': + pyqt_sip_dir = os.path.join(sys.platform, 'sip', 'PyQt4') else: - in_t = False -print("pyqt_version_tag:%s" % pyqt_version_tag) + pyqt_sip_dir = os.path.join(sys.platform, 'share', 'sip', 'PyQt4') + return pyqt_sip_dir + +def get_qt4_tag(sip_flags): + in_t = False + for item in sip_flags.split(' '): + if item == '-t': + in_t = True + elif in_t: + if item.startswith('Qt_4'): + return item + else: + in_t = False + raise ValueError('Cannot find Qt\'s tag in PyQt4\'s SIP flags.') -print("pyqt_sip_dir:%s" % pyqtcfg.pyqt_sip_dir) -print("pyqt_sip_flags:%s" % pyqtcfg.pyqt_sip_flags) +if __name__ == '__main__': + try: + import PyQt4.pyqtconfig + pyqtcfg = PyQt4.pyqtconfig.Configuration() + sip_dir = pyqtcfg.pyqt_sip_dir + sip_flags = pyqtcfg.pyqt_sip_flags + except ImportError: + # PyQt4 >= 4.10.0 was built with configure-ng.py instead of + # configure.py, so pyqtconfig.py is not installed. + sip_dir = get_default_sip_dir() + sip_flags = PyQt4.QtCore.PYQT_CONFIGURATION['sip_flags'] + print('pyqt_version:%06.x' % PyQt4.QtCore.PYQT_VERSION) + print('pyqt_version_str:%s' % PyQt4.QtCore.PYQT_VERSION_STR) + print('pyqt_version_tag:%s' % get_qt4_tag(sip_flags)) + print('pyqt_sip_dir:%s' % sip_dir) + print('pyqt_sip_flags:%s' % sip_flags) diff --git a/Code/Mantid/Build/CMake/FindPyQt4.cmake b/Code/Mantid/Build/CMake/FindPyQt4.cmake index 9b45d5169b3c..b3fe28c7e63b 100644 --- a/Code/Mantid/Build/CMake/FindPyQt4.cmake +++ b/Code/Mantid/Build/CMake/FindPyQt4.cmake @@ -9,16 +9,20 @@ # Find the installed version of PyQt4. FindPyQt4 should only be called after # Python has been found. # -# This file defines the following variables: +# This file defines the following variables, which can also be overriden by +# users: # # PYQT4_VERSION - The version of PyQt4 found expressed as a 6 digit hex number -# suitable for comparision as a string +# suitable for comparison as a string # # PYQT4_VERSION_STR - The version of PyQt4 as a human readable string. # -# PYQT4_VERSION_TAG - The PyQt version tag using by PyQt's sip files. +# PYQT4_VERSION_TAG - The Qt4 version tag used by PyQt's sip files. # -# PYQT4_SIP_DIR - The directory holding the PyQt4 .sip files. +# PYQT4_SIP_DIR - The directory holding the PyQt4 .sip files. This can be unset +# if PyQt4 was built using its new build system and pyqtconfig.py is not +# present on the system, as in this case its value cannot be determined +# automatically. # # PYQT4_SIP_FLAGS - The SIP flags used to build PyQt. @@ -30,19 +34,38 @@ ELSE(EXISTS PYQT4_VERSION) FIND_FILE(_find_pyqt_py FindPyQt.py PATHS ${CMAKE_MODULE_PATH}) EXECUTE_PROCESS(COMMAND ${PYTHON_EXECUTABLE} ${_find_pyqt_py} OUTPUT_VARIABLE pyqt_config) - IF( NOT ${pyqt_config} MATCHES "Traceback" ) - STRING(REGEX REPLACE "^pyqt_version:([^\n]+).*$" "\\1" PYQT4_VERSION ${pyqt_config}) - STRING(REGEX REPLACE ".*\npyqt_version_str:([^\n]+).*$" "\\1" PYQT4_VERSION_STR ${pyqt_config}) - STRING(REGEX REPLACE ".*\npyqt_version_tag:([^\n]+).*$" "\\1" PYQT4_VERSION_TAG ${pyqt_config}) - STRING(REGEX REPLACE ".*\npyqt_sip_dir:([^\n]+).*$" "\\1" PYQT4_SIP_DIR ${pyqt_config}) - STRING(REGEX REPLACE ".*\npyqt_sip_flags:([^\n]+).*$" "\\1" PYQT4_SIP_FLAGS ${pyqt_config}) + IF(pyqt_config) + STRING(REGEX MATCH "^pyqt_version:([^\n]+).*$" _dummy ${pyqt_config}) + SET(PYQT4_VERSION "${CMAKE_MATCH_1}" CACHE STRING "PyQt4's version as a 6-digit hexadecimal number") - SET(PYQT4_FOUND TRUE) - ENDIF() + STRING(REGEX MATCH ".*\npyqt_version_str:([^\n]+).*$" _dummy ${pyqt_config}) + SET(PYQT4_VERSION_STR "${CMAKE_MATCH_1}" CACHE STRING "PyQt4's version as a human-readable string") - include ( FindPackageHandleStandardArgs ) - find_package_handle_standard_args ( PyQt4 DEFAULT_MSG PYQT4_VERSION ) + STRING(REGEX MATCH ".*\npyqt_version_tag:([^\n]+).*$" _dummy ${pyqt_config}) + SET(PYQT4_VERSION_TAG "${CMAKE_MATCH_1}" CACHE STRING "The Qt4 version tag used by PyQt4's .sip files") - mark_as_advanced ( _find_pyqt_py ) + STRING(REGEX MATCH ".*\npyqt_sip_dir:([^\n]+).*$" _dummy ${pyqt_config}) + SET(PYQT4_SIP_DIR "${CMAKE_MATCH_1}" CACHE FILEPATH "The base directory where PyQt4's .sip files are installed") + + STRING(REGEX MATCH ".*\npyqt_sip_flags:([^\n]+).*$" _dummy ${pyqt_config}) + SET(PYQT4_SIP_FLAGS "${CMAKE_MATCH_1}" CACHE STRING "The SIP flags used to build PyQt4") + + IF(NOT IS_DIRECTORY "${PYQT4_SIP_DIR}") + MESSAGE(WARNING "The base directory where PyQt4's SIP files are installed could not be determined. This usually means PyQt4 was built with its new build system and pyqtconfig.py is not present.\n" + "Please set the PYQT4_SIP_DIR variable manually.") + ELSE(NOT IS_DIRECTORY "${PYQT4_SIP_DIR}") + SET(PYQT4_FOUND TRUE) + ENDIF(NOT IS_DIRECTORY "${PYQT4_SIP_DIR}") + ENDIF(pyqt_config) + + IF(PYQT4_FOUND) + IF(NOT PYQT4_FIND_QUIETLY) + MESSAGE(STATUS "Found PyQt4 version: ${PYQT4_VERSION_STR}") + ENDIF(NOT PYQT4_FIND_QUIETLY) + ELSE(PYQT4_FOUND) + IF(PYQT4_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find Python") + ENDIF(PYQT4_FIND_REQUIRED) + ENDIF(PYQT4_FOUND) ENDIF(EXISTS PYQT4_VERSION) From bcd6011051db70aa1a2838b9988a011f91b614af Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 29 Oct 2014 08:38:26 +0000 Subject: [PATCH 248/284] Refs #10431 Allow some variance in expected DQQ --- .../CustomInterfaces/test/ReflMainViewPresenterTest.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index f7cb68ab6484..920843b34d96 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -710,12 +710,12 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //Check the table was updated as expected ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); TS_ASSERT_EQUALS(ws->String(0, ThetaCol), "0.7"); - TS_ASSERT_EQUALS(ws->String(0, DQQCol), "0.0340301395749668"); + TS_ASSERT_DELTA(boost::lexical_cast(ws->String(0, DQQCol)), 0.034030, 1e-6); TS_ASSERT_EQUALS(ws->String(0, QMinCol), "0.009"); TS_ASSERT_EQUALS(ws->String(0, QMaxCol), "0.154"); TS_ASSERT_EQUALS(ws->String(1, ThetaCol), "2.3"); - TS_ASSERT_EQUALS(ws->String(1, DQQCol), "0.0340504661681226"); + TS_ASSERT_DELTA(boost::lexical_cast(ws->String(1, DQQCol)), 0.034050, 1e-6); TS_ASSERT_EQUALS(ws->String(1, QMinCol), "0.03"); TS_ASSERT_EQUALS(ws->String(1, QMaxCol), "0.504"); From f75a370139c3defebd42ef01c4290cff66b0e26a Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 29 Oct 2014 09:37:01 +0000 Subject: [PATCH 249/284] Refs #10237 Store options as QVariants This way we don't need to handle type conversion ourselves. We can let QVariant take care of that for us. --- .../inc/MantidQtCustomInterfaces/IReflPresenter.h | 7 +++++-- .../inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h | 6 +++--- .../MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp | 8 ++++---- .../CustomInterfaces/src/ReflMainViewPresenter.cpp | 8 ++++---- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h index 8a73ccb7f4a1..6b9a7dcf86e5 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h @@ -5,6 +5,9 @@ #include #include "MantidKernel/System.h" + +class QVariant; + namespace MantidQt { namespace CustomInterfaces @@ -39,8 +42,8 @@ namespace MantidQt virtual ~IReflPresenter() {}; //Tell the presenter something happened virtual void notify(int flag) = 0; - virtual const std::map& options() const = 0; - virtual void setOptions(const std::map& options) = 0; + virtual const std::map& options() const = 0; + virtual void setOptions(const std::map& options) = 0; private: }; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 6694cc5382e2..6eaebc8b508c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -45,8 +45,8 @@ namespace MantidQt ReflMainViewPresenter(ReflMainView* view); virtual ~ReflMainViewPresenter(); virtual void notify(int flag); - virtual const std::map& options() const; - virtual void setOptions(const std::map& options); + virtual const std::map& options() const; + virtual void setOptions(const std::map& options); //Public for the purposes of unit testing static std::map parseKeyValueString(const std::string& str); protected: @@ -59,7 +59,7 @@ namespace MantidQt //stores whether or not the table has changed since it was last saved bool m_tableDirty; //stores the user options for the presenter - std::map m_options; + std::map m_options; //process selected rows virtual void process(); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp index ccf1a5a81589..c131089a0e5e 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp @@ -30,10 +30,10 @@ namespace MantidQt /** This slot saves the currently configured options to the presenter */ void QtReflOptionsDialog::saveOptions() { - std::map options = m_presenter->options(); + std::map options = m_presenter->options(); //Set the options map to match the UI - options["WarnProcessAll"] = ui.checkWarnProcessAll->isChecked() ? "true" : "false"; + options["WarnProcessAll"] = ui.checkWarnProcessAll->isChecked(); //Update the presenter's options m_presenter->setOptions(options); @@ -42,10 +42,10 @@ namespace MantidQt /** This slot sets the ui to match the presenter's options */ void QtReflOptionsDialog::loadOptions() { - std::map options = m_presenter->options(); + std::map options = m_presenter->options(); //Set the values from the options - ui.checkWarnProcessAll->setChecked(options["WarnProcessAll"] == "true"); + ui.checkWarnProcessAll->setChecked(options["WarnProcessAll"].toBool()); } } //CustomInterfaces diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 75b5b941979a..366835a85615 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -250,7 +250,7 @@ namespace MantidQt std::set rows = m_view->getSelectedRows(); if(rows.empty()) { - if(m_options["WarnProcessAll"] == "true") + if(m_options["WarnProcessAll"].toBool()) { //Does the user want to abort? if(!m_view->askUserYesNo("This will process all rows in the table. Continue?","Process all rows?")) @@ -1055,7 +1055,7 @@ namespace MantidQt /** Gets the options used by the presenter @returns The options used by the presenter */ - const std::map& ReflMainViewPresenter::options() const + const std::map& ReflMainViewPresenter::options() const { return m_options; } @@ -1063,7 +1063,7 @@ namespace MantidQt /** Sets the options used by the presenter @param options : The new options for the presenter to use */ - void ReflMainViewPresenter::setOptions(const std::map& options) + void ReflMainViewPresenter::setOptions(const std::map& options) { //Optionally check the validity of the new options m_options = options; @@ -1075,7 +1075,7 @@ namespace MantidQt m_options.clear(); //Set defaults - m_options["WarnProcessAll"] = "true"; + m_options["WarnProcessAll"] = true; //Load from disk //TODO From 57e83ef61e6be48bef9725b0a5b76ab4929e57aa Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 29 Oct 2014 09:49:41 +0000 Subject: [PATCH 250/284] Refs #10237 Persist options using QSettings Options are saved in the group: `Mantid/CustomInterfaces/ISISReflectometry` --- .../src/ReflMainViewPresenter.cpp | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 366835a85615..3903e1484eb0 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -13,12 +13,16 @@ #include #include +#include + using namespace Mantid::API; using namespace Mantid::Geometry; using namespace Mantid::Kernel; namespace { + const QString ReflSettingsGroup = "Mantid/CustomInterfaces/ISISReflectometry"; + void validateModel(ITableWorkspace_sptr model) { if(!model) @@ -1065,8 +1069,16 @@ namespace MantidQt */ void ReflMainViewPresenter::setOptions(const std::map& options) { - //Optionally check the validity of the new options - m_options = options; + //Overwrite the given options + for(auto it = options.begin(); it != options.end(); ++it) + m_options[it->first] = it->second; + + //Save any changes to disk + QSettings settings; + settings.beginGroup(ReflSettingsGroup); + for(auto it = m_options.begin(); it != m_options.end(); ++it) + settings.setValue(QString::fromStdString(it->first), it->second); + settings.endGroup(); } /** Load options from disk if possible, or set to defaults */ @@ -1077,8 +1089,13 @@ namespace MantidQt //Set defaults m_options["WarnProcessAll"] = true; - //Load from disk - //TODO + //Load saved values from disk + QSettings settings; + settings.beginGroup(ReflSettingsGroup); + QStringList keys = settings.childKeys(); + for(auto it = keys.begin(); it != keys.end(); ++it) + m_options[it->toStdString()] = settings.value(*it); + settings.endGroup(); } } } From 793f4eafd26372f77534b517e9df1d43c35cda3a Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 29 Oct 2014 11:03:41 +0000 Subject: [PATCH 251/284] Refactoring and replace contour plot code Refs #10451 --- .../IndirectDataReduction.ui | 2 +- .../MantidQtCustomInterfaces/IndirectSqw.h | 8 +- .../CustomInterfaces/src/IndirectSqw.cpp | 237 ++++++++++-------- 3 files changed, 138 insertions(+), 109 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui index c61bdcaba050..72c9d108c63a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataReduction.ui @@ -1798,7 +1798,7 @@ Later steps in the process (saving, renaming) will not be done. - false + true Plot Input diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSqw.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSqw.h index ad26ef5efddf..1f26ac1ea2d6 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSqw.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSqw.h @@ -47,8 +47,12 @@ namespace CustomInterfaces virtual bool validate(); private slots: - void sOfQwRebinE(bool state); - void sOfQwPlotInput(); + void energyRebinToggle(bool state); + void plotContour(); + + private: + bool validateQRebin(); + bool validateEnergyRebin(); }; } // namespace CustomInterfaces diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp index c736b1a73397..ab5a57e83265 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp @@ -4,6 +4,8 @@ #include +using namespace Mantid::API; + namespace MantidQt { namespace CustomInterfaces @@ -14,8 +16,8 @@ namespace CustomInterfaces IndirectSqw::IndirectSqw(Ui::IndirectDataReduction& uiForm, QWidget * parent) : IndirectDataReductionTab(uiForm, parent) { - connect(m_uiForm.sqw_ckRebinE, SIGNAL(toggled(bool)), this, SLOT(sOfQwRebinE(bool))); - connect(m_uiForm.sqw_dsSampleInput, SIGNAL(loadClicked()), this, SLOT(sOfQwPlotInput())); + connect(m_uiForm.sqw_ckRebinE, SIGNAL(toggled(bool)), this, SLOT(energyRebinToggle(bool))); + connect(m_uiForm.sqw_dsSampleInput, SIGNAL(loadClicked()), this, SLOT(plotContour())); m_uiForm.sqw_leELow->setValidator(m_valDbl); m_uiForm.sqw_leEWidth->setValidator(m_valDbl); @@ -24,18 +26,125 @@ namespace CustomInterfaces m_uiForm.sqw_leQWidth->setValidator(m_valDbl); m_uiForm.sqw_leQHigh->setValidator(m_valDbl); } - + //---------------------------------------------------------------------------------------------- /** Destructor */ IndirectSqw::~IndirectSqw() { } - + void IndirectSqw::setup() { } + bool IndirectSqw::validate() + { + bool valid = true; + + UserInputValidator uiv; + uiv.checkDataSelectorIsValid("Sample", m_uiForm.sqw_dsSampleInput); + QString error = uiv.generateErrorMessage(); + + if(!error.isEmpty()) + { + valid = false; + emit showMessageBox(error); + } + + if(m_uiForm.sqw_ckRebinE->isChecked() && validateEnergyRebin()) + valid = false; + + if(!validateQRebin()) + valid = false; + + return valid; + } + + /** + * Validates the Q rebinning parameters. + * + * @returns If the rebinning is valid + */ + bool IndirectSqw::validateQRebin() + { + bool valid = true; + + if ( m_uiForm.sqw_leQLow->text() == "" ) + { + valid = false; + m_uiForm.sqw_valQLow->setText("*"); + } + else + { + m_uiForm.sqw_valQLow->setText(" "); + } + + if ( m_uiForm.sqw_leQWidth->text() == "" ) + { + valid = false; + m_uiForm.sqw_valQWidth->setText("*"); + } + else + { + m_uiForm.sqw_valQWidth->setText(" "); + } + + if ( m_uiForm.sqw_leQHigh->text() == "" ) + { + valid = false; + m_uiForm.sqw_valQHigh->setText("*"); + } + else + { + m_uiForm.sqw_valQHigh->setText(" "); + } + + return valid; + } + + /** + * Validates the energy rebinning parameters. + * + * @returns If the rebinning is valid + */ + bool IndirectSqw::validateEnergyRebin() + { + bool valid = true; + + if ( m_uiForm.sqw_leELow->text() == "" ) + { + valid = false; + m_uiForm.sqw_valELow->setText("*"); + } + else + { + m_uiForm.sqw_valELow->setText(" "); + } + + if ( m_uiForm.sqw_leEWidth->text() == "" ) + { + valid = false; + m_uiForm.sqw_valEWidth->setText("*"); + } + else + { + m_uiForm.sqw_valEWidth->setText(" "); + } + + if ( m_uiForm.sqw_leEHigh->text() == "" ) + { + valid = false; + m_uiForm.sqw_valEHigh->setText("*"); + } + else + { + m_uiForm.sqw_valEHigh->setText(" "); + } + + return valid; + } + void IndirectSqw::run() { QString rebinString = m_uiForm.sqw_leQLow->text() + "," + m_uiForm.sqw_leQWidth->text() + @@ -114,92 +223,12 @@ namespace CustomInterfaces QString pyOutput = m_pythonRunner.runPythonCode(pyInput).trimmed(); } - bool IndirectSqw::validate() - { - bool valid = true; - - UserInputValidator uiv; - uiv.checkDataSelectorIsValid("Sample", m_uiForm.sqw_dsSampleInput); - QString error = uiv.generateErrorMessage(); - - if (!error.isEmpty()) - { - valid = false; - emit showMessageBox(error); - } - - if ( m_uiForm.sqw_ckRebinE->isChecked() ) - { - if ( m_uiForm.sqw_leELow->text() == "" ) - { - valid = false; - m_uiForm.sqw_valELow->setText("*"); - } - else - { - m_uiForm.sqw_valELow->setText(" "); - } - - if ( m_uiForm.sqw_leEWidth->text() == "" ) - { - valid = false; - m_uiForm.sqw_valEWidth->setText("*"); - } - else - { - m_uiForm.sqw_valEWidth->setText(" "); - } - - if ( m_uiForm.sqw_leEHigh->text() == "" ) - { - valid = false; - m_uiForm.sqw_valEHigh->setText("*"); - } - else - { - m_uiForm.sqw_valEHigh->setText(" "); - } - } - - if ( m_uiForm.sqw_leQLow->text() == "" ) - { - valid = false; - m_uiForm.sqw_valQLow->setText("*"); - } - else - { - m_uiForm.sqw_valQLow->setText(" "); - } - - if ( m_uiForm.sqw_leQWidth->text() == "" ) - { - valid = false; - m_uiForm.sqw_valQWidth->setText("*"); - } - else - { - m_uiForm.sqw_valQWidth->setText(" "); - } - - if ( m_uiForm.sqw_leQHigh->text() == "" ) - { - valid = false; - m_uiForm.sqw_valQHigh->setText("*"); - } - else - { - m_uiForm.sqw_valQHigh->setText(" "); - } - - return valid; - } - /** * Enabled/disables the rebin in energy UI widgets * * @param state :: True to enable RiE UI, false to disable */ - void IndirectSqw::sOfQwRebinE(bool state) + void IndirectSqw::energyRebinToggle(bool state) { QString val; if ( state ) val = "*"; @@ -223,32 +252,28 @@ namespace CustomInterfaces * * Creates a colour 2D plot of the data */ - void IndirectSqw::sOfQwPlotInput() + void IndirectSqw::plotContour() { - QString pyInput = "from mantid.simpleapi import *\n" - "from mantidplot import *\n"; - if (m_uiForm.sqw_dsSampleInput->isValid()) { - if(m_uiForm.sqw_dsSampleInput->isFileSelectorVisible()) - { - //Load file into workspacwe - pyInput += "filename = r'" + m_uiForm.sqw_dsSampleInput->getFullFilePath() + "'\n" - "(dir, file) = os.path.split(filename)\n" - "(sqwInput, ext) = os.path.splitext(file)\n" - "LoadNexus(Filename=filename, OutputWorkspace=sqwInput)\n"; - } - else - { - //Use existing workspace - pyInput += "sqwInput = '" + m_uiForm.sqw_dsSampleInput->getCurrentDataName() + "'\n"; - } + QString sampleWsName = m_uiForm.sqw_dsSampleInput->getCurrentDataName(); + + QString convertedWsName = sampleWsName.left(sampleWsName.length() - 4) + "_rqw"; + + IAlgorithm_sptr convertSpecAlg = AlgorithmManager::Instance().create("ConvertSpectrumAxis"); + convertSpecAlg->initialize(); + + convertSpecAlg->setProperty("InputWorkspace", sampleWsName.toStdString()); + convertSpecAlg->setProperty("OutputWorkspace", convertedWsName.toStdString()); + convertSpecAlg->setProperty("Target", "ElasticQ"); + convertSpecAlg->setProperty("EMode", "Indirect"); + + convertSpecAlg->execute(); - pyInput += "ConvertSpectrumAxis(InputWorkspace=sqwInput, OutputWorkspace=sqwInput[:-4]+'_rqw', Target='ElasticQ', EMode='Indirect')\n" - "ws = importMatrixWorkspace(sqwInput[:-4]+'_rqw')\n" - "ws.plotGraph2D()\n"; + QString pyInput = "from mantidplot import plot2D\n" + "plot2D('" + convertedWsName + "')\n"; - QString pyOutput = m_pythonRunner.runPythonCode(pyInput).trimmed(); + m_pythonRunner.runPythonCode(pyInput).trimmed(); } else { From 9bc29d88e038352755718221b984f6aea40dd634 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 29 Oct 2014 11:28:25 +0000 Subject: [PATCH 252/284] Refs #10408 Use QLabel to show hints Instead of relying on QToolTip (which has problems on OSX), create a QLabel widget and style it to look like a tooltip. --- .../MantidQtMantidWidgets/HintingLineEdit.h | 1 + .../MantidWidgets/src/HintingLineEdit.cpp | 24 ++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h index 377573916d05..76df20b98b42 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h +++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/HintingLineEdit.h @@ -57,6 +57,7 @@ namespace MantidQt std::map m_matches; std::map m_hints; bool m_dontComplete; + QLabel* m_hintLabel; protected slots: void updateHints(const QString& text); }; diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp index 5759348605c4..0c128d666905 100644 --- a/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp +++ b/Code/Mantid/MantidQt/MantidWidgets/src/HintingLineEdit.cpp @@ -9,6 +9,18 @@ namespace MantidQt { HintingLineEdit::HintingLineEdit(QWidget *parent, const std::map &hints) : QLineEdit(parent), m_hints(hints), m_dontComplete(false) { + m_hintLabel = new QLabel(this, Qt::ToolTip); + m_hintLabel->setMargin(1 + style()->pixelMetric(QStyle::PM_ToolTipLabelFrameWidth, 0, m_hintLabel)); + m_hintLabel->setFrameStyle(QFrame::StyledPanel); + m_hintLabel->setAlignment(Qt::AlignLeft); + m_hintLabel->setWordWrap(true); + m_hintLabel->setIndent(1); + m_hintLabel->setAutoFillBackground(true); + m_hintLabel->setPalette(QToolTip::palette()); + m_hintLabel->setForegroundRole(QPalette::ToolTipText); + m_hintLabel->setBackgroundRole(QPalette::ToolTipBase); + m_hintLabel->ensurePolished(); + connect(this, SIGNAL(textEdited(const QString&)), this, SLOT(updateHints(const QString&))); } @@ -103,7 +115,17 @@ namespace MantidQt hintList += QString::fromStdString(mIt->second) + "
          \n"; } - QToolTip::showText(mapToGlobal(QPoint(0, 5)), hintList.trimmed()); + if(!hintList.trimmed().isEmpty()) + { + m_hintLabel->show(); + m_hintLabel->setText(hintList.trimmed()); + m_hintLabel->adjustSize(); + m_hintLabel->move(mapToGlobal(QPoint(0, height()))); + } + else + { + m_hintLabel->hide(); + } } /** Insert an auto completion suggestion beneath the user's cursor and select it */ From 96d3d7ea3674d99ea2bbd0b097918b065c9de99c Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 29 Oct 2014 11:40:13 +0000 Subject: [PATCH 253/284] Added S(Q, w) reduction using batch runner Refs #10451 --- .../CustomInterfaces/src/IndirectSqw.cpp | 131 +++++++++++------- 1 file changed, 78 insertions(+), 53 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp index ab5a57e83265..e6bb59518be5 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp @@ -5,6 +5,7 @@ #include using namespace Mantid::API; +using MantidQt::API::BatchAlgorithmRunner; namespace MantidQt { @@ -52,7 +53,7 @@ namespace CustomInterfaces emit showMessageBox(error); } - if(m_uiForm.sqw_ckRebinE->isChecked() && validateEnergyRebin()) + if(m_uiForm.sqw_ckRebinE->isChecked() && !validateEnergyRebin()) valid = false; if(!validateQRebin()) @@ -147,80 +148,104 @@ namespace CustomInterfaces void IndirectSqw::run() { + QString sampleWsName = m_uiForm.sqw_dsSampleInput->getCurrentDataName(); + QString sqwWsName = sampleWsName.left(sampleWsName.length() - 4) + "_sqw"; + QString eRebinWsName = sampleWsName.left(sampleWsName.length() - 4) + "_r"; + QString rebinString = m_uiForm.sqw_leQLow->text() + "," + m_uiForm.sqw_leQWidth->text() + "," + m_uiForm.sqw_leQHigh->text(); - QString wsname; - if(m_uiForm.sqw_dsSampleInput->isFileSelectorVisible()) - { - // Load Nexus file into workspace - QString filename = m_uiForm.sqw_dsSampleInput->getFullFilePath(); - QFileInfo fi(filename); - wsname = fi.baseName(); - - if(!loadFile(filename, wsname)) - { - emit showMessageBox("Could not load Nexus file"); - } - } - else + // Rebin in energy + bool rebinInEnergy = m_uiForm.sqw_ckRebinE->isChecked(); + if(rebinInEnergy) { - // Get the workspace - wsname = m_uiForm.sqw_dsSampleInput->getCurrentDataName(); - } + QString eRebinString = m_uiForm.sqw_leELow->text() + "," + m_uiForm.sqw_leEWidth->text() + + "," + m_uiForm.sqw_leEHigh->text(); - QString pyInput = "from mantid.simpleapi import *\n"; + IAlgorithm_sptr energyRebinAlg = AlgorithmManager::Instance().create("Rebin"); + energyRebinAlg->initialize(); - // Create output name before rebinning - pyInput += "sqwInput = '" + wsname + "'\n"; - pyInput += "sqwOutput = sqwInput[:-3] + 'sqw'\n"; + energyRebinAlg->setProperty("InputWorkspace", sampleWsName.toStdString()); + energyRebinAlg->setProperty("OutputWorkspace", eRebinWsName.toStdString()); + energyRebinAlg->setProperty("Params", eRebinString.toStdString()); - if ( m_uiForm.sqw_ckRebinE->isChecked() ) - { - QString eRebinString = m_uiForm.sqw_leELow->text() + "," + m_uiForm.sqw_leEWidth->text() + - "," + m_uiForm.sqw_leEHigh->text(); - - pyInput += "Rebin(InputWorkspace=sqwInput, OutputWorkspace=sqwInput+'_r', Params='" + eRebinString + "')\n" - "sqwInput += '_r'\n"; + m_batchAlgoRunner->addAlgorithm(energyRebinAlg); } - pyInput += - "efixed = " + m_uiForm.leEfixed->text() + "\n" - "rebin = '" + rebinString + "'\n"; + // Get correct S(Q, w) algorithm + QString efixed = m_uiForm.leEfixed->text(); + IAlgorithm_sptr sqwAlg; QString rebinType = m_uiForm.sqw_cbRebinType->currentText(); + if(rebinType == "Centre (SofQW)") - pyInput += "SofQW(InputWorkspace=sqwInput, OutputWorkspace=sqwOutput, QAxisBinning=rebin, EMode='Indirect', EFixed=efixed)\n"; + sqwAlg = AlgorithmManager::Instance().create("SofQW"); else if(rebinType == "Parallelepiped (SofQW2)") - pyInput += "SofQW2(InputWorkspace=sqwInput, OutputWorkspace=sqwOutput, QAxisBinning=rebin, EMode='Indirect', EFixed=efixed)\n"; + sqwAlg = AlgorithmManager::Instance().create("SofQW2"); else if(rebinType == "Parallelepiped/Fractional Area (SofQW3)") - pyInput += "SofQW3(InputWorkspace=sqwInput, OutputWorkspace=sqwOutput, QAxisBinning=rebin, EMode='Indirect', EFixed=efixed)\n"; + sqwAlg = AlgorithmManager::Instance().create("SofQW3"); - pyInput += "AddSampleLog(Workspace=sqwOutput, LogName='rebin_type', LogType='String', LogText='"+rebinType+"')\n"; + // S(Q, w) algorithm + sqwAlg->initialize(); - if ( m_uiForm.sqw_ckSave->isChecked() ) - { - pyInput += "SaveNexus(InputWorkspace=sqwOutput, Filename=sqwOutput+'.nxs')\n"; + BatchAlgorithmRunner::AlgorithmRuntimeProps sqwInputProps; + if(rebinInEnergy) + sqwInputProps["InputWorkspace"] = eRebinWsName.toStdString(); + else + sqwInputProps["InputWorkspace"] = sampleWsName.toStdString(); - if (m_uiForm.sqw_ckVerbose->isChecked()) - { - pyInput += "logger.notice(\"Resolution file saved to default save directory.\")\n"; - } - } + sqwAlg->setProperty("OutputWorkspace", sqwWsName.toStdString()); + sqwAlg->setProperty("QAxisBinning", rebinString.toStdString()); + sqwAlg->setProperty("EMode", "Indirect"); + sqwAlg->setProperty("EFixed", efixed.toStdString()); - if ( m_uiForm.sqw_cbPlotType->currentText() == "Contour" ) - { - pyInput += "importMatrixWorkspace(sqwOutput).plotGraph2D()\n"; - } + m_batchAlgoRunner->addAlgorithm(sqwAlg, sqwInputProps); + + // Add sample log for S(Q, w) algorithm used + IAlgorithm_sptr sampleLogAlg = AlgorithmManager::Instance().create("AddSampleLog"); + sampleLogAlg->initialize(); + + sampleLogAlg->setProperty("LogName", "rebin_type"); + sampleLogAlg->setProperty("LogType", "String"); + sampleLogAlg->setProperty("LogText", rebinType.toStdString()); - else if ( m_uiForm.sqw_cbPlotType->currentText() == "Spectra" ) + BatchAlgorithmRunner::AlgorithmRuntimeProps inputToAddSampleLogProps; + inputToAddSampleLogProps["Workspace"] = sqwWsName.toStdString(); + + m_batchAlgoRunner->addAlgorithm(sampleLogAlg, inputToAddSampleLogProps); + + // Save S(Q, w) workspace + if(m_uiForm.sqw_ckSave->isChecked()) { - pyInput += - "nspec = mtd[sqwOutput].getNumberHistograms()\n" - "plotSpectrum(sqwOutput, range(0, nspec))\n"; + QString saveFilename = sqwWsName + ".nxs"; + + IAlgorithm_sptr saveNexusAlg = AlgorithmManager::Instance().create("SaveNexus"); + saveNexusAlg->initialize(); + + saveNexusAlg->setProperty("Filename", saveFilename.toStdString()); + + BatchAlgorithmRunner::AlgorithmRuntimeProps inputToSaveNexusProps; + inputToSaveNexusProps["InputWorkspace"] = sqwWsName.toStdString(); + + m_batchAlgoRunner->addAlgorithm(saveNexusAlg, inputToSaveNexusProps); } - QString pyOutput = m_pythonRunner.runPythonCode(pyInput).trimmed(); + m_batchAlgoRunner->executeBatch(); + + //TODO + /* if(m_uiForm.sqw_cbPlotType->currentText() == "Contour") */ + /* { */ + /* pyInput += "importMatrixWorkspace(sqwOutput).plotGraph2D()\n"; */ + /* } */ + + /* else if( m_uiForm.sqw_cbPlotType->currentText() == "Spectra") */ + /* { */ + /* pyInput += */ + /* "nspec = mtd[sqwOutput].getNumberHistograms()\n" */ + /* "plotSpectrum(sqwOutput, range(0, nspec))\n"; */ + /* } */ + + /* QString pyOutput = m_pythonRunner.runPythonCode(pyInput).trimmed(); */ } /** From 4406ad8d8f67aefdc87729f4faaccc21157925be Mon Sep 17 00:00:00 2001 From: Dan Nixon Date: Wed, 29 Oct 2014 11:54:50 +0000 Subject: [PATCH 254/284] Result plotting working again Refs #10451 --- .../MantidQtCustomInterfaces/IndirectSqw.h | 1 + .../CustomInterfaces/src/IndirectSqw.cpp | 62 ++++++++++++------- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSqw.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSqw.h index 1f26ac1ea2d6..e616371e5669 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSqw.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectSqw.h @@ -49,6 +49,7 @@ namespace CustomInterfaces private slots: void energyRebinToggle(bool state); void plotContour(); + void sqwAlgDone(bool error); private: bool validateQRebin(); diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp index e6bb59518be5..de3a0ecd662c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectSqw.cpp @@ -17,15 +17,17 @@ namespace CustomInterfaces IndirectSqw::IndirectSqw(Ui::IndirectDataReduction& uiForm, QWidget * parent) : IndirectDataReductionTab(uiForm, parent) { - connect(m_uiForm.sqw_ckRebinE, SIGNAL(toggled(bool)), this, SLOT(energyRebinToggle(bool))); - connect(m_uiForm.sqw_dsSampleInput, SIGNAL(loadClicked()), this, SLOT(plotContour())); - m_uiForm.sqw_leELow->setValidator(m_valDbl); m_uiForm.sqw_leEWidth->setValidator(m_valDbl); m_uiForm.sqw_leEHigh->setValidator(m_valDbl); m_uiForm.sqw_leQLow->setValidator(m_valDbl); m_uiForm.sqw_leQWidth->setValidator(m_valDbl); m_uiForm.sqw_leQHigh->setValidator(m_valDbl); + + connect(m_uiForm.sqw_ckRebinE, SIGNAL(toggled(bool)), this, SLOT(energyRebinToggle(bool))); + connect(m_uiForm.sqw_dsSampleInput, SIGNAL(loadClicked()), this, SLOT(plotContour())); + + connect(m_batchAlgoRunner, SIGNAL(batchComplete(bool)), this, SLOT(sqwAlgDone(bool))); } //---------------------------------------------------------------------------------------------- @@ -231,21 +233,38 @@ namespace CustomInterfaces } m_batchAlgoRunner->executeBatch(); + } + + /** + * Handles plotting the S(Q, w) workspace when the algorithm chain is finished. + * + * @param error If the algorithm chain failed + */ + void IndirectSqw::sqwAlgDone(bool error) + { + if(error) + return; + + // Get the workspace name + QString sampleWsName = m_uiForm.sqw_dsSampleInput->getCurrentDataName(); + QString sqwWsName = sampleWsName.left(sampleWsName.length() - 4) + "_sqw"; + + QString pyInput = "sqw_ws = '" + sqwWsName + "'\n"; + QString plotType = m_uiForm.sqw_cbPlotType->currentText(); - //TODO - /* if(m_uiForm.sqw_cbPlotType->currentText() == "Contour") */ - /* { */ - /* pyInput += "importMatrixWorkspace(sqwOutput).plotGraph2D()\n"; */ - /* } */ + if(plotType == "Contour") + { + pyInput += "plot2D(sqw_ws)\n"; + } - /* else if( m_uiForm.sqw_cbPlotType->currentText() == "Spectra") */ - /* { */ - /* pyInput += */ - /* "nspec = mtd[sqwOutput].getNumberHistograms()\n" */ - /* "plotSpectrum(sqwOutput, range(0, nspec))\n"; */ - /* } */ + else if(plotType == "Spectra") + { + pyInput += + "n_spec = mtd[sqw_ws].getNumberHistograms()\n" + "plotSpectrum(sqw_ws, range(0, n_spec))\n"; + } - /* QString pyOutput = m_pythonRunner.runPythonCode(pyInput).trimmed(); */ + m_pythonRunner.runPythonCode(pyInput).trimmed(); } /** @@ -256,8 +275,11 @@ namespace CustomInterfaces void IndirectSqw::energyRebinToggle(bool state) { QString val; - if ( state ) val = "*"; - else val = " "; + if(state) + val = "*"; + else + val = " "; + m_uiForm.sqw_leELow->setEnabled(state); m_uiForm.sqw_leEWidth->setEnabled(state); m_uiForm.sqw_leEHigh->setEnabled(state); @@ -279,7 +301,7 @@ namespace CustomInterfaces */ void IndirectSqw::plotContour() { - if (m_uiForm.sqw_dsSampleInput->isValid()) + if(m_uiForm.sqw_dsSampleInput->isValid()) { QString sampleWsName = m_uiForm.sqw_dsSampleInput->getCurrentDataName(); @@ -295,9 +317,7 @@ namespace CustomInterfaces convertSpecAlg->execute(); - QString pyInput = "from mantidplot import plot2D\n" - "plot2D('" + convertedWsName + "')\n"; - + QString pyInput = "plot2D('" + convertedWsName + "')\n"; m_pythonRunner.runPythonCode(pyInput).trimmed(); } else From d60b642293208727e2b468841ba62898566929fc Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Wed, 29 Oct 2014 13:39:15 +0000 Subject: [PATCH 255/284] Fix scope problem with setting detector position. Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 5 +- .../CurveFitting/src/CalculateMSVesuvio.cpp | 83 ++++++++++--------- 2 files changed, 49 insertions(+), 39 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index 53f0fe78d23b..d3cc71ed3739 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -165,7 +165,10 @@ namespace Mantid Kernel::V3D &scatterPt) const; std::pair calculateE1Range(const double theta, const double en0) const; double partialDiffXSec(const double en0, const double en1, const double theta) const; - Kernel::V3D generateDetectorPos(const Kernel::V3D & nominalPos, const double energy) const; + Kernel::V3D generateDetectorPos(const Kernel::V3D & nominalPos, const double energy, + const Kernel::V3D &scatterPt, + const Kernel::V3D & direcBeforeSc, + double &scang, double &distToExit) const; double generateE1(const double angle, const double e1nom, const double e1res) const; // Member Variables diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 1839c17bba11..5823cd4c4be9 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -903,39 +903,15 @@ namespace Mantid const auto & inX = m_inputWS->readX(0); for(size_t i = 0; i < nscatters; ++i) { - V3D detPos; double scang(0.0), distToExit(0.0); - size_t ntries(0); - do - { - V3D detPos = generateDetectorPos(detpar.pos, en1[i]); - // transform to sample frame - detPos.rotate(*m_goniometer); - // Distance to exit the sample for this order - V3D scToDet = detPos - scatterPts[i]; - scToDet.normalize(); - Geometry::Track scatterToDet(scatterPts[i], scToDet); - if(m_sampleShape->interceptSurface(scatterToDet) > 0) - { - scang = neutronDirs[i].angle(scToDet); - const auto & link = scatterToDet.begin(); - distToExit = link->distInsideObject; - break; - } - // if point is very close surface then there may be no valid intercept so try again - } - while(ntries < MAX_SCATTER_PT_TRIES); - if(ntries == MAX_SCATTER_PT_TRIES) - { - throw std::runtime_error("Unable to create track from sample to detector. " - "Detector shape may be too small."); - } - + V3D detPos = generateDetectorPos(detpar.pos, en1[i], scatterPts[i], neutronDirs[i], + scang, distToExit); // Weight by probability neutron leaves sample - weights[i] *= exp(-m_sampleProps->mu*distToExit); + double & curWgt = weights[i]; + curWgt *= exp(-m_sampleProps->mu*distToExit); // Weight by cross-section for the final energy const double efinal = generateE1(detpar.theta, detpar.efixed, m_foilRes); - weights[i] *= partialDiffXSec(en1[i], efinal, scang)/m_sampleProps->totalxsec; + curWgt *= partialDiffXSec(en1[i], efinal, scang)/m_sampleProps->totalxsec; // final TOF const double veli = sqrt(efinal/MASS_TO_MEV); tofs[i] += detpar.t0 + (scatterPts[i].distance(detPos)*1e6)/veli; @@ -947,7 +923,7 @@ namespace Mantid { if (inX[it] - 0.5*m_delt < finalTOF && finalTOF < inX[it] + 0.5*m_delt) { - counts[it] += weights[i]; + counts[it] += curWgt; break; } } @@ -1159,20 +1135,51 @@ namespace Mantid * Generate a random position within the final detector in the lab frame * @param nominalPos The poisiton of the centre point of the detector * @param energy The final energy of the neutron + * @param scatterPt The position of the scatter event that lead to this detector + * @param direcBeforeSc Directional vector that lead to scatter point that hit this detector + * @param scang [Output] The value of the scattering angle for the generated point + * @param distToExit [Output] The distance covered within the object from scatter to exit * @return A new position in the detector */ - V3D CalculateMSVesuvio::generateDetectorPos(const V3D &nominalPos, const double energy) const + V3D CalculateMSVesuvio::generateDetectorPos(const V3D &nominalPos, const double energy, + const V3D &scatterPt, const V3D &direcBeforeSc, + double &scang, double &distToExit) const { const double mu = 7430.0/sqrt(energy); // Inverse attenuation length (m-1) for vesuvio det. const double ps = 1.0 - exp(-mu*m_detThick); // Probability of detection in path thickness. V3D detPos; - // Beam direction by moving to front of "box"define by detector dimensions and then - // computing expected distance travelled based on probability - detPos[m_beamIdx] = (nominalPos[m_beamIdx] - 0.5*m_detThick) - \ - (log(1.0 - m_randgen->flat()*ps)/mu); - // perturb away from nominal position - detPos[m_acrossIdx] = nominalPos[m_acrossIdx] + (m_randgen->flat() - 0.5)*m_detWidth; - detPos[m_upIdx] = nominalPos[m_upIdx] + (m_randgen->flat() - 0.5)*m_detHeight; + scang = 0.0; distToExit = 0.0; + size_t ntries(0); + do + { + // Beam direction by moving to front of "box"define by detector dimensions and then + // computing expected distance travelled based on probability + detPos[m_beamIdx] = (nominalPos[m_beamIdx] - 0.5*m_detThick) - \ + (log(1.0 - m_randgen->flat()*ps)/mu); + // perturb away from nominal position + detPos[m_acrossIdx] = nominalPos[m_acrossIdx] + (m_randgen->flat() - 0.5)*m_detWidth; + detPos[m_upIdx] = nominalPos[m_upIdx] + (m_randgen->flat() - 0.5)*m_detHeight; + detPos.rotate(*m_goniometer); // to sample frame + + // Distance to exit the sample for this order + V3D scToDet = detPos - scatterPt; + scToDet.normalize(); + Geometry::Track scatterToDet(scatterPt, scToDet); + if(m_sampleShape->interceptSurface(scatterToDet) > 0) + { + scang = direcBeforeSc.angle(scToDet); + const auto & link = scatterToDet.begin(); + distToExit = link->distInsideObject; + break; + } + // if point is very close surface then there may be no valid intercept so try again + } + while(ntries < MAX_SCATTER_PT_TRIES); + if(ntries == MAX_SCATTER_PT_TRIES) + { + throw std::runtime_error("Unable to create track from sample to detector. " + "Detector shape may be too small."); + } return detPos; } From 8b08ecb737c0005c2cb4973f7865c9f9195d3998 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Wed, 29 Oct 2014 15:07:11 +0000 Subject: [PATCH 256/284] Implement value check for unit test. Fixed problem with setting initial detector position & shape uncovered here. Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 1 - .../CurveFitting/src/CalculateMSVesuvio.cpp | 10 +--- .../test/CalculateMSVesuvioTest.h | 52 +++++++++++-------- .../test/ComptonProfileTestHelpers.h | 5 +- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index d3cc71ed3739..560c0ea5d76b 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -179,7 +179,6 @@ namespace Mantid double m_srcR1, m_srcR2; // beam umbra, penumbra radius (m) double m_halfSampleHeight, m_halfSampleWidth, m_halfSampleThick; // (m) double m_maxWidthSampleFrame; // Maximum width in sample frame (m) - Kernel::DblMatrix const *m_goniometer; // sample rotation Geometry::Object const *m_sampleShape; // sample shape SampleComptonProperties *m_sampleProps; // description of sample properties double m_detHeight, m_detWidth, m_detThick; // (m) diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 5823cd4c4be9..581eb0278af6 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -471,8 +471,7 @@ namespace Mantid m_randgen(NULL), m_acrossIdx(0), m_upIdx(1), m_beamIdx(3), m_beamDir(), m_srcR1(0.0), m_srcR2(0.0), m_halfSampleHeight(0.0), m_halfSampleWidth(0.0), m_halfSampleThick(0.0), - m_maxWidthSampleFrame(0.0), m_goniometer(NULL), m_sampleShape(NULL), - m_sampleProps(NULL), + m_maxWidthSampleFrame(0.0), m_sampleShape(NULL), m_sampleProps(NULL), m_detHeight(-1.0), m_detWidth(-1.0), m_detThick(-1.0), m_tmin(-1.0), m_tmax(-1.0), m_delt(-1.0), m_foilRes(-1.0), m_progress(NULL), m_inputWS() @@ -591,7 +590,7 @@ namespace Mantid setProperty("TotalScatteringWS", totalsc); setProperty("MultipleScatteringWS", multsc); - } + } /** * Caches inputs insuitable form for speed in later calculations @@ -622,8 +621,6 @@ namespace Mantid m_srcR1 /= 100.0; m_srcR2 /= 100.0; - // Sample rotation specified by a goniometer - m_goniometer = &(m_inputWS->run().getGoniometerMatrix()); // Sample shape m_sampleShape = &(m_inputWS->sample().getShape()); // We know the shape is valid from the property validator @@ -821,8 +818,6 @@ namespace Mantid // moderator coord in lab frame V3D srcPos = generateSrcPos(detpar.l1); - // transform to sample frame - srcPos.rotate(*m_goniometer); if(fabs(srcPos[m_acrossIdx]) > m_halfSampleWidth || fabs(srcPos[m_upIdx]) > m_halfSampleHeight) { @@ -1159,7 +1154,6 @@ namespace Mantid // perturb away from nominal position detPos[m_acrossIdx] = nominalPos[m_acrossIdx] + (m_randgen->flat() - 0.5)*m_detWidth; detPos[m_upIdx] = nominalPos[m_upIdx] + (m_randgen->flat() - 0.5)*m_detHeight; - detPos.rotate(*m_goniometer); // to sample frame // Distance to exit the sample for this order V3D scToDet = detPos - scatterPt; diff --git a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h index dae6b089a0c6..b167139e336f 100644 --- a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h +++ b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h @@ -31,28 +31,13 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite TS_ASSERT(alg.isInitialized()); } - void test_exec_with_flat_plate_sample_and_no_goniometer() + void test_exec_with_flat_plate_sample() { auto alg = createTestAlgorithm(createFlatPlateSampleWS()); - - feenableexcept(FE_INVALID | FE_OVERFLOW); - - TS_ASSERT_THROWS_NOTHING(alg->execute()); - TS_ASSERT(alg->isExecuted()); - } - - void test_exec_with_flat_plate_sample_and_goniometer() - { - auto testWS = createFlatPlateSampleWS(); - Mantid::Geometry::Goniometer sampleRot; - // 45.0 deg rotation around Y - sampleRot.pushAxis("phi", 0.0, 1.0, 0.0, 45.0, - Mantid::Geometry::CW, Mantid::Geometry::angDegrees); - testWS->mutableRun().setGoniometer(sampleRot, false); - auto alg = createTestAlgorithm(testWS); - TS_ASSERT_THROWS_NOTHING(alg->execute()); TS_ASSERT(alg->isExecuted()); + + checkOutputValuesAsExpected(alg, 0.0113021908, 0.0028218125); } // ------------------------ Failure Cases ----------------------------------------- @@ -193,10 +178,10 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite // replace instrument with one that has a detector with a shape const std::string shapeXML = \ "" - "" - "" - "" - "" + "" + "" + "" + "" "" ""; const auto pos = ws2d->getDetector(0)->getPos(); @@ -209,6 +194,29 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite return ws2d; } + void checkOutputValuesAsExpected(const Mantid::API::IAlgorithm_sptr & alg, + const double expectedTotal, const double expectedMS) + { + using Mantid::API::MatrixWorkspace_sptr; + const size_t checkIdx = 100; + const double tolerance(1e-8); + + // Values for total scattering + MatrixWorkspace_sptr totScatter = alg->getProperty("TotalScatteringWS"); + TS_ASSERT(totScatter); + const auto & totY = totScatter->readY(0); + TS_ASSERT_DELTA(expectedTotal, totY[checkIdx], tolerance); + const auto & totX = totScatter->readX(0); + TS_ASSERT_DELTA(150.0, totX[checkIdx], tolerance); // based on workspace setup + + // Values for multiple scatters + MatrixWorkspace_sptr multScatter = alg->getProperty("MultipleScatteringWS"); + TS_ASSERT(multScatter); + const auto & msY = multScatter->readY(0); + TS_ASSERT_DELTA(expectedMS, msY[checkIdx], tolerance); + const auto & msX = multScatter->readX(0); + TS_ASSERT_DELTA(150.0, msX[checkIdx], tolerance); // based on workspace setup + } }; diff --git a/Code/Mantid/Framework/CurveFitting/test/ComptonProfileTestHelpers.h b/Code/Mantid/Framework/CurveFitting/test/ComptonProfileTestHelpers.h index a7b923df3757..83c29bd6fb0c 100644 --- a/Code/Mantid/Framework/CurveFitting/test/ComptonProfileTestHelpers.h +++ b/Code/Mantid/Framework/CurveFitting/test/ComptonProfileTestHelpers.h @@ -64,14 +64,14 @@ namespace ComptonProfileTestHelpers { double r(0.553), theta(66.5993), phi(138.6); Mantid::Kernel::V3D detPos; - detPos.spherical(r, theta, phi); + detPos.spherical_rad(r, theta*M_PI/180.0, phi*M_PI/180.0); ws2d->setInstrument(createTestInstrumentWithFoilChanger(id,detPos)); } else { double r(0.55), theta(66.5993), phi(0.0); Mantid::Kernel::V3D detPos; - detPos.spherical(r, theta, phi); + detPos.spherical_rad(r, theta*M_PI/180.0, phi*M_PI/180.0); ws2d->setInstrument(createTestInstrumentWithNoFoilChanger(id,detPos)); } @@ -182,6 +182,7 @@ namespace ComptonProfileTestHelpers pmap.addDouble(compID, "t0", -0.32); pmap.addDouble(compID, "hwhm_lorentz", 24); pmap.addDouble(compID, "sigma_gauss", 73); + pmap.addDouble(compID, "sigma_tof", 0.3); } static void addFoilResolution(const Mantid::API::MatrixWorkspace_sptr & ws, From 91644b76858608238f497c1e2b19cf603c8a976d Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Wed, 29 Oct 2014 15:14:27 +0000 Subject: [PATCH 257/284] Remove some unused properties. Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 2 +- .../CurveFitting/src/CalculateMSVesuvio.cpp | 22 ++++--------------- .../test/CalculateMSVesuvioTest.h | 20 +++-------------- 3 files changed, 8 insertions(+), 36 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index 560c0ea5d76b..ad29ad09c1da 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -176,7 +176,7 @@ namespace Mantid size_t m_acrossIdx, m_upIdx, m_beamIdx; // indices of each direction Kernel::V3D m_beamDir; // Directional vector for beam - double m_srcR1, m_srcR2; // beam umbra, penumbra radius (m) + double m_srcR2; // beam penumbra radius (m) double m_halfSampleHeight, m_halfSampleWidth, m_halfSampleThick; // (m) double m_maxWidthSampleFrame; // Maximum width in sample frame (m) Geometry::Object const *m_sampleShape; // sample shape diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 581eb0278af6..2a4869291550 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -469,7 +469,7 @@ namespace Mantid /// Constructor CalculateMSVesuvio::CalculateMSVesuvio() : Algorithm(), m_randgen(NULL), - m_acrossIdx(0), m_upIdx(1), m_beamIdx(3), m_beamDir(), m_srcR1(0.0), m_srcR2(0.0), + m_acrossIdx(0), m_upIdx(1), m_beamIdx(3), m_beamDir(), m_srcR2(0.0), m_halfSampleHeight(0.0), m_halfSampleWidth(0.0), m_halfSampleThick(0.0), m_maxWidthSampleFrame(0.0), m_sampleShape(NULL), m_sampleProps(NULL), m_detHeight(-1.0), m_detWidth(-1.0), m_detThick(-1.0), @@ -522,12 +522,8 @@ namespace Mantid setPropertyGroup("AtomicProperties", "Sample"); // -- Beam -- - declareProperty("BeamUmbraRadius", -1.0, positiveNonZero, - "Radius, in cm, of part in total shadow."); - declareProperty("BeamPenumbraRadius", -1.0, positiveNonZero, - "Radius, in cm, of part in partial shadow."); - setPropertyGroup("BeamUmbraRadius", "Beam"); - setPropertyGroup("BeamPenumbraRadius", "Beam"); + declareProperty("BeamRadius", -1.0, positiveNonZero, + "Radius, in cm, of beam"); // -- Algorithm -- declareProperty("Seed", 123456789, positiveInt, @@ -607,18 +603,8 @@ namespace Mantid m_upIdx = rframe->pointingUp(); m_beamIdx = rframe->pointingAlongBeam(); - m_srcR1 = getProperty("BeamUmbraRadius"); - m_srcR2 = getProperty("BeamPenumbraRadius"); - if(m_srcR2 < m_srcR1) - { - std::ostringstream os; - os << "Invalid beam radius parameters. Penumbra value=" - << m_srcR2 << " < Umbra value=" - << m_srcR1; - throw std::invalid_argument(os.str()); - } + m_srcR2 = getProperty("BeamRadius"); // Convert to metres - m_srcR1 /= 100.0; m_srcR2 /= 100.0; // Sample shape diff --git a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h index b167139e336f..0fd918d229bc 100644 --- a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h +++ b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h @@ -95,21 +95,8 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite CalculateMSVesuvio alg; alg.initialize(); - TS_ASSERT_THROWS(alg.setProperty("BeamUmbraRadius", -1.5), std::invalid_argument); - TS_ASSERT_THROWS(alg.setProperty("BeamUmbraRadius", 0.0), std::invalid_argument); - TS_ASSERT_THROWS(alg.setProperty("BeamPenumbraRadius", -1.5), std::invalid_argument); - TS_ASSERT_THROWS(alg.setProperty("BeamPenumbraRadius", 0.0), std::invalid_argument); - } - - void test_setting_umbra_less_than_penumbra_throws_invalid_argument() - { - auto testWS = createFlatPlateSampleWS(); - auto alg = createTestAlgorithm(testWS); - - alg->setProperty("BeamUmbraRadius", 2.5); - alg->setProperty("BeamPenumbraRadius", 1.5); - - TS_ASSERT_THROWS(alg->execute(), std::invalid_argument); + TS_ASSERT_THROWS(alg.setProperty("BeamRadius", -1.5), std::invalid_argument); + TS_ASSERT_THROWS(alg.setProperty("BeamRadius", 0.0), std::invalid_argument); } void test_input_workspace_with_detector_that_has_no_shape_throws_exception() @@ -134,8 +121,7 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite const double sampleProps[9] = {1.007900, 0.9272392, 5.003738, 16.00000, 3.2587662E-02, 13.92299, 27.50000, 4.0172841E-02, 15.07701}; alg->setProperty("AtomicProperties", std::vector(sampleProps, sampleProps + 9)); - alg->setProperty("BeamUmbraRadius", 1.5); - alg->setProperty("BeamPenumbraRadius", 2.5); + alg->setProperty("BeamRadius", 2.5); // outputs alg->setPropertyValue("TotalScatteringWS", "__unused_for_child"); alg->setPropertyValue("MultipleScatteringWS", "__unused_for_child"); From 8afc45c4be650466fad1edf18f1b72e5a9682e80 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Wed, 29 Oct 2014 17:20:11 +0000 Subject: [PATCH 258/284] Add static function to retrieve resolution parameters Follows on from how ConvertToYSpace fills the detector parameters Refs #10169 --- .../MantidCurveFitting/VesuvioResolution.h | 5 ++ .../CurveFitting/src/CalculateMSVesuvio.cpp | 15 +---- .../CurveFitting/src/VesuvioResolution.cpp | 66 +++++++++++-------- 3 files changed, 45 insertions(+), 41 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/VesuvioResolution.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/VesuvioResolution.h index fd9f28d1437b..543363c119e9 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/VesuvioResolution.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/VesuvioResolution.h @@ -55,6 +55,11 @@ namespace CurveFitting class MANTID_CURVEFITTING_DLL VesuvioResolution : public virtual API::ParamFunction, public virtual API::IFunction1D { public: + + /// Creates a POD struct containing the required resolution parameters for this spectrum + static ResolutionParams getResolutionParameters(const API::MatrixWorkspace_const_sptr & ws, + const size_t index); + /// Default constructor required for factory VesuvioResolution(); diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 2a4869291550..217fdf801c73 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -712,19 +712,8 @@ namespace Mantid { // Detector information DetectorParams detpar = ConvertToYSpace::getDetectorParameters(m_inputWS, wsIndex); - // t0 is stored in seconds by default, whereas here we want microseconds - detpar.t0 *= 1e6; - - const Geometry::IDetector_const_sptr detector = m_inputWS->getDetector(wsIndex); - const auto & pmap = m_inputWS->instrumentParameters(); - // Resolution information - ResolutionParams respar; - respar.dl1 = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_l1"); - respar.dl2 = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_l2"); - respar.dtof = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_tof"); - respar.dthe = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_theta"); //radians - respar.dEnLorentz = ConvertToYSpace::getComponentParameter(detector, pmap, "hwhm_lorentz"); - respar.dEnGauss = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_gauss"); + detpar.t0 *= 1e6; // t0 in microseconds here + ResolutionParams respar = VesuvioResolution::getResolutionParameters(m_inputWS, wsIndex); // Final counts averaged over all simulations const size_t nruns(NSIMULATIONS), nscatters(NSCATTERS), nevents(NEVENTS); diff --git a/Code/Mantid/Framework/CurveFitting/src/VesuvioResolution.cpp b/Code/Mantid/Framework/CurveFitting/src/VesuvioResolution.cpp index 7e0a734546ac..6bcf01387e11 100644 --- a/Code/Mantid/Framework/CurveFitting/src/VesuvioResolution.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/VesuvioResolution.cpp @@ -22,8 +22,44 @@ namespace CurveFitting // Register into factory DECLARE_FUNCTION(VesuvioResolution); + //--------------------------------------------------------------------------- + // Static functions + //--------------------------------------------------------------------------- + /** - */ + * @param ws The workspace with attached instrument + * @param index Index of the spectrum + * @return DetectorParams structure containing the relevant parameters + */ + ResolutionParams VesuvioResolution::getResolutionParameters(const API::MatrixWorkspace_const_sptr & ws, + const size_t index) + { + Geometry::IDetector_const_sptr detector; + try + { + detector = ws->getDetector(index); + } + catch (Kernel::Exception::NotFoundError &) + { + throw std::invalid_argument("VesuvioResolution - Workspace has no detector attached to histogram at index " + \ + boost::lexical_cast(index)); + } + + ResolutionParams respar; + const auto & pmap = ws->constInstrumentParameters(); + respar.dl1 = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_l1"); + respar.dl2 = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_l2"); + respar.dtof = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_tof"); + respar.dthe = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_theta"); //radians + respar.dEnLorentz = ConvertToYSpace::getComponentParameter(detector, pmap, "hwhm_lorentz"); + respar.dEnGauss = ConvertToYSpace::getComponentParameter(detector, pmap, "sigma_gauss"); + return respar; + } + + //--------------------------------------------------------------------------- + // Member functions + //--------------------------------------------------------------------------- + VesuvioResolution::VesuvioResolution() : API::ParamFunction(), API::IFunction1D(), m_log("VesuvioResolution"), m_wsIndex(0), m_mass(0.0), m_voigt(), @@ -63,35 +99,9 @@ namespace CurveFitting UNUSED_ARG(startX); UNUSED_ARG(endX); - auto inst = workspace->getInstrument(); - auto sample = inst->getSample(); - auto source = inst->getSource(); - if(!sample || !source) - { - throw std::invalid_argument("VesuvioResolution - Workspace has no source/sample."); - } m_wsIndex = wsIndex; - Geometry::IDetector_const_sptr det; - try - { - det = workspace->getDetector(m_wsIndex); - } - catch (Kernel::Exception::NotFoundError &) - { - throw std::invalid_argument("VesuvioResolution - Workspace has no detector attached to histogram at index " + boost::lexical_cast(m_wsIndex)); - } - DetectorParams detpar = ConvertToYSpace::getDetectorParameters(workspace, m_wsIndex); - const auto & pmap = workspace->constInstrumentParameters(); - - ResolutionParams respar; - respar.dl1 = ConvertToYSpace::getComponentParameter(det, pmap, "sigma_l1"); - respar.dl2 = ConvertToYSpace::getComponentParameter(det, pmap, "sigma_l2"); - respar.dtof = ConvertToYSpace::getComponentParameter(det, pmap, "sigma_tof"); - respar.dthe = ConvertToYSpace::getComponentParameter(det, pmap, "sigma_theta"); //radians - respar.dEnLorentz = ConvertToYSpace::getComponentParameter(det, pmap, "hwhm_lorentz"); - respar.dEnGauss = ConvertToYSpace::getComponentParameter(det, pmap, "sigma_gauss"); - + ResolutionParams respar = getResolutionParameters(workspace, m_wsIndex); this->cacheResolutionComponents(detpar, respar); } From e1ab08d600271303ed283e2303125598ba180228 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Wed, 29 Oct 2014 17:28:08 +0000 Subject: [PATCH 259/284] Refactoring to improve readability Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 3 ++ .../CurveFitting/src/CalculateMSVesuvio.cpp | 54 ++++++++++++------- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index ad29ad09c1da..9d2339681b6a 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -152,6 +152,9 @@ namespace Mantid const DetectorParams & detpar, const ResolutionParams &respar, Simulation & simulCounts) const; + void assignToOutput(const size_t nscatters, + const SimulationWithErrors & avgCounts, API::ISpectrum & totalsc, + API::ISpectrum & multsc) const; double calculateCounts(const size_t nscatters, const DetectorParams & detpar, const ResolutionParams &respar, diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 217fdf801c73..781cf435fc39 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -731,7 +731,41 @@ namespace Mantid // Average over all runs and assign to output workspaces SimulationWithErrors avgCounts = accumulator.average(); avgCounts.normalise(); + assignToOutput(nscatters, avgCounts, totalsc, multsc); + } + + /** + * Perform a single simulation of a given number of events for up to a maximum number of + * scatterings on a chosen detector + * @param nevents The number of neutron events to simulate + * @param nscatters Maximum order of scattering that should be simulated + * @param detpar Detector information describing the final detector position + * @param respar Resolution information on the intrument as a whole + * @param simulCounts Simulation object used to storing the calculated number of counts + */ + void CalculateMSVesuvio::simulate(const size_t nevents, const size_t nscatters, + const DetectorParams & detpar, + const ResolutionParams &respar, + Simulation & simulCounts) const + { + for(size_t i = 0; i < nevents; ++i) + { + calculateCounts(nscatters, detpar, respar, simulCounts); + } + } + /** + * Assign the averaged counts to the correct workspaces + * @param nscatters The highest order of scattering + * @param avgCounts Counts & errors separated for each scattering order + * @param totalsc A non-const reference to the spectrum for the total scattering calculation + * @param multsc A non-const reference to the spectrum for the multiple scattering contribution + */ + void + CalculateMSVesuvio::assignToOutput(const size_t nscatters, + const CalculateMSVesuvio::SimulationWithErrors &avgCounts, + API::ISpectrum & totalsc, API::ISpectrum & multsc) const + { // Sum up all multiple scatter events auto & msscatY = multsc.dataY(); auto & msscatE = multsc.dataE(); @@ -757,26 +791,6 @@ namespace Mantid VectorHelper::SumGaussError()); } - /** - * Perform a single simulation of a given number of events for up to a maximum number of - * scatterings on a chosen detector - * @param nevents The number of neutron events to simulate - * @param nscatters Maximum order of scattering that should be simulated - * @param detpar Detector information describing the final detector position - * @param respar Resolution information on the intrument as a whole - * @param simulCounts Simulation object used to storing the calculated number of counts - */ - void CalculateMSVesuvio::simulate(const size_t nevents, const size_t nscatters, - const DetectorParams & detpar, - const ResolutionParams &respar, - Simulation & simulCounts) const - { - for(size_t i = 0; i < nevents; ++i) - { - calculateCounts(nscatters, detpar, respar, simulCounts); - } - } - /** * * @param nscatters Maximum order of scattering that should be simulated From 3365277a0c6885bdef53d65b936007e79f9af065 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Wed, 29 Oct 2014 17:38:41 +0000 Subject: [PATCH 260/284] Add properties to control the number of scatterings, runs & events Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 13 ++-- .../CurveFitting/src/CalculateMSVesuvio.cpp | 70 +++++++++++-------- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index 9d2339681b6a..3965ce40bf65 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -148,15 +148,12 @@ namespace Mantid void cacheInputs(); void calculateMS(const size_t wsIndex, API::ISpectrum & totalsc, API::ISpectrum & multsc) const; - void simulate(const size_t nevents, const size_t nscatters, - const DetectorParams & detpar, + void simulate(const DetectorParams & detpar, const ResolutionParams &respar, Simulation & simulCounts) const; - void assignToOutput(const size_t nscatters, - const SimulationWithErrors & avgCounts, API::ISpectrum & totalsc, + void assignToOutput(const SimulationWithErrors & avgCounts, API::ISpectrum & totalsc, API::ISpectrum & multsc) const; - double calculateCounts(const size_t nscatters, - const DetectorParams & detpar, + double calculateCounts(const DetectorParams & detpar, const ResolutionParams &respar, Simulation & simulation) const; @@ -188,6 +185,10 @@ namespace Mantid double m_tmin, m_tmax, m_delt; // min, max & dt TOF value double m_foilRes; // resolution in energy of foil + size_t m_nscatters; // highest order of scattering to generate + size_t m_nruns; // number of runs per spectrum + size_t m_nevents; // number of single events per run + API::Progress *m_progress; API::MatrixWorkspace_sptr m_inputWS; }; diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 781cf435fc39..3ff69122d50b 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -33,9 +33,6 @@ namespace Mantid namespace { - const size_t NSIMULATIONS = 10; - const size_t NEVENTS = 50000; - const size_t NSCATTERS = 3; const size_t MAX_SCATTER_PT_TRIES = 25; /// Conversion constant const double MASS_TO_MEV = 0.5*PhysicalConstants::NeutronMass/PhysicalConstants::meV; @@ -474,6 +471,7 @@ namespace Mantid m_maxWidthSampleFrame(0.0), m_sampleShape(NULL), m_sampleProps(NULL), m_detHeight(-1.0), m_detWidth(-1.0), m_detThick(-1.0), m_tmin(-1.0), m_tmax(-1.0), m_delt(-1.0), m_foilRes(-1.0), + m_nscatters(0), m_nruns(0), m_nevents(0), m_progress(NULL), m_inputWS() { } @@ -528,6 +526,16 @@ namespace Mantid // -- Algorithm -- declareProperty("Seed", 123456789, positiveInt, "Seed the random number generator with this value"); + declareProperty("NumScatters", 3, positiveInt, + "Number of scattering orders to calculate"); + declareProperty("NumRuns", 10, positiveInt, + "Number of simulated runs per spectrum"); + declareProperty("NumEventsPerRun", 50000, positiveInt, + "Number of events per run"); + setPropertyGroup("Seed", "Algorithm"); + setPropertyGroup("NumScatters", "Algorithm"); + setPropertyGroup("NumRuns", "Algorithm"); + setPropertyGroup("NumEventsPerRun", "Algorithm"); // Outputs declareProperty(new WorkspaceProperty<>("TotalScatteringWS","", Direction::Output), @@ -553,7 +561,7 @@ namespace Mantid // Setup progress const int64_t nhist = static_cast(m_inputWS->getNumberHistograms()); - m_progress = new API::Progress(this, 0.0, 1.0, nhist*NSIMULATIONS*2); + m_progress = new API::Progress(this, 0.0, 1.0, nhist*m_nruns*2); for(int64_t i = 0; i < nhist; ++i) { @@ -593,6 +601,14 @@ namespace Mantid */ void CalculateMSVesuvio::cacheInputs() { + // Algorithm + int nscatters = getProperty("NumScatters"); + m_nscatters = static_cast(nscatters); + int nruns = getProperty("NumRuns"); + m_nruns = static_cast(nruns); + int nevents = getProperty("NumEventsPerRun"); + m_nevents = static_cast(nevents); + // -- Geometry -- const auto instrument = m_inputWS->getInstrument(); m_beamDir = instrument->getSample()->getPos() - instrument->getSource()->getPos(); @@ -716,14 +732,15 @@ namespace Mantid ResolutionParams respar = VesuvioResolution::getResolutionParameters(m_inputWS, wsIndex); // Final counts averaged over all simulations - const size_t nruns(NSIMULATIONS), nscatters(NSCATTERS), nevents(NEVENTS); - SimulationAggregator accumulator(nruns); - for(size_t i = 0; i < nruns; ++i) + SimulationAggregator accumulator(m_nruns); + for(size_t i = 0; i < m_nruns; ++i) { m_progress->report("MS calculation: idx=" + boost::lexical_cast(wsIndex) + ", run=" + boost::lexical_cast(i)); - simulate(nevents, nscatters, detpar, respar, - accumulator.newSimulation(nscatters, m_inputWS->blocksize())); + + simulate(detpar, respar, + accumulator.newSimulation(m_nscatters, m_inputWS->blocksize())); + m_progress->report("MS calculation: idx=" + boost::lexical_cast(wsIndex) + ", run=" + boost::lexical_cast(i)); } @@ -731,45 +748,40 @@ namespace Mantid // Average over all runs and assign to output workspaces SimulationWithErrors avgCounts = accumulator.average(); avgCounts.normalise(); - assignToOutput(nscatters, avgCounts, totalsc, multsc); + assignToOutput(avgCounts, totalsc, multsc); } /** * Perform a single simulation of a given number of events for up to a maximum number of * scatterings on a chosen detector - * @param nevents The number of neutron events to simulate - * @param nscatters Maximum order of scattering that should be simulated * @param detpar Detector information describing the final detector position * @param respar Resolution information on the intrument as a whole * @param simulCounts Simulation object used to storing the calculated number of counts */ - void CalculateMSVesuvio::simulate(const size_t nevents, const size_t nscatters, - const DetectorParams & detpar, + void CalculateMSVesuvio::simulate(const DetectorParams & detpar, const ResolutionParams &respar, Simulation & simulCounts) const { - for(size_t i = 0; i < nevents; ++i) + for(size_t i = 0; i < m_nevents; ++i) { - calculateCounts(nscatters, detpar, respar, simulCounts); + calculateCounts(detpar, respar, simulCounts); } } /** * Assign the averaged counts to the correct workspaces - * @param nscatters The highest order of scattering * @param avgCounts Counts & errors separated for each scattering order * @param totalsc A non-const reference to the spectrum for the total scattering calculation * @param multsc A non-const reference to the spectrum for the multiple scattering contribution */ void - CalculateMSVesuvio::assignToOutput(const size_t nscatters, - const CalculateMSVesuvio::SimulationWithErrors &avgCounts, + CalculateMSVesuvio::assignToOutput(const CalculateMSVesuvio::SimulationWithErrors &avgCounts, API::ISpectrum & totalsc, API::ISpectrum & multsc) const { // Sum up all multiple scatter events auto & msscatY = multsc.dataY(); auto & msscatE = multsc.dataE(); - for(size_t i = 1; i < nscatters; ++i) //(i >= 1 for multiple scatters) + for(size_t i = 1; i < m_nscatters; ++i) //(i >= 1 for multiple scatters) { const auto & counts = avgCounts.sim.counts[i]; // equivalent to msscatY[j] += counts[j] @@ -792,14 +804,12 @@ namespace Mantid } /** - * - * @param nscatters Maximum order of scattering that should be simulated * @param detpar Detector information describing the final detector position * @param respar Resolution information on the intrument as a whole * @param simulation [Output] Store the calculated counts here * @return The sum of the weights for all scatters */ - double CalculateMSVesuvio::calculateCounts(const size_t nscatters, const DetectorParams &detpar, + double CalculateMSVesuvio::calculateCounts(const DetectorParams &detpar, const ResolutionParams &respar, Simulation &simulation) const { @@ -814,9 +824,9 @@ namespace Mantid } // track various variables during calculation - std::vector weights(nscatters, 1.0), // start at 1.0 - tofs(nscatters, 0.0), // tof accumulates for each piece of the calculation - en1(nscatters, 0.0); + std::vector weights(m_nscatters, 1.0), // start at 1.0 + tofs(m_nscatters, 0.0), // tof accumulates for each piece of the calculation + en1(m_nscatters, 0.0); const double vel2 = sqrt(detpar.efixed/MASS_TO_MEV); const double t2 = detpar.l2/vel2; @@ -824,8 +834,8 @@ namespace Mantid tofs[0] = generateTOF(en1[0], respar.dtof, respar.dl1); // correction for resolution in l1 // Neutron path - std::vector scatterPts(nscatters), // track origin of each scatter - neutronDirs(nscatters); // neutron directions + std::vector scatterPts(m_nscatters), // track origin of each scatter + neutronDirs(m_nscatters); // neutron directions V3D startPos(srcPos); neutronDirs[0] = m_beamDir; @@ -836,7 +846,7 @@ namespace Mantid tofs[0] += (distFromStart*1e6/vel0); // multiple scatter events within sample, i.e not including zeroth - for(size_t i = 1; i < nscatters; ++i) + for(size_t i = 1; i < m_nscatters; ++i) { weights[i] = weights[i-1]; tofs[i] = tofs[i-1]; @@ -885,7 +895,7 @@ namespace Mantid // force all orders in to current detector const auto & inX = m_inputWS->readX(0); - for(size_t i = 0; i < nscatters; ++i) + for(size_t i = 0; i < m_nscatters; ++i) { double scang(0.0), distToExit(0.0); V3D detPos = generateDetectorPos(detpar.pos, en1[i], scatterPts[i], neutronDirs[i], From 6deac0b8390a9a693cf65b9780d711a043b20dbd Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Wed, 29 Oct 2014 17:43:39 +0000 Subject: [PATCH 261/284] Separate helpers into different file The main algorithm code is easier to read this way. Refs #10169 --- .../Framework/CurveFitting/CMakeLists.txt | 2 + .../MantidCurveFitting/CalculateMSVesuvio.h | 73 +-- .../inc/MantidCurveFitting/MSVesuvioHelpers.h | 76 +++ .../CurveFitting/src/CalculateMSVesuvio.cpp | 439 +----------------- .../CurveFitting/src/MSVesuvioHelpers.cpp | 420 +++++++++++++++++ 5 files changed, 520 insertions(+), 490 deletions(-) create mode 100644 Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/MSVesuvioHelpers.h create mode 100644 Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp diff --git a/Code/Mantid/Framework/CurveFitting/CMakeLists.txt b/Code/Mantid/Framework/CurveFitting/CMakeLists.txt index 403c02e38b34..6fd76d691ebf 100644 --- a/Code/Mantid/Framework/CurveFitting/CMakeLists.txt +++ b/Code/Mantid/Framework/CurveFitting/CMakeLists.txt @@ -57,6 +57,7 @@ set ( SRC_FILES src/LogNormal.cpp src/Lorentzian.cpp src/Lorentzian1D.cpp + src/MSVesuvioHelpers.cpp src/MultiDomainCreator.cpp src/MuonFInteraction.cpp src/NeutronBk2BkExpConvPVoigt.cpp @@ -167,6 +168,7 @@ set ( INC_FILES inc/MantidCurveFitting/LogNormal.h inc/MantidCurveFitting/Lorentzian.h inc/MantidCurveFitting/Lorentzian1D.h + inc/MantidCurveFitting/MSVesuvioHelpers.h inc/MantidCurveFitting/MultiDomainCreator.h inc/MantidCurveFitting/MuonFInteraction.h inc/MantidCurveFitting/NeutronBk2BkExpConvPVoigt.h diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index 3965ce40bf65..89080ea516ec 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -7,10 +7,6 @@ #include "MantidGeometry/Instrument/ReferenceFrame.h" #include "MantidKernel/V3D.h" -#include -#include -#include - namespace Mantid { namespace CurveFitting @@ -20,6 +16,12 @@ namespace Mantid //----------------------------------------------------------------------------- struct DetectorParams; struct ResolutionParams; + namespace MSVesuvioHelper + { + class RandomNumberGenerator; + struct Simulation; + struct SimulationWithErrors; + } /** Calculates the multiple scattering & total scattering contributions @@ -49,7 +51,6 @@ namespace Mantid class DLLExport CalculateMSVesuvio : public API::Algorithm { private: - // Holds date on the compton scattering properties of an atom struct ComptonNeutronAtom { @@ -59,7 +60,6 @@ namespace Mantid double sclength; // 4pi/xsec double profile; // s.d of J(y) }; - // Holds data about sample as a whole. struct SampleComptonProperties { @@ -73,57 +73,6 @@ namespace Mantid double mu; // attenuation factor (1/m) }; - // Produces random numbers with various probability distributions - class RandomNumberGenerator - { - typedef boost::uniform_real uniform_double; - typedef boost::normal_distribution gaussian_double; - public: - RandomNumberGenerator(const int seed); - /// Returns a flat random number between 0.0 & 1.0 - double flat(); - /// Returns a random number distributed by a normal distribution - double gaussian(const double mean, const double sigma); - - private: - RandomNumberGenerator(); - boost::mt19937 m_generator; - }; - - // Stores counts for each scatter order - // for a "run" of a given number of events - struct Simulation - { - Simulation(const size_t order, const size_t ntimes); - - std::vector> counts; - size_t maxorder; - }; - // Stores counts for each scatter order with errors - struct SimulationWithErrors - { - SimulationWithErrors(const size_t order, const size_t ntimes) : - sim(order, ntimes), errors(order, std::vector(ntimes)) {} - - void normalise(); - Simulation sim; - std::vector> errors; - - }; - - // Accumulates and averages the results of a set of simulations - struct SimulationAggregator - { - SimulationAggregator(const size_t nruns); - - // Creates a placeholder for a new simulation - Simulation & newSimulation(const size_t order, - const size_t ntimes); - SimulationWithErrors average() const; - - std::vector results; - }; - public: CalculateMSVesuvio(); ~CalculateMSVesuvio(); @@ -150,12 +99,12 @@ namespace Mantid API::ISpectrum & multsc) const; void simulate(const DetectorParams & detpar, const ResolutionParams &respar, - Simulation & simulCounts) const; - void assignToOutput(const SimulationWithErrors & avgCounts, API::ISpectrum & totalsc, - API::ISpectrum & multsc) const; + MSVesuvioHelper::Simulation & simulCounts) const; + void assignToOutput(const MSVesuvioHelper::SimulationWithErrors & avgCounts, + API::ISpectrum & totalsc, API::ISpectrum & multsc) const; double calculateCounts(const DetectorParams & detpar, const ResolutionParams &respar, - Simulation & simulation) const; + MSVesuvioHelper::Simulation & simulation) const; // single-event helpers Kernel::V3D generateSrcPos(const double l1) const; @@ -172,7 +121,7 @@ namespace Mantid double generateE1(const double angle, const double e1nom, const double e1res) const; // Member Variables - RandomNumberGenerator *m_randgen; // random number generator + MSVesuvioHelper::RandomNumberGenerator *m_randgen; // random number generator size_t m_acrossIdx, m_upIdx, m_beamIdx; // indices of each direction Kernel::V3D m_beamDir; // Directional vector for beam diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/MSVesuvioHelpers.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/MSVesuvioHelpers.h new file mode 100644 index 000000000000..89cfe9088d31 --- /dev/null +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/MSVesuvioHelpers.h @@ -0,0 +1,76 @@ +#ifndef MANTID_CURVEFITTING_MSVESUVIOHELPERS_H +#define MANTID_CURVEFITTING_MSVESUVIOHELPERS_H + +#include + +#include +#include +#include + + +namespace Mantid { namespace CurveFitting +{ + namespace MSVesuvioHelper + { + // Absorption energy for double-difference gold foil + double finalEnergyAuDD(const double randv); + // Absorption energy for gold foil YAP + double finalEnergyAuYap(const double randv); + // Absorption energy for uranium + double finalEnergyUranium(const double randv); + + // Ties together random numbers with various probability distributions + // @todo: Should move to Kernel + class RandomNumberGenerator + { + typedef boost::uniform_real uniform_double; + typedef boost::normal_distribution gaussian_double; + public: + RandomNumberGenerator(const int seed); + /// Returns a flat random number between 0.0 & 1.0 + double flat(); + /// Returns a random number distributed by a normal distribution + double gaussian(const double mean, const double sigma); + + private: + RandomNumberGenerator(); + boost::mt19937 m_generator; + }; + + // Stores counts for each scatter order + // for a "run" of a given number of events + struct Simulation + { + Simulation(const size_t order, const size_t ntimes); + + std::vector> counts; + size_t maxorder; + }; + // Stores counts for each scatter order with errors + struct SimulationWithErrors + { + SimulationWithErrors(const size_t order, const size_t ntimes) : + sim(order, ntimes), errors(order, std::vector(ntimes)) {} + + void normalise(); + Simulation sim; + std::vector> errors; + }; + + // Accumulates and averages the results of a set of simulations + struct SimulationAggregator + { + SimulationAggregator(const size_t nruns); + + // Creates a placeholder for a new simulation + Simulation & newSimulation(const size_t order, + const size_t ntimes); + SimulationWithErrors average() const; + + std::vector results; + }; + + } +}} + +#endif // MANTID_CURVEFITTING_MSVESUVIOHELPERS_H diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index 3ff69122d50b..ef42ec2f43a3 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -4,6 +4,7 @@ #include "MantidCurveFitting/CalculateMSVesuvio.h" // Use helpers for storing detector/resolution parameters #include "MantidCurveFitting/ConvertToYSpace.h" +#include "MantidCurveFitting/MSVesuvioHelpers.h" #include "MantidCurveFitting/VesuvioResolution.h" #include "MantidAPI/SampleShapeValidator.h" @@ -36,428 +37,10 @@ namespace Mantid const size_t MAX_SCATTER_PT_TRIES = 25; /// Conversion constant const double MASS_TO_MEV = 0.5*PhysicalConstants::NeutronMass/PhysicalConstants::meV; - - /** - * Generate the final energy of a neutron for gold foil analyser at 293K - * in double-difference mode: - * - THIN FOIL NUMBER DENSITY = 1.456E20 ATOMS/SQ CM. - * - THICK FOIL NUMBER DENSITY = 3.0* 1.456E20 ATOMS/SQ CM. - * @param randv A random number between 0.0 & 1.0, sample from a flat distribution - * @return A value to use for the final energy - */ - double finalEnergyAuDD(const double randv) - { - // Tabulated values of absoprtion energies from S.F. Mughabghab, Neutron Cross Sections, Academic - // Press, Orlando, Florida, 1984. - const double ENERGIES[300] = {\ - 2000.0, 2020.7, 2041.5, 2062.2, 2082.9, 2103.7, 2124.4, 2145.2, 2165.9, 2186.6, 2207.4, 2228.1, - 2248.8, 2269.6, 2290.3, 2311.0, 2331.8, 2352.5, 2373.2, 2394.0, 2414.7, 2435.5, 2456.2, 2476.9, - 2497.7, 2518.4, 2539.1, 2559.9, 2580.6, 2601.3, 2622.1, 2642.8, 2663.5, 2684.3, 2705.0, 2725.8, - 2746.5, 2767.2, 2788.0, 2808.7, 2829.4, 2850.2, 2870.9, 2891.6, 2912.4, 2933.1, 2953.8, 2974.6, - 2995.3, 3016.1, 3036.8, 3057.5, 3078.3, 3099.0, 3119.7, 3140.5, 3161.2, 3181.9, 3202.7, 3223.4, - 3244.1, 3264.9, 3285.6, 3306.4, 3327.1, 3347.8, 3368.6, 3389.3, 3410.0, 3430.8, 3451.5, 3472.2, - 3493.0, 3513.7, 3534.4, 3555.2, 3575.9, 3596.7, 3617.4, 3638.1, 3658.9, 3679.6, 3700.3, 3721.1, - 3741.8, 3762.5, 3783.3, 3804.0, 3824.7, 3845.5, 3866.2, 3887.0, 3907.7, 3928.4, 3949.2, 3969.9, - 3990.6, 4011.4, 4032.1, 4052.8, 4073.6, 4094.3, 4115.1, 4135.8, 4156.5, 4177.3, 4198.0, 4218.7, - 4239.5, 4260.2, 4280.9, 4301.7, 4322.4, 4343.1, 4363.9, 4384.6, 4405.4, 4426.1, 4446.8, 4467.6, - 4488.3, 4509.0, 4529.8, 4550.5, 4571.2, 4592.0, 4612.7, 4633.4, 4654.2, 4674.9, 4695.7, 4716.4, - 4737.1, 4757.9, 4778.6, 4799.3, 4820.1, 4840.8, 4861.5, 4882.3, 4903.0, 4923.7, 4944.5, 4965.2, - 4986.0, 5006.7, 5027.4, 5048.2, 5068.9, 5089.6, 5110.4, 5131.1, 5151.8, 5172.6, 5193.3, 5214.0, - 5234.8, 5255.5, 5276.3, 5297.0, 5317.7, 5338.5, 5359.2, 5379.9, 5400.7, 5421.4, 5442.1, 5462.9, - 5483.6, 5504.3, 5525.1, 5545.8, 5566.6, 5587.3, 5608.0, 5628.8, 5649.5, 5670.2, 5691.0, 5711.7, - 5732.4, 5753.2, 5773.9, 5794.6, 5815.4, 5836.1, 5856.9, 5877.6, 5898.3, 5919.1, 5939.8, 5960.5, - 5981.3, 6002.0, 6022.7, 6043.5, 6064.2, 6085.0, 6105.7, 6126.4, 6147.2, 6167.9, 6188.6, 6209.4, - 6230.1, 6250.8, 6271.6, 6292.3, 6313.0, 6333.8, 6354.5, 6375.3, 6396.0, 6416.7, 6437.5, 6458.2, - 6478.9, 6499.7, 6520.4, 6541.1, 6561.9, 6582.6, 6603.3, 6624.1, 6644.8, 6665.6, 6686.3, 6707.0, - 6727.8, 6748.5, 6769.2, 6790.0, 6810.7, 6831.4, 6852.2, 6872.9, 6893.6, 6914.4, 6935.1, 6955.9, - 6976.6, 6997.3, 7018.1, 7038.8, 7059.5, 7080.3, 7101.0, 7121.7, 7142.5, 7163.2, 7183.9, 7204.7, - 7225.4, 7246.2, 7266.9, 7287.6, 7308.4, 7329.1, 7349.8, 7370.6, 7391.3, 7412.0, 7432.8, 7453.5, - 7474.2, 7495.0, 7515.7, 7536.5, 7557.2, 7577.9, 7598.7, 7619.4, 7640.1, 7660.9, 7681.6, 7702.3, - 7723.1, 7743.8, 7764.5, 7785.3, 7806.0, 7826.8, 7847.5, 7868.2, 7889.0, 7909.7, 7930.4, 7951.2, - 7971.9, 7992.6, 8013.4, 8034.1, 8054.8, 8075.6, 8096.3, 8117.1, 8137.8, 8158.5, 8179.3, 8200.0 - }; - - const double XVALUES[300] = {\ - 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, - 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, - 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00010, 0.00010, - 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, - 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, - 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, - 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, 0.00030, 0.00030, 0.00030, 0.00030, 0.00030, 0.00030, - 0.00030, 0.00030, 0.00040, 0.00040, 0.00040, 0.00040, 0.00040, 0.00050, 0.00050, 0.00050, 0.00050, 0.00060, - 0.00060, 0.00070, 0.00070, 0.00070, 0.00080, 0.00090, 0.00090, 0.00100, 0.00110, 0.00110, 0.00120, 0.00130, - 0.00150, 0.00160, 0.00170, 0.00190, 0.00210, 0.00230, 0.00260, 0.00290, 0.00320, 0.00360, 0.00410, 0.00470, - 0.00540, 0.00620, 0.00720, 0.00840, 0.00990, 0.01180, 0.01420, 0.01740, 0.02140, 0.02680, 0.03410, 0.04400, - 0.05770, 0.07680, 0.10360, 0.14050, 0.18960, 0.25110, 0.32310, 0.40240, 0.48540, 0.56870, 0.64930, 0.72370, - 0.78850, 0.84150, 0.88240, 0.91260, 0.93440, 0.95000, 0.96130, 0.96960, 0.97570, 0.98030, 0.98380, 0.98650, - 0.98870, 0.99040, 0.99180, 0.99290, 0.99380, 0.99460, 0.99520, 0.99580, 0.99620, 0.99660, 0.99700, 0.99730, - 0.99750, 0.99770, 0.99790, 0.99810, 0.99830, 0.99840, 0.99850, 0.99860, 0.99870, 0.99880, 0.99890, 0.99900, - 0.99900, 0.99910, 0.99910, 0.99920, 0.99920, 0.99930, 0.99930, 0.99940, 0.99940, 0.99940, 0.99940, 0.99950, - 0.99950, 0.99950, 0.99950, 0.99960, 0.99960, 0.99960, 0.99960, 0.99960, 0.99960, 0.99970, 0.99970, 0.99970, - 0.99970, 0.99970, 0.99970, 0.99970, 0.99970, 0.99970, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, - 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99990, 0.99990, - 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, - 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, - 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, - 0.99990, 0.99990, 0.99990, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, - 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, - 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 - }; - - for(size_t i = 0; i < 299; ++i) - { - if(XVALUES[i] < randv && XVALUES[i+1] > randv) - { - double ef = ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); - if(ef < 100.0) ef = 0.0; - return ef; - } - } - return 0.0; - - - } - - /** - * Generate the final energy of a neutron for gold foil analyser at 293K - * with number density of 7.35E19 atoms/cm^2 in yap difference mode. - * @param randv A random number between 0.0 & 1.0, sample from a flat distribution - * @return A value to use for the final energy - */ - double finalEnergyAuYap(const double randv) - { - // Tabulated values of absoprtion energies from S.F. Mughabghab, Neutron Cross Sections, Academic - // Press, Orlando, Florida, 1984. - const double ENERGIES[600] = {\ - 4000.0, 4003.3, 4006.7, 4010.0, 4013.4, 4016.7, 4020.0, 4023.4, 4026.7, 4030.1, 4033.4, 4036.7, - 4040.1, 4043.4, 4046.7, 4050.1, 4053.4, 4056.8, 4060.1, 4063.4, 4066.8, 4070.1, 4073.5, 4076.8, - 4080.1, 4083.5, 4086.8, 4090.2, 4093.5, 4096.8, 4100.2, 4103.5, 4106.8, 4110.2, 4113.5, 4116.9, - 4120.2, 4123.5, 4126.9, 4130.2, 4133.6, 4136.9, 4140.2, 4143.6, 4146.9, 4150.3, 4153.6, 4156.9, - 4160.3, 4163.6, 4166.9, 4170.3, 4173.6, 4177.0, 4180.3, 4183.6, 4187.0, 4190.3, 4193.7, 4197.0, - 4200.3, 4203.7, 4207.0, 4210.4, 4213.7, 4217.0, 4220.4, 4223.7, 4227.0, 4230.4, 4233.7, 4237.1, - 4240.4, 4243.7, 4247.1, 4250.4, 4253.8, 4257.1, 4260.4, 4263.8, 4267.1, 4270.5, 4273.8, 4277.1, - 4280.5, 4283.8, 4287.1, 4290.5, 4293.8, 4297.2, 4300.5, 4303.8, 4307.2, 4310.5, 4313.9, 4317.2, - 4320.5, 4323.9, 4327.2, 4330.6, 4333.9, 4337.2, 4340.6, 4343.9, 4347.2, 4350.6, 4353.9, 4357.3, - 4360.6, 4363.9, 4367.3, 4370.6, 4374.0, 4377.3, 4380.6, 4384.0, 4387.3, 4390.7, 4394.0, 4397.3, - 4400.7, 4404.0, 4407.3, 4410.7, 4414.0, 4417.4, 4420.7, 4424.0, 4427.4, 4430.7, 4434.1, 4437.4, - 4440.7, 4444.1, 4447.4, 4450.8, 4454.1, 4457.4, 4460.8, 4464.1, 4467.4, 4470.8, 4474.1, 4477.5, - 4480.8, 4484.1, 4487.5, 4490.8, 4494.2, 4497.5, 4500.8, 4504.2, 4507.5, 4510.9, 4514.2, 4517.5, - 4520.9, 4524.2, 4527.5, 4530.9, 4534.2, 4537.6, 4540.9, 4544.2, 4547.6, 4550.9, 4554.3, 4557.6, - 4560.9, 4564.3, 4567.6, 4571.0, 4574.3, 4577.6, 4581.0, 4584.3, 4587.6, 4591.0, 4594.3, 4597.7, - 4601.0, 4604.3, 4607.7, 4611.0, 4614.4, 4617.7, 4621.0, 4624.4, 4627.7, 4631.1, 4634.4, 4637.7, - 4641.1, 4644.4, 4647.7, 4651.1, 4654.4, 4657.8, 4661.1, 4664.4, 4667.8, 4671.1, 4674.5, 4677.8, - 4681.1, 4684.5, 4687.8, 4691.2, 4694.5, 4697.8, 4701.2, 4704.5, 4707.8, 4711.2, 4714.5, 4717.9, - 4721.2, 4724.5, 4727.9, 4731.2, 4734.6, 4737.9, 4741.2, 4744.6, 4747.9, 4751.3, 4754.6, 4757.9, - 4761.3, 4764.6, 4767.9, 4771.3, 4774.6, 4778.0, 4781.3, 4784.6, 4788.0, 4791.3, 4794.7, 4798.0, - 4801.3, 4804.7, 4808.0, 4811.4, 4814.7, 4818.0, 4821.4, 4824.7, 4828.0, 4831.4, 4834.7, 4838.1, - 4841.4, 4844.7, 4848.1, 4851.4, 4854.8, 4858.1, 4861.4, 4864.8, 4868.1, 4871.5, 4874.8, 4878.1, - 4881.5, 4884.8, 4888.1, 4891.5, 4894.8, 4898.2, 4901.5, 4904.8, 4908.2, 4911.5, 4914.9, 4918.2, - 4921.5, 4924.9, 4928.2, 4931.6, 4934.9, 4938.2, 4941.6, 4944.9, 4948.2, 4951.6, 4954.9, 4958.3, - 4961.6, 4964.9, 4968.3, 4971.6, 4975.0, 4978.3, 4981.6, 4985.0, 4988.3, 4991.7, 4995.0, 4998.3, - 5001.7, 5005.0, 5008.3, 5011.7, 5015.0, 5018.4, 5021.7, 5025.0, 5028.4, 5031.7, 5035.1, 5038.4, - 5041.7, 5045.1, 5048.4, 5051.8, 5055.1, 5058.4, 5061.8, 5065.1, 5068.4, 5071.8, 5075.1, 5078.5, - 5081.8, 5085.1, 5088.5, 5091.8, 5095.2, 5098.5, 5101.8, 5105.2, 5108.5, 5111.9, 5115.2, 5118.5, - 5121.9, 5125.2, 5128.5, 5131.9, 5135.2, 5138.6, 5141.9, 5145.2, 5148.6, 5151.9, 5155.3, 5158.6, - 5161.9, 5165.3, 5168.6, 5172.0, 5175.3, 5178.6, 5182.0, 5185.3, 5188.6, 5192.0, 5195.3, 5198.7, - 5202.0, 5205.3, 5208.7, 5212.0, 5215.4, 5218.7, 5222.0, 5225.4, 5228.7, 5232.1, 5235.4, 5238.7, - 5242.1, 5245.4, 5248.7, 5252.1, 5255.4, 5258.8, 5262.1, 5265.4, 5268.8, 5272.1, 5275.5, 5278.8, - 5282.1, 5285.5, 5288.8, 5292.2, 5295.5, 5298.8, 5302.2, 5305.5, 5308.8, 5312.2, 5315.5, 5318.9, - 5322.2, 5325.5, 5328.9, 5332.2, 5335.6, 5338.9, 5342.2, 5345.6, 5348.9, 5352.3, 5355.6, 5358.9, - 5362.3, 5365.6, 5368.9, 5372.3, 5375.6, 5379.0, 5382.3, 5385.6, 5389.0, 5392.3, 5395.7, 5399.0, - 5402.3, 5405.7, 5409.0, 5412.4, 5415.7, 5419.0, 5422.4, 5425.7, 5429.0, 5432.4, 5435.7, 5439.1, - 5442.4, 5445.7, 5449.1, 5452.4, 5455.8, 5459.1, 5462.4, 5465.8, 5469.1, 5472.5, 5475.8, 5479.1, - 5482.5, 5485.8, 5489.1, 5492.5, 5495.8, 5499.2, 5502.5, 5505.8, 5509.2, 5512.5, 5515.9, 5519.2, - 5522.5, 5525.9, 5529.2, 5532.6, 5535.9, 5539.2, 5542.6, 5545.9, 5549.2, 5552.6, 5555.9, 5559.3, - 5562.6, 5565.9, 5569.3, 5572.6, 5576.0, 5579.3, 5582.6, 5586.0, 5589.3, 5592.7, 5596.0, 5599.3, - 5602.7, 5606.0, 5609.3, 5612.7, 5616.0, 5619.4, 5622.7, 5626.0, 5629.4, 5632.7, 5636.1, 5639.4, - 5642.7, 5646.1, 5649.4, 5652.8, 5656.1, 5659.4, 5662.8, 5666.1, 5669.4, 5672.8, 5676.1, 5679.5, - 5682.8, 5686.1, 5689.5, 5692.8, 5696.2, 5699.5, 5702.8, 5706.2, 5709.5, 5712.9, 5716.2, 5719.5, - 5722.9, 5726.2, 5729.5, 5732.9, 5736.2, 5739.6, 5742.9, 5746.2, 5749.6, 5752.9, 5756.3, 5759.6, - 5762.9, 5766.3, 5769.6, 5773.0, 5776.3, 5779.6, 5783.0, 5786.3, 5789.6, 5793.0, 5796.3, 5799.7, - 5803.0, 5806.3, 5809.7, 5813.0, 5816.4, 5819.7, 5823.0, 5826.4, 5829.7, 5833.1, 5836.4, 5839.7, - 5843.1, 5846.4, 5849.7, 5853.1, 5856.4, 5859.8, 5863.1, 5866.4, 5869.8, 5873.1, 5876.5, 5879.8, - 5883.1, 5886.5, 5889.8, 5893.2, 5896.5, 5899.8, 5903.2, 5906.5, 5909.8, 5913.2, 5916.5, 5919.9, - 5923.2, 5926.5, 5929.9, 5933.2, 5936.6, 5939.9, 5943.2, 5946.6, 5949.9, 5953.3, 5956.6, 5959.9, - 5963.3, 5966.6, 5970.0, 5973.3, 5976.6, 5980.0, 5983.3, 5986.6, 5990.0, 5993.3, 5996.7, 6000.0 - }; - - const double XVALUES[600] = {\ - 0.00000, 0.00000, 0.00000, 0.00002, 0.00003, 0.00003, 0.00004, 0.00005, 0.00005, 0.00006, 0.00007, 0.00007, - 0.00008, 0.00009, 0.00010, 0.00010, 0.00011, 0.00012, 0.00013, 0.00014, 0.00015, 0.00015, 0.00016, 0.00017, - 0.00018, 0.00019, 0.00020, 0.00021, 0.00022, 0.00023, 0.00024, 0.00025, 0.00026, 0.00027, 0.00028, 0.00029, - 0.00030, 0.00031, 0.00032, 0.00033, 0.00034, 0.00035, 0.00037, 0.00038, 0.00039, 0.00040, 0.00041, 0.00043, - 0.00044, 0.00045, 0.00047, 0.00048, 0.00049, 0.00051, 0.00052, 0.00054, 0.00055, 0.00057, 0.00058, 0.00060, - 0.00061, 0.00063, 0.00065, 0.00066, 0.00068, 0.00070, 0.00072, 0.00074, 0.00075, 0.00077, 0.00079, 0.00081, - 0.00083, 0.00085, 0.00087, 0.00089, 0.00092, 0.00094, 0.00096, 0.00098, 0.00101, 0.00103, 0.00106, 0.00108, - 0.00111, 0.00113, 0.00116, 0.00118, 0.00121, 0.00124, 0.00127, 0.00130, 0.00133, 0.00136, 0.00139, 0.00142, - 0.00146, 0.00149, 0.00152, 0.00156, 0.00159, 0.00163, 0.00167, 0.00171, 0.00174, 0.00178, 0.00182, 0.00187, - 0.00191, 0.00195, 0.00200, 0.00204, 0.00209, 0.00214, 0.00219, 0.00224, 0.00229, 0.00235, 0.00240, 0.00246, - 0.00251, 0.00257, 0.00263, 0.00269, 0.00276, 0.00282, 0.00289, 0.00296, 0.00303, 0.00310, 0.00318, 0.00325, - 0.00333, 0.00341, 0.00349, 0.00358, 0.00367, 0.00376, 0.00385, 0.00394, 0.00404, 0.00414, 0.00425, 0.00435, - 0.00446, 0.00458, 0.00469, 0.00481, 0.00494, 0.00507, 0.00520, 0.00533, 0.00548, 0.00562, 0.00577, 0.00592, - 0.00608, 0.00625, 0.00642, 0.00659, 0.00677, 0.00696, 0.00716, 0.00736, 0.00757, 0.00778, 0.00800, 0.00823, - 0.00847, 0.00872, 0.00898, 0.00924, 0.00952, 0.00980, 0.01010, 0.01041, 0.01073, 0.01106, 0.01141, 0.01177, - 0.01214, 0.01253, 0.01293, 0.01335, 0.01379, 0.01425, 0.01472, 0.01522, 0.01573, 0.01627, 0.01683, 0.01742, - 0.01803, 0.01867, 0.01934, 0.02004, 0.02077, 0.02154, 0.02234, 0.02317, 0.02405, 0.02497, 0.02594, 0.02695, - 0.02801, 0.02913, 0.03030, 0.03153, 0.03282, 0.03419, 0.03561, 0.03712, 0.03871, 0.04037, 0.04213, 0.04398, - 0.04594, 0.04799, 0.05017, 0.05246, 0.05488, 0.05743, 0.06013, 0.06297, 0.06598, 0.06915, 0.07251, 0.07605, - 0.07979, 0.08374, 0.08791, 0.09230, 0.09694, 0.10183, 0.10698, 0.11241, 0.11812, 0.12411, 0.13041, 0.13703, - 0.14395, 0.15119, 0.15877, 0.16667, 0.17490, 0.18347, 0.19237, 0.20159, 0.21114, 0.22100, 0.23117, 0.24164, - 0.25240, 0.26344, 0.27473, 0.28628, 0.29807, 0.31007, 0.32228, 0.33468, 0.34725, 0.35999, 0.37286, 0.38586, - 0.39898, 0.41219, 0.42549, 0.43886, 0.45228, 0.46575, 0.47925, 0.49277, 0.50628, 0.51980, 0.53329, 0.54674, - 0.56016, 0.57350, 0.58677, 0.59996, 0.61304, 0.62600, 0.63883, 0.65152, 0.66403, 0.67638, 0.68853, 0.70048, - 0.71220, 0.72369, 0.73492, 0.74590, 0.75659, 0.76700, 0.77711, 0.78691, 0.79640, 0.80557, 0.81442, 0.82294, - 0.83113, 0.83900, 0.84654, 0.85376, 0.86067, 0.86726, 0.87355, 0.87954, 0.88525, 0.89067, 0.89583, 0.90073, - 0.90537, 0.90979, 0.91398, 0.91794, 0.92170, 0.92527, 0.92865, 0.93185, 0.93489, 0.93776, 0.94049, 0.94307, - 0.94552, 0.94784, 0.95005, 0.95213, 0.95412, 0.95600, 0.95779, 0.95949, 0.96110, 0.96264, 0.96410, 0.96549, - 0.96681, 0.96807, 0.96927, 0.97041, 0.97150, 0.97254, 0.97353, 0.97447, 0.97538, 0.97624, 0.97706, 0.97785, - 0.97860, 0.97933, 0.98002, 0.98068, 0.98131, 0.98192, 0.98250, 0.98306, 0.98359, 0.98411, 0.98460, 0.98507, - 0.98553, 0.98596, 0.98638, 0.98679, 0.98718, 0.98755, 0.98791, 0.98826, 0.98859, 0.98892, 0.98923, 0.98953, - 0.98981, 0.99009, 0.99036, 0.99062, 0.99087, 0.99111, 0.99135, 0.99158, 0.99179, 0.99201, 0.99221, 0.99241, - 0.99260, 0.99279, 0.99296, 0.99314, 0.99331, 0.99347, 0.99363, 0.99378, 0.99393, 0.99408, 0.99422, 0.99435, - 0.99448, 0.99461, 0.99473, 0.99486, 0.99497, 0.99509, 0.99520, 0.99530, 0.99541, 0.99551, 0.99561, 0.99571, - 0.99580, 0.99589, 0.99598, 0.99607, 0.99615, 0.99623, 0.99631, 0.99639, 0.99647, 0.99654, 0.99661, 0.99668, - 0.99675, 0.99682, 0.99688, 0.99694, 0.99701, 0.99707, 0.99713, 0.99718, 0.99724, 0.99729, 0.99735, 0.99740, - 0.99745, 0.99750, 0.99755, 0.99760, 0.99764, 0.99769, 0.99773, 0.99778, 0.99782, 0.99786, 0.99790, 0.99794, - 0.99798, 0.99802, 0.99806, 0.99809, 0.99813, 0.99816, 0.99820, 0.99823, 0.99827, 0.99830, 0.99833, 0.99836, - 0.99839, 0.99842, 0.99845, 0.99848, 0.99850, 0.99853, 0.99856, 0.99859, 0.99861, 0.99864, 0.99866, 0.99869, - 0.99871, 0.99873, 0.99876, 0.99878, 0.99880, 0.99882, 0.99884, 0.99886, 0.99889, 0.99891, 0.99893, 0.99895, - 0.99896, 0.99898, 0.99900, 0.99902, 0.99904, 0.99906, 0.99907, 0.99909, 0.99911, 0.99912, 0.99914, 0.99915, - 0.99917, 0.99919, 0.99920, 0.99922, 0.99923, 0.99924, 0.99926, 0.99927, 0.99929, 0.99930, 0.99931, 0.99933, - 0.99934, 0.99935, 0.99936, 0.99938, 0.99939, 0.99940, 0.99941, 0.99942, 0.99943, 0.99944, 0.99946, 0.99947, - 0.99948, 0.99949, 0.99950, 0.99951, 0.99952, 0.99953, 0.99954, 0.99955, 0.99956, 0.99956, 0.99957, 0.99958, - 0.99959, 0.99960, 0.99961, 0.99962, 0.99963, 0.99963, 0.99964, 0.99965, 0.99966, 0.99967, 0.99967, 0.99968, - 0.99969, 0.99970, 0.99970, 0.99971, 0.99972, 0.99973, 0.99973, 0.99974, 0.99975, 0.99975, 0.99976, 0.99977, - 0.99977, 0.99978, 0.99979, 0.99979, 0.99980, 0.99980, 0.99981, 0.99982, 0.99982, 0.99983, 0.99983, 0.99984, - 0.99984, 0.99985, 0.99985, 0.99986, 0.99986, 0.99987, 0.99988, 0.99988, 0.99989, 0.99989, 0.99990, 0.99990, - 0.99990, 0.99991, 0.99991, 0.99992, 0.99992, 0.99993, 0.99993, 0.99994, 0.99994, 0.99994, 0.99995, 0.99995, - 0.99996, 0.99996, 0.99997, 0.99997, 0.99997, 0.99998, 0.99998, 0.99998, 0.99999, 0.99999, 1.00000, 1.00000 - }; - - for(size_t i = 0; i < 599; ++i) - { - if(XVALUES[i] < randv && XVALUES[i+1] > randv) - { - return ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); - } - } - return 0.0; - } - - /** - * Generate the final energy of a neutron for uranium foil analyser at 293K - * with number density of 1.456E20 atoms/cm^2 in double-difference mode. - * @param randv A random number between 0.0 & 1.0, sample from a flat distribution - * @return A value to use for the final energy - */ - double finalEnergyUranium(const double randv) - { - const double ENERGIES[201] = {\ - 5959.0, 5967.7, 5976.4, 5985.1, 5993.8, 6002.5, 6011.2, 6019.9, 6028.6, 6037.3, 6046.0, 6054.8, - 6063.5, 6072.2, 6080.9, 6089.6, 6098.3, 6107.0, 6115.7, 6124.4, 6133.1, 6141.8, 6150.5, 6159.2, - 6167.9, 6176.6, 6185.3, 6194.0, 6202.7, 6211.4, 6220.1, 6228.9, 6237.6, 6246.3, 6255.0, 6263.7, - 6272.4, 6281.1, 6289.8, 6298.5, 6307.2, 6315.9, 6324.6, 6333.3, 6342.0, 6350.7, 6359.4, 6368.1, - 6376.8, 6385.5, 6394.3, 6403.0, 6411.7, 6420.4, 6429.1, 6437.8, 6446.5, 6455.2, 6463.9, 6472.6, - 6481.3, 6490.0, 6498.7, 6507.4, 6516.1, 6524.8, 6533.5, 6542.2, 6550.9, 6559.6, 6568.4, 6577.1, - 6585.8, 6594.5, 6603.2, 6611.9, 6620.6, 6629.3, 6638.0, 6646.7, 6655.4, 6664.1, 6672.8, 6681.5, - 6690.2, 6698.9, 6707.6, 6716.3, 6725.0, 6733.7, 6742.5, 6751.2, 6759.9, 6768.6, 6777.3, 6786.0, - 6794.7, 6803.4, 6812.1, 6820.8, 6829.5, 6838.2, 6846.9, 6855.6, 6864.3, 6873.0, 6881.7, 6890.4, - 6899.1, 6907.8, 6916.5, 6925.3, 6934.0, 6942.7, 6951.4, 6960.1, 6968.8, 6977.5, 6986.2, 6994.9, - 7003.6, 7012.3, 7021.0, 7029.7, 7038.4, 7047.1, 7055.8, 7064.5, 7073.2, 7081.9, 7090.6, 7099.4, - 7108.1, 7116.8, 7125.5, 7134.2, 7142.9, 7151.6, 7160.3, 7169.0, 7177.7, 7186.4, 7195.1, 7203.8, - 7212.5, 7221.2, 7229.9, 7238.6, 7247.3, 7256.0, 7264.8, 7273.5, 7282.2, 7290.9, 7299.6, 7308.3, - 7317.0, 7325.7, 7334.4, 7343.1, 7351.8, 7360.5, 7369.2, 7377.9, 7386.6, 7395.3, 7404.0, 7412.7, - 7421.4, 7430.1, 7438.9, 7447.6, 7456.3, 7465.0, 7473.7, 7482.4, 7491.1, 7499.8, 7508.5, 7517.2, - 7525.9, 7534.6, 7543.3, 7552.0, 7560.7, 7569.4, 7578.1, 7586.8, 7595.5, 7604.2, 7613.0, 7621.7, - 7630.4, 7639.1, 7647.8, 7656.5, 7665.2, 7673.9, 7682.6, 7691.3, 7700.0 - }; - - const double XVALUES[201] = {\ - 0.00000, 0.00000, 0.00000, 0.00020, 0.00030, 0.00040, 0.00050, 0.00060, 0.00070, 0.00080, 0.00090, 0.00110, - 0.00120, 0.00140, 0.00150, 0.00170, 0.00190, 0.00210, 0.00230, 0.00250, 0.00270, 0.00290, 0.00310, 0.00340, - 0.00360, 0.00390, 0.00410, 0.00440, 0.00470, 0.00500, 0.00530, 0.00560, 0.00590, 0.00620, 0.00650, 0.00690, - 0.00720, 0.00760, 0.00800, 0.00840, 0.00880, 0.00920, 0.00960, 0.01010, 0.01050, 0.01100, 0.01150, 0.01210, - 0.01270, 0.01330, 0.01390, 0.01460, 0.01530, 0.01610, 0.01690, 0.01780, 0.01870, 0.01970, 0.02090, 0.02210, - 0.02350, 0.02500, 0.02660, 0.02850, 0.03070, 0.03320, 0.03620, 0.03990, 0.04440, 0.05020, 0.05780, 0.06790, - 0.08120, 0.09880, 0.12150, 0.15020, 0.18520, 0.22640, 0.27340, 0.32510, 0.38050, 0.43830, 0.49720, 0.55580, - 0.61290, 0.66710, 0.71740, 0.76250, 0.80190, 0.83510, 0.86220, 0.88380, 0.90050, 0.91340, 0.92340, 0.93100, - 0.93710, 0.94200, 0.94600, 0.94940, 0.95230, 0.95490, 0.95710, 0.95920, 0.96100, 0.96270, 0.96430, 0.96580, - 0.96710, 0.96840, 0.96950, 0.97060, 0.97170, 0.97270, 0.97360, 0.97450, 0.97540, 0.97620, 0.97700, 0.97770, - 0.97840, 0.97910, 0.97980, 0.98040, 0.98100, 0.98160, 0.98220, 0.98280, 0.98330, 0.98390, 0.98440, 0.98490, - 0.98540, 0.98590, 0.98630, 0.98680, 0.98720, 0.98770, 0.98810, 0.98850, 0.98890, 0.98930, 0.98970, 0.99010, - 0.99050, 0.99090, 0.99130, 0.99160, 0.99200, 0.99230, 0.99270, 0.99300, 0.99330, 0.99360, 0.99400, 0.99430, - 0.99460, 0.99480, 0.99510, 0.99540, 0.99560, 0.99590, 0.99610, 0.99640, 0.99660, 0.99680, 0.99710, 0.99730, - 0.99750, 0.99770, 0.99780, 0.99800, 0.99820, 0.99840, 0.99850, 0.99870, 0.99880, 0.99890, 0.99910, 0.99920, - 0.99930, 0.99940, 0.99950, 0.99960, 0.99960, 0.99970, 0.99980, 0.99980, 0.99990, 0.99990, 0.99990, 1.00000, - 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 - }; - - for(size_t i = 0; i < 200; ++i) - { - if(XVALUES[i] < randv && XVALUES[i+1] > randv) - { - return ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); - } - } - - return 0.0; - } - - } // end anonymous namespace //------------------------------------------------------------------------- - // RandomNumberGenerator helper - //------------------------------------------------------------------------- - /** - * Produces random numbers with various probability distributions - */ - CalculateMSVesuvio:: - RandomNumberGenerator::RandomNumberGenerator(const int seed) : m_generator() - { - m_generator.seed(static_cast(seed)); - } - /// Returns a flat random number between 0.0 & 1.0 - double CalculateMSVesuvio:: - RandomNumberGenerator::flat() - { - return uniform_double()(m_generator, - uniform_double::param_type(0.0, 1.0)); - } - /// Returns a random number distributed by a normal distribution - double CalculateMSVesuvio:: - RandomNumberGenerator::gaussian(const double mean, const double sigma) - { - return gaussian_double()(m_generator, - gaussian_double::param_type(mean, sigma)); - } - - //------------------------------------------------------------------------- - // Simulation helper - //------------------------------------------------------------------------- - /** - * Stores counts for each scatter order - * for a "run" of a given number of events - */ - CalculateMSVesuvio::Simulation:: - Simulation(const size_t order, const size_t ntimes) : - counts(order, std::vector(ntimes)), - maxorder(order) - {} - //------------------------------------------------------------------------- - // SimulationAggreator - //------------------------------------------------------------------------- - /** - * Accumulates and averages the results - * of each simulation - * @param nruns The number of runs that will be computed - */ - CalculateMSVesuvio::SimulationAggregator:: - SimulationAggregator(const size_t nruns) - { - results.reserve(nruns); - } - - /** - * @param order The number of requested scatterings - * @param ntimes The number of times on input workspace - * @return A reference to a new Simulation object - */ - CalculateMSVesuvio::Simulation & - CalculateMSVesuvio::SimulationAggregator:: - newSimulation(const size_t order, const size_t ntimes) - { - results.push_back(Simulation(order, ntimes)); - return results.back(); - } - - /** - * @return The mean and standard deviation of the current set of simulations - */ - CalculateMSVesuvio::SimulationWithErrors - CalculateMSVesuvio::SimulationAggregator::average() const - { - const size_t maxorder(results[0].maxorder), ntimes(results[0].counts[0].size()), - nruns(results.size()); - SimulationWithErrors retval(maxorder, ntimes); - - for(size_t i = 0; i < maxorder; ++i) - { - auto & orderCounts = retval.sim.counts[i]; - auto & orderErrors = retval.errors[i]; - for(size_t j = 0; j < ntimes; ++j) - { - double mean(0.0); - size_t npoints(0); - for(size_t k = 0; k < nruns; ++k) - { - const double val = results[k].counts[i][j]; - if(val > 0.0) - { - mean += val; - npoints +=1; - } - } - if(npoints < 2) - { - orderCounts[j] = 0.0; - orderErrors[j] = 0.0; - } - else - { - const double dblPts = static_cast(npoints); - orderCounts[j] = mean/dblPts; - // error is std dev - double sumsq(0.0); - for(size_t k = 0; k < nruns; ++k) - { - const double val = results[k].counts[i][j]; - if(val > 0.0) - { - const double diff = (val - mean); - sumsq += diff*diff; - } - } - orderErrors[j] = sqrt(sumsq/(dblPts*(dblPts-1))); - } - } - } - - return retval; - } - //------------------------------------------------------------------------- - // SimulationWithErrors - //------------------------------------------------------------------------- - /** - * Normalise the counts so that the integral over the single-scatter - * events is 1. - */ - void CalculateMSVesuvio::SimulationWithErrors::normalise() - { - const double sumSingle = std::accumulate(sim.counts.front().begin(), - sim.counts.front().end(), 0.0); - if(sumSingle > 0.0) - { - const double invSum = 1.0/sumSingle; // multiply is faster - // Divide everything by the sum - const size_t nscatters = sim.counts.size(); - for(size_t i = 0; i < nscatters; ++i) - { - auto & counts = sim.counts[i]; - auto & scerrors = this->errors[i]; - for(auto cit = counts.begin(), eit = scerrors.begin(); cit != counts.end(); - ++cit, ++eit) - { - (*cit) *= invSum; - (*eit) *= invSum; - } - } - } - } - - //------------------------------------------------------------------------- - // Algorithm definitions + // Member functions //------------------------------------------------------------------------- // Register the algorithm into the AlgorithmFactory @@ -557,7 +140,7 @@ namespace Mantid MatrixWorkspace_sptr multsc = WorkspaceFactory::Instance().create(m_inputWS); // Initialize random number generator - m_randgen = new RandomNumberGenerator(getProperty("Seed")); + m_randgen = new MSVesuvioHelper::RandomNumberGenerator(getProperty("Seed")); // Setup progress const int64_t nhist = static_cast(m_inputWS->getNumberHistograms()); @@ -732,7 +315,7 @@ namespace Mantid ResolutionParams respar = VesuvioResolution::getResolutionParameters(m_inputWS, wsIndex); // Final counts averaged over all simulations - SimulationAggregator accumulator(m_nruns); + MSVesuvioHelper::SimulationAggregator accumulator(m_nruns); for(size_t i = 0; i < m_nruns; ++i) { m_progress->report("MS calculation: idx=" + boost::lexical_cast(wsIndex) @@ -746,7 +329,7 @@ namespace Mantid } // Average over all runs and assign to output workspaces - SimulationWithErrors avgCounts = accumulator.average(); + MSVesuvioHelper::SimulationWithErrors avgCounts = accumulator.average(); avgCounts.normalise(); assignToOutput(avgCounts, totalsc, multsc); } @@ -760,7 +343,7 @@ namespace Mantid */ void CalculateMSVesuvio::simulate(const DetectorParams & detpar, const ResolutionParams &respar, - Simulation & simulCounts) const + MSVesuvioHelper::Simulation & simulCounts) const { for(size_t i = 0; i < m_nevents; ++i) { @@ -775,7 +358,7 @@ namespace Mantid * @param multsc A non-const reference to the spectrum for the multiple scattering contribution */ void - CalculateMSVesuvio::assignToOutput(const CalculateMSVesuvio::SimulationWithErrors &avgCounts, + CalculateMSVesuvio::assignToOutput(const MSVesuvioHelper::SimulationWithErrors &avgCounts, API::ISpectrum & totalsc, API::ISpectrum & multsc) const { // Sum up all multiple scatter events @@ -811,7 +394,7 @@ namespace Mantid */ double CalculateMSVesuvio::calculateCounts(const DetectorParams &detpar, const ResolutionParams &respar, - Simulation &simulation) const + MSVesuvioHelper::Simulation &simulation) const { double weightSum(0.0); @@ -1191,12 +774,12 @@ namespace Mantid const double randv = m_randgen->flat(); if(e1nom < 5000.0) { - if(angle > 90.0) return finalEnergyAuDD(randv); - else return finalEnergyAuYap(randv); + if(angle > 90.0) return MSVesuvioHelper::finalEnergyAuDD(randv); + else return MSVesuvioHelper::finalEnergyAuYap(randv); } else { - return finalEnergyUranium(randv); + return MSVesuvioHelper::finalEnergyUranium(randv); } } diff --git a/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp b/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp new file mode 100644 index 000000000000..5e2269c1914e --- /dev/null +++ b/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp @@ -0,0 +1,420 @@ +//----------------------------------------------------------------------------- +// Includes +//----------------------------------------------------------------------------- +#include "MantidCurveFitting/MSVesuvioHelpers.h" + +#include + +namespace Mantid { namespace CurveFitting +{ + namespace MSVesuvioHelper + { + + /** + * Generate the final energy of a neutron for gold foil analyser at 293K + * in double-difference mode: + * - THIN FOIL NUMBER DENSITY = 1.456E20 ATOMS/SQ CM. + * - THICK FOIL NUMBER DENSITY = 3.0* 1.456E20 ATOMS/SQ CM. + * @param randv A random number between 0.0 & 1.0, sample from a flat distribution + * @return A value to use for the final energy + */ + double finalEnergyAuDD(const double randv) + { + // Tabulated values of absoprtion energies from S.F. Mughabghab, Neutron Cross Sections, Academic + // Press, Orlando, Florida, 1984. + const double ENERGIES[300] = {\ + 2000.0, 2020.7, 2041.5, 2062.2, 2082.9, 2103.7, 2124.4, 2145.2, 2165.9, 2186.6, 2207.4, 2228.1, + 2248.8, 2269.6, 2290.3, 2311.0, 2331.8, 2352.5, 2373.2, 2394.0, 2414.7, 2435.5, 2456.2, 2476.9, + 2497.7, 2518.4, 2539.1, 2559.9, 2580.6, 2601.3, 2622.1, 2642.8, 2663.5, 2684.3, 2705.0, 2725.8, + 2746.5, 2767.2, 2788.0, 2808.7, 2829.4, 2850.2, 2870.9, 2891.6, 2912.4, 2933.1, 2953.8, 2974.6, + 2995.3, 3016.1, 3036.8, 3057.5, 3078.3, 3099.0, 3119.7, 3140.5, 3161.2, 3181.9, 3202.7, 3223.4, + 3244.1, 3264.9, 3285.6, 3306.4, 3327.1, 3347.8, 3368.6, 3389.3, 3410.0, 3430.8, 3451.5, 3472.2, + 3493.0, 3513.7, 3534.4, 3555.2, 3575.9, 3596.7, 3617.4, 3638.1, 3658.9, 3679.6, 3700.3, 3721.1, + 3741.8, 3762.5, 3783.3, 3804.0, 3824.7, 3845.5, 3866.2, 3887.0, 3907.7, 3928.4, 3949.2, 3969.9, + 3990.6, 4011.4, 4032.1, 4052.8, 4073.6, 4094.3, 4115.1, 4135.8, 4156.5, 4177.3, 4198.0, 4218.7, + 4239.5, 4260.2, 4280.9, 4301.7, 4322.4, 4343.1, 4363.9, 4384.6, 4405.4, 4426.1, 4446.8, 4467.6, + 4488.3, 4509.0, 4529.8, 4550.5, 4571.2, 4592.0, 4612.7, 4633.4, 4654.2, 4674.9, 4695.7, 4716.4, + 4737.1, 4757.9, 4778.6, 4799.3, 4820.1, 4840.8, 4861.5, 4882.3, 4903.0, 4923.7, 4944.5, 4965.2, + 4986.0, 5006.7, 5027.4, 5048.2, 5068.9, 5089.6, 5110.4, 5131.1, 5151.8, 5172.6, 5193.3, 5214.0, + 5234.8, 5255.5, 5276.3, 5297.0, 5317.7, 5338.5, 5359.2, 5379.9, 5400.7, 5421.4, 5442.1, 5462.9, + 5483.6, 5504.3, 5525.1, 5545.8, 5566.6, 5587.3, 5608.0, 5628.8, 5649.5, 5670.2, 5691.0, 5711.7, + 5732.4, 5753.2, 5773.9, 5794.6, 5815.4, 5836.1, 5856.9, 5877.6, 5898.3, 5919.1, 5939.8, 5960.5, + 5981.3, 6002.0, 6022.7, 6043.5, 6064.2, 6085.0, 6105.7, 6126.4, 6147.2, 6167.9, 6188.6, 6209.4, + 6230.1, 6250.8, 6271.6, 6292.3, 6313.0, 6333.8, 6354.5, 6375.3, 6396.0, 6416.7, 6437.5, 6458.2, + 6478.9, 6499.7, 6520.4, 6541.1, 6561.9, 6582.6, 6603.3, 6624.1, 6644.8, 6665.6, 6686.3, 6707.0, + 6727.8, 6748.5, 6769.2, 6790.0, 6810.7, 6831.4, 6852.2, 6872.9, 6893.6, 6914.4, 6935.1, 6955.9, + 6976.6, 6997.3, 7018.1, 7038.8, 7059.5, 7080.3, 7101.0, 7121.7, 7142.5, 7163.2, 7183.9, 7204.7, + 7225.4, 7246.2, 7266.9, 7287.6, 7308.4, 7329.1, 7349.8, 7370.6, 7391.3, 7412.0, 7432.8, 7453.5, + 7474.2, 7495.0, 7515.7, 7536.5, 7557.2, 7577.9, 7598.7, 7619.4, 7640.1, 7660.9, 7681.6, 7702.3, + 7723.1, 7743.8, 7764.5, 7785.3, 7806.0, 7826.8, 7847.5, 7868.2, 7889.0, 7909.7, 7930.4, 7951.2, + 7971.9, 7992.6, 8013.4, 8034.1, 8054.8, 8075.6, 8096.3, 8117.1, 8137.8, 8158.5, 8179.3, 8200.0 + }; + const double XVALUES[300] = {\ + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, + 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00010, 0.00010, + 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, + 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, + 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00010, 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, + 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, 0.00020, 0.00030, 0.00030, 0.00030, 0.00030, 0.00030, 0.00030, + 0.00030, 0.00030, 0.00040, 0.00040, 0.00040, 0.00040, 0.00040, 0.00050, 0.00050, 0.00050, 0.00050, 0.00060, + 0.00060, 0.00070, 0.00070, 0.00070, 0.00080, 0.00090, 0.00090, 0.00100, 0.00110, 0.00110, 0.00120, 0.00130, + 0.00150, 0.00160, 0.00170, 0.00190, 0.00210, 0.00230, 0.00260, 0.00290, 0.00320, 0.00360, 0.00410, 0.00470, + 0.00540, 0.00620, 0.00720, 0.00840, 0.00990, 0.01180, 0.01420, 0.01740, 0.02140, 0.02680, 0.03410, 0.04400, + 0.05770, 0.07680, 0.10360, 0.14050, 0.18960, 0.25110, 0.32310, 0.40240, 0.48540, 0.56870, 0.64930, 0.72370, + 0.78850, 0.84150, 0.88240, 0.91260, 0.93440, 0.95000, 0.96130, 0.96960, 0.97570, 0.98030, 0.98380, 0.98650, + 0.98870, 0.99040, 0.99180, 0.99290, 0.99380, 0.99460, 0.99520, 0.99580, 0.99620, 0.99660, 0.99700, 0.99730, + 0.99750, 0.99770, 0.99790, 0.99810, 0.99830, 0.99840, 0.99850, 0.99860, 0.99870, 0.99880, 0.99890, 0.99900, + 0.99900, 0.99910, 0.99910, 0.99920, 0.99920, 0.99930, 0.99930, 0.99940, 0.99940, 0.99940, 0.99940, 0.99950, + 0.99950, 0.99950, 0.99950, 0.99960, 0.99960, 0.99960, 0.99960, 0.99960, 0.99960, 0.99970, 0.99970, 0.99970, + 0.99970, 0.99970, 0.99970, 0.99970, 0.99970, 0.99970, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, + 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99980, 0.99990, 0.99990, + 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, + 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, + 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, 0.99990, + 0.99990, 0.99990, 0.99990, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, + 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, + 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 + }; + + for(size_t i = 0; i < 299; ++i) + { + if(XVALUES[i] < randv && XVALUES[i+1] > randv) + { + double ef = ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); + if(ef < 100.0) ef = 0.0; + return ef; + } + } + return 0.0; + + + } + + /** + * Generate the final energy of a neutron for gold foil analyser at 293K + * with number density of 7.35E19 atoms/cm^2 in yap difference mode. + * @param randv A random number between 0.0 & 1.0, sample from a flat distribution + * @return A value to use for the final energy + */ + double finalEnergyAuYap(const double randv) + { + // Tabulated values of absoprtion energies from S.F. Mughabghab, Neutron Cross Sections, Academic + // Press, Orlando, Florida, 1984. + const double ENERGIES[600] = {\ + 4000.0, 4003.3, 4006.7, 4010.0, 4013.4, 4016.7, 4020.0, 4023.4, 4026.7, 4030.1, 4033.4, 4036.7, + 4040.1, 4043.4, 4046.7, 4050.1, 4053.4, 4056.8, 4060.1, 4063.4, 4066.8, 4070.1, 4073.5, 4076.8, + 4080.1, 4083.5, 4086.8, 4090.2, 4093.5, 4096.8, 4100.2, 4103.5, 4106.8, 4110.2, 4113.5, 4116.9, + 4120.2, 4123.5, 4126.9, 4130.2, 4133.6, 4136.9, 4140.2, 4143.6, 4146.9, 4150.3, 4153.6, 4156.9, + 4160.3, 4163.6, 4166.9, 4170.3, 4173.6, 4177.0, 4180.3, 4183.6, 4187.0, 4190.3, 4193.7, 4197.0, + 4200.3, 4203.7, 4207.0, 4210.4, 4213.7, 4217.0, 4220.4, 4223.7, 4227.0, 4230.4, 4233.7, 4237.1, + 4240.4, 4243.7, 4247.1, 4250.4, 4253.8, 4257.1, 4260.4, 4263.8, 4267.1, 4270.5, 4273.8, 4277.1, + 4280.5, 4283.8, 4287.1, 4290.5, 4293.8, 4297.2, 4300.5, 4303.8, 4307.2, 4310.5, 4313.9, 4317.2, + 4320.5, 4323.9, 4327.2, 4330.6, 4333.9, 4337.2, 4340.6, 4343.9, 4347.2, 4350.6, 4353.9, 4357.3, + 4360.6, 4363.9, 4367.3, 4370.6, 4374.0, 4377.3, 4380.6, 4384.0, 4387.3, 4390.7, 4394.0, 4397.3, + 4400.7, 4404.0, 4407.3, 4410.7, 4414.0, 4417.4, 4420.7, 4424.0, 4427.4, 4430.7, 4434.1, 4437.4, + 4440.7, 4444.1, 4447.4, 4450.8, 4454.1, 4457.4, 4460.8, 4464.1, 4467.4, 4470.8, 4474.1, 4477.5, + 4480.8, 4484.1, 4487.5, 4490.8, 4494.2, 4497.5, 4500.8, 4504.2, 4507.5, 4510.9, 4514.2, 4517.5, + 4520.9, 4524.2, 4527.5, 4530.9, 4534.2, 4537.6, 4540.9, 4544.2, 4547.6, 4550.9, 4554.3, 4557.6, + 4560.9, 4564.3, 4567.6, 4571.0, 4574.3, 4577.6, 4581.0, 4584.3, 4587.6, 4591.0, 4594.3, 4597.7, + 4601.0, 4604.3, 4607.7, 4611.0, 4614.4, 4617.7, 4621.0, 4624.4, 4627.7, 4631.1, 4634.4, 4637.7, + 4641.1, 4644.4, 4647.7, 4651.1, 4654.4, 4657.8, 4661.1, 4664.4, 4667.8, 4671.1, 4674.5, 4677.8, + 4681.1, 4684.5, 4687.8, 4691.2, 4694.5, 4697.8, 4701.2, 4704.5, 4707.8, 4711.2, 4714.5, 4717.9, + 4721.2, 4724.5, 4727.9, 4731.2, 4734.6, 4737.9, 4741.2, 4744.6, 4747.9, 4751.3, 4754.6, 4757.9, + 4761.3, 4764.6, 4767.9, 4771.3, 4774.6, 4778.0, 4781.3, 4784.6, 4788.0, 4791.3, 4794.7, 4798.0, + 4801.3, 4804.7, 4808.0, 4811.4, 4814.7, 4818.0, 4821.4, 4824.7, 4828.0, 4831.4, 4834.7, 4838.1, + 4841.4, 4844.7, 4848.1, 4851.4, 4854.8, 4858.1, 4861.4, 4864.8, 4868.1, 4871.5, 4874.8, 4878.1, + 4881.5, 4884.8, 4888.1, 4891.5, 4894.8, 4898.2, 4901.5, 4904.8, 4908.2, 4911.5, 4914.9, 4918.2, + 4921.5, 4924.9, 4928.2, 4931.6, 4934.9, 4938.2, 4941.6, 4944.9, 4948.2, 4951.6, 4954.9, 4958.3, + 4961.6, 4964.9, 4968.3, 4971.6, 4975.0, 4978.3, 4981.6, 4985.0, 4988.3, 4991.7, 4995.0, 4998.3, + 5001.7, 5005.0, 5008.3, 5011.7, 5015.0, 5018.4, 5021.7, 5025.0, 5028.4, 5031.7, 5035.1, 5038.4, + 5041.7, 5045.1, 5048.4, 5051.8, 5055.1, 5058.4, 5061.8, 5065.1, 5068.4, 5071.8, 5075.1, 5078.5, + 5081.8, 5085.1, 5088.5, 5091.8, 5095.2, 5098.5, 5101.8, 5105.2, 5108.5, 5111.9, 5115.2, 5118.5, + 5121.9, 5125.2, 5128.5, 5131.9, 5135.2, 5138.6, 5141.9, 5145.2, 5148.6, 5151.9, 5155.3, 5158.6, + 5161.9, 5165.3, 5168.6, 5172.0, 5175.3, 5178.6, 5182.0, 5185.3, 5188.6, 5192.0, 5195.3, 5198.7, + 5202.0, 5205.3, 5208.7, 5212.0, 5215.4, 5218.7, 5222.0, 5225.4, 5228.7, 5232.1, 5235.4, 5238.7, + 5242.1, 5245.4, 5248.7, 5252.1, 5255.4, 5258.8, 5262.1, 5265.4, 5268.8, 5272.1, 5275.5, 5278.8, + 5282.1, 5285.5, 5288.8, 5292.2, 5295.5, 5298.8, 5302.2, 5305.5, 5308.8, 5312.2, 5315.5, 5318.9, + 5322.2, 5325.5, 5328.9, 5332.2, 5335.6, 5338.9, 5342.2, 5345.6, 5348.9, 5352.3, 5355.6, 5358.9, + 5362.3, 5365.6, 5368.9, 5372.3, 5375.6, 5379.0, 5382.3, 5385.6, 5389.0, 5392.3, 5395.7, 5399.0, + 5402.3, 5405.7, 5409.0, 5412.4, 5415.7, 5419.0, 5422.4, 5425.7, 5429.0, 5432.4, 5435.7, 5439.1, + 5442.4, 5445.7, 5449.1, 5452.4, 5455.8, 5459.1, 5462.4, 5465.8, 5469.1, 5472.5, 5475.8, 5479.1, + 5482.5, 5485.8, 5489.1, 5492.5, 5495.8, 5499.2, 5502.5, 5505.8, 5509.2, 5512.5, 5515.9, 5519.2, + 5522.5, 5525.9, 5529.2, 5532.6, 5535.9, 5539.2, 5542.6, 5545.9, 5549.2, 5552.6, 5555.9, 5559.3, + 5562.6, 5565.9, 5569.3, 5572.6, 5576.0, 5579.3, 5582.6, 5586.0, 5589.3, 5592.7, 5596.0, 5599.3, + 5602.7, 5606.0, 5609.3, 5612.7, 5616.0, 5619.4, 5622.7, 5626.0, 5629.4, 5632.7, 5636.1, 5639.4, + 5642.7, 5646.1, 5649.4, 5652.8, 5656.1, 5659.4, 5662.8, 5666.1, 5669.4, 5672.8, 5676.1, 5679.5, + 5682.8, 5686.1, 5689.5, 5692.8, 5696.2, 5699.5, 5702.8, 5706.2, 5709.5, 5712.9, 5716.2, 5719.5, + 5722.9, 5726.2, 5729.5, 5732.9, 5736.2, 5739.6, 5742.9, 5746.2, 5749.6, 5752.9, 5756.3, 5759.6, + 5762.9, 5766.3, 5769.6, 5773.0, 5776.3, 5779.6, 5783.0, 5786.3, 5789.6, 5793.0, 5796.3, 5799.7, + 5803.0, 5806.3, 5809.7, 5813.0, 5816.4, 5819.7, 5823.0, 5826.4, 5829.7, 5833.1, 5836.4, 5839.7, + 5843.1, 5846.4, 5849.7, 5853.1, 5856.4, 5859.8, 5863.1, 5866.4, 5869.8, 5873.1, 5876.5, 5879.8, + 5883.1, 5886.5, 5889.8, 5893.2, 5896.5, 5899.8, 5903.2, 5906.5, 5909.8, 5913.2, 5916.5, 5919.9, + 5923.2, 5926.5, 5929.9, 5933.2, 5936.6, 5939.9, 5943.2, 5946.6, 5949.9, 5953.3, 5956.6, 5959.9, + 5963.3, 5966.6, 5970.0, 5973.3, 5976.6, 5980.0, 5983.3, 5986.6, 5990.0, 5993.3, 5996.7, 6000.0 + }; + const double XVALUES[600] = {\ + 0.00000, 0.00000, 0.00000, 0.00002, 0.00003, 0.00003, 0.00004, 0.00005, 0.00005, 0.00006, 0.00007, 0.00007, + 0.00008, 0.00009, 0.00010, 0.00010, 0.00011, 0.00012, 0.00013, 0.00014, 0.00015, 0.00015, 0.00016, 0.00017, + 0.00018, 0.00019, 0.00020, 0.00021, 0.00022, 0.00023, 0.00024, 0.00025, 0.00026, 0.00027, 0.00028, 0.00029, + 0.00030, 0.00031, 0.00032, 0.00033, 0.00034, 0.00035, 0.00037, 0.00038, 0.00039, 0.00040, 0.00041, 0.00043, + 0.00044, 0.00045, 0.00047, 0.00048, 0.00049, 0.00051, 0.00052, 0.00054, 0.00055, 0.00057, 0.00058, 0.00060, + 0.00061, 0.00063, 0.00065, 0.00066, 0.00068, 0.00070, 0.00072, 0.00074, 0.00075, 0.00077, 0.00079, 0.00081, + 0.00083, 0.00085, 0.00087, 0.00089, 0.00092, 0.00094, 0.00096, 0.00098, 0.00101, 0.00103, 0.00106, 0.00108, + 0.00111, 0.00113, 0.00116, 0.00118, 0.00121, 0.00124, 0.00127, 0.00130, 0.00133, 0.00136, 0.00139, 0.00142, + 0.00146, 0.00149, 0.00152, 0.00156, 0.00159, 0.00163, 0.00167, 0.00171, 0.00174, 0.00178, 0.00182, 0.00187, + 0.00191, 0.00195, 0.00200, 0.00204, 0.00209, 0.00214, 0.00219, 0.00224, 0.00229, 0.00235, 0.00240, 0.00246, + 0.00251, 0.00257, 0.00263, 0.00269, 0.00276, 0.00282, 0.00289, 0.00296, 0.00303, 0.00310, 0.00318, 0.00325, + 0.00333, 0.00341, 0.00349, 0.00358, 0.00367, 0.00376, 0.00385, 0.00394, 0.00404, 0.00414, 0.00425, 0.00435, + 0.00446, 0.00458, 0.00469, 0.00481, 0.00494, 0.00507, 0.00520, 0.00533, 0.00548, 0.00562, 0.00577, 0.00592, + 0.00608, 0.00625, 0.00642, 0.00659, 0.00677, 0.00696, 0.00716, 0.00736, 0.00757, 0.00778, 0.00800, 0.00823, + 0.00847, 0.00872, 0.00898, 0.00924, 0.00952, 0.00980, 0.01010, 0.01041, 0.01073, 0.01106, 0.01141, 0.01177, + 0.01214, 0.01253, 0.01293, 0.01335, 0.01379, 0.01425, 0.01472, 0.01522, 0.01573, 0.01627, 0.01683, 0.01742, + 0.01803, 0.01867, 0.01934, 0.02004, 0.02077, 0.02154, 0.02234, 0.02317, 0.02405, 0.02497, 0.02594, 0.02695, + 0.02801, 0.02913, 0.03030, 0.03153, 0.03282, 0.03419, 0.03561, 0.03712, 0.03871, 0.04037, 0.04213, 0.04398, + 0.04594, 0.04799, 0.05017, 0.05246, 0.05488, 0.05743, 0.06013, 0.06297, 0.06598, 0.06915, 0.07251, 0.07605, + 0.07979, 0.08374, 0.08791, 0.09230, 0.09694, 0.10183, 0.10698, 0.11241, 0.11812, 0.12411, 0.13041, 0.13703, + 0.14395, 0.15119, 0.15877, 0.16667, 0.17490, 0.18347, 0.19237, 0.20159, 0.21114, 0.22100, 0.23117, 0.24164, + 0.25240, 0.26344, 0.27473, 0.28628, 0.29807, 0.31007, 0.32228, 0.33468, 0.34725, 0.35999, 0.37286, 0.38586, + 0.39898, 0.41219, 0.42549, 0.43886, 0.45228, 0.46575, 0.47925, 0.49277, 0.50628, 0.51980, 0.53329, 0.54674, + 0.56016, 0.57350, 0.58677, 0.59996, 0.61304, 0.62600, 0.63883, 0.65152, 0.66403, 0.67638, 0.68853, 0.70048, + 0.71220, 0.72369, 0.73492, 0.74590, 0.75659, 0.76700, 0.77711, 0.78691, 0.79640, 0.80557, 0.81442, 0.82294, + 0.83113, 0.83900, 0.84654, 0.85376, 0.86067, 0.86726, 0.87355, 0.87954, 0.88525, 0.89067, 0.89583, 0.90073, + 0.90537, 0.90979, 0.91398, 0.91794, 0.92170, 0.92527, 0.92865, 0.93185, 0.93489, 0.93776, 0.94049, 0.94307, + 0.94552, 0.94784, 0.95005, 0.95213, 0.95412, 0.95600, 0.95779, 0.95949, 0.96110, 0.96264, 0.96410, 0.96549, + 0.96681, 0.96807, 0.96927, 0.97041, 0.97150, 0.97254, 0.97353, 0.97447, 0.97538, 0.97624, 0.97706, 0.97785, + 0.97860, 0.97933, 0.98002, 0.98068, 0.98131, 0.98192, 0.98250, 0.98306, 0.98359, 0.98411, 0.98460, 0.98507, + 0.98553, 0.98596, 0.98638, 0.98679, 0.98718, 0.98755, 0.98791, 0.98826, 0.98859, 0.98892, 0.98923, 0.98953, + 0.98981, 0.99009, 0.99036, 0.99062, 0.99087, 0.99111, 0.99135, 0.99158, 0.99179, 0.99201, 0.99221, 0.99241, + 0.99260, 0.99279, 0.99296, 0.99314, 0.99331, 0.99347, 0.99363, 0.99378, 0.99393, 0.99408, 0.99422, 0.99435, + 0.99448, 0.99461, 0.99473, 0.99486, 0.99497, 0.99509, 0.99520, 0.99530, 0.99541, 0.99551, 0.99561, 0.99571, + 0.99580, 0.99589, 0.99598, 0.99607, 0.99615, 0.99623, 0.99631, 0.99639, 0.99647, 0.99654, 0.99661, 0.99668, + 0.99675, 0.99682, 0.99688, 0.99694, 0.99701, 0.99707, 0.99713, 0.99718, 0.99724, 0.99729, 0.99735, 0.99740, + 0.99745, 0.99750, 0.99755, 0.99760, 0.99764, 0.99769, 0.99773, 0.99778, 0.99782, 0.99786, 0.99790, 0.99794, + 0.99798, 0.99802, 0.99806, 0.99809, 0.99813, 0.99816, 0.99820, 0.99823, 0.99827, 0.99830, 0.99833, 0.99836, + 0.99839, 0.99842, 0.99845, 0.99848, 0.99850, 0.99853, 0.99856, 0.99859, 0.99861, 0.99864, 0.99866, 0.99869, + 0.99871, 0.99873, 0.99876, 0.99878, 0.99880, 0.99882, 0.99884, 0.99886, 0.99889, 0.99891, 0.99893, 0.99895, + 0.99896, 0.99898, 0.99900, 0.99902, 0.99904, 0.99906, 0.99907, 0.99909, 0.99911, 0.99912, 0.99914, 0.99915, + 0.99917, 0.99919, 0.99920, 0.99922, 0.99923, 0.99924, 0.99926, 0.99927, 0.99929, 0.99930, 0.99931, 0.99933, + 0.99934, 0.99935, 0.99936, 0.99938, 0.99939, 0.99940, 0.99941, 0.99942, 0.99943, 0.99944, 0.99946, 0.99947, + 0.99948, 0.99949, 0.99950, 0.99951, 0.99952, 0.99953, 0.99954, 0.99955, 0.99956, 0.99956, 0.99957, 0.99958, + 0.99959, 0.99960, 0.99961, 0.99962, 0.99963, 0.99963, 0.99964, 0.99965, 0.99966, 0.99967, 0.99967, 0.99968, + 0.99969, 0.99970, 0.99970, 0.99971, 0.99972, 0.99973, 0.99973, 0.99974, 0.99975, 0.99975, 0.99976, 0.99977, + 0.99977, 0.99978, 0.99979, 0.99979, 0.99980, 0.99980, 0.99981, 0.99982, 0.99982, 0.99983, 0.99983, 0.99984, + 0.99984, 0.99985, 0.99985, 0.99986, 0.99986, 0.99987, 0.99988, 0.99988, 0.99989, 0.99989, 0.99990, 0.99990, + 0.99990, 0.99991, 0.99991, 0.99992, 0.99992, 0.99993, 0.99993, 0.99994, 0.99994, 0.99994, 0.99995, 0.99995, + 0.99996, 0.99996, 0.99997, 0.99997, 0.99997, 0.99998, 0.99998, 0.99998, 0.99999, 0.99999, 1.00000, 1.00000 + }; + for(size_t i = 0; i < 599; ++i) + { + if(XVALUES[i] < randv && XVALUES[i+1] > randv) + { + return ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); + } + } + return 0.0; + } + + /** + * Generate the final energy of a neutron for uranium foil analyser at 293K + * with number density of 1.456E20 atoms/cm^2 in double-difference mode. + * @param randv A random number between 0.0 & 1.0, sample from a flat distribution + * @return A value to use for the final energy + */ + double finalEnergyUranium(const double randv) + { + const double ENERGIES[201] = {\ + 5959.0, 5967.7, 5976.4, 5985.1, 5993.8, 6002.5, 6011.2, 6019.9, 6028.6, 6037.3, 6046.0, 6054.8, + 6063.5, 6072.2, 6080.9, 6089.6, 6098.3, 6107.0, 6115.7, 6124.4, 6133.1, 6141.8, 6150.5, 6159.2, + 6167.9, 6176.6, 6185.3, 6194.0, 6202.7, 6211.4, 6220.1, 6228.9, 6237.6, 6246.3, 6255.0, 6263.7, + 6272.4, 6281.1, 6289.8, 6298.5, 6307.2, 6315.9, 6324.6, 6333.3, 6342.0, 6350.7, 6359.4, 6368.1, + 6376.8, 6385.5, 6394.3, 6403.0, 6411.7, 6420.4, 6429.1, 6437.8, 6446.5, 6455.2, 6463.9, 6472.6, + 6481.3, 6490.0, 6498.7, 6507.4, 6516.1, 6524.8, 6533.5, 6542.2, 6550.9, 6559.6, 6568.4, 6577.1, + 6585.8, 6594.5, 6603.2, 6611.9, 6620.6, 6629.3, 6638.0, 6646.7, 6655.4, 6664.1, 6672.8, 6681.5, + 6690.2, 6698.9, 6707.6, 6716.3, 6725.0, 6733.7, 6742.5, 6751.2, 6759.9, 6768.6, 6777.3, 6786.0, + 6794.7, 6803.4, 6812.1, 6820.8, 6829.5, 6838.2, 6846.9, 6855.6, 6864.3, 6873.0, 6881.7, 6890.4, + 6899.1, 6907.8, 6916.5, 6925.3, 6934.0, 6942.7, 6951.4, 6960.1, 6968.8, 6977.5, 6986.2, 6994.9, + 7003.6, 7012.3, 7021.0, 7029.7, 7038.4, 7047.1, 7055.8, 7064.5, 7073.2, 7081.9, 7090.6, 7099.4, + 7108.1, 7116.8, 7125.5, 7134.2, 7142.9, 7151.6, 7160.3, 7169.0, 7177.7, 7186.4, 7195.1, 7203.8, + 7212.5, 7221.2, 7229.9, 7238.6, 7247.3, 7256.0, 7264.8, 7273.5, 7282.2, 7290.9, 7299.6, 7308.3, + 7317.0, 7325.7, 7334.4, 7343.1, 7351.8, 7360.5, 7369.2, 7377.9, 7386.6, 7395.3, 7404.0, 7412.7, + 7421.4, 7430.1, 7438.9, 7447.6, 7456.3, 7465.0, 7473.7, 7482.4, 7491.1, 7499.8, 7508.5, 7517.2, + 7525.9, 7534.6, 7543.3, 7552.0, 7560.7, 7569.4, 7578.1, 7586.8, 7595.5, 7604.2, 7613.0, 7621.7, + 7630.4, 7639.1, 7647.8, 7656.5, 7665.2, 7673.9, 7682.6, 7691.3, 7700.0 + }; + + const double XVALUES[201] = {\ + 0.00000, 0.00000, 0.00000, 0.00020, 0.00030, 0.00040, 0.00050, 0.00060, 0.00070, 0.00080, 0.00090, 0.00110, + 0.00120, 0.00140, 0.00150, 0.00170, 0.00190, 0.00210, 0.00230, 0.00250, 0.00270, 0.00290, 0.00310, 0.00340, + 0.00360, 0.00390, 0.00410, 0.00440, 0.00470, 0.00500, 0.00530, 0.00560, 0.00590, 0.00620, 0.00650, 0.00690, + 0.00720, 0.00760, 0.00800, 0.00840, 0.00880, 0.00920, 0.00960, 0.01010, 0.01050, 0.01100, 0.01150, 0.01210, + 0.01270, 0.01330, 0.01390, 0.01460, 0.01530, 0.01610, 0.01690, 0.01780, 0.01870, 0.01970, 0.02090, 0.02210, + 0.02350, 0.02500, 0.02660, 0.02850, 0.03070, 0.03320, 0.03620, 0.03990, 0.04440, 0.05020, 0.05780, 0.06790, + 0.08120, 0.09880, 0.12150, 0.15020, 0.18520, 0.22640, 0.27340, 0.32510, 0.38050, 0.43830, 0.49720, 0.55580, + 0.61290, 0.66710, 0.71740, 0.76250, 0.80190, 0.83510, 0.86220, 0.88380, 0.90050, 0.91340, 0.92340, 0.93100, + 0.93710, 0.94200, 0.94600, 0.94940, 0.95230, 0.95490, 0.95710, 0.95920, 0.96100, 0.96270, 0.96430, 0.96580, + 0.96710, 0.96840, 0.96950, 0.97060, 0.97170, 0.97270, 0.97360, 0.97450, 0.97540, 0.97620, 0.97700, 0.97770, + 0.97840, 0.97910, 0.97980, 0.98040, 0.98100, 0.98160, 0.98220, 0.98280, 0.98330, 0.98390, 0.98440, 0.98490, + 0.98540, 0.98590, 0.98630, 0.98680, 0.98720, 0.98770, 0.98810, 0.98850, 0.98890, 0.98930, 0.98970, 0.99010, + 0.99050, 0.99090, 0.99130, 0.99160, 0.99200, 0.99230, 0.99270, 0.99300, 0.99330, 0.99360, 0.99400, 0.99430, + 0.99460, 0.99480, 0.99510, 0.99540, 0.99560, 0.99590, 0.99610, 0.99640, 0.99660, 0.99680, 0.99710, 0.99730, + 0.99750, 0.99770, 0.99780, 0.99800, 0.99820, 0.99840, 0.99850, 0.99870, 0.99880, 0.99890, 0.99910, 0.99920, + 0.99930, 0.99940, 0.99950, 0.99960, 0.99960, 0.99970, 0.99980, 0.99980, 0.99990, 0.99990, 0.99990, 1.00000, + 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 + }; + + for(size_t i = 0; i < 200; ++i) + { + if(XVALUES[i] < randv && XVALUES[i+1] > randv) + { + return ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); + } + } + return 0.0; + } + + //------------------------------------------------------------------------- + // RandomNumberGenerator + //------------------------------------------------------------------------- + /** + * Produces random numbers with various probability distributions + */ + RandomNumberGenerator::RandomNumberGenerator(const int seed) : m_generator() + { + m_generator.seed(static_cast(seed)); + } + /// Returns a flat random number between 0.0 & 1.0 + double RandomNumberGenerator::flat() + { + return uniform_double()(m_generator, + uniform_double::param_type(0.0, 1.0)); + } + /// Returns a random number distributed by a normal distribution + double RandomNumberGenerator::gaussian(const double mean, const double sigma) + { + return gaussian_double()(m_generator, + gaussian_double::param_type(mean, sigma)); + } + + //------------------------------------------------------------------------- + // Simulation + //------------------------------------------------------------------------- + /** + * Stores counts for each scatter order + * for a "run" of a given number of events + */ + Simulation::Simulation(const size_t order, const size_t ntimes) : + counts(order, std::vector(ntimes)), + maxorder(order) + {} + + //------------------------------------------------------------------------- + // SimulationAggreator + //------------------------------------------------------------------------- + /** + * Accumulates and averages the results + * of each simulation + * @param nruns The number of runs that will be computed + */ + SimulationAggregator::SimulationAggregator(const size_t nruns) + { + results.reserve(nruns); + } + + /** + * @param order The number of requested scatterings + * @param ntimes The number of times on input workspace + * @return A reference to a new Simulation object + */ + Simulation & SimulationAggregator::newSimulation(const size_t order, const size_t ntimes) + { + results.push_back(Simulation(order, ntimes)); + return results.back(); + } + + /** + * @return The mean and standard deviation of the current set of simulations + */ + SimulationWithErrors + SimulationAggregator::average() const + { + const size_t maxorder(results[0].maxorder), ntimes(results[0].counts[0].size()), + nruns(results.size()); + SimulationWithErrors retval(maxorder, ntimes); + + for(size_t i = 0; i < maxorder; ++i) + { + auto & orderCounts = retval.sim.counts[i]; + auto & orderErrors = retval.errors[i]; + for(size_t j = 0; j < ntimes; ++j) + { + double mean(0.0); + size_t npoints(0); + for(size_t k = 0; k < nruns; ++k) + { + const double val = results[k].counts[i][j]; + if(val > 0.0) + { + mean += val; + npoints +=1; + } + } + if(npoints < 2) + { + orderCounts[j] = 0.0; + orderErrors[j] = 0.0; + } + else + { + const double dblPts = static_cast(npoints); + orderCounts[j] = mean/dblPts; + // error is std dev + double sumsq(0.0); + for(size_t k = 0; k < nruns; ++k) + { + const double val = results[k].counts[i][j]; + if(val > 0.0) + { + const double diff = (val - mean); + sumsq += diff*diff; + } + } + orderErrors[j] = sqrt(sumsq/(dblPts*(dblPts-1))); + } + } + } + + return retval; + } + //------------------------------------------------------------------------- + // SimulationWithErrors + //------------------------------------------------------------------------- + /** + * Normalise the counts so that the integral over the single-scatter + * events is 1. + */ + void SimulationWithErrors::normalise() + { + const double sumSingle = std::accumulate(sim.counts.front().begin(), + sim.counts.front().end(), 0.0); + if(sumSingle > 0.0) + { + const double invSum = 1.0/sumSingle; // multiply is faster + // Divide everything by the sum + const size_t nscatters = sim.counts.size(); + for(size_t i = 0; i < nscatters; ++i) + { + auto & counts = sim.counts[i]; + auto & scerrors = this->errors[i]; + for(auto cit = counts.begin(), eit = scerrors.begin(); cit != counts.end(); + ++cit, ++eit) + { + (*cit) *= invSum; + (*eit) *= invSum; + } + } + } + } + + } // namespace MSVesuvioHelper +}} From b7309429cef08e03963cab525ff0a3f240fb7250 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 30 Oct 2014 08:44:14 +0000 Subject: [PATCH 262/284] Refs #10237 Include QVariant rather than declare --- .../inc/MantidQtCustomInterfaces/IReflPresenter.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h index 6b9a7dcf86e5..5755151a9b52 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IReflPresenter.h @@ -6,7 +6,7 @@ #include "MantidKernel/System.h" -class QVariant; +#include namespace MantidQt { From 6c990d0e9904e8abfc1230e1fc3933c92fe4f2ce Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 30 Oct 2014 10:44:19 +0000 Subject: [PATCH 263/284] First performance enhancement Use STL algorithms for value searching and static storage for constant arrays. Refs #10169 --- .../CurveFitting/src/MSVesuvioHelpers.cpp | 64 ++++++++----------- 1 file changed, 28 insertions(+), 36 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp b/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp index 5e2269c1914e..9b51dfac49f4 100644 --- a/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp @@ -22,7 +22,7 @@ namespace Mantid { namespace CurveFitting { // Tabulated values of absoprtion energies from S.F. Mughabghab, Neutron Cross Sections, Academic // Press, Orlando, Florida, 1984. - const double ENERGIES[300] = {\ + static const double ENERGIES[300] = {\ 2000.0, 2020.7, 2041.5, 2062.2, 2082.9, 2103.7, 2124.4, 2145.2, 2165.9, 2186.6, 2207.4, 2228.1, 2248.8, 2269.6, 2290.3, 2311.0, 2331.8, 2352.5, 2373.2, 2394.0, 2414.7, 2435.5, 2456.2, 2476.9, 2497.7, 2518.4, 2539.1, 2559.9, 2580.6, 2601.3, 2622.1, 2642.8, 2663.5, 2684.3, 2705.0, 2725.8, @@ -49,7 +49,7 @@ namespace Mantid { namespace CurveFitting 7723.1, 7743.8, 7764.5, 7785.3, 7806.0, 7826.8, 7847.5, 7868.2, 7889.0, 7909.7, 7930.4, 7951.2, 7971.9, 7992.6, 8013.4, 8034.1, 8054.8, 8075.6, 8096.3, 8117.1, 8137.8, 8158.5, 8179.3, 8200.0 }; - const double XVALUES[300] = {\ + static const double XVALUES[300] = {\ 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00000, 0.00010, 0.00010, @@ -77,18 +77,14 @@ namespace Mantid { namespace CurveFitting 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 }; - for(size_t i = 0; i < 299; ++i) - { - if(XVALUES[i] < randv && XVALUES[i+1] > randv) - { - double ef = ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); - if(ef < 100.0) ef = 0.0; - return ef; - } - } - return 0.0; - - + const double *xp1 = std::lower_bound(XVALUES, XVALUES+300, randv); + if(xp1 == XVALUES+300) return 0.0; + const double *xm1 = xp1 - 1; + const double *ep1 = ENERGIES + (xp1 - XVALUES); + const double *em1 = ep1 - 1; + const double ef = (*em1) + (randv - *xm1)*(*ep1 - *em1)/(*xp1 - *xm1); + if( ef < 100.0 ) return 0.0; + else return ef; } /** @@ -101,7 +97,7 @@ namespace Mantid { namespace CurveFitting { // Tabulated values of absoprtion energies from S.F. Mughabghab, Neutron Cross Sections, Academic // Press, Orlando, Florida, 1984. - const double ENERGIES[600] = {\ + static const double ENERGIES[600] = {\ 4000.0, 4003.3, 4006.7, 4010.0, 4013.4, 4016.7, 4020.0, 4023.4, 4026.7, 4030.1, 4033.4, 4036.7, 4040.1, 4043.4, 4046.7, 4050.1, 4053.4, 4056.8, 4060.1, 4063.4, 4066.8, 4070.1, 4073.5, 4076.8, 4080.1, 4083.5, 4086.8, 4090.2, 4093.5, 4096.8, 4100.2, 4103.5, 4106.8, 4110.2, 4113.5, 4116.9, @@ -153,7 +149,7 @@ namespace Mantid { namespace CurveFitting 5923.2, 5926.5, 5929.9, 5933.2, 5936.6, 5939.9, 5943.2, 5946.6, 5949.9, 5953.3, 5956.6, 5959.9, 5963.3, 5966.6, 5970.0, 5973.3, 5976.6, 5980.0, 5983.3, 5986.6, 5990.0, 5993.3, 5996.7, 6000.0 }; - const double XVALUES[600] = {\ + static const double XVALUES[600] = {\ 0.00000, 0.00000, 0.00000, 0.00002, 0.00003, 0.00003, 0.00004, 0.00005, 0.00005, 0.00006, 0.00007, 0.00007, 0.00008, 0.00009, 0.00010, 0.00010, 0.00011, 0.00012, 0.00013, 0.00014, 0.00015, 0.00015, 0.00016, 0.00017, 0.00018, 0.00019, 0.00020, 0.00021, 0.00022, 0.00023, 0.00024, 0.00025, 0.00026, 0.00027, 0.00028, 0.00029, @@ -205,14 +201,13 @@ namespace Mantid { namespace CurveFitting 0.99990, 0.99991, 0.99991, 0.99992, 0.99992, 0.99993, 0.99993, 0.99994, 0.99994, 0.99994, 0.99995, 0.99995, 0.99996, 0.99996, 0.99997, 0.99997, 0.99997, 0.99998, 0.99998, 0.99998, 0.99999, 0.99999, 1.00000, 1.00000 }; - for(size_t i = 0; i < 599; ++i) - { - if(XVALUES[i] < randv && XVALUES[i+1] > randv) - { - return ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); - } - } - return 0.0; + + const double *xp1 = std::lower_bound(XVALUES, XVALUES+600, randv); + if(xp1 == XVALUES+600) return 0.0; + const double *xm1 = xp1 - 1; + const double *ep1 = ENERGIES + (xp1 - XVALUES); + const double *em1 = ep1 - 1; + return (*em1) + (randv - *xm1)*(*ep1 - *em1)/(*xp1 - *xm1); } /** @@ -223,7 +218,7 @@ namespace Mantid { namespace CurveFitting */ double finalEnergyUranium(const double randv) { - const double ENERGIES[201] = {\ + static const double ENERGIES[201] = {\ 5959.0, 5967.7, 5976.4, 5985.1, 5993.8, 6002.5, 6011.2, 6019.9, 6028.6, 6037.3, 6046.0, 6054.8, 6063.5, 6072.2, 6080.9, 6089.6, 6098.3, 6107.0, 6115.7, 6124.4, 6133.1, 6141.8, 6150.5, 6159.2, 6167.9, 6176.6, 6185.3, 6194.0, 6202.7, 6211.4, 6220.1, 6228.9, 6237.6, 6246.3, 6255.0, 6263.7, @@ -242,8 +237,7 @@ namespace Mantid { namespace CurveFitting 7525.9, 7534.6, 7543.3, 7552.0, 7560.7, 7569.4, 7578.1, 7586.8, 7595.5, 7604.2, 7613.0, 7621.7, 7630.4, 7639.1, 7647.8, 7656.5, 7665.2, 7673.9, 7682.6, 7691.3, 7700.0 }; - - const double XVALUES[201] = {\ + static const double XVALUES[201] = {\ 0.00000, 0.00000, 0.00000, 0.00020, 0.00030, 0.00040, 0.00050, 0.00060, 0.00070, 0.00080, 0.00090, 0.00110, 0.00120, 0.00140, 0.00150, 0.00170, 0.00190, 0.00210, 0.00230, 0.00250, 0.00270, 0.00290, 0.00310, 0.00340, 0.00360, 0.00390, 0.00410, 0.00440, 0.00470, 0.00500, 0.00530, 0.00560, 0.00590, 0.00620, 0.00650, 0.00690, @@ -262,15 +256,13 @@ namespace Mantid { namespace CurveFitting 0.99930, 0.99940, 0.99950, 0.99960, 0.99960, 0.99970, 0.99980, 0.99980, 0.99990, 0.99990, 0.99990, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000, 1.00000 }; - - for(size_t i = 0; i < 200; ++i) - { - if(XVALUES[i] < randv && XVALUES[i+1] > randv) - { - return ENERGIES[i] + (randv - XVALUES[i])*(ENERGIES[i+1] - ENERGIES[i])/(XVALUES[i+1] - XVALUES[i]); - } - } - return 0.0; + + const double *xp1 = std::lower_bound(XVALUES, XVALUES+201, randv); + if(xp1 == XVALUES+201) return 0.0; + const double *xm1 = xp1 - 1; + const double *ep1 = ENERGIES + (xp1 - XVALUES); + const double *em1 = ep1 - 1; + return (*em1) + (randv - *xm1)*(*ep1 - *em1)/(*xp1 - *xm1); } //------------------------------------------------------------------------- From 750be02b6236777d0f2844e42825ada770acb893 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 30 Oct 2014 11:17:02 +0000 Subject: [PATCH 264/284] Refs #10347 Use declarative bindings in options dialog Instead of manually having to load/save options to/from widgets in QtReflOptionsDialog, we now load/save options using a map binding options to widgets. It may seem overkill for just one option, but when we have fifteen to twenty it'll greatly simplify our life. It could be expanded in future to build the bindings from widget properties in the UI file, so new options need not even touch QtReflOptionsDialog's code. --- .../QtReflOptionsDialog.h | 3 ++ .../src/QtReflOptionsDialog.cpp | 53 +++++++++++++++++-- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h index 94b90bc3ed7b..670f77947576 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflOptionsDialog.h @@ -45,6 +45,7 @@ namespace MantidQt virtual ~QtReflOptionsDialog(); protected: void initLayout(); + void initBindings(); protected slots: void saveOptions(); void loadOptions(); @@ -53,6 +54,8 @@ namespace MantidQt Ui::reflOptionsDialog ui; //the presenter boost::shared_ptr m_presenter; + //maps option names to widget names + std::map m_bindings; }; } //CustomInterfaces diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp index c131089a0e5e..f63e24a70c3f 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp @@ -11,6 +11,7 @@ namespace MantidQt m_presenter(presenter) { initLayout(); + initBindings(); loadOptions(); } @@ -27,13 +28,40 @@ namespace MantidQt connect(ui.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(saveOptions())); } + /** Bind options to their widgets */ + void QtReflOptionsDialog::initBindings() + { + m_bindings.clear(); + + m_bindings["WarnProcessAll"] = "checkWarnProcessAll"; + } + /** This slot saves the currently configured options to the presenter */ void QtReflOptionsDialog::saveOptions() { std::map options = m_presenter->options(); - //Set the options map to match the UI - options["WarnProcessAll"] = ui.checkWarnProcessAll->isChecked(); + //Iterate through all our bound widgets, pushing their value into the options map + for(auto it = m_bindings.begin(); it != m_bindings.end(); ++it) + { + QString widgetName = it->second; + if(widgetName.isEmpty()) + continue; + + QCheckBox* checkbox = findChild(widgetName); + if(checkbox) + { + options[it->first] = checkbox->isChecked(); + continue; + } + + QSpinBox* spinbox = findChild(widgetName); + if(spinbox) + { + options[it->first] = spinbox->value(); + continue; + } + } //Update the presenter's options m_presenter->setOptions(options); @@ -45,7 +73,26 @@ namespace MantidQt std::map options = m_presenter->options(); //Set the values from the options - ui.checkWarnProcessAll->setChecked(options["WarnProcessAll"].toBool()); + for(auto it = options.begin(); it != options.end(); ++it) + { + QString widgetName = m_bindings[it->first]; + if(widgetName.isEmpty()) + continue; + + QCheckBox* checkbox = findChild(widgetName); + if(checkbox) + { + checkbox->setChecked(it->second.toBool()); + continue; + } + + QSpinBox* spinbox = findChild(widgetName); + if(spinbox) + { + spinbox->setValue(it->second.toInt()); + continue; + } + } } } //CustomInterfaces From 59e9d1f09b18fbea29a837e8288305af25415e60 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 30 Oct 2014 11:29:12 +0000 Subject: [PATCH 265/284] Refs #10347 Add rounding options Users may now individually specify what level of rounding is applied to the angle, qmin, qmax, and resolution columns. --- .../ReflMainViewPresenter.h | 2 +- .../ReflOptionsDialog.ui | 187 ++++++++++++++++-- .../src/QtReflOptionsDialog.cpp | 8 + .../src/ReflMainViewPresenter.cpp | 25 ++- 4 files changed, 207 insertions(+), 15 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h index 6eaebc8b508c..64031ae82268 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h @@ -78,7 +78,7 @@ namespace MantidQt //Autofill a row with sensible values void autofillRow(size_t rowNo); //calculates qmin and qmax - static std::vector calcQRange(Mantid::API::MatrixWorkspace_sptr ws, double theta); + std::vector calcQRange(Mantid::API::MatrixWorkspace_sptr ws, double theta); //get the number of rows in a group size_t numRowsInGroup(int groupId) const; //Stitch some rows diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui index 7fa7828940fc..981a668d48fd 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui @@ -6,8 +6,8 @@ 0 0 - 420 - 141 + 372 + 222
          @@ -21,15 +21,116 @@ - - - - - Warn when processing all rows - - - - + + + 0 + + + + Warnings + + + + + + Warn when processing all rows + + + + + + + + Rounding + + + + + + Round q_max column to + + + + + + + false + + + + + + + false + + + + + + + false + + + + + + + Round q_min column to + + + + + + + Round dq/q column to + + + + + + + Round Angle column to + + + + + + + false + + + + + + + decimal places + + + + + + + decimal places + + + + + + + decimal places + + + + + + + decimal places + + + + + + @@ -77,5 +178,69 @@ + + checkRoundAngle + toggled(bool) + spinAnglePrecision + setEnabled(bool) + + + 106 + 53 + + + 226 + 53 + + + + + checkRoundQMin + toggled(bool) + spinQMinPrecision + setEnabled(bool) + + + 106 + 84 + + + 226 + 84 + + + + + checkRoundQMax + toggled(bool) + spinQMaxPrecision + setEnabled(bool) + + + 106 + 115 + + + 226 + 115 + + + + + checkRoundDQQ + toggled(bool) + spinDQQPrecision + setEnabled(bool) + + + 106 + 146 + + + 226 + 146 + + + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp index f63e24a70c3f..d344c3bc4767 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp @@ -34,6 +34,14 @@ namespace MantidQt m_bindings.clear(); m_bindings["WarnProcessAll"] = "checkWarnProcessAll"; + m_bindings["RoundAngle"] = "checkRoundAngle"; + m_bindings["RoundQMin"] = "checkRoundQMin"; + m_bindings["RoundQMax"] = "checkRoundQMax"; + m_bindings["RoundDQQ"] = "checkRoundDQQ"; + m_bindings["RoundAnglePrecision"] = "spinAnglePrecision"; + m_bindings["RoundQMinPrecision"] = "spinQMinPrecision"; + m_bindings["RoundQMaxPrecision"] = "spinQMaxPrecision"; + m_bindings["RoundDQQPrecision"] = "spinDQQPrecision"; } /** This slot saves the currently configured options to the presenter */ diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 3903e1484eb0..8909cc6972cd 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -404,7 +404,10 @@ namespace MantidQt throw std::runtime_error("Value for two theta could not be found in log."); //Update the model - m_model->String(rowNo, COL_ANGLE) = Strings::toString(Utils::roundToDP(thetaVal, 3)); + if(m_options["RoundAngle"].toBool()) + thetaVal = Utils::roundToDP(thetaVal, m_options["RoundAnglePrecision"].toInt()); + + m_model->String(rowNo, COL_ANGLE) = Strings::toString(thetaVal); m_tableDirty = true; } @@ -418,6 +421,10 @@ namespace MantidQt //Update the model double dqqVal = calcResAlg->getProperty("Resolution"); + + if(m_options["RoundDQQ"].toBool()) + dqqVal = Utils::roundToDP(dqqVal, m_options["RoundDQQPrecision"].toInt()); + m_model->String(rowNo, COL_DQQ) = Strings::toString(dqqVal); m_tableDirty = true; } @@ -622,8 +629,12 @@ namespace MantidQt double qmin = 4 * M_PI / lmax * sin(theta * M_PI / 180.0); double qmax = 4 * M_PI / lmin * sin(theta * M_PI / 180.0); - qmin = Utils::roundToDP(qmin, 3); - qmax = Utils::roundToDP(qmax, 3); + + if(m_options["RoundQMin"].toBool()) + qmin = Utils::roundToDP(qmin, m_options["RoundQMinPrecision"].toInt()); + + if(m_options["RoundQMax"].toBool()) + qmax = Utils::roundToDP(qmax, m_options["RoundQMaxPrecision"].toInt()); std::vector ret; ret.push_back(qmin); @@ -1088,6 +1099,14 @@ namespace MantidQt //Set defaults m_options["WarnProcessAll"] = true; + m_options["RoundAngle"] = false; + m_options["RoundQMin"] = false; + m_options["RoundQMax"] = false; + m_options["RoundDQQ"] = false; + m_options["RoundAnglePrecision"] = 3; + m_options["RoundQMinPrecision"] = 3; + m_options["RoundQMaxPrecision"] = 3; + m_options["RoundDQQPrecision"] = 3; //Load saved values from disk QSettings settings; From 265487c8894d3d3ea356823b9b2adf4ac6bd4bc1 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 30 Oct 2014 11:36:20 +0000 Subject: [PATCH 266/284] Refs #10347 Add option for warning when discarding changes --- .../inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui | 7 +++++++ .../MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp | 1 + .../CustomInterfaces/src/ReflMainViewPresenter.cpp | 5 +++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui index 981a668d48fd..6a705131e323 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui @@ -37,6 +37,13 @@ + + + + Warn when discarding unsaved changes + + + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp index d344c3bc4767..863fd2f42d5e 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp @@ -34,6 +34,7 @@ namespace MantidQt m_bindings.clear(); m_bindings["WarnProcessAll"] = "checkWarnProcessAll"; + m_bindings["WarnDiscardChanges"] = "checkWarnDiscardChanges"; m_bindings["RoundAngle"] = "checkRoundAngle"; m_bindings["RoundQMin"] = "checkRoundQMin"; m_bindings["RoundQMax"] = "checkRoundQMax"; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 8909cc6972cd..f40cc5424989 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -899,7 +899,7 @@ namespace MantidQt */ void ReflMainViewPresenter::newTable() { - if(m_tableDirty) + if(m_tableDirty && m_options["WarnDiscardChanges"].toBool()) if(!m_view->askUserYesNo("Your current table has unsaved changes. Are you sure you want to discard them?","Start New Table?")) return; @@ -918,7 +918,7 @@ namespace MantidQt */ void ReflMainViewPresenter::openTable() { - if(m_tableDirty) + if(m_tableDirty && m_options["WarnDiscardChanges"].toBool()) if(!m_view->askUserYesNo("Your current table has unsaved changes. Are you sure you want to discard them?","Open Table?")) return; @@ -1099,6 +1099,7 @@ namespace MantidQt //Set defaults m_options["WarnProcessAll"] = true; + m_options["WarnDiscardChanges"] = true; m_options["RoundAngle"] = false; m_options["RoundQMin"] = false; m_options["RoundQMax"] = false; From b384245252303224b054806cf829998b31574cef Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 30 Oct 2014 11:56:31 +0000 Subject: [PATCH 267/284] Refs #10347 Automatically bind options to widgets Use the `reflOptionName` property on a widget to specify the option its value should control. --- .../ReflOptionsDialog.ui | 30 +++++++++++++++++++ .../src/QtReflOptionsDialog.cpp | 19 ++++++------ 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui index 6a705131e323..a50c5437923e 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui @@ -35,6 +35,9 @@ Warn when processing all rows + + WarnProcessAll + @@ -42,6 +45,9 @@ Warn when discarding unsaved changes + + WarnDiscardChanges +
          @@ -56,6 +62,9 @@ Round q_max column to + + RoundQMax + @@ -63,6 +72,9 @@ false + + RoundQMinPrecision + @@ -70,6 +82,9 @@ false + + RoundQMaxPrecision + @@ -77,6 +92,9 @@ false + + RoundDQQPrecision + @@ -84,6 +102,9 @@ Round q_min column to + + RoundQMin + @@ -91,6 +112,9 @@ Round dq/q column to + + RoundDQQ + @@ -98,6 +122,9 @@ Round Angle column to + + RoundAngle + @@ -105,6 +132,9 @@ false + + RoundAnglePrecision + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp index 863fd2f42d5e..c8591bd344f9 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp @@ -33,16 +33,15 @@ namespace MantidQt { m_bindings.clear(); - m_bindings["WarnProcessAll"] = "checkWarnProcessAll"; - m_bindings["WarnDiscardChanges"] = "checkWarnDiscardChanges"; - m_bindings["RoundAngle"] = "checkRoundAngle"; - m_bindings["RoundQMin"] = "checkRoundQMin"; - m_bindings["RoundQMax"] = "checkRoundQMax"; - m_bindings["RoundDQQ"] = "checkRoundDQQ"; - m_bindings["RoundAnglePrecision"] = "spinAnglePrecision"; - m_bindings["RoundQMinPrecision"] = "spinQMinPrecision"; - m_bindings["RoundQMaxPrecision"] = "spinQMaxPrecision"; - m_bindings["RoundDQQPrecision"] = "spinDQQPrecision"; + //Check all the widgets for the "reflOptionName" property. + //If it exists, bind the named option to that widget. + QList widgets = findChildren(); + for(auto it = widgets.begin(); it != widgets.end(); ++it) + { + QVariant binding = (*it)->property("reflOptionName"); + if(binding.isValid()) + m_bindings[binding.toString().toStdString()] = (*it)->objectName(); + } } /** This slot saves the currently configured options to the presenter */ From b86b82205a8e48ce9053f064db44ef6571611e61 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 30 Oct 2014 11:58:55 +0000 Subject: [PATCH 268/284] Refs #10347 Remove "Apply" button from options dialog It has no advantage over the "Ok" button. The dialog forces itself to remain in the foreground, so nothing can happen between the user hitting "Apply" and closing the dialog. We may as well be tidy and remove it. --- .../inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui | 2 +- .../MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui index a50c5437923e..4eb580d6ee7a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui @@ -175,7 +175,7 @@ Qt::Horizontal - QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok + QDialogButtonBox::Cancel|QDialogButtonBox::Ok diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp index c8591bd344f9..501c461d1e06 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflOptionsDialog.cpp @@ -25,7 +25,6 @@ namespace MantidQt { ui.setupUi(this); connect(ui.buttonBox->button(QDialogButtonBox::Ok), SIGNAL(clicked()), this, SLOT(saveOptions())); - connect(ui.buttonBox->button(QDialogButtonBox::Apply), SIGNAL(clicked()), this, SLOT(saveOptions())); } /** Bind options to their widgets */ From 4344828ad5937d7b1343f4211d6fa69741183ce8 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 30 Oct 2014 12:21:39 +0000 Subject: [PATCH 269/284] Refs #10347 Correct unit tests Now that we are not rounding by default, the expected values for unit testing need to be updated. --- .../test/ReflMainViewPresenterTest.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index 0698662c4651..b4d24725c60c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -709,15 +709,15 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //Check the table was updated as expected ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); - TS_ASSERT_EQUALS(ws->String(0, ThetaCol), "0.7"); - TS_ASSERT_EQUALS(ws->String(0, DQQCol), "0.0340301"); - TS_ASSERT_EQUALS(ws->String(0, QMinCol), "0.009"); - TS_ASSERT_EQUALS(ws->String(0, QMaxCol), "0.154"); + TS_ASSERT_EQUALS(ws->String(0, ThetaCol), "0.70002"); + TS_ASSERT_EQUALS(ws->String(0, DQQCol), "0.0340292"); + TS_ASSERT_EQUALS(ws->String(0, QMinCol), "0.00903104"); + TS_ASSERT_EQUALS(ws->String(0, QMaxCol), "0.153528"); TS_ASSERT_EQUALS(ws->String(1, ThetaCol), "2.3"); TS_ASSERT_EQUALS(ws->String(1, DQQCol), "0.0340505"); - TS_ASSERT_EQUALS(ws->String(1, QMinCol), "0.03"); - TS_ASSERT_EQUALS(ws->String(1, QMaxCol), "0.504"); + TS_ASSERT_EQUALS(ws->String(1, QMinCol), "0.0296654"); + TS_ASSERT_EQUALS(ws->String(1, QMaxCol), "0.504311"); //Tidy up AnalysisDataService::Instance().remove("TestWorkspace"); From fe12e9463c1e233c0f29ea358f28c0603f9a90ef Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Thu, 30 Oct 2014 13:28:54 +0000 Subject: [PATCH 270/284] Refs #10347 Use TS_ASSERT_DELTA --- .../test/ReflMainViewPresenterTest.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h index b4d24725c60c..50977a4aa1e0 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/test/ReflMainViewPresenterTest.h @@ -709,15 +709,15 @@ class ReflMainViewPresenterTest : public CxxTest::TestSuite //Check the table was updated as expected ws = AnalysisDataService::Instance().retrieveWS("TestWorkspace"); - TS_ASSERT_EQUALS(ws->String(0, ThetaCol), "0.70002"); - TS_ASSERT_EQUALS(ws->String(0, DQQCol), "0.0340292"); - TS_ASSERT_EQUALS(ws->String(0, QMinCol), "0.00903104"); - TS_ASSERT_EQUALS(ws->String(0, QMaxCol), "0.153528"); - - TS_ASSERT_EQUALS(ws->String(1, ThetaCol), "2.3"); - TS_ASSERT_EQUALS(ws->String(1, DQQCol), "0.0340505"); - TS_ASSERT_EQUALS(ws->String(1, QMinCol), "0.0296654"); - TS_ASSERT_EQUALS(ws->String(1, QMaxCol), "0.504311"); + TS_ASSERT_DELTA(boost::lexical_cast(ws->String(0, ThetaCol)), 0.70002, 1e-5); + TS_ASSERT_DELTA(boost::lexical_cast(ws->String(0, DQQCol)), 0.03402, 1e-5); + TS_ASSERT_DELTA(boost::lexical_cast(ws->String(0, QMinCol)), 0.00903, 1e-5); + TS_ASSERT_DELTA(boost::lexical_cast(ws->String(0, QMaxCol)), 0.15352, 1e-5); + + TS_ASSERT_DELTA(boost::lexical_cast(ws->String(1, ThetaCol)), 2.3, 1e-5); + TS_ASSERT_DELTA(boost::lexical_cast(ws->String(1, DQQCol)), 0.03405, 1e-5); + TS_ASSERT_DELTA(boost::lexical_cast(ws->String(1, QMinCol)), 0.02966, 1e-5); + TS_ASSERT_DELTA(boost::lexical_cast(ws->String(1, QMaxCol)), 0.50431, 1e-5); //Tidy up AnalysisDataService::Instance().remove("TestWorkspace"); From 3651eeac324831ea6bf4806ebfd6342ca236e7ac Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 29 Oct 2014 13:29:37 +0000 Subject: [PATCH 271/284] Refs #10457 Connect actions automatically --- .../MantidQtCustomInterfaces/QtReflMainView.h | 21 ++++----- .../CustomInterfaces/src/QtReflMainView.cpp | 45 +++++++------------ 2 files changed, 28 insertions(+), 38 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h index 8c3976f3200c..ee38f190122a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/QtReflMainView.h @@ -88,17 +88,18 @@ namespace MantidQt QSignalMapper* m_openMap; private slots: + void on_actionNewTable_triggered(); + void on_actionSaveTable_triggered(); + void on_actionSaveTableAs_triggered(); + void on_actionAppendRow_triggered(); + void on_actionPrependRow_triggered(); + void on_actionDeleteRow_triggered(); + void on_actionProcess_triggered(); + void on_actionGroupRows_triggered(); + void on_actionExpandSelection_triggered(); + void on_actionOptionsDialog_triggered(); + void setModel(QString name); - void actionNewTable(); - void actionSave(); - void actionSaveAs(); - void actionAppendRow(); - void actionPrependRow(); - void actionDeleteRow(); - void actionProcess(); - void actionGroupRows(); - void actionExpandSelection(); - void actionOptionsDialog(); void tableUpdated(const QModelIndex& topLeft, const QModelIndex& bottomRight); void showContextMenu(const QPoint& pos); }; diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 1bd142faf6dd..ac6d8b3c236d 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -56,17 +56,6 @@ namespace MantidQt //Custom context menu for table connect(ui.viewTable, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(showContextMenu(const QPoint&))); - connect(ui.actionSaveTable, SIGNAL(triggered()), this, SLOT(actionSave())); - connect(ui.actionSaveTableAs, SIGNAL(triggered()), this, SLOT(actionSaveAs())); - connect(ui.actionNewTable, SIGNAL(triggered()), this, SLOT(actionNewTable())); - connect(ui.actionAppendRow, SIGNAL(triggered()), this, SLOT(actionAppendRow())); - connect(ui.actionPrependRow, SIGNAL(triggered()), this, SLOT(actionPrependRow())); - connect(ui.actionDeleteRow, SIGNAL(triggered()), this, SLOT(actionDeleteRow())); - connect(ui.actionProcess, SIGNAL(triggered()), this, SLOT(actionProcess())); - connect(ui.actionGroupRows, SIGNAL(triggered()), this, SLOT(actionGroupRows())); - connect(ui.actionExpandSelection, SIGNAL(triggered()), this, SLOT(actionExpandSelection())); - connect(ui.actionOptionsDialog, SIGNAL(triggered()), this, SLOT(actionOptionsDialog())); - //Finally, create a presenter to do the thinking for us m_presenter = boost::shared_ptr(new ReflMainViewPresenter(this)); } @@ -118,7 +107,7 @@ namespace MantidQt /** This slot notifies the presenter that the "save" button has been pressed */ - void QtReflMainView::actionSave() + void QtReflMainView::on_actionSaveTable_triggered() { m_presenter->notify(SaveFlag); } @@ -126,7 +115,7 @@ namespace MantidQt /** This slot notifies the presenter that the "save as" button has been pressed */ - void QtReflMainView::actionSaveAs() + void QtReflMainView::on_actionSaveTableAs_triggered() { m_presenter->notify(SaveAsFlag); } @@ -134,7 +123,7 @@ namespace MantidQt /** This slot notifies the presenter that the "append row" button has been pressed */ - void QtReflMainView::actionAppendRow() + void QtReflMainView::on_actionAppendRow_triggered() { m_presenter->notify(AppendRowFlag); } @@ -142,7 +131,7 @@ namespace MantidQt /** This slot notifies the presenter that the "prepend row" button has been pressed */ - void QtReflMainView::actionPrependRow() + void QtReflMainView::on_actionPrependRow_triggered() { m_presenter->notify(PrependRowFlag); } @@ -150,7 +139,7 @@ namespace MantidQt /** This slot notifies the presenter that the "delete" button has been pressed */ - void QtReflMainView::actionDeleteRow() + void QtReflMainView::on_actionDeleteRow_triggered() { m_presenter->notify(DeleteRowFlag); } @@ -158,7 +147,7 @@ namespace MantidQt /** This slot notifies the presenter that the "process" button has been pressed */ - void QtReflMainView::actionProcess() + void QtReflMainView::on_actionProcess_triggered() { m_presenter->notify(ProcessFlag); } @@ -166,7 +155,7 @@ namespace MantidQt /** This slot notifies the presenter that the "group rows" button has been pressed */ - void QtReflMainView::actionGroupRows() + void QtReflMainView::on_actionGroupRows_triggered() { m_presenter->notify(GroupRowsFlag); } @@ -174,7 +163,7 @@ namespace MantidQt /** This slot notifies the presenter that the "new table" button has been pressed */ - void QtReflMainView::actionNewTable() + void QtReflMainView::on_actionNewTable_triggered() { m_presenter->notify(NewTableFlag); } @@ -182,27 +171,27 @@ namespace MantidQt /** This slot notifies the presenter that the "expand selection" button has been pressed */ - void QtReflMainView::actionExpandSelection() + void QtReflMainView::on_actionExpandSelection_triggered() { m_presenter->notify(ExpandSelectionFlag); } /** - This slot notifies the presenter that the table has been updated/changed by the user + This slot notifies the presenter that the "options..." button has been pressed */ - void QtReflMainView::tableUpdated(const QModelIndex& topLeft, const QModelIndex& bottomRight) + void QtReflMainView::on_actionOptionsDialog_triggered() { - Q_UNUSED(topLeft); - Q_UNUSED(bottomRight); - m_presenter->notify(TableUpdatedFlag); + m_presenter->notify(OptionsDialogFlag); } /** - This slot notifies the presenter that the "options..." button has been pressed + This slot notifies the presenter that the table has been updated/changed by the user */ - void QtReflMainView::actionOptionsDialog() + void QtReflMainView::tableUpdated(const QModelIndex& topLeft, const QModelIndex& bottomRight) { - m_presenter->notify(OptionsDialogFlag); + Q_UNUSED(topLeft); + Q_UNUSED(bottomRight); + m_presenter->notify(TableUpdatedFlag); } /** From 818c3f4717c26ce324eb134884971bbea1481a79 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 29 Oct 2014 13:38:04 +0000 Subject: [PATCH 272/284] Refs #10457 Zero out the progress bar declaratively --- .../inc/MantidQtCustomInterfaces/ReflMainWidget.ui | 6 +++++- .../Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp | 4 ---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index e4d2eed4bba5..759acf3fcdb0 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -322,7 +322,11 @@ 1 - + + + 0 + + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index ac6d8b3c236d..119f220f3ffb 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -46,10 +46,6 @@ namespace MantidQt ui.splitterTables->setStretchFactor(0, 0); ui.splitterTables->setStretchFactor(1, 1); - //Zero out the progress bar - ui.progressBar->setRange(0, 100); - ui.progressBar->setValue(0); - //Allow rows to be reordered ui.viewTable->verticalHeader()->setMovable(true); From 7cc1d8fe9c4a1a677c244e0431542a7a215a79d6 Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 29 Oct 2014 16:21:05 +0000 Subject: [PATCH 273/284] Refs #10457 Rename "Group Rows" to "Group Selected" --- .../inc/MantidQtCustomInterfaces/ReflMainWidget.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index 759acf3fcdb0..05c26ebbdc17 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -485,7 +485,7 @@ :/drag_curves.png:/drag_curves.png - Group Rows + Group Selected
          From 49e699c6c1b5a161058f557a4c0e128935c90d1b Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Wed, 29 Oct 2014 18:05:45 +0000 Subject: [PATCH 274/284] Refs #10457 Merge QToolButtons into a QToolBar --- .../ReflMainWidget.ui | 52 ++++--------------- .../CustomInterfaces/src/QtReflMainView.cpp | 4 -- 2 files changed, 9 insertions(+), 47 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui index 05c26ebbdc17..58628b436de4 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMainWidget.ui @@ -232,49 +232,15 @@ 1 - - - - - AppendRow - - - - - - - DeleteRow - - - - - - - GroupRows - - - - - - - ExpandSelection - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - + + + QToolBar{border: none;} + + + + + + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp index 119f220f3ffb..90769469642f 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/QtReflMainView.cpp @@ -36,10 +36,6 @@ namespace MantidQt { ui.setupUi(this); - ui.buttonAppendRow->setDefaultAction(ui.actionAppendRow); - ui.buttonDeleteRow->setDefaultAction(ui.actionDeleteRow); - ui.buttonGroupRows->setDefaultAction(ui.actionGroupRows); - ui.buttonExpandSelection->setDefaultAction(ui.actionExpandSelection); ui.buttonProcess->setDefaultAction(ui.actionProcess); //Expand the process runs column at the expense of the search column From 355f90da867b79dcf358da3d849d03856e8ebe24 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 30 Oct 2014 14:23:39 +0000 Subject: [PATCH 275/284] Remove call to copy constructor in V3D::distance When called millions of times in a loop, e.g. Monte Carlo, then this can make a noticeably difference. Refs #10169 --- Code/Mantid/Framework/Kernel/src/V3D.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Code/Mantid/Framework/Kernel/src/V3D.cpp b/Code/Mantid/Framework/Kernel/src/V3D.cpp index 1710acb8373b..1e6025349131 100644 --- a/Code/Mantid/Framework/Kernel/src/V3D.cpp +++ b/Code/Mantid/Framework/Kernel/src/V3D.cpp @@ -482,9 +482,8 @@ V3D::cross_prod(const V3D& v) const double V3D::distance(const V3D& v) const { - V3D dif(*this); - dif-=v; - return dif.norm(); + const double dx(x-v.x), dy(y-v.y), dz(z-v.z); + return sqrt(dx*dx +dy*dy + dz*dz); } /** Calculates the zenith angle (theta) of this vector with respect to another From 9986c9e3ec6c37045a0c5bd3f498e63bd05da9ab Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 30 Oct 2014 14:47:46 +0000 Subject: [PATCH 276/284] Use a list instead of a vector inside intersection tests. The lists are small so traversal time is not an issue but it is quicker to push back to a list. Refs #10169 --- .../inc/MantidGeometry/Surfaces/Line.h | 10 ++--- .../Surfaces/LineIntersectVisit.h | 12 +++--- .../Framework/Geometry/src/Objects/Object.cpp | 14 ++++--- .../Framework/Geometry/src/Surfaces/Line.cpp | 12 +++--- .../Geometry/test/LineIntersectVisitTest.h | 39 +++++++------------ .../Mantid/Framework/Geometry/test/LineTest.h | 38 +++++++++--------- 6 files changed, 59 insertions(+), 66 deletions(-) diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/Line.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/Line.h index e5f8957178be..45952481c5df 100644 --- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/Line.h +++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/Line.h @@ -62,7 +62,7 @@ namespace Mantid Kernel::V3D Direct; ///< Direction of outer surface (Unit Vector) int lambdaPair(const int ix,const std::pair, - std::complex >& SQ,std::vector& PntOut) const; + std::complex >& SQ,std::list& PntOut) const; public: @@ -86,10 +86,10 @@ namespace Mantid int setLine(const Kernel::V3D&,const Kernel::V3D&); ///< input Origin + direction - int intersect(std::vector&,const Quadratic&) const; - int intersect(std::vector&,const Cylinder&) const; - int intersect(std::vector&,const Plane&) const; - int intersect(std::vector&,const Sphere&) const; + int intersect(std::list&,const Quadratic&) const; + int intersect(std::list&,const Cylinder&) const; + int intersect(std::list&,const Plane&) const; + int intersect(std::list&,const Sphere&) const; }; diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/LineIntersectVisit.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/LineIntersectVisit.h index dba93f49362a..f225702a7c68 100644 --- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/LineIntersectVisit.h +++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/LineIntersectVisit.h @@ -4,7 +4,7 @@ #include "MantidGeometry/Surfaces/BaseVisit.h" #include "MantidGeometry/Surfaces/Line.h" #include "MantidKernel/V3D.h" -#include +#include namespace Mantid { @@ -56,8 +56,8 @@ namespace Mantid private: Line ATrack; ///< The line - std::vector PtOut; ///< The intersection point - std::vector DOut; ///< The distance + std::list PtOut; ///< The intersection point + std::list DOut; ///< The distance void procTrack(); @@ -66,7 +66,7 @@ namespace Mantid LineIntersectVisit(const Kernel::V3D&, const Kernel::V3D&); /// Destructor - virtual ~LineIntersectVisit() {}; + virtual ~LineIntersectVisit() {} void Accept(const Surface&); void Accept(const Quadratic&); @@ -78,10 +78,10 @@ namespace Mantid // Accessor /// Get the distance - const std::vector& getDistance() const + const std::list& getDistance() const { return DOut; } /// Get the intersection points - const std::vector& getPoints() const + const std::list& getPoints() const { return PtOut; } /// Get the number of intersection points unsigned long getNPoints() const { return (unsigned long)PtOut.size(); } diff --git a/Code/Mantid/Framework/Geometry/src/Objects/Object.cpp b/Code/Mantid/Framework/Geometry/src/Objects/Object.cpp index 344fc90dd795..221750d9bb4f 100644 --- a/Code/Mantid/Framework/Geometry/src/Objects/Object.cpp +++ b/Code/Mantid/Framework/Geometry/src/Objects/Object.cpp @@ -810,16 +810,18 @@ namespace Mantid { (*vc)->acceptVisitor(LI); } - const std::vector& IPts(LI.getPoints()); - const std::vector& dPts(LI.getDistance()); + const auto& IPts(LI.getPoints()); + const auto& dPts(LI.getDistance()); - for (unsigned int i = 0; i < IPts.size(); i++) + auto ditr = dPts.begin(); + auto itrEnd = IPts.end(); + for (auto iitr = IPts.begin(); iitr != itrEnd; ++iitr, ++ditr) { - if (dPts[i] > 0.0) // only interested in forward going points + if (*ditr > 0.0) // only interested in forward going points { // Is the point and enterance/exit Point - const int flag = calcValidType(IPts[i], UT.direction()); - UT.addPoint(flag, IPts[i], *this); + const int flag = calcValidType(*iitr, UT.direction()); + UT.addPoint(flag, *iitr, *this); } } UT.buildLink(); diff --git a/Code/Mantid/Framework/Geometry/src/Surfaces/Line.cpp b/Code/Mantid/Framework/Geometry/src/Surfaces/Line.cpp index 69e2dbbc1e1d..c4c424e9fb55 100644 --- a/Code/Mantid/Framework/Geometry/src/Surfaces/Line.cpp +++ b/Code/Mantid/Framework/Geometry/src/Surfaces/Line.cpp @@ -136,9 +136,9 @@ namespace Mantid } int - Line::lambdaPair(const int ix,const std::pair< + Line::lambdaPair(const int ix, const std::pair< std::complex,std::complex >& SQ, - std::vector& PntOut) const + std::list &PntOut) const /** Helper function to decide which roots to take. The assumption is that lambda has been solved by quadratic @@ -190,7 +190,7 @@ namespace Mantid } int - Line::intersect(std::vector& VecOut, + Line::intersect(std::list &VecOut, const Quadratic& Sur) const /** For the line that intersects the surfaces @@ -220,7 +220,7 @@ namespace Mantid } int - Line::intersect(std::vector& PntOut ,const Plane& Pln) const + Line::intersect(std::list& PntOut ,const Plane& Pln) const /** For the line that intersects the cylinder generate add the point to the VecOut, return number of points @@ -244,7 +244,7 @@ namespace Mantid } int - Line::intersect(std::vector& PntOut ,const Cylinder& Cyl) const + Line::intersect(std::list &PntOut , const Cylinder& Cyl) const /** For the line that intersects the cylinder generate add the point to the VecOut, return number of points @@ -273,7 +273,7 @@ namespace Mantid } int - Line::intersect(std::vector& PntOut ,const Sphere& Sph) const + Line::intersect(std::list &PntOut , const Sphere& Sph) const /** For the line that intersects the cylinder generate add the point to the VecOut, return number of points diff --git a/Code/Mantid/Framework/Geometry/test/LineIntersectVisitTest.h b/Code/Mantid/Framework/Geometry/test/LineIntersectVisitTest.h index 448aafecbc6e..24765b26c270 100644 --- a/Code/Mantid/Framework/Geometry/test/LineIntersectVisitTest.h +++ b/Code/Mantid/Framework/Geometry/test/LineIntersectVisitTest.h @@ -20,8 +20,8 @@ class LineIntersectVisitTest: public CxxTest::TestSuite{ void testConstructor(){ LineIntersectVisit A(V3D(-1.0,-1.0,-1.0),V3D(1.0,0.0,0.0)); TS_ASSERT_EQUALS(A.getNPoints(),0); - TS_ASSERT_EQUALS(A.getPoints(),std::vector()); - TS_ASSERT_EQUALS(A.getDistance(),std::vector()); + TS_ASSERT_EQUALS(A.getPoints(),std::list()); + TS_ASSERT_EQUALS(A.getDistance(),std::list()); } void testAcceptPlane(){ @@ -31,10 +31,10 @@ class LineIntersectVisitTest: public CxxTest::TestSuite{ TS_ASSERT_EQUALS(extractString(B),"-1 px 0\n"); A.Accept(B); TS_ASSERT_EQUALS(A.getNPoints(),1); - std::vector Pnts; + std::list Pnts; Pnts.push_back(V3D(0.0,-1.0,-1.0)); TS_ASSERT_EQUALS(A.getPoints(),Pnts); - std::vector Dist; + std::list Dist; Dist.push_back(1.0); TS_ASSERT_EQUALS(A.getDistance(),Dist); } @@ -45,14 +45,13 @@ class LineIntersectVisitTest: public CxxTest::TestSuite{ Sphere B; B.setSurface("s 0.0 0.0 0.0 2"); A.Accept(B); - std::vector pntOut; + std::list pntOut; // changed for forward going only intercepts on quadratice surfaces //pntOut.push_back(V3D(-2.0,0.0,0.0)); pntOut.push_back(V3D(2.0,0.0,0.0)); TS_ASSERT_EQUALS(A.getNPoints(),1); TS_ASSERT_EQUALS(A.getPoints(),pntOut); - std::vector Dist; - //Dist.push_back(2.0); + std::list Dist; Dist.push_back(2.0); TS_ASSERT_EQUALS(A.getDistance(),Dist); } @@ -67,19 +66,13 @@ class LineIntersectVisitTest: public CxxTest::TestSuite{ A.Accept(B); // change for forward only intercept TS_ASSERT_EQUALS(A.getNPoints(),1); - std::vector pntOut; - pntOut=A.getPoints(); - //TS_ASSERT_DELTA(pntOut[0].X(),-1,0.0000001); - //TS_ASSERT_DELTA(pntOut[0].Y(),0.0,0.0000001); - //TS_ASSERT_DELTA(pntOut[0].Z(),0.0,0.0000001); - TS_ASSERT_DELTA(pntOut[0].X(),1,0.0000001); - TS_ASSERT_DELTA(pntOut[0].Y(),0.0,0.0000001); - TS_ASSERT_DELTA(pntOut[0].Z(),0.0,0.0000001); + const auto &pntOut = A.getPoints(); + TS_ASSERT_DELTA(pntOut.front().X(),1,0.0000001); + TS_ASSERT_DELTA(pntOut.front().Y(),0.0,0.0000001); + TS_ASSERT_DELTA(pntOut.front().Z(),0.0,0.0000001); - std::vector Dist; - Dist=A.getDistance(); - TS_ASSERT_DELTA(Dist[0],1.0,0.0000001); - //TS_ASSERT_DELTA(Dist[1],1.0,0.0000001); + const auto &Dist = A.getDistance(); + TS_ASSERT_DELTA(Dist.front(),1.0,0.0000001); } void testAcceptCylinder(){ @@ -92,13 +85,13 @@ class LineIntersectVisitTest: public CxxTest::TestSuite{ TS_ASSERT_EQUALS(B.getNormal(),V3D(0,1,0)); A.Accept(B); - std::vector pntOut; + std::list pntOut; // forward only //pntOut.push_back(V3D(-1.0,0.0,0.0)); pntOut.push_back(V3D(1.0,0.0,0.0)); TS_ASSERT_EQUALS(A.getNPoints(),1); TS_ASSERT_EQUALS(A.getPoints(),pntOut); - std::vector Dist; + std::list Dist; //Dist.push_back(1.0); Dist.push_back(1.0); TS_ASSERT_EQUALS(A.getDistance(),Dist); @@ -106,14 +99,12 @@ class LineIntersectVisitTest: public CxxTest::TestSuite{ LineIntersectVisit C(V3D(1.1,0.0,0.0),V3D(-1.0,0.0,0.0)); C.Accept(B); TS_ASSERT_EQUALS(C.getNPoints(),2); - std::vector pntOut2; + std::list pntOut2; pntOut2.push_back(V3D(-1.0,0.0,0.0)); pntOut2.push_back(V3D(1.0,0.0,0.0)); TS_ASSERT_EQUALS(C.getPoints(),pntOut2); } - void testAcceptGeneral(){ - } private: std::string extractString(const Surface& pv) diff --git a/Code/Mantid/Framework/Geometry/test/LineTest.h b/Code/Mantid/Framework/Geometry/test/LineTest.h index b0a2f59dc0f6..2b2d4fcf56ba 100644 --- a/Code/Mantid/Framework/Geometry/test/LineTest.h +++ b/Code/Mantid/Framework/Geometry/test/LineTest.h @@ -142,13 +142,12 @@ class LineTest: public CxxTest::TestSuite TS_ASSERT_EQUALS(B.getRadius(),1); TS_ASSERT_EQUALS(B.getNormal(),V3D(0,1,0)); - std::vector pntOut; + std::list pntOut; A.intersect(pntOut,B); // forward only solution for cylinders - TS_ASSERT_EQUALS(pntOut.size(),1); - //TS_ASSERT_EQUALS(pntOut[0],V3D(-1.0,0.0,0.0)); - TS_ASSERT_EQUALS(pntOut[0],V3D(1.0,0.0,0.0)); + TS_ASSERT_EQUALS(pntOut.size(),1); + TS_ASSERT_EQUALS(pntOut.front(),V3D(1.0,0.0,0.0)); } //A Line with equation equivalent to x axis will cut A Cylinder with 1 radius with center at 0,0,0 y axis normal @@ -164,12 +163,13 @@ class LineTest: public CxxTest::TestSuite TS_ASSERT_EQUALS(B.getRadius(),1); TS_ASSERT_EQUALS(B.getNormal(),V3D(0,1,0)); - std::vector pntOut; + std::list pntOut; A.intersect(pntOut,B); - TS_ASSERT_EQUALS(pntOut.size(),2); - TS_ASSERT_EQUALS(pntOut[0],V3D(1.0,0.0,0.0)); - TS_ASSERT_EQUALS(pntOut[1],V3D(-1.0,0.0,0.0)); + TS_ASSERT_EQUALS(pntOut.size(),2); + auto itr = pntOut.begin(); + TS_ASSERT_EQUALS(*(itr++), V3D(1.0,0.0,0.0)); + TS_ASSERT_EQUALS(*itr,V3D(-1.0,0.0,0.0)); } //A Line with equation equivalent to x axis will cut a plane YZ with equation x=5 will cut at one point 5,0,0 @@ -181,11 +181,11 @@ class LineTest: public CxxTest::TestSuite Plane B; TS_ASSERT_EQUALS(B.setSurface("px 5 0 0"),0); - std::vector pntOut; + std::list pntOut; A.intersect(pntOut,B); - TS_ASSERT_EQUALS(pntOut.size(),1); - TS_ASSERT_EQUALS(pntOut[0],V3D(5.0,0.0,0.0)); + TS_ASSERT_EQUALS(pntOut.size(),1); + TS_ASSERT_EQUALS(pntOut.front(),V3D(5.0,0.0,0.0)); } //A Line with equation equivalent to x axis will cut A sphere with 2 radius with center at 0,0,0 @@ -197,12 +197,11 @@ class LineTest: public CxxTest::TestSuite Sphere B; B.setSurface("s 0.0 0.0 0.0 2"); - std::vector pntOut; + std::list pntOut; A.intersect(pntOut,B); // forward only solutions - TS_ASSERT_EQUALS(pntOut.size(),1); - //TS_ASSERT_EQUALS(pntOut[0],V3D(-2.0,0.0,0.0)); - TS_ASSERT_EQUALS(pntOut[0],V3D(2.0,0.0,0.0)); + TS_ASSERT_EQUALS(pntOut.size(),1); + TS_ASSERT_EQUALS(pntOut.front(),V3D(2.0,0.0,0.0)); } //A Line with equation equivalent to x axis starting at -10 will cut A sphere with 2 radius with center at 0,0,0 @@ -214,11 +213,12 @@ class LineTest: public CxxTest::TestSuite Sphere B; B.setSurface("s 0.0 0.0 0.0 2"); - std::vector pntOut; + std::list pntOut; A.intersect(pntOut,B); - TS_ASSERT_EQUALS(pntOut.size(),2); - TS_ASSERT_EQUALS(pntOut[0],V3D(2.0,0.0,0.0)); - TS_ASSERT_EQUALS(pntOut[1],V3D(-2.0,0.0,0.0)); + TS_ASSERT_EQUALS(pntOut.size(),2); + auto itr = pntOut.begin(); + TS_ASSERT_EQUALS(*(itr++), V3D(2.0,0.0,0.0)); + TS_ASSERT_EQUALS(*itr, V3D(-2.0,0.0,0.0)); } }; From bfd7075d8219f63bb5fd353866ff011895ca1e22 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 30 Oct 2014 14:48:13 +0000 Subject: [PATCH 277/284] A few minor things to improve efficiency for intersection calcs Refs #10169 --- .../Geometry/inc/MantidGeometry/Surfaces/Plane.h | 2 +- .../Framework/Geometry/src/Objects/RuleItems.cpp | 15 +++++++++------ .../Framework/Geometry/src/Surfaces/Plane.cpp | 3 +-- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/Plane.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/Plane.h index 8e4c34e0d412..cdb7e3c93834 100644 --- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/Plane.h +++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Surfaces/Plane.h @@ -82,7 +82,7 @@ namespace Mantid double distance(const Kernel::V3D&) const; ///< distance from a point double getDistance() const { return Dist; } ///< Distance from origin - Kernel::V3D getNormal() const { return NormV; } ///< Normal to plane (+ve surface) + const Kernel::V3D & getNormal() const { return NormV; } ///< Normal to plane (+ve surface) void rotate(const Kernel::Matrix&); void displace(const Kernel::V3D&); diff --git a/Code/Mantid/Framework/Geometry/src/Objects/RuleItems.cpp b/Code/Mantid/Framework/Geometry/src/Objects/RuleItems.cpp index b78500bee17f..97a69ac7534f 100644 --- a/Code/Mantid/Framework/Geometry/src/Objects/RuleItems.cpp +++ b/Code/Mantid/Framework/Geometry/src/Objects/RuleItems.cpp @@ -292,9 +292,11 @@ Intersection::isValid(const Kernel::V3D& Vec) const @retval 0 :: Vec is outside object. */ { - if (!A || !B) - return false; - return (A->isValid(Vec) && B->isValid(Vec)) ? true : false; + if(A && B) + { + return (A->isValid(Vec) && B->isValid(Vec)); + } + return false; } bool @@ -849,9 +851,10 @@ SurfPoint::isValid(const Kernel::V3D& Pt) const */ { if (key) - return (key->side(Pt)*sign)>=0 ? true : false; - else - return false; + { + return (key->side(Pt)*sign)>=0; + } + return false; } bool diff --git a/Code/Mantid/Framework/Geometry/src/Surfaces/Plane.cpp b/Code/Mantid/Framework/Geometry/src/Surfaces/Plane.cpp index 95962e6acb5e..4e5004b92152 100644 --- a/Code/Mantid/Framework/Geometry/src/Surfaces/Plane.cpp +++ b/Code/Mantid/Framework/Geometry/src/Surfaces/Plane.cpp @@ -220,8 +220,7 @@ Plane::side(const Kernel::V3D& A) const @retval 0 :: A is on the plane itself (within tolerence) */ { - double Dp=NormV.scalar_prod(A); - Dp-=Dist; + double Dp=NormV.scalar_prod(A)-Dist; if (Tolerance0) ? 1 : -1; return 0; From de1fa94c6fe714988d96a5c7c1e791a38a28b07a Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 30 Oct 2014 15:09:57 +0000 Subject: [PATCH 278/284] Reduce the number of events per run. It brings the unit test time down to an acceptable place. Refs #10169 --- .../Framework/CurveFitting/test/CalculateMSVesuvioTest.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h index 0fd918d229bc..1c58cb8e71c6 100644 --- a/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h +++ b/Code/Mantid/Framework/CurveFitting/test/CalculateMSVesuvioTest.h @@ -37,7 +37,7 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite TS_ASSERT_THROWS_NOTHING(alg->execute()); TS_ASSERT(alg->isExecuted()); - checkOutputValuesAsExpected(alg, 0.0113021908, 0.0028218125); + checkOutputValuesAsExpected(alg, 0.0099824991, 0.0020558473); } // ------------------------ Failure Cases ----------------------------------------- @@ -122,6 +122,9 @@ class CalculateMSVesuvioTest : public CxxTest::TestSuite 27.50000, 4.0172841E-02, 15.07701}; alg->setProperty("AtomicProperties", std::vector(sampleProps, sampleProps + 9)); alg->setProperty("BeamRadius", 2.5); + // reduce number of events for test purposes + alg->setProperty("NumEventsPerRun", 10000); + // outputs alg->setPropertyValue("TotalScatteringWS", "__unused_for_child"); alg->setPropertyValue("MultipleScatteringWS", "__unused_for_child"); From 68bf42abc5949dd3de7fed5dc64d82b216fb171d Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 30 Oct 2014 16:46:48 +0000 Subject: [PATCH 279/284] Add include line for std::accumulate. Refs #10169 --- Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp b/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp index 9b51dfac49f4..a55a3a134365 100644 --- a/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp @@ -4,6 +4,7 @@ #include "MantidCurveFitting/MSVesuvioHelpers.h" #include +#include namespace Mantid { namespace CurveFitting { From ed583fa2afffa5da424c05fe8e4f15fa6204e0ed Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 30 Oct 2014 16:47:10 +0000 Subject: [PATCH 280/284] Fix boost random usage for older boost versions. Refs #10169 --- .../inc/MantidCurveFitting/MSVesuvioHelpers.h | 1 - .../CurveFitting/src/MSVesuvioHelpers.cpp | 14 ++++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/MSVesuvioHelpers.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/MSVesuvioHelpers.h index 89cfe9088d31..9084339ea9eb 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/MSVesuvioHelpers.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/MSVesuvioHelpers.h @@ -7,7 +7,6 @@ #include #include - namespace Mantid { namespace CurveFitting { namespace MSVesuvioHelper diff --git a/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp b/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp index a55a3a134365..7b6aef7d6365 100644 --- a/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/MSVesuvioHelpers.cpp @@ -6,6 +6,8 @@ #include #include +#include + namespace Mantid { namespace CurveFitting { namespace MSVesuvioHelper @@ -279,14 +281,18 @@ namespace Mantid { namespace CurveFitting /// Returns a flat random number between 0.0 & 1.0 double RandomNumberGenerator::flat() { - return uniform_double()(m_generator, - uniform_double::param_type(0.0, 1.0)); + typedef boost::variate_generator uniform_generator; + return uniform_generator(m_generator, + uniform_double(0.0, 1.0))(); } /// Returns a random number distributed by a normal distribution double RandomNumberGenerator::gaussian(const double mean, const double sigma) { - return gaussian_double()(m_generator, - gaussian_double::param_type(mean, sigma)); + typedef boost::variate_generator gauss_generator; + return gauss_generator(m_generator, + gaussian_double(mean, sigma))(); } //------------------------------------------------------------------------- From 8b32bd0d0e1ad1ec8cf1f374ea387985a154be60 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Thu, 30 Oct 2014 17:12:58 +0000 Subject: [PATCH 281/284] Fix ambiguity error on intel compiler. Refs #10169 --- Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp index ef42ec2f43a3..17a999da9740 100644 --- a/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp +++ b/Code/Mantid/Framework/CurveFitting/src/CalculateMSVesuvio.cpp @@ -143,9 +143,9 @@ namespace Mantid m_randgen = new MSVesuvioHelper::RandomNumberGenerator(getProperty("Seed")); // Setup progress - const int64_t nhist = static_cast(m_inputWS->getNumberHistograms()); + const size_t nhist = m_inputWS->getNumberHistograms(); m_progress = new API::Progress(this, 0.0, 1.0, nhist*m_nruns*2); - for(int64_t i = 0; i < nhist; ++i) + for(size_t i = 0; i < nhist; ++i) { // Copy over the X-values From 512cc0ea1eff07c59386bd91dcacab626fbd8807 Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Fri, 31 Oct 2014 08:00:16 +0000 Subject: [PATCH 282/284] Change the category the algorithm to an allowed existing one. Refs #10169 --- .../CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index 89080ea516ec..82069d607175 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -82,7 +82,7 @@ namespace Mantid /// @copydoc Algorithm::version virtual int version() const { return 1; } /// @copydoc Algorithm::category - virtual const std::string category() const { return "Corrections"; } + virtual const std::string category() const { return "ISIS"; } /// @copydoc Algorithm::summary virtual const std::string summary() const { From 6e4da70533e2834f46c6db42bd9554b9a07f62ac Mon Sep 17 00:00:00 2001 From: Martyn Gigg Date: Fri, 31 Oct 2014 12:11:40 +0000 Subject: [PATCH 283/284] Add documentation file for algorithm. Refs #10169 --- .../MantidCurveFitting/CalculateMSVesuvio.h | 4 +- .../algorithms/CalculateMSVesuvio-v1.rst | 59 +++++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 Code/Mantid/docs/source/algorithms/CalculateMSVesuvio-v1.rst diff --git a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h index 82069d607175..0938057d47fe 100644 --- a/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h +++ b/Code/Mantid/Framework/CurveFitting/inc/MantidCurveFitting/CalculateMSVesuvio.h @@ -86,8 +86,8 @@ namespace Mantid /// @copydoc Algorithm::summary virtual const std::string summary() const { - return "Corrects for the effects of multiple scattering " - "on a flat plate or cylindrical sample."; + return "Calculates the contributions of multiple scattering " + "on a flat plate sample for VESUVIO"; } private: diff --git a/Code/Mantid/docs/source/algorithms/CalculateMSVesuvio-v1.rst b/Code/Mantid/docs/source/algorithms/CalculateMSVesuvio-v1.rst new file mode 100644 index 000000000000..8eddae38cace --- /dev/null +++ b/Code/Mantid/docs/source/algorithms/CalculateMSVesuvio-v1.rst @@ -0,0 +1,59 @@ +.. algorithm:: + +.. summary:: + +.. alias:: + +.. properties:: + +Description +----------- + +Calculates the multiple scattering contribution for deep inelastic neutron scattering on +the `Vesuvio `__ instrument at +ISIS. The algorithm follows the procedures defined by J. Mayers et al. [1]_. + + +Usage +----- + +.. code-block:: python + + runs = "" # fill in run numbers here + ip_file = "" # fill in IP file here + data = LoadVesuvio(Filename=, SpectrumList=spectra, + Mode="SingleDifference", InstrumentParFile=ip_file) + # Cut it down to the typical range + data = CropWorkspace(raw_ws,XMin=50.0,XMax=562.0) + # Coarser binning + data = Rebin(raw_ws, Params=[49.5, 1.0, 562.5]) + + # Create sample shape + height = 0.1 # y-dir (m) + width = 0.1 # x-dir (m) + thick = 0.005 # z-dir (m) + + half_height, half_width, half_thick = 0.5*height, 0.5*width, 0.5*thick + xml_str = \ + " " \ + + " " % (half_width,-half_height,half_thick) \ + + " " % (half_width, half_height, half_thick) \ + + " " % (half_width, -half_height, -half_thick) \ + + " " % (-half_width, -half_height, half_thick) \ + + "" + CreateSampleShape(data, xml_str) + atom_props = [1.007900, 0.9272392, 5.003738, + 16.00000, 3.2587662E-02, 13.92299, + 27.50000, 4.0172841E-02, 15.07701] + tot_scatter, ms_scatter = \ + CalculateMSVesuvio(data, NoOfMasses=3, SampleDensity=241, AtomicProperties=atom_props, + BeamRadius=2.5) + +References +---------- + +.. [1] J. Mayers, A.L. Fielding and R. Senesi, `Nucl. Inst Methods A 481, 454(2002) `__ + + + +.. categories:: From 3fff8bbb4d9795f1206933c827b4a6df959d727f Mon Sep 17 00:00:00 2001 From: Harry Jeffery Date: Fri, 31 Oct 2014 13:49:31 +0000 Subject: [PATCH 284/284] Refs #10467 Add option for partial group processing warning --- .../MantidQtCustomInterfaces/ReflOptionsDialog.ui | 12 +++++++++++- .../CustomInterfaces/src/ReflMainViewPresenter.cpp | 3 ++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui index 4eb580d6ee7a..d436410bd92a 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui +++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflOptionsDialog.ui @@ -40,7 +40,7 @@ - + Warn when discarding unsaved changes @@ -50,6 +50,16 @@ + + + + Warn when processing only part of a group + + + WarnProcessPartialGroup + + + diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp index 9cd78d5543c7..39638075735c 100644 --- a/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp +++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp @@ -288,7 +288,7 @@ namespace MantidQt const int& groupId = gIt->first; const std::set& groupRows = gIt->second; //Are we only partially processing a group? - if(groupRows.size() < numRowsInGroup(gIt->first)) + if(groupRows.size() < numRowsInGroup(gIt->first) && m_options["WarnProcessPartialGroup"].toBool()) { std::stringstream err; err << "You have only selected " << groupRows.size() << " of the "; @@ -1096,6 +1096,7 @@ namespace MantidQt //Set defaults m_options["WarnProcessAll"] = true; m_options["WarnDiscardChanges"] = true; + m_options["WarnProcessPartialGroup"] = true; m_options["RoundAngle"] = false; m_options["RoundQMin"] = false; m_options["RoundQMax"] = false;