def Fblock(a, first): # read Ascii block of Floats line1 = a[first] line2 = a[first + 1] val = ExtractInt(line2) numb = val[0] lines = numb / 5 last = numb - 5 * lines if line1.startswith('F'): error = '' else: error = 'NOT an F block starting at line ' + str(first) logger.information('ERROR *** ' + error) sys.exit(error) fval = [] for m in range(0, lines): mm = first + 2 + m val = ExtractFloat(a[mm]) for n in range(0, 5): fval.append(val[n]) mm += 1 val = ExtractFloat(a[mm]) for n in range(0, last): fval.append(val[n]) mm += 1 return mm, fval # values as list
def ReadInxGroup(asc, n, lgrp): # read ascii x,y,e x = [] y = [] e = [] first = n * lgrp last = (n + 1) * lgrp val = ExtractFloat(asc[first + 2]) Q = val[0] for m in range(first + 4, last): val = ExtractFloat(asc[m]) x.append(val[0] / 1000.0) y.append(val[1]) e.append(val[2]) npt = len(x) return Q, npt, x, y, e # values of x,y,e as lists
def IN13Read(instr, run, ana, refl, Plot, Save): # Ascii start routine workdir = config['defaultsave.directory'] path, fname = getFilePath(run, '.asc', instr) logger.information('Reading file : ' + path) asc = loadFile(path) # header block text = asc[1] run = text[:8] text = asc[4] # run line instr = text[:4] next, Ival = Iblock(asc, 5) nsubsp = Ival[0] nspec = Ival[153] - 2 # text block text = asc[25] title = text[:20] # para1 block next, Fval = Fblock(asc, 32) ntemp = int(Fval[6]) f1 = ntemp / 10 ltemp = int(f1) f2 = f1 - 10 * ltemp if f2 >= 0.: ltemp = ltemp + 1 wave = 2.0 * Fval[81] logger.information('No. sub-spectra : ' + str(nsubsp)) logger.information('No. spectra : ' + str(nspec)) logger.information('Scan type : ' + str(int(Fval[8])) + ' ; Average energy : ' + str(Fval[9])) logger.information('CaF2 lattice : ' + str(Fval[81]) + ' ; Graphite lattice : ' + str(Fval[82])) logger.information('Wavelength : ' + str(wave)) logger.information('No. temperatures : ' + str(ntemp)) logger.information('No. temperature lines : ' + str(ltemp)) # para2 block next, Fval = Fblock(asc, next) angles = Fval[:nspec] logger.information('Angles : ' + str(angles)) lspec = 4 + ltemp # monitors psd = next + (nspec + 2048) * lspec l1m1 = psd + 1 l2m1 = l1m1 + 3 mon1 = ExtractFloat(asc[l2m1]) logger.information('Mon1 : Line ' + str(l2m1) + ' : ' + asc[l2m1]) # raw spectra first = next xDat = angles y2D = [] e2D = [] for n in range(0, nspec): ylist = [] elist = [] l1 = first + lspec * n + 1 logger.information('Line ' + str(l1) + ' : ' + asc[l1]) for l in range(0, ltemp): l2 = l1 + 3 + l val = ExtractFloat(asc[l2]) nval = len(val) for m in range(0, nval): ylist.append(val[m] / mon1[m]) elist.append(math.sqrt(val[m]) / mon1[m]) y2D.append(ylist) e2D.append(elist) # create WS npt = len(xDat) xDat.append(2 * xDat[npt - 1] - xDat[npt - 2]) ascWS = fname + '_' + ana + refl + '_ang' outWS = fname + '_' + ana + refl + '_q' xD = np.array(xDat) k0 = 4 * math.pi / wave Q = [] for n in range(0, nspec): if angles[n] >= 180.0: angles[n] = 360.0 - angles[n] theta = math.radians(angles[n] / 2.) qq = k0 * math.sin(theta) Q.append(qq) Qa = np.array(Q) sorted_indices = Qa.argsort() sorted_Q = Qa[sorted_indices] lxdq = len(sorted_Q) xlast = 2 * sorted_Q[lxdq - 1] - sorted_Q[lxdq - 2] sorted_Q = np.append(sorted_Q, xlast) xDq = sorted_Q for m in range(0, nval): ylist = [] elist = [] for n in range(0, nspec): ylist.append(y2D[n][m]) elist.append(e2D[n][m]) y1D = np.array(ylist) e1D = np.array(elist) y1Dq = y1D[sorted_indices] e1Dq = e1D[sorted_indices] if m == 0: xData = xD yData = y1D eData = e1D xDq = sorted_Q yDq = y1Dq eDq = e1Dq else: xData = np.append(xData, xD) yData = np.append(yData, y1D) eData = np.append(eData, e1D) xDq = np.append(xDq, sorted_Q) yDq = np.append(yDq, y1Dq) eDq = np.append(eDq, e1Dq) CreateWorkspace(OutputWorkspace=ascWS, DataX=xData, DataY=yData, DataE=eData, Nspec=3, UnitX='MomentumTransfer') IN13Paras(ascWS, run, title, wave) CreateWorkspace(OutputWorkspace=outWS, DataX=xDq, DataY=yDq, DataE=eDq, Nspec=3, UnitX='MomentumTransfer') IN13Paras(outWS, run, title, wave) if Save: opath = os.path.join(workdir, outWS + '.nxs') SaveNexusProcessed(InputWorkspace=outWS, Filename=opath) logger.information('Output file : ' + opath) if Plot != 'None': plotForce(outWS, Plot) return outWS