Ejemplo n.º 1
0
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()
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
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
Ejemplo n.º 9
0
    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
Ejemplo n.º 10
0
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)
Ejemplo n.º 11
0
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()