Commit 9baa6313 authored by Zolnierczuk, Piotr's avatar Zolnierczuk, Piotr
Browse files

rudimentary diffraction scan writer

parent 59189771
Loading
Loading
Loading
Loading
+33 −29
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ def get_phase_index(scan_index, offset=0):




class DiffractionWriter(DiffractionScan):
    "Convert EPICS/ADARA/NeXus file to diffrun .dat file"

@@ -50,8 +51,8 @@ class DiffractionWriter(DiffractionScan):
        diffrun = self.make_filename(self.info['base'])
        with open(os.path.join(outdir, diffrun), 'wt', encoding='ascii') as fd:
            #
            fd.write('"############################"\n')
            fd.write('"### Starting diffraction run" %s\n' % self.info['time'])
            fd.write( "\"############################\"\n")
            fd.write(f"\"### Starting diffraction run\" {self.info['time']}\n")
            self.log.info("%s: creating diffrun .dat file", diffrun)

            lmin = self.info.get('lmin', 5.0)*ANGSTROM
@@ -60,9 +61,11 @@ class DiffractionWriter(DiffractionScan):
            lambda_tab = (lambda_tab[1:]+lambda_tab[:-1])/2
            attpow = get_attenuator_pos(self.info.get('moatt', 0.0))

            upcnt = None
            for iq, res in self.data.items():
                spin_up  = not iq%2
                fd.write('"############################"\n')
                spin_lbl = "Spin up" if spin_up else "Spin down"
                fd.write( "\"############################\"\n")
                fd.write( "-------------- physics parameters -----------------\n")
                fd.write(f"lambda =                {lmax:g}\n")
                fd.write(f"lambdaMin =                {lmin:g}\n")
@@ -76,43 +79,44 @@ class DiffractionWriter(DiffractionScan):

                qmin    = res.get('qmin')
                pcharge = res['pcharge']*PROTON_CHARGE_UNIT #  convert to echo units
                detsum  = res['neutron'].shape[-1]
                detwin  = detsum

                fd.write(f"\"Q\"   {qmin:g}  ")
                # detector data
                neutrons = res['neutron']
                xbin = self.info['xbin']
                ybin = self.info['ybin']
                tbin = self.info['tbin']
                h3,_  = np.histogramdd((neutrons[0], neutrons[1], neutrons[2]),
                                  bins=(tbin, ybin, xbin))
                detsum  = neutrons.shape[-1]
                tofdet  = h3.sum(axis=(1,2))
                detwin  = int(np.sum(h3[:,10:22,10:22])) # FIXME: hardcoded detwin
                if spin_up:
                    fd.write(f"\"Spin up\"     ")
                else:
                    fd.write(f"\"Spin down\"   ")
                    upcnt = detsum

                fd.write(f"\"Q\"   {qmin:g}  \"{spin_lbl}\"  ")
                fd.write(f"\"Proton charge\"  {pcharge:.0f}  ")
                detsum = res['neutron'].shape[-1]
                detwin = detsum
                fd.write(f"\"Det sum\"   {detsum}    ")
                fd.write(f"\"Det win\"   {detwin}    ")
#               FIXME HERE
                fd.write(f"\"Det tc sum\"\n")
                for _ in range(42):
                    fd.write(f"0\n")
                fd.write(f"\"Mon1 tc sum\"\n")
                for _ in range(42):
                    fd.write(f"0\n")
                fd.write(f"\"Mon2 tc sum\"\n")
                for _ in range(42):
                    fd.write(f"0\n")
                fd.write(f"\n")
                fd.write( "\"Det tc sum\"\n")
                fd.write("\n".join([f"{val:.0f}" for val in tofdet]))
                fd.write( "\n\"Mon1 tc sum\"\n")
                fd.write("\n".join(["0" for _ in tofdet]))
                fd.write( "\n\"Mon2 tc sum\"\n")
                fd.write("\n".join(["0" for _ in tofdet]))
                fd.write( "\n")
#
                fd.write(f"\"Q\"   {qmin:g}  ")
                if spin_up:
                    fd.write(f"\"Spin up\"     ")
                else:
                    fd.write(f"\"Spin down\"   ")
                fd.write(f"\"Q\"   {qmin:g}  \"{spin_lbl}\"   ")
                fd.write(f"\"Det sum/proton charge\"  {detsum/pcharge:g}  ")
                fd.write(f"\"Det win/proton charge\"  {detwin/pcharge:g}  ")
                fd.write( "\n")

                if not spin_up:
                    if detsum>0:
                        fr = upcnt/detsum
                    else:
                        fr = np.nan
                    fd.write(f"\"Q\"   {qmin:g}  ")
                    fd.write(f"\"flip ratio\" 1.0\n")
                    fd.write(f"\"flip ratio\" {fr:g}\n")

            self.log.info("%s: done", diffrun)