Gatan | AMETEKSkip to Main Content
No options found

WARCL polar map to energy-momentum mapping

DigitalMicrograph Script

Remaps a 3D WARCL polar map image stack to an energy-momentum basis.

Preview

// $BACKGROUND$

Number Ne = 670/1 // Number of energy bins
Number Nm = 320*4 // Number of pixels in momentum map
Number Nphi = 180 // Number of phi slices over 180 deg
Number MapRotation = 0

Image raw := GetFrontImage()
Number Nx = raw.ImageGetDimensionSize(0)
Number Ny = raw.ImageGetDimensionSize(1)
Number Nz = raw.ImageGetDimensionSize(2)
Number Dispersion_nm = raw.ImageGetDimensionScale(2)
Number WavelengthMin_nm = raw.ImageGetDimensionOrigin(2)
Number WavelengthMax_nm = WavelengthMin_nm + Dispersion_nm*(Nz -1)
Number WavelengthCenter_nm = WavelengthMin_nm + Dispersion_nm*(Nz-1)/2
Number EnergyMin_eV = 1239.8/(WavelengthMax_nm)
Number EnergyMax_eV = 1239.8/(WavelengthMin_nm)
Number Kmax_um = sin(90*pi()/180)*2*pi()/(WavelengthMin_nm/1000)
Number AngleSampling_deg = raw.ImageGetDimensionScale(0)
Number AngleMax_deg = AngleSampling_deg*Nx/2

Result("\n" + Dispersion_nm)
Result("\n" + WavelengthMin_nm)
Result("\n" + WavelengthCenter_nm)
Result("\n" + EnergyMin_eV)
Result("\n" + EnergyMax_eV)
Result("\n" + AngleSampling_deg)
Result("\n" + AngleMax_deg)

Image Energy_eV := RealImage("Energy", 4, Nx, Ne)
Energy_eV = EnergyMin_eV + (EnergyMax_eV - EnergyMin_eV)*irow/Ne

Image Row := (Nz/(WavelengthMax_nm - WavelengthMin_nm))*(1239.8/Energy_eV - WavelengthMin_nm)
//Row.showImage()

Image RawSlice := RealImage("Temp raw slice", 4, Nx, Nz)
Image EnergyARCL := RealImage("Energy sampled ARCL", 4, Nx, Ny, Ne)

EnergyARCL.ImageSetDimensionScale(2, (EnergyMax_eV - EnergyMin_eV)/Ne)
EnergyARCL.ImageSetDimensionOrigin(2, EnergyMin_eV)
EnergyARCL.ImageSetDimensionUnitString(2, "eV")
EnergyARCL.ImageSetDimensionScale(0, raw.ImageGetDimensionScale(0))
EnergyARCL.ImageSetDimensionOrigin(0, raw.ImageGetDimensionOrigin(0))
EnergyARCL.ImageSetDimensionUnitString(0, raw.ImageGetDimensionUnitString(0))
EnergyARCL.ImageSetDimensionScale(1, raw.ImageGetDimensionScale(1))
EnergyARCL.ImageSetDimensionOrigin(1, raw.ImageGetDimensionOrigin(1))
EnergyARCL.ImageSetDimensionUnitString(1, raw.ImageGetDimensionUnitString(1))

//EnergyARCL.showImage()

for (number i = 0; i < Ny; i++)
{
	RawSlice = Slice2(raw, 0, i, 0, 0, Nx, 1, 2, Nz, 1)
	Slice2(EnergyARCL, 0, i, 0, 0, Nx, 1, 2, Ne, 1) = Warp(RawSlice, icol, Row)
	
	// Result("\n" + i)
}

Image EnergyMomentumCL := RealImage("Energy-Momentum CL", 4, Nm, Ne, Nphi)
EnergyMomentumCL.ImageSetDimensionScale(0, Kmax_um/(Nm/2))
EnergyMomentumCL.ImageSetDimensionOrigin(0, -Kmax_um)
EnergyMomentumCL.ImageSetDimensionUnitString(0, "/um")
EnergyMomentumCL.ImageSetDimensionScale(1, -(EnergyMax_eV - EnergyMin_eV)/Ne)
EnergyMomentumCL.ImageSetDimensionOrigin(1, EnergyMax_eV)
EnergyMomentumCL.ImageSetDimensionUnitString(1, "eV")
EnergyMomentumCL.ImageSetDimensionScale(2, 180/Nphi)
EnergyMomentumCL.ImageSetDimensionOrigin(2, 0)
EnergyMomentumCL.ImageSetDimensionUnitString(2, "deg")
//EnergyMomentumCL.showImage()

Image ARCLSlice := RealImage("Current ARCL slice", 4, Nx, Ny)
//ARCLSlice.showImage()
Image EnergyMomentumSlice := RealImage("Current Energy-Momentum CL slice", 4, Nm, Nphi)
//EnergyMomentumSlice.showImage()

Image K_um := RealImage("Sample plane momentum map, K", 4, Nm, Nphi)
Image Theta := RealImage("Theta [deg]", 4, Nm, Nphi)
Image Phi := RealImage("Phi", 4, Nm, Nphi)

Image XX := RealImage("XX", 4, Nm, Nphi)
Image YY := RealImage("ZZ", 4, Nm, Nphi)
Image TT := RealImage("TT", 4, Nm, Nphi)
//XX.showImage()


//K_um = (iradius/(Nm/2))*Kmax_um
K_um = (icol/Nm - 0.5)*2*Kmax_um
//K_um.showImage()

Number Wavelength_um

number cutoff = (3.45 - energymin_ev)*ne/(energymax_ev - energymin_ev)

for (number i = 0; i < Ne; i++)
{
	// Slice2(img, Start X, Start Y, Start Z, Dim 2, steps 2, stride 2, Dim 2, Steps 2, stride 2)
	ARCLSlice = Slice2(EnergyARCL, 0, 0, i, 0, Nx, 1, 1, Ny, 1)
	
	Wavelength_um = 1.2398/(EnergyMin_eV + (EnergyMax_eV - EnergyMin_eV)*i/Ne)
	Theta = asin(K_um*Wavelength_um/(2*pi())) // Use for Momentum mapping
	Phi = (irow/Nphi)*pi()

	XX = cos(Phi)*(Theta/(AngleSampling_deg*pi()/180)) + Nx/2
	YY = sin(Phi)*(Theta/(AngleSampling_deg*pi()/180)) + Ny/2
	
	EnergyMomentumSlice = Warp(ARCLSlice, XX, YY) 
		if (i > cutoff)
		{
			EnergyMomentumSlice = Energymomentumslice*0
		}
	Slice2(EnergyMomentumCL, 0, (Ne - i - 1), 0, 0, Nm, 1, 2, Nphi, 1) = EnergyMomentumSlice
	Result("\nRemapping slice: " + i + " of " + Ne)
}


EnergyMomentumCL.showImage()