ASML Focus & Energy Matrix (FEM) Generator

Create a 2D array with energy varying on the x-axis and focus on the y-axis.



Looking for something else? Click here for the Meander Array Generator or here for the mla150 FEM generator.

from pyscript import document import js # Import the js bridge # Store the grid data globally to make it accessible grid_data_store = [] def generate_energy_focus_grid(rows, cols, center_energy, step_energy, center_focus, step_focus): grid = [[{} for _ in range(cols)] for _ in range(rows)] center_row_idx = (rows - 1) / 2.0 center_col_idx = (cols - 1) / 2.0 for r in range(rows): for c in range(cols): col_dist_from_center = c - center_col_idx row_dist_from_center = r - center_row_idx energy_val = center_energy + (col_dist_from_center * step_energy) focus_val = center_focus - (row_dist_from_center * step_focus) grid[r][c] = {'energy': energy_val, 'focus': focus_val} return grid def format_number(num): if num == int(num): return str(int(num)) else: return f"{num:.2f}" def print_table(event): """Triggers the browser's print dialog.""" js.window.print() def copy_table_to_clipboard(event): global grid_data_store clipboard_string = "" for row in grid_data_store: row_items = [] for cell in row: cell_text = f"E: {cell['energy']:.2f} mJ, F: {cell['focus']:.2f} µm" row_items.append(cell_text) clipboard_string += "\t".join(row_items) + "\n" clipboard_string = clipboard_string.strip() try: js.navigator.clipboard.writeText(clipboard_string) feedback = document.querySelector("#copy-feedback") feedback.innerText = "Copied to clipboard!" except Exception as e: feedback = document.querySelector("#copy-feedback") feedback.innerText = f"Copy failed. See browser console for details." def generate_and_display(event): global grid_data_store output_div = document.querySelector("#output") try: rows = int(document.querySelector("#rows").value) cols = int(document.querySelector("#cols").value) center_energy = float(document.querySelector("#center_energy").value) step_energy = float(document.querySelector("#step_energy").value) center_focus = float(document.querySelector("#center_focus").value) step_focus = float(document.querySelector("#step_focus").value) if rows <= 0 or cols <= 0: output_div.innerText = "Error: Rows and columns must be positive numbers." return except (ValueError, TypeError): output_div.innerText = "Error: Please enter valid numbers for all fields." return grid_data_store = generate_energy_focus_grid(rows, cols, center_energy, step_energy, center_focus, step_focus) output_div.innerHTML = "" table = document.createElement("table") table.classList.add("w-full", "border-collapse", "text-xs", "md:text-sm") for row_data in grid_data_store: tr = document.createElement("tr") for cell_data in row_data: td = document.createElement("td") td.classList.add("p-2", "border", "border-gray-300", "text-center", "cell-content") energy_str = format_number(cell_data['energy']) focus_str = format_number(cell_data['focus']) energy_div = f'
{energy_str} mJ
' focus_div = f'
{focus_str} μm
' td.innerHTML = energy_div + focus_div tr.appendChild(td) table.appendChild(tr) output_div.appendChild(table) document.querySelector("#copy-container").classList.remove("hidden") document.querySelector("#copy-feedback").innerText = "\u00A0"