1 # This Python script will be executed from within the main lidar_correction_ghk.py |
|
2 # Probably it will be better in the future to let the main script rather read a conguration file, |
|
3 # which might improve the portability of the code within an executable. |
|
4 # Due to problems I had with some two letter variables, most variables are now with at least |
|
5 # three letters mixed small and capital. |
|
6 # Error calculation? |
|
7 # False: only calculate the GHK-parameters. True: calculate also errors. Can take a long time. |
|
8 Error_Calc = True |
|
9 |
|
10 # Header to identify the lidar system |
|
11 # |
|
12 EID = "xx" # Earlinet station ID |
|
13 LID = "example lidar" # Additional lidar ID (short descriptive text) |
|
14 print(" Lidar system :", EID, ", ", LID) |
|
15 |
|
16 # +++ IL Laser beam polarisation and +-Uncertainty |
|
17 DOLP, dDOLP, nDOLP = 0.995, 0.005, 1 #degree of linear polarization; default 1 |
|
18 RotL, dRotL, nRotL = 0., 2., 1 #alpha; rotation of laser polarization in degrees; default 0 |
|
19 |
|
20 # +++ ME Emitter optics and +-Uncertainty; default = no emitter optics |
|
21 DiE, dDiE, nDiE = 0.0, 0.1, 0 # Diattenuation; default 0 |
|
22 TiE = 1.0 # Unpolarized transmittance; default 1 |
|
23 RetE, dRetE, nRetE = 0., 180., 0 # Retardance in degrees; default 0 |
|
24 RotE, dRotE, nRotE = 0., 1., 0 # beta: Rotation of optical element in degrees; default 0 |
|
25 |
|
26 # +++ MO Receiver optics including telescope |
|
27 DiO, dDiO, nDiO = 0.0, 0.2, 1 # Diattenuation; default 0 |
|
28 TiO = 1.0 # Unpolarized transmittance; default 1 |
|
29 RetO, dRetO, nRetO = 0., 180., 0 # Retardance in degrees; default 0 |
|
30 RotO, dRotO, nRotO = 0., 0.1, 0 #gamma: Rotation of the optical element in degrees; default 0 |
|
31 |
|
32 # +++++ PBS MT Transmitting path defined with TS, TP, PolFilter extinction ratio ERaT, and +-Uncertainty |
|
33 # --- Polarizing beam splitter transmitting path |
|
34 TP, dTP, nTP = 0.95, 0.01, 1 # transmittance of the PBS for parallel polarized light |
|
35 TS, dTS, nTS = 0.005, 0.001, 1 # transmittance of the PBS for cross polarized light |
|
36 RetT, dRetT, nRetT = 0.0, 180., 0 # Retardance in degrees |
|
37 # --- Pol.Filter behind transmitted path of PBS |
|
38 ERaT, dERaT, nERaT = 0.001, 0.001, 0 # Extinction ratio |
|
39 RotaT, dRotaT, nRotaT = 0., 1., 0 # Rotation of the Pol.-filter in degrees; usually close to 0° because TP >> TS, but for PollyXTs it can also be close to 90° |
|
40 # -- |
|
41 TiT = 0.5 * (TP + TS) # do not change this |
|
42 DiT = (TP-TS)/(TP+TS) # do not change this |
|
43 DaT = (1-ERaT)/(1+ERaT) # do not change this |
|
44 TaT = 0.5*(1+ERaT) # do not change this |
|
45 |
|
46 # +++++ PBS MR Reflecting path defined with RS, RP, and cleaning PolFilter extinction ratio ERaR and +-Uncertainty |
|
47 # ---- for PBS without absorption the change of RS and RP must depend on the change of TP and TS. Hence the values and uncertainties are not independent. |
|
48 RS_RP_depend_on_TS_TP = True |
|
49 # --- Polarizing beam splitter reflecting path |
|
50 if(RS_RP_depend_on_TS_TP): |
|
51 RP, dRP, nRP = 1-TP, 0.00, 0 # do not change this |
|
52 RS, dRS, nRS = 1-TS, 0.00, 0 # do not change this |
|
53 else: |
|
54 RP, dRP, nRP = 0.05, 0.01, 1 # change this if RS_RP_depend_on_TS_TP = False; reflectance of the PBS for parallel polarized light |
|
55 RS, dRS, nRS = 0.98, 0.01, 1 # change this if RS_RP_depend_on_TS_TP = False; reflectance of the PBS for cross polarized light |
|
56 RetR, dRetR, nRetR = 0.0, 180., 0 # Retardance in degrees |
|
57 # --- Pol.Filter behind reflected path of PBS |
|
58 ERaR, dERaR, nERaR = 0.001, 0.001, 1 # Extinction ratio |
|
59 RotaR, dRotaR, nRotaR = 90., 1., 1 # Rotation of the Pol.-filter in degrees; usually 90° because RS >> RP, but for PollyXTs it can also be 0° |
|
60 # -- |
|
61 TiR = 0.5 * (RP + RS) # do not change this |
|
62 DiR = (RP-RS)/(RP+RS) # do not change this |
|
63 DaR = (1-ERaR)/(1+ERaR) # do not change this |
|
64 TaR = 0.5*(1+ERaR) # do not change this |
|
65 # NEW --- Additional ND filter transmission (attenuation) during the calibration |
|
66 TCalT, dTCalT, nTCalT = 1, 0.01, 0 # transmitting path, default 1, 0, 0 |
|
67 TCalR, dTCalR, nTCalR = 0.1, 0.001, 1 # reflecting path, default 1, 0, 0 |
|
68 |
|
69 # +++ Orientation of the PBS with respect to the reference plane (see Improvements_of_lidar_correction_ghk_ver.0.9.8_190124.pdf) |
|
70 # Y = +1: polarisation in reference plane is finally transmitted, |
|
71 # Y = -1: polarisation in reference plane is finally reflected. |
|
72 Y = +1. |
|
73 |
|
74 # +++ Calibrator |
|
75 |
|
76 # --- Calibrator Type used; defined by matrix values below |
|
77 TypeC = 3 #Type of calibrator: 1 = mechanical rotator; 2 = hwp rotator (fixed retardation); 3 = linear polarizer; 4 = qwp; 5 = circular polarizer; 6 = real HWP calibration +-22.5° |
|
78 |
|
79 # --- Calibrator Location |
|
80 LocC = 3 #location of calibrator: 1 = behind laser; 2 = behind emitter; 3 = before receiver; 4 = before PBS |
|
81 # --- MC Calibrator parameters |
|
82 if TypeC == 1: #mechanical rotator |
|
83 DiC, dDiC, nDiC = 0., 0., 0 # Diattenuation |
|
84 TiC = 1. |
|
85 RetC, dRetC, nRetC = 0., 0., 0 # Retardance in degrees |
|
86 RotC, dRotC, nRotC = 0., 0.1, 1 #constant calibrator rotation offset epsilon |
|
87 # Rotation error without calibrator: if False, then epsilon = 0 for normal measurements |
|
88 RotationErrorEpsilonForNormalMeasurements = True # is in general True for TypeC == 1 calibrator |
|
89 elif TypeC == 2: # HWP simulated by rotator without retardance! |
|
90 DiC, dDiC, nDiC = 0., 0., 0 # Diattenuation; ideal 0.0 |
|
91 TiC = 1. |
|
92 RetC, dRetC, nRetC = 180., 0., 0 # Retardance in degrees |
|
93 #NOTE: use here twice the HWP-rotation-angle |
|
94 RotC, dRotC, nRotC = 0.0, 0.1, 1 #constant calibrator rotation offset epsilon |
|
95 RotationErrorEpsilonForNormalMeasurements = True # is in general True for TypeC == 2 calibrator |
|
96 elif TypeC == 3: # linear polarizer calibrator. Diattenuation DiC = (1-ERC)/(1+ERC); ERC = extinction ratio of calibrator |
|
97 DiC, dDiC, nDiC = 0.9998, 0.00019, 1 # Diattenuation; ideal 1.0 |
|
98 TiC = 0.4 # ideal 0.5 |
|
99 RetC, dRetC, nRetC = 0., 180., 3 # Retardance in degrees |
|
100 RotC, dRotC, nRotC = 0.0, 0.1, 0 #constant calibrator rotation offset epsilon |
|
101 RotationErrorEpsilonForNormalMeasurements = False # is in general False for TypeC == 3 calibrator |
|
102 elif TypeC == 4: # QWP calibrator |
|
103 DiC, dDiC, nDiC = 0.0, 0., 0 # Diattenuation; ideal 0.0 |
|
104 TiC = 1.0 # ideal 0.5 |
|
105 RetC, dRetC, nRetC = 90., 0., 0 # Retardance in degrees |
|
106 RotC, dRotC, nRotC = 0.0, 0.1, 1 #constant calibrator rotation offset epsilon |
|
107 RotationErrorEpsilonForNormalMeasurements = False # is False for TypeC == 4 calibrator |
|
108 elif TypeC == 6: # real half-wave plate rotator calibration at +-22.5° => rotated_diattenuator_X22x5deg.odt |
|
109 DiC, dDiC, nDiC = 0., 0., 0 # Diattenuation; ideal 0.0 |
|
110 TiC = 1. |
|
111 RetC, dRetC, nRetC = 180., 0., 0 # Retardance in degrees |
|
112 #Note: use real HWP angles here |
|
113 RotC, dRotC, nRotC = 0.0, 0.1, 1 #constant calibrator rotation offset epsilon |
|
114 RotationErrorEpsilonForNormalMeasurements = True # is in general True for TypeC == 6 calibrator |
|
115 else: |
|
116 print ('calibrator not implemented yet') |
|
117 sys.exit() |
|
118 |
|
119 # --- LDRCal assumed atmospheric linear depolarization ratio during the calibration measurements in calibration range with almost clean air (first guess) |
|
120 LDRCal,dLDRCal,nLDRCal= 0.2, 0.15, 1 # spans most of the atmospheric depolarisation variability |
|
121 # LDRCal,dLDRCal,nLDRCal= 0.009, 0.005, 1 # spans the interference filter influence |
|
122 |
|
123 # ==================================================== |
|
124 # NOTE: there is no need to change anything below. |
|
125 # ==================================================== |
|
126 # !!! don't change anything in this section !!! |
|
127 # NEW *** |
|
128 bPlotEtax = False # plot error histogramms for Etax |
|
129 |
|
130 # *** Only for signal noise errors *** |
|
131 nNCal = 0 # error nNCal, calibration signals: one-sigma in steps to left and right |
|
132 nNI = 0 # error nNI, 0° signals: one-sigma in steps to left and right; NI signals are calculated from NCalT and NCalR in main programm, but noise is assumed to be independent. |
|
133 |
|
134 # --- number of photon counts in the signal summed up in the calibration range during the calibration measurements |
|
135 NCalT = 28184 # default 1e6, assumed the same in +45° and -45° signals |
|
136 NCalR = 28184 # default 1e6, assumed the same in +45° and -45° signals |
|
137 NILfac = 2 # (relative duration (laser shots) of standard (0°) measurement to calibration measurements) * (range of std. meas. smoothing / calibration range); example: 100000#/5000# * 100/1000 = 2 |
|
138 # LDRmeas below will be used to calculate IR and IT of 0° signals. |
|
139 # calculate signal counts only from parallel 0° signal assuming the same electronic amplification in both channels; overwrites above values |
|
140 CalcFrom0deg = True |
|
141 NI = 1e5 #number of photon counts in the parallel 0°-signal |
|
142 |
|
143 if(CalcFrom0deg): |
|
144 # either eFactT or eFacR is = 1 => rel. amplification |
|
145 eFacT = 1 # rel. amplification of transmitted channel, approximate values are sufficient; def. = 1 |
|
146 eFacR = 10 # rel. amplification of reflected channel, approximate values are sufficient; def. = 1 |
|
147 NILfac = 2 # (relative duration (laser shots) of standard (0°) measurement to calibration measurements) * (range of std. meas. smoothing / calibration range); example: 100000#/5000# * 100/1000 = 2 |
|
148 |
|
149 NCalT = NI / NILfac * TCalT * eFacT # photon counts in transmitted signal during calibration |
|
150 NCalR = NI / NILfac * TCalR * eFacR # photon counts in reflected signal during calibration |
|
151 # LDRmeas below will be used to calculate IR and IT of 0° signals. |
|
152 # NEW *** End of signal noise error parameters *** |
|
153 |
|
154 |
|
155 # --- LDRtrue for simulation of measurement => LDRsim |
|
156 LDRtrue = 0.4 |
|
157 LDRtrue2 = 0.004 |
|
158 |
|
159 # --- measured LDRm will be corrected with calculated parameters GHK |
|
160 LDRmeas = 0.3 |
|
161 |
|
162 # --- this is just for correct transfer of the variables to the main file |
|
163 DOLP0, dDOLP, nDOLP = DOLP, dDOLP, nDOLP |
|
164 RotL0, dRotL, nRotL = RotL, dRotL, nRotL |
|
165 # Emitter |
|
166 DiE0, dDiE, nDiE = DiE, dDiE, nDiE |
|
167 RetE0, dRetE, nRetE = RetE, dRetE, nRetE |
|
168 RotE0, dRotE, nRotE = RotE, dRotE, nRotE |
|
169 # Receiver |
|
170 DiO0, dDiO, nDiO = DiO, dDiO, nDiO |
|
171 RetO0, dRetO, nRetO = RetO, dRetO, nRetO |
|
172 RotO0, dRotO, nRotO = RotO, dRotO, nRotO |
|
173 # Calibrator |
|
174 DiC0, dDiC, nDiC = DiC, dDiC, nDiC |
|
175 RetC0, dRetC, nRetC = RetC, dRetC, nRetC |
|
176 RotC0, dRotC, nRotC = RotC, dRotC, nRotC |
|
177 # PBS |
|
178 TP0, dTP, nTP = TP, dTP, nTP |
|
179 TS0, dTS, nTS = TS, dTS, nTS |
|
180 RetT0, dRetT, nRetT = RetT, dRetT, nRetT |
|
181 |
|
182 ERaT0, dERaT, nERaT = ERaT, dERaT, nERaT |
|
183 RotaT0,dRotaT,nRotaT= RotaT,dRotaT,nRotaT |
|
184 |
|
185 RP0, dRP, nRP = RP, dRP, nRP |
|
186 RS0, dRS, nRS = RS, dRS, nRS |
|
187 RetR0, dRetR, nRetR = RetR, dRetR, nRetR |
|
188 |
|
189 ERaR0, dERaR, nERaR = ERaR, dERaR, nERaR |
|
190 RotaR0,dRotaR,nRotaR= RotaR,dRotaR,nRotaR |
|
191 |
|
192 LDRCal0,dLDRCal,nLDRCal=LDRCal,dLDRCal,nLDRCal |
|