This repository was archived by the owner on Jul 29, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathscanning_vls_ruling_density.py
130 lines (88 loc) · 4.31 KB
/
scanning_vls_ruling_density.py
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import numpy
from Shadow import ShadowTools as ST
from silx.gui.plot.StackView import StackViewMainWindow
from oasys.widgets import gui as oasysgui
def plot_data1D(dataX, dataY, title="", xtitle="", ytitle=""):
plot_canvas = oasysgui.plotWindow()
plot_canvas.addCurve(dataX, dataY)
plot_canvas.resetZoom()
plot_canvas.setXAxisAutoScale(True)
plot_canvas.setYAxisAutoScale(True)
plot_canvas.setGraphGrid(False)
plot_canvas.setXAxisLogarithmic(False)
plot_canvas.setYAxisLogarithmic(False)
plot_canvas.setGraphXLabel(xtitle)
plot_canvas.setGraphYLabel(ytitle)
plot_canvas.setGraphTitle(title)
plot_canvas.show()
def plot_data3D(data3D, dataScan, dataX, dataY, title="", xtitle="", ytitle=""):
xmin = numpy.min(dataX)
xmax = numpy.max(dataX)
ymin = numpy.min(dataY)
ymax = numpy.max(dataY)
stepX = dataX[1]-dataX[0]
stepY = dataY[1]-dataY[0]
if len(dataScan) > 1: stepScan = dataScan[1]-dataScan[0]
else: stepScan = 1.0
if stepScan == 0.0: stepScan = 1.0
if stepX == 0.0: stepX = 1.0
if stepY == 0.0: stepY = 1.0
dim0_calib = (dataScan[0], stepScan)
dim1_calib = (ymin, stepY)
dim2_calib = (xmin, stepX)
data_to_plot = numpy.swapaxes(data3D,1,2)
colormap = {"name":"temperature", "normalization":"linear", "autoscale":True, "vmin":0, "vmax":0, "colors":256}
plot_canvas = StackViewMainWindow()
plot_canvas.setGraphTitle(title)
plot_canvas.setLabels(["Scanned Variable", ytitle, xtitle])
plot_canvas.setColormap(colormap=colormap)
plot_canvas.setStack(numpy.array(data_to_plot), calibrations=[dim0_calib, dim1_calib, dim2_calib] )
plot_canvas.show()
shadow_beam = in_object_1
# TO ACCESS THE OPTICAL ELEMENT THAT GENERATE THE BEAM AT THIS IMAGE PLANE
# YOU NEED TO SURF THE HISTORY OF THE BEAM
vls_oe_number = shadow_beam._oe_number
vls_history_element = shadow_beam.getOEHistory(shadow_beam._oe_number)
# SHADOWOUI OBJECTS: WRAPPERS OF THE NATIVE SHADOW3 OBJECTS
shadowOui_input_beam = vls_history_element._input_beam
shadowOui_VLS_before_tracing = vls_history_element._shadow_oe_start
#shadowOui_VLS_after_tracing = vls_history_element._shadow_oe_end
#ticket2D = shadowOui_input_beam._beam.histo2(col_h=1, col_v=3, nbins=100, ref=23)
# VARIABLE TO SCAN IS (JUST AN EXAMPLE) COEFFIECIENT C3 TO OPTIMIZE GRATING
C0 = shadowOui_VLS_before_tracing._oe.RULING
C1 = shadowOui_VLS_before_tracing._oe.RUL_A1
C2 = shadowOui_VLS_before_tracing._oe.RUL_A2
C3 = shadowOui_VLS_before_tracing._oe.RUL_A3
print("RULING DENSITY", C0, C1, C2, C3)
# 10 VALUES
c3_values = -5 + C3 + numpy.arange(0, 41)*(10/40)
# plotting range
x_min = -0.15
x_max = 0.15
z_min = -0.002
z_max = 0.002
nbins=101
stack_result = numpy.zeros((len(c3_values), nbins, nbins))
fwhms = numpy.zeros(len(c3_values))
best_focus_positions = numpy.zeros(len(c3_values))
for index in range(0, len(c3_values)):
# NATIVE SHADOW3 OBJECTS
# MAKE A DUPLICATE TO BE SURE TO NOT AFFECT THE REST OF SHADOWOUI SIMULATION!
shadow3_beam = shadowOui_input_beam.duplicate(copy_rays=True, history=False)._beam # KEEP THE ORIGINAL UNTOUCHED
shadow3_VLS = shadowOui_VLS_before_tracing.duplicate()._oe # KEEP THE ORIGINAL UNTOUCHED
shadow3_VLS.RUL_A3= c3_values[index]
shadow3_beam.traceOE(shadow3_VLS, vls_oe_number) #
# 2D DISTRIBUTION X,Z TO OBTAIN THE FOCAL SPOT DIMENSION
ticket2D = shadow3_beam.histo2(col_h=1, col_v=3, nbins=nbins, ref=23, nolost=1, xrange=[x_min, x_max], yrange=[z_min, z_max])
histogram = ticket2D["histogram"]
fwhms[index] = ticket2D["fwhm_v"]
for ix in range(nbins):
for iz in range(nbins):
stack_result[index, ix, iz] = histogram[ix, iz]
# FOCUS POSITION
ticketFocus = ST.focnew(shadow3_beam, mode=0, center=[0.0, 0.0])
best_focus_positions[index] = ticketFocus['z_waist']
print("C3, FWHM, Focus", shadow3_VLS.RUL_A3, fwhms[index], best_focus_positions[index])
plot_data1D(c3_values, fwhms*1e4, "SPOT VERTICAL SIZE", "C3 [l/cm]^3", "Z FWHM [um]")
plot_data1D(c3_values, best_focus_positions, "VERTICAL FOCUS RELATIVE POSITION", "C3 [l/cm]^3", "Distance [cm]")
plot_data3D(stack_result, c3_values, numpy.linspace(x_min, x_max, nbins), numpy.linspace(z_min, z_max, nbins), "SPOT SIZE AT IMAGE PLANE", "X [um]", "Z [um]")