def visualize_grating(): beamLine = raycing.BeamLine() # bg = BlazedGratingAlt( bg = roe.BlazedGrating( beamLine, 'BlazedGrating', (0, p, 0), pitch=pitch, material=coating, blaze=blaze, #antiblaze=pitch, rho=rho) fig1 = plt.figure(figsize=(8, 6), dpi=72) rect2d = [0.1, 0.1, 0.8, 0.8] ax = fig1.add_axes(rect2d, aspect='auto') ax.set_xlabel(u'y (µm)') ax.set_ylabel(u'z (nm)') ax.set_title( u'Grating profile with {0:.0f} lines/mm and {1}° blaze angle\n'.format( rho, np.degrees(blaze)) + u'and beam footprint at {0}° pitch angle'.format(np.degrees(pitch))) maxY = 2.2 * bg.rho_1 y = np.linspace(-2 * maxY, 2 * maxY, 280) z = bg.local_z(0, y) ax.plot(y * 1e3, z * 1e6, '-k', lw=2) beamSource = rs.Beam(nrays=len(y), forceState=1) beamSourceLoc = rs.Beam(copyFrom=beamSource) raycing.global_to_virgin_local(bg.bl, beamSource, beamSourceLoc, bg.center, slice(None)) raycing.rotate_beam(beamSourceLoc, slice(None), pitch=-pitch) beamSource.z[:] = y * np.tan(pitch) beamGloSG, beamLoSG = bg.reflect(beamSource) ax.plot([beamSourceLoc.y * 1e3, beamLoSG.y * 1e3], [beamSourceLoc.z * 1e6, beamLoSG.z * 1e6], '-r', alpha=0.2, lw=0.5) ax.plot(beamLoSG.y * 1e3, beamLoSG.z * 1e6, 'or', alpha=0.5, lw=3) ax.set_xlim(-maxY * 1e3, maxY * 1e3) mz = bg.rho_1 * np.tan(blaze) ax.set_ylim(-mz * 1.1e6, mz * 0.2e6) y1, y2, z1, z2, d = get_grating_area_fraction(rho, blaze, pitch) xs = np.array([y1, y2]) * 1e3 ys = np.array([z1, z2]) * 1e6 ax.plot(xs, ys, 'og', lw=3) fig1.savefig(prefix + '_profile.png') plt.show()
def run_process(beamLine, shineOnly1stSource=False): beamSource = beamLine.sources[0].shine() beamFSM0 = beamLine.fsm0.expose(beamSource) beamTmp = beamLine.feFixedMask.propagate(beamSource) beamFSMFE = beamLine.fsmFE.expose(beamSource) beamFilter1global, beamFilter1local1, beamFilter1local2 =\ beamLine.filter1.double_refract(beamSource) beamFilter1local2A = rs.Beam(copyFrom=beamFilter1local2) beamFilter1local2A.absorb_intensity(beamSource) beamFurtherDown = beamFilter1global beamVCMglobal, beamVCMlocal = beamLine.vcm.reflect(beamFurtherDown) beamVCMlocal.absorb_intensity(beamFurtherDown) beamFSMVCM = beamLine.fsmVCM.expose(beamVCMglobal) outDict = { 'beamSource': beamSource, 'beamFSM0': beamFSM0, 'beamFSMFE': beamFSMFE, 'beamFilter1global': beamFilter1global, 'beamFilter1local1': beamFilter1local1, 'beamFilter1local2': beamFilter1local2, 'beamFilter1local2A': beamFilter1local2A, 'beamVCMglobal': beamVCMglobal, 'beamVCMlocal': beamVCMlocal, 'beamFSMVCM': beamFSMVCM } beamLine.beams = outDict if showIn3D: beamLine.prepare_flow() return outDict
def run_process(beamLine): thetaNodes = (beamLine.orderThetas[:, np.newaxis] + screenThetas).flatten() waveFSM = beamLine.fsm.prepare_wave(beamLine.bg, screenPhis, thetaNodes) wrepeats = 1 beamLine.fluxIn = 0 for repeat in range(wrepeats): beamSource = beamLine.sources[0].shine(withAmplitudes=True) beamLine.fluxIn += (beamSource.Jss + beamSource.Jpp).sum() beamGglobal, beamGlocal = beamLine.gr.reflect(beamSource) beamFSMrays = beamLine.fsm.expose(beamGglobal) oeGlobal, oeLocal = beamLine.bg.reflect(beamSource) oeLocal.area = beamLine.bg.area rw.diffract(oeLocal, waveFSM) if wrepeats > 1: print('wave repeats: {0} of {1} done'.format(repeat+1, wrepeats)) beamLine.fluxIn /= wrepeats beamLine.fluxOut = (oeLocal.Jss + oeLocal.Jpp)[oeLocal.state == 1].sum() outDict = {'beamSource': beamSource, 'beamGglobal': beamGglobal, 'beamGlocal': beamGlocal, 'beamFSMrays': beamFSMrays, 'waveFSM': waveFSM} beamLine.waveFSM = waveFSM oeLocal.y = oeLocal.y % (4*beamLine.bg.rho_1) - 2*beamLine.bg.rho_1 outDict['oeLocal'] = oeLocal saw = rs.Beam(copyFrom=oeLocal) saw.y = np.random.uniform(-1.1, 1.1, size=len(saw.x)) * beamLine.bg.rho_1 saw.z = beamLine.bg.local_z(0, saw.y) outDict['saw'] = saw return outDict
def align_beamline(HOMS, energy): SourceBeam = rsources.Beam(nrays=2) SourceBeam.a[:] = 0 SourceBeam.b[:] = 1 SourceBeam.c[:] = 0 SourceBeam.x[:] = 0 SourceBeam.y[:] = 0 SourceBeam.z[:] = 0 SourceBeam.state[:] = 1 SourceBeam.E[:] = energy tmpy = HOMS.P1H.center[1] newx = HOMS.P1H.center[0] newz = HOMS.P1H.center[2] HOMS.P1H.center = (newx, tmpy, newz) print("P1H.center:", HOMS.P1H.center) P1Hbeam = HOMS.P1H.expose(beam=SourceBeam) tmpy = HOMS.M1H.center[1] newx = HOMS.M1H.center[0] newz = HOMS.M1H.center[2] HOMS.M1H.center = (newx, tmpy, newz) print("M1H.center:", HOMS.M1H.center) M1HBeam, oe01beamLocal01 = HOMS.M1H.reflect(beam=SourceBeam) tmpy = HOMS.P2H.center[1] newx = HOMS.P2H.center[0] newz = HOMS.P2H.center[2] HOMS.P2H.center = (newx, tmpy, newz) print("P2H.center:", HOMS.P2H.center) P2Hbeam = HOMS.P2H.expose(beam=M1HBeam) tmpy = HOMS.M2H.center[1] newx = HOMS.M2H.center[0] newz = HOMS.M2H.center[2] HOMS.M2H.center = (newx, tmpy, newz) print("M2H.center:", HOMS.M2H.center) M2HBeam, oe02beamLocal01 = HOMS.M2H.reflect(beam=M1HBeam) tmpy = HOMS.P3H.center[1] newx = HOMS.P3H.center[0] newz = HOMS.P3H.center[2] HOMS.P3H.center = (newx, tmpy, newz) print("P3H.center:", HOMS.P3H.center) P3HBeam = HOMS.P3H.expose(beam=M2HBeam) tmpy = HOMS.DG3.center[1] newx = HOMS.DG3.center[0] newz = HOMS.DG3.center[2] HOMS.DG3.center = (newx, tmpy, newz) print("DG3.center:", HOMS.DG3.center) DG3Beam = HOMS.DG3.expose(beam=M2HBeam)
def run_process(beamLine): beamSource = beamLine.sources[0].shine() beamLine.feFixedMask.propagate(beamSource) beamFilter1global, beamFilter1local1, beamFilter1local2 = \ beamLine.filter1.double_refract(beamSource) beamFilter1local2A = rs.Beam(copyFrom=beamFilter1local2) beamFilter1local2A.absorb_intensity(beamSource) outDict = {'beamSource': beamSource, 'beamFilter1global': beamFilter1global, 'beamFilter1local1': beamFilter1local1, 'beamFilter1local2': beamFilter1local2, 'beamFilter1local2A': beamFilter1local2A} beamLine.beams = outDict return outDict
def run_process(beamLine): ygloS = beamLine.yglo * (beamLine.E / E_FZP) + p wavelen = len(ygloS) wave3Dpoints = rs.Beam(nrays=wavelen, forceState=1, withAmplitudes=True) rw.prepare_wave(beamLine.fzp, wave3Dpoints, beamLine.xglo, ygloS, beamLine.zglo) wave3Dpoints.dS = 1 wrepeats = 1 for repeat in range(wrepeats): beamSource = beamLine.sources[0].shine(withAmplitudes=True) outDict = {'beamSource': beamSource} beamLine.fluxIn = (beamSource.Jss + beamSource.Jpp).sum() oeGlobal, oeLocal = beamLine.fzp.reflect(beamSource) oeLocal.area = beamLine.fzp.area rw.diffract(oeLocal, wave3Dpoints) if wrepeats > 1: print('wave repeats: {0} of {1} done'.format(repeat + 1, wrepeats)) beamLine.intensityDiffr = wave3Dpoints.Jss + wave3Dpoints.Jpp return outDict
def run_process(beamLine, shineOnly1stSource=False): beamSource = beamLine.sources[0].shine() # beamLine.feFixedMask.propagate(beamSource) beamFSM0 = beamLine.fsm0.expose(beamSource) beamM1global, beamM1local = beamLine.m1.reflect(beamSource) beamFSM1 = beamLine.fsm1.expose(beamM1global) beamM2global, beamM2local = beamLine.m2.reflect(beamM1global) beamPGglobal, beamPGlocal = beamLine.pg.reflect(beamM2global) beamFSMPG = beamLine.fsmPG.expose(beamPGglobal) beamM3global, beamM3local = beamLine.m3.reflect(beamPGglobal) beamFSM3hf = beamLine.fsm3hf.expose(beamM3global) beamFSM3vf = beamLine.fsm3vf.expose(beamM3global) outDict = {'beamSource': beamSource, 'beamFSM0': beamFSM0, 'beamM1global': beamM1global, 'beamM1local': beamM1local, 'beamFSM1': beamFSM1, 'beamM2global': beamM2global, 'beamM2local': beamM2local, 'beamPGglobal': beamPGglobal, 'beamPGlocal': beamPGlocal, 'beamFSMPG': beamFSMPG, 'beamM3global': beamM3global, 'beamM3local': beamM3local, 'beamFSM3hf': beamFSM3hf, 'beamFSM3vf': beamFSM3vf, } for iopening, s1 in enumerate(beamLine.s1s): beamM3globalTemp = rs.Beam(copyFrom=beamM3global) s1.propagate(beamM3globalTemp) beamFSM3vs = beamLine.fsm3vf.expose(beamM3globalTemp) beamM4global, beamM4local = beamLine.m4.reflect(beamM3globalTemp) beamFSMExp1 = beamLine.fsmExp1.expose(beamM4global) beamFSMExp2 = beamLine.fsmExp2.expose(beamM4global) sti = '{0:02d}'.format(iopening) outDict['beamFSM3vsOp'+sti] = beamFSM3vs outDict['beamM4globalOp'+sti] = beamM4global outDict['beamM4localOp'+sti] = beamM4local outDict['beamFSMExp1Op'+sti] = beamFSMExp1 outDict['beamFSMExp2Op'+sti] = beamFSMExp2 return outDict
def run_process(beamLine, shineOnly1stSource=False): for i in range(len(beamLine.sources)): curSource = beamLine.sources[i].shine() if i == 0: beamSource = curSource else: beamSource.concatenate(curSource) if shineOnly1stSource: break beamFSM0 = beamLine.fsm0.expose(beamSource) beamTmp1 = beamLine.feFixedMask.propagate(beamSource) beamFSMFE = beamLine.fsmFE.expose(beamSource) beamFilter1global, beamFilter1local1, beamFilter1local2 = \ beamLine.filter1.double_refract(beamSource) beamFilter1local2A = rs.Beam(copyFrom=beamFilter1local2) beamFilter1local2A.absorb_intensity(beamSource) if hasattr(beamLine, 'filter2'): beamFilter2global, beamFilter2local1, beamFilter2local2 = \ beamLine.filter2.double_refract(beamFilter1global) beamFilter2local2.absorb_intensity(beamFilter1global) beamFurtherDown = beamFilter2global else: beamFurtherDown = beamFilter1global # beamFurtherDown = beamSource beamVCMglobal, beamVCMlocal = beamLine.vcm.reflect(beamFurtherDown) beamVCMlocal.absorb_intensity(beamFurtherDown) beamFSMVCM = beamLine.fsmVCM.expose(beamVCMglobal) beamDCMglobal, beamDCMlocal1, beamDCMlocal2 = \ beamLine.dcm.double_reflect(beamVCMglobal) beamDCMlocal1.absorb_intensity(beamVCMglobal) beamBSBlocklocal = beamLine.BSBlock.propagate(beamDCMglobal) beamSlitAfterDCMlocal = beamLine.slitAfterDCM.propagate(beamDCMglobal) beamFSMDCM = beamLine.fsmDCM.expose(beamDCMglobal) beamVFMglobal, beamVFMlocal = beamLine.vfm.reflect(beamDCMglobal) beamSlitAfterVFMlocal = beamLine.slitAfterVFM.propagate(beamVFMglobal) beamFSMVFM = beamLine.fsmVFM.expose(beamVFMglobal) beamPSLocal = beamLine.ohPS.propagate(beamVFMglobal) beamSlitEHLocal = beamLine.slitEH.propagate(beamVFMglobal) beamFSMSample = beamLine.fsmSample.expose(beamVFMglobal) # 'beamFilter2global': beamFilter2global, # 'beamFilter2local1': beamFilter2local1, # 'beamFilter2local2': beamFilter2local2, outDict = { 'beamSource': beamSource, 'beamFSM0': beamFSM0, 'beamFSMFE': beamFSMFE, 'beamFilter1global': beamFilter1global, 'beamFilter1local1': beamFilter1local1, 'beamFilter1local2': beamFilter1local2, 'beamFilter1local2A': beamFilter1local2A, 'beamVCMglobal': beamVCMglobal, 'beamVCMlocal': beamVCMlocal, 'beamFSMVCM': beamFSMVCM, 'beamDCMglobal': beamDCMglobal, 'beamDCMlocal1': beamDCMlocal1, 'beamDCMlocal2': beamDCMlocal2, 'beamFSMDCM': beamFSMDCM, 'beamBSBlocklocal': beamBSBlocklocal, 'beamSlitAfterDCMlocal': beamSlitAfterDCMlocal, 'beamFSMDCM': beamFSMDCM, 'beamVFMglobal': beamVFMglobal, 'beamVFMlocal': beamVFMlocal, 'beamSlitAfterVFMlocal': beamSlitAfterVFMlocal, 'beamFSMVFM': beamFSMVFM, 'beamPSLocal': beamPSLocal, 'beamSlitEHLocal': beamSlitEHLocal, 'beamFSMSample': beamFSMSample } if hasattr(beamLine, 'filter2'): outDict['beamFilter2global'] = beamFilter2global outDict['beamFilter2local1'] = beamFilter2local1 outDict['beamFilter2local2'] = beamFilter2local2 beamLine.beams = outDict if showIn3D: beamLine.prepare_flow() return outDict
def shine(self, hitpoint=(0, 10, 0)): """ Source special logic, shine in direction defined by hitpoint""" # Obsolete parameters used by the original shine() method toGlobal = True withAmplitudes = False accuBeam = None # Prepare beam to be returned bo = rs.Beam(self.nrays, withAmplitudes=withAmplitudes) bo.state[:] = 1 self._apply_distribution(bo.y, self.disty, self.dy) # TODO Add normal distribution! # We want to shine a flat distribution # around the capillary entrance point xMin, xMax = hitpoint[0] - self.dx, hitpoint[0] + self.dx bo.x = np.random.uniform(xMin, xMax, self.nrays) zMin, zMax = hitpoint[2] - self.dz, hitpoint[2] + self.dz bo.z = np.random.uniform(zMin, zMax, self.nrays) # Likewise we want the momentum to be distributed # around the direction of the capillary entrance # Only direction of momentum can be specified # so normalization is mandatory normfactor = np.sqrt(sum([x**2 for x in hitpoint])) # With momentum distribution in the x-direction ... a0 = 1. * hitpoint[0] / normfactor aMin, aMax = a0 - self.dxprime, a0 + self.dxprime bo.a = np.random.uniform(aMin, aMax, self.nrays) # ... and in the z-direction ... c0 = 1. * hitpoint[2] / normfactor cMin, cMax = c0 - self.dzprime, c0 + self.dzprime bo.c = np.random.uniform(cMin, cMax, self.nrays) # ... we can find the momentum distribution in the y-direction ac = bo.a**2 + bo.c**2 if sum(ac > 1) > 0: bo.b[:] = (ac + 1)**0.5 bo.a[:] /= bo.b bo.c[:] /= bo.b bo.b[:] = 1.0 / bo.b else: bo.b[:] = (1 - ac)**0.5 # This assumes that distE is not None bo.E[:] = rs.make_energy(self.distE, self.energies,\ self.nrays, self.filamentBeam) # Add a container for number of reflections for each ray bo.nRefl = np.zeros_like(bo.state) # So far we neglect polarization, but it's needed # for xrt compatibility rs.make_polarization(self.polarization, bo, self.nrays) # This assumes toGlobal is True raycing.virgin_local_to_global(self.bl, bo, self.center) return bo
def align_beamline(beamLine, energy): geometricSource01beamGlobal01 = rsources.Beam(nrays=2) geometricSource01beamGlobal01.a[:] = 0 geometricSource01beamGlobal01.b[:] = 1 geometricSource01beamGlobal01.c[:] = 0 geometricSource01beamGlobal01.x[:] = 0 geometricSource01beamGlobal01.y[:] = 0 geometricSource01beamGlobal01.z[:] = 0 geometricSource01beamGlobal01.E[:] = energy geometricSource01beamGlobal01.state[:] = 1 tmpy = beamLine.screen02.center[1] newx = beamLine.screen02.center[0] newz = beamLine.screen02.center[2] beamLine.screen02.center = (newx, tmpy, newz) print("screen02.center:", beamLine.screen02.center) screen02beamLocal01 = beamLine.screen02.expose( beam=geometricSource01beamGlobal01) tmpy = beamLine.lauePlate01.center[1] newx = beamLine.lauePlate01.center[0] newz = beamLine.lauePlate01.center[2] beamLine.lauePlate01.center = (newx, tmpy, newz) print("lauePlate01.center:", beamLine.lauePlate01.center) braggT = crystalSi01.get_Bragg_angle(energy) alphaT = 0 if beamLine.lauePlate01.alpha is None else beamLine.lauePlate01.alpha lauePitch = 0 print("bragg, alpha:", np.degrees(braggT), np.degrees(alphaT), "degrees") braggT += -crystalSi01.get_dtheta(energy, alphaT) if crystalSi01.geom.startswith('Laue'): lauePitch = 0.5 * np.pi print("braggT:", np.degrees(braggT), "degrees") loBeam = rsources.Beam(copyFrom=geometricSource01beamGlobal01) raycing.global_to_virgin_local(beamLine, geometricSource01beamGlobal01, loBeam, center=beamLine.lauePlate01.center) raycing.rotate_beam( loBeam, roll=-(beamLine.lauePlate01.positionRoll + beamLine.lauePlate01.roll), yaw=-beamLine.lauePlate01.yaw, pitch=0) theta0 = np.arctan2(-loBeam.c[0], loBeam.b[0]) th2pitch = np.sqrt(1. - loBeam.a[0]**2) targetPitch = np.arcsin(np.sin(braggT) / th2pitch) -\ theta0 targetPitch += alphaT + lauePitch beamLine.lauePlate01.pitch = targetPitch print("lauePlate01.pitch:", np.degrees(beamLine.lauePlate01.pitch), "degrees") lauePlate01beamGlobal01, lauePlate01beamLocal01 = beamLine.lauePlate01.reflect( beam=geometricSource01beamGlobal01) print "Laue Plate exit point" print lauePlate01beamGlobal01.x, lauePlate01beamGlobal01.y, lauePlate01beamGlobal01.z tmpy = beamLine.screen01.center[1] newx = lauePlate01beamGlobal01.x[0] +\ lauePlate01beamGlobal01.a[0] * (tmpy - lauePlate01beamGlobal01.y[0]) /\ lauePlate01beamGlobal01.b[0] newz = lauePlate01beamGlobal01.z[0] +\ lauePlate01beamGlobal01.c[0] * (tmpy - lauePlate01beamGlobal01.y[0]) /\ lauePlate01beamGlobal01.b[0] beamLine.screen01.center = (newx, tmpy, newz) print("screen01.center:", beamLine.screen01.center) screen01beamLocal01 = beamLine.screen01.expose( beam=lauePlate01beamGlobal01)
def visualize_grating(): from matplotlib.patches import Arc beamLine = raycing.BeamLine() bg = roe.BlazedGrating( beamLine, 'BlazedGrating', (0, p, 0), pitch=pitch, material=coating, blaze=blaze, #antiblaze=pitch, rho=rho, # gratingDensity=['y', rho, 1, 0, 1e-7] ) fig1 = plt.figure(figsize=(8, 6), dpi=100) rect2d = [0.1, 0.1, 0.8, 0.8] ax = fig1.add_axes(rect2d, aspect='auto') ax.set_xlabel(u'y (µm)') ax.set_ylabel(u'z (nm)') ax.set_title( u'Grating profile with {0:.0f} lines/mm and {1:.2f}° blaze angle\n'.format( rho, np.degrees(blaze)) + u'and beam footprint at {0}° pitch angle'.format(np.degrees(pitch))) maxY = 2.2 * bg.rho_1 y = np.linspace(-2*maxY, 2*maxY, 1000) z = bg.local_z(0, y) ax.plot(y*1e3, z*1e6, '-k', lw=2) y = np.linspace(-2*maxY, 2*maxY, 300) z = bg.local_z(0, y) beamSource = rs.Beam(nrays=len(y), forceState=1) beamSourceLoc = rs.Beam(copyFrom=beamSource) raycing.global_to_virgin_local(bg.bl, beamSource, beamSourceLoc, bg.center, slice(None)) raycing.rotate_beam(beamSourceLoc, slice(None), pitch=-pitch) beamSource.z[:] = y * np.tan(pitch) beamGloSG, beamLoSG = bg.reflect(beamSource) ax.plot([beamSourceLoc.y*1e3, beamLoSG.y*1e3], [beamSourceLoc.z*1e6, beamLoSG.z*1e6], '-r', alpha=0.2, lw=0.5) ax.plot(beamLoSG.y*1e3, beamLoSG.z*1e6, 'or', alpha=0.5, lw=3) ax.set_xlim(-maxY*1e3, maxY*1e3) mz = bg.rho_1*np.tan(blaze) ax.set_ylim(-mz*1.1e6, mz*0.2e6) # y1, y2, z1, z2, d = get_grating_area_fraction(rho, blaze, pitch) # xs = np.array([y1, y2]) * 1e3 # ys = np.array([z1, z2]) * 1e6 # ax.plot(xs, ys, 'og', lw=3) if bg.gratingDensity is not None: ax.plot(bg.ticks*1e3, np.zeros_like(bg.ticks), 'og', lw=3) ax.plot([-0.5, 2.2], [-mz*1e6, -mz*1e6], alpha=0.5, lw=1) ax.add_patch(Arc([0, -mz*1e6], maxY*0.22e3, mz*0.2e6, theta1=0, theta2=90-blazeDeg, color='b')) ax.add_patch(Arc([bg.rho_1*1e3, -mz*1e6], maxY*0.22e3, mz*0.2e6, theta1=90, theta2=180, color='b')) ax.text(bg.rho_1*0.15e3, -mz*0.9e6, 'blaze', ha='left', va='center', fontsize=12, color='b') ax.text(bg.rho_1*0.97e3, -mz*0.83e6, 'anti-\nblaze', ha='right', va='center', fontsize=12, color='b') fig1.savefig(prefix + '_profile.png') plt.show()