-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathCD_SEM_ruffness.py
More file actions
66 lines (56 loc) · 3.35 KB
/
CD_SEM_ruffness.py
File metadata and controls
66 lines (56 loc) · 3.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import CD_SEM_tools as tools
import CD_SEM_FFT as FFTcalc
import CD_SEM_edges as edges
import CD_SEM_ruffness as ruff
import CD_SEM_analysis as anlys
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.colors import LinearSegmentedColormap
import numpy as np
######### This object holds ?? properties from CD-SEM analyis. It only auto initializes values pulled directly from the header file of the '.fit' SEM image.
######### The __call__ function will run all the necassary calculations to assign values to all object properties
class SEMImageDetails:
def __init__(self):
# These are all of the variable that we need at the end of the analysis
# Line Edge Roughness - LER
self.LER_edges: None | int = None # Number of measured edges
self.LER_wave_low: None | float = None # nm # Cutoff Wavelengths
self.LER_wave_high: None | float = None
self.LER_median: None | float = None # nm # Median LER 3*sigma
self.LER_range_low: None | float = None # nm # LER 3*sigma range
self.LER_range_high: None | float = None
# White Line Width Roughness - WLWR
self.WLWR_lines: None | int = None # Number of measured lines
self.WLWR_avg_width: None | float = None # nm # Average Line Width
self.WLWR_LDC: None | float = None # Line Duty Cycle
self.WLWR_median: None | float = None # nm # Median LWR 3*sigma
self.WLWR_lin_corr: None | float = None # Median Lin. corr. coeff. (c_white)
self.WLWR_range_low: None | float = None # c_white range
self.WLWR_range_high: None | float = None
# White Line Placement Accuracy
self.WLPA_lines: None | int = None # Number of measured lines
self.WLPA_place: None | float = None # nm # Placement Roughness 3*sigma
self.WLPA_place_low: None | float = None # nm # Placement 3*sigma range
self.WLPA_place_high: None | float = None
self.WLPA_crossline_L: None | float = None # nm # Cross Line L_o
self.WLPA_crossline_A: None | float = None # nm # Cross Line A_o
self.WLPA_inline: None | float = None # nm # In Line
self.WLPA_pitch: None | float = None # nm # Pitch Lo
self.WLPA_pitch_walk: None | float = None # nm # Pitch Walking * Pitch Lo
# Black Line Width Roughness
self.BLWR_lines: None | int = None # Number of measured lines
self.BLWR_avg_width: None | float = None # nm # Average Line Width
self.BLWR_LDC: None | float = None # Line Duty Cycle
self.BLWR_median: None | float = None # nm # Median LWR 3*sigma
self.BLWR_lin_corr: None | float = None # Median Lin. corr. coeff. (c_black)
self.BLWR_range_low: None | float = None # c_black range
self.BLWR_range_high: None | float = None
# Black Line Placement Accuracy
self.BLPA_lines: None | int = None # Number of measured lines
self.BLPA_place: None | float = None # nm # Placement Roughness 3*sigma
self.BLPA_place_low: None | float = None # nm # Placement 3*sigma range
self.BLPA_place_high: None | float = None
self.BLPA_crossline_L: None | float = None # nm # Cross Line L_o
self.BLPA_crossline_A: None | float = None # nm # Cross Line A_o
self.BLPA_inline: None | float = None # nm # In Line
def __call__(self):