GHK_0.9.8e4_Py3.7.py

Fri, 29 May 2020 23:37:07 +0200

author
Volker Freudenthaler
date
Fri, 29 May 2020 23:37:07 +0200
changeset 40
676673dd931d
permissions
-rw-r--r--

Script version GHK_O.9.8e4_Py3.7 with two input files

Volker@40 1 # -*- coding: utf-8 -*-
Volker@40 2 """
Volker@40 3 Copyright 2016, 2019 Volker Freudenthaler
Volker@40 4
Volker@40 5 Licensed under the EUPL, Version 1.1 only (the "Licence").
Volker@40 6
Volker@40 7 You may not use this work except in compliance with the Licence.
Volker@40 8 A copy of the licence is distributed with the code. Alternatively, you may obtain
Volker@40 9 a copy of the Licence at:
Volker@40 10
Volker@40 11 https://joinup.ec.europa.eu/community/eupl/og_page/eupl
Volker@40 12
Volker@40 13 Unless required by applicable law or agreed to in writing, software distributed
Volker@40 14 under the Licence is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS
Volker@40 15 OF ANY KIND, either express or implied. See the Licence for the specific language governing
Volker@40 16 permissions and limitations under the Licence.
Volker@40 17
Volker@40 18 Equation reference: http://www.atmos-meas-tech-discuss.net/amt-2015-338/amt-2015-338.pdf
Volker@40 19 With equations code from Appendix C
Volker@40 20 Python 3.7, seaborn 0.9.0
Volker@40 21
Volker@40 22 Code description:
Volker@40 23
Volker@40 24 From measured lidar signals we cannot directly determine the desired backscatter coefficient (F11) and the linear depolarization ratio (LDR)
Volker@40 25 because of the cross talk between the channles and systematic errors of a lidar system.
Volker@40 26 http://www.atmos-meas-tech-discuss.net/amt-2015-338/amt-2015-338.pdf provides an analytical model for the description of these errors,
Volker@40 27 with which the measured signals can be corrected.
Volker@40 28 This code simulates the lidar measurements with "assumed true" model parameters from an input file, and calculates the correction parameters (G,H, and K).
Volker@40 29 The "assumed true" system parameters are the ones we think are the right ones, but in reality these parameters probably deviate from the assumed truth due to
Volker@40 30 uncertainties. The uncertainties of the "assumed true" parameters can be described in the input file. Then this code calculates the lidar signals and the
Volker@40 31 gain ratio eta* with all possible combinations of "errors", which represents the distribution of "possibly real" signals, and "corrects" them with the "assumed true"
Volker@40 32 GHK parameters (GT0, GR0, HT0, HR0, and K0) to derive finally the distributions of "possibly real" linear depolarization ratios (LDRCorr),
Volker@40 33 which are plotted for five different input linear depolarization ratios (LDRtrue). The red bars in the plots represent the input values of LDRtrue.
Volker@40 34 A complication arises from the fact that the correction parameter K = eta*/eta (Eq. 83) can depend on the LDR during the calibration measurement, i.e. LDRcal or aCal
Volker@40 35 in the code (see e.g. Eqs. (103), (115), and (141); mind the mistake in Eq. (116)). Therefor values of K for LDRcal = 0.004, 0.2, and 0.45 are calculated for
Volker@40 36 "assumed true" system parameters and printed in the output file behind the GH parameters. The full impact of the LDRcal dependent K can be considered in the error
Volker@40 37 calculation by specifying a range of possible LDRcal values in the input file. For the real calibration measurements a calibration range with low or no aerosol
Volker@40 38 content should be chosen, and the default in the input file is a range of LDRcal between 0.004 and 0.014 (i.e. 0.009 +-0.005).
Volker@40 39
Volker@40 40 Tip: In case you run the code with Spyder, all output text and plots can be displayed together in an IPython console, which can be saved as an html file.
Volker@40 41
Volker@40 42 Ver. 0.9.7: includes the random error (signal noise) of the calibration and standard measurements
Volker@40 43 Changes:
Volker@40 44 Line 1687 Eta = (TaR * TiR) / (TaT * TiT)
Volker@40 45 Line 1691 K = Etax / Eta # K of the real system; but correction in Line 1721 with K0 / Etax
Volker@40 46 should work with nTCalT = nTCalR = 0
Volker@40 47 Ver. 0.9.7b:
Volker@40 48 ToDo: include error due to TCalT und TCalR => determination of NCalT and NCalR etc. in error calculation line 1741ff
Volker@40 49 combined error loops iNI and INCal for signals
Volker@40 50 Ver. 0.9.7c: individual error loops for each of the six signals
Volker@40 51 Ver. 0.9.7c2: different calculation of the signal noise errors
Volker@40 52 Ver. 0.9.7c3: n.a.different calculation of the signal noise errors
Volker@40 53 Ver. 0.9.7c4: test to speed up the loops for error calculation by moving them just before the actual calculation: still some code errors
Volker@40 54 Ver. 0.9.8:
Volker@40 55 - correct calculation of Eta for cleaned anaylsers considering the combined transmission Eta = (TaT* TiT)(1 + cos2RotaT * DaT * DiT) and (TaR * TiR)(1 + cos2RotaR * DaR * DiR) according to the papers supplement Eqs. (S.10.10.1) ff
Volker@40 56 - calculation of the PLDR from LDR and BSR, BSR, and LDRm
Volker@40 57 - ND-filters can be added for the calibration measurements in the transmitted (TCalT) and the reflected path (TCalR) in order to include their uncertainties in the error calculation.
Volker@40 58 Ver. 0.9.8b: change from "TTa = TiT * TaT" to "TTa = TiT * TaT * ATPT" etc. (compare ver 0.9.8 with 0.9.8b) removes
Volker@40 59 - the strong Tp dependence of the errors
Volker@40 60 - the factor 2 in the GH parameters
Volker@40 61 - see c:\technik\Optik\Polarizers\DepCal\ApplOpt\GH-parameters-190114.odt
Volker@40 62 Ver. 0.9.8c: includes error of Etax
Volker@40 63 Ver. 0.9.8d: Eta0, K0 etc in error loop replaced by Eta0y, K0y etc. Changes in signal noise calculations
Volker@40 64 Ver. 0.9.8e: ambiguous laser spec. DOLP (no discrimination between left and right circular polarisation) replaced by Stokes parameters Qin, Uin
Volker@40 65 Ver. 0.9.8e2: Added plot of LDRsim, Etax, Etapx, Etamx; LDRCorr and aLDRcorr consistently named
Volker@40 66 Ver. 0.9.8e3: Change of OutputFile name; Change of Ir and It noise if (CalcFrom0deg) = False; (Different calculation of error contributions tested but not implemented)
Volker@40 67 Ver. 0.9.8e4: text changed for y=+-1 (see line 274 ff and line 1044 ff
Volker@40 68
Volker@40 69 ========================================================
Volker@40 70 simulation: LDRsim = Ir / It with variable parameters (possible truths)
Volker@40 71 G,H,Eta,Etax,K
Volker@40 72 It = TaT * TiT * ATP1 * TiO * TiE * (GT + atrue * HT)
Volker@40 73 LDRsim = Ir / It
Volker@40 74 consistency test: is forward simulation and correction consistent?
Volker@40 75 LDRCorr = (LDRsim / Eta * (GT + HT) - (GR + HR)) / ((GR - HR) - LDRsim / Eta * (GT - HT)) => atrue?
Volker@40 76 assumed true: G0,H0,Eta0,Etax0,K0 => actual retrievals of LDRCorr
Volker@40 77 => correct possible truths with assumed true G0,H0,Eta0
Volker@40 78 measure: It, Ir, EtaX
Volker@40 79 coorect it with: G0,H0,K0
Volker@40 80 LDRCorr = (LDRsim / (Etax / K0) * (GT0 + HT0) - (GR0 + HR0)) / ((GR0 - HR0) - LDRsim0 / (Etax / K0) * (GT0 - HT0))
Volker@40 81 """
Volker@40 82 # Comment: The code might works with Python 2.7 with the help of following line, which enables Python2 to correctly interpret the Python 3 print statements.
Volker@40 83 from __future__ import print_function
Volker@40 84 # !/usr/bin/env python3
Volker@40 85
Volker@40 86 import os
Volker@40 87 import sys
Volker@40 88
Volker@40 89 from scipy.stats import kurtosis
Volker@40 90 from scipy.stats import skew
Volker@40 91 # use: kurtosis(data, fisher=True,bias=False) => 0; skew(data,bias=False) => 0
Volker@40 92 # Comment: the seaborn library makes nicer plots, but the code works also without it.
Volker@40 93 import numpy as np
Volker@40 94 import matplotlib.pyplot as plt
Volker@40 95
Volker@40 96 try:
Volker@40 97 import seaborn as sns
Volker@40 98
Volker@40 99 sns_loaded = True
Volker@40 100 except ImportError:
Volker@40 101 sns_loaded = False
Volker@40 102
Volker@40 103 # from time import clock # python 2
Volker@40 104 from timeit import default_timer as clock
Volker@40 105
Volker@40 106 # from matplotlib.backends.backend_pdf import PdfPages
Volker@40 107 # pdffile = '{}.pdf'.format('path')
Volker@40 108 # pp = PdfPages(pdffile)
Volker@40 109 ## pp.savefig can be called multiple times to save to multiple pages
Volker@40 110 # pp.savefig()
Volker@40 111 # pp.close()
Volker@40 112
Volker@40 113 from contextlib import contextmanager
Volker@40 114
Volker@40 115 @contextmanager
Volker@40 116 def redirect_stdout(new_target):
Volker@40 117 old_target, sys.stdout = sys.stdout, new_target # replace sys.stdout
Volker@40 118 try:
Volker@40 119 yield new_target # run some code with the replaced stdout
Volker@40 120 finally:
Volker@40 121 sys.stdout.flush()
Volker@40 122 sys.stdout = old_target # restore to the previous value
Volker@40 123
Volker@40 124 '''
Volker@40 125 real_raw_input = vars(__builtins__).get('raw_input',input)
Volker@40 126 '''
Volker@40 127 try:
Volker@40 128 import __builtin__
Volker@40 129
Volker@40 130 input = getattr(__builtin__, 'raw_input')
Volker@40 131 except (ImportError, AttributeError):
Volker@40 132 pass
Volker@40 133
Volker@40 134 from distutils.util import strtobool
Volker@40 135
Volker@40 136
Volker@40 137 def user_yes_no_query(question):
Volker@40 138 sys.stdout.write('%s [y/n]\n' % question)
Volker@40 139 while True:
Volker@40 140 try:
Volker@40 141 return strtobool(input().lower())
Volker@40 142 except ValueError:
Volker@40 143 sys.stdout.write('Please respond with \'y\' or \'n\'.\n')
Volker@40 144
Volker@40 145
Volker@40 146 # if user_yes_no_query('want to exit?') == 1: sys.exit()
Volker@40 147
Volker@40 148 abspath = os.path.abspath(__file__)
Volker@40 149 dname = os.path.dirname(abspath)
Volker@40 150 fname = os.path.basename(abspath)
Volker@40 151 os.chdir(dname)
Volker@40 152
Volker@40 153 # PrintToOutputFile = True
Volker@40 154
Volker@40 155 sqr05 = 0.5 ** 0.5
Volker@40 156
Volker@40 157 # ---- Initial definition of variables; the actual values will be read in with exec(open('./optic_input.py').read()) below
Volker@40 158 # Do you want to calculate the errors? If not, just the GHK-parameters are determined.
Volker@40 159 Error_Calc = True
Volker@40 160 LID = "internal"
Volker@40 161 EID = "internal"
Volker@40 162 # --- IL Laser IL and +-Uncertainty
Volker@40 163 Qin, dQin, nQin = 1., 0.0, 0 # second Stokes vector parameter; default 1 => linear polarization
Volker@40 164 Vin, dVin, nVin = 0., 0.0, 0 # fourth Stokes vector parameter
Volker@40 165 RotL, dRotL, nRotL = 0.0, 0.0, 1 # alpha; rotation of laser polarization in degrees; default 0
Volker@40 166 # IL = 1e5 #photons in the laser beam, including detection efficiency of the telescope, atmodspheric and r^2 attenuation
Volker@40 167 # --- ME Emitter and +-Uncertainty
Volker@40 168 DiE, dDiE, nDiE = 0., 0.00, 1 # Diattenuation
Volker@40 169 TiE = 1. # Unpolarized transmittance
Volker@40 170 RetE, dRetE, nRetE = 0., 180.0, 0 # Retardance in degrees
Volker@40 171 RotE, dRotE, nRotE = 0., 0.0, 0 # beta: Rotation of optical element in degrees
Volker@40 172 # --- MO Receiver Optics including telescope
Volker@40 173 DiO, dDiO, nDiO = -0.055, 0.003, 1
Volker@40 174 TiO = 0.9
Volker@40 175 RetO, dRetO, nRetO = 0., 180.0, 2
Volker@40 176 RotO, dRotO, nRotO = 0., 0.1, 1 # gamma
Volker@40 177 # --- PBS MT transmitting path defined with (TS,TP); and +-Uncertainty
Volker@40 178 TP, dTP, nTP = 0.98, 0.02, 1
Volker@40 179 TS, dTS, nTS = 0.001, 0.001, 1
Volker@40 180 TiT = 0.5 * (TP + TS)
Volker@40 181 DiT = (TP - TS) / (TP + TS)
Volker@40 182 # PolFilter
Volker@40 183 RetT, dRetT, nRetT = 0., 180., 0
Volker@40 184 ERaT, dERaT, nERaT = 0.001, 0.001, 1
Volker@40 185 RotaT, dRotaT, nRotaT = 0., 3., 1
Volker@40 186 DaT = (1 - ERaT) / (1 + ERaT)
Volker@40 187 TaT = 0.5 * (1 + ERaT)
Volker@40 188 # --- PBS MR reflecting path defined with (RS,RP); and +-Uncertainty
Volker@40 189 RS_RP_depend_on_TS_TP = False
Volker@40 190 if (RS_RP_depend_on_TS_TP):
Volker@40 191 RP, dRP, nRP = 1 - TP, 0.0, 0
Volker@40 192 RS, dRS, nRS = 1 - TS, 0.0, 0
Volker@40 193 else:
Volker@40 194 RP, dRP, nRP = 0.05, 0.01, 1
Volker@40 195 RS, dRS, nRS = 0.98, 0.01, 1
Volker@40 196 TiR = 0.5 * (RP + RS)
Volker@40 197 DiR = (RP - RS) / (RP + RS)
Volker@40 198 # PolFilter
Volker@40 199 RetR, dRetR, nRetR = 0., 180., 0
Volker@40 200 ERaR, dERaR, nERaR = 0.001, 0.001, 1
Volker@40 201 RotaR, dRotaR, nRotaR = 90., 3., 1
Volker@40 202 DaR = (1 - ERaR) / (1 + ERaR)
Volker@40 203 TaR = 0.5 * (1 + ERaR)
Volker@40 204
Volker@40 205 # +++ Orientation of the PBS with respect to the reference plane (see Polarisation-orientation.png and Polarisation-orientation-2.png in /system_settings)
Volker@40 206 # Y = +1: PBS incidence plane is parallel to reference plane and polarisation in reference plane is finally transmitted.
Volker@40 207 # Y = -1: PBS incidence plane is perpendicular to reference plane and polarisation in reference plane is finally reflected.
Volker@40 208 Y = 1.
Volker@40 209
Volker@40 210 # Calibrator = type defined by matrix values
Volker@40 211 LocC = 4 # location of calibrator: behind laser = 1; behind emitter = 2; before receiver = 3; before PBS = 4
Volker@40 212
Volker@40 213 # --- Additional attenuation (transmission of the ND-filter) during the calibration
Volker@40 214 TCalT, dTCalT, nTCalT = 1, 0., 0 # transmitting path; error calc not working yet
Volker@40 215 TCalR, dTCalR, nTCalR = 1, 0., 0 # reflecting path; error calc not working yet
Volker@40 216
Volker@40 217 # *** signal noise error calculation
Volker@40 218 # --- number of photon counts in the signal summed up in the calibration range during the calibration measurements
Volker@40 219 NCalT = 1e6 # default 1e6, assumed the same in +45° and -45° signals
Volker@40 220 NCalR = 1e6 # default 1e6, assumed the same in +45° and -45° signals
Volker@40 221 NILfac = 1.0 # duration of standard (0°) measurement relative to calibration measurements
Volker@40 222 nNCal = 0 # error nNCal: one-sigma in steps to left and right for calibration signals
Volker@40 223 nNI = 0 # error nNI: one-sigma in steps to left and right for 0° signals
Volker@40 224 NI = 50000 #number of photon counts in the parallel 0°-signal
Volker@40 225 eFacT = 1.0 # rel. amplification of transmitted channel, approximate values are sufficient; def. = 1
Volker@40 226 eFacR = 10.0
Volker@40 227 IoutTp0, IoutTp, dIoutTp0 = 0.5, 0.5, 0.0
Volker@40 228 IoutTm0, IoutTm, dIoutTm0 = 0.5, 0.5, 0.0
Volker@40 229 IoutRp0, IoutRp, dIoutRp0 = 0.5, 0.5, 0.0
Volker@40 230 IoutRm0, IoutRm, dIoutRm0 = 0.5, 0.5, 0.0
Volker@40 231 It0, It, dIt0 = 1 , 1, 0
Volker@40 232 Ir0, Ir, dTr0 = 1 , 1, 0
Volker@40 233 CalcFrom0deg = True
Volker@40 234
Volker@40 235 TypeC = 3 # linear polarizer calibrator
Volker@40 236 # example with extinction ratio 0.001
Volker@40 237 DiC, dDiC, nDiC = 1.0, 0., 0 # ideal 1.0
Volker@40 238 TiC = 0.5 # ideal 0.5
Volker@40 239 RetC, dRetC, nRetC = 0.0, 0.0, 0
Volker@40 240 RotC, dRotC, nRotC = 0.0, 0.1, 0 # constant calibrator offset epsilon
Volker@40 241 RotationErrorEpsilonForNormalMeasurements = False # is in general False for TypeC == 3 calibrator
Volker@40 242
Volker@40 243 # Rotation error without calibrator: if False, then epsilon = 0 for normal measurements
Volker@40 244 RotationErrorEpsilonForNormalMeasurements = True
Volker@40 245 # BSR backscatter ratio
Volker@40 246 # BSR, dBSR, nBSR = 10, 0.05, 1
Volker@40 247 BSR = np.zeros(5)
Volker@40 248 BSR = [1.1, 2, 5, 10., 50.]
Volker@40 249 # theoretical molecular LDR LDRm
Volker@40 250 LDRm, dLDRm, nLDRm = 0.004, 0.001, 1
Volker@40 251 # LDRCal assumed atmospheric linear depolarization ratio during the calibration measurements (first guess)
Volker@40 252 LDRCal0, dLDRCal, nLDRCal = 0.25, 0.04, 1
Volker@40 253 LDRCal = LDRCal0
Volker@40 254 # measured LDRm will be corrected with calculated parameters
Volker@40 255 LDRmeas = 0.015
Volker@40 256 # LDRtrue for simulation of measurement => LDRsim
Volker@40 257 LDRtrue = 0.004
Volker@40 258 LDRtrue2 = 0.004
Volker@40 259 LDRunCorr = 1.
Volker@40 260 # Initialize other values to 0
Volker@40 261 ER, nER, dER = 0.001, 0, 0.001
Volker@40 262 K = 0.
Volker@40 263 Km = 0.
Volker@40 264 Kp = 0.
Volker@40 265 LDRCorr = 0.
Volker@40 266 Eta = 0.
Volker@40 267 Ir = 0.
Volker@40 268 It = 0.
Volker@40 269 h = 1.
Volker@40 270
Volker@40 271 Loc = ['', 'behind laser', 'behind emitter', 'before receiver', 'before PBS']
Volker@40 272 Type = ['', 'mechanical rotator', 'hwp rotator', 'linear polarizer', 'qwp rotator', 'circular polarizer',
Volker@40 273 'real HWP +-22.5°']
Volker@40 274
Volker@40 275 bPlotEtax = False
Volker@40 276
Volker@40 277 # end of initial definition of variables
Volker@40 278 # *******************************************************************************************************************************
Volker@40 279 # --- Read actual lidar system parameters from optic_input.py (must be in the programs sub-directory 'system_settings')
Volker@40 280 # *******************************************************************************************************************************
Volker@40 281
Volker@40 282 # InputFile = 'optic_input_example_2_1.py'
Volker@40 283 # InputFile = 'ALidar-355-F-3-3c2-0.9.8d.py'
Volker@40 284 # InputFile = 'Polarimeter-4C3-ver0.98e.py'
Volker@40 285 # InputFile = 'Polarimeter-4A-ver0.98e.py'
Volker@40 286 InputFile = 'optic_input_raym-200-02-18-ver0.9.8e.py'
Volker@40 287 InputFile = 'optic_input_raym-200-04-17-ver0.9.8e.py'
Volker@40 288 InputFile = 'optic_input_raym-200-04-17-ver0.9.8e-extended.py'
Volker@40 289 InputFile = 'Adam_ver0.98.py'
Volker@40 290 InputFile = 'MUSA-B3A-ver0.98e.py'
Volker@40 291 InputFile = 'MUSA-B4A-ver0.98e.py'
Volker@40 292 # InputFile = 'MUSA-A3C-ver0.98e.py'
Volker@40 293 InputFile = 'optic_input_ver0.98e_LILI_532_May2020.py'
Volker@40 294 InputFile = 'optic_input_ver0.98e_LILI_532_May2020_RotL=90.py'
Volker@40 295 InputFile = 'optic_input_0.9.8e4-PollyXT_Lacros.py'
Volker@40 296 InputFile = 'optic_input_UPC-lidar_0.9.8e4.py'
Volker@40 297 InputFile = 'optic_input_UV-Pot-ver0.9.8e.py'
Volker@40 298 InputFile = 'optic_input_0.9.8e4-PollyXT_Lacros.py'
Volker@40 299 InputFile = 'optic_input_example_lidar_ver0.9.8e.py'
Volker@40 300
Volker@40 301 # *******************************************************************************************************************************
Volker@40 302
Volker@40 303 '''
Volker@40 304 print("From ", dname)
Volker@40 305 print("Running ", fname)
Volker@40 306 print("Reading input file ", InputFile, " for")
Volker@40 307 '''
Volker@40 308 input_path = os.path.join('.', 'system_settings', InputFile)
Volker@40 309 # this works with Python 2 and 3!
Volker@40 310 exec(open(input_path).read(), globals())
Volker@40 311 # end of read actual system parameters
Volker@40 312
Volker@40 313
Volker@40 314 # --- Manual Parameter Change ---
Volker@40 315 # (use for quick parameter changes without changing the input file )
Volker@40 316 # DiO = 0.
Volker@40 317 # LDRtrue = 0.45
Volker@40 318 # LDRtrue2 = 0.004
Volker@40 319 # Y = -1
Volker@40 320 # LocC = 4 #location of calibrator: 1 = behind laser; 2 = behind emitter; 3 = before receiver; 4 = before PBS
Volker@40 321 # #TypeC = 6 Don't change the TypeC here
Volker@40 322 # RotationErrorEpsilonForNormalMeasurements = True
Volker@40 323 # LDRCal = 0.25
Volker@40 324 # # --- Errors
Volker@40 325 Qin0, dQin, nQin = Qin, dQin, nQin
Volker@40 326 Vin0, dVin, nVin = Vin, dVin, nVin
Volker@40 327 RotL0, dRotL, nRotL = RotL, dRotL, nRotL
Volker@40 328
Volker@40 329 DiE0, dDiE, nDiE = DiE, dDiE, nDiE
Volker@40 330 RetE0, dRetE, nRetE = RetE, dRetE, nRetE
Volker@40 331 RotE0, dRotE, nRotE = RotE, dRotE, nRotE
Volker@40 332
Volker@40 333 DiO0, dDiO, nDiO = DiO, dDiO, nDiO
Volker@40 334 RetO0, dRetO, nRetO = RetO, dRetO, nRetO
Volker@40 335 RotO0, dRotO, nRotO = RotO, dRotO, nRotO
Volker@40 336
Volker@40 337 DiC0, dDiC, nDiC = DiC, dDiC, nDiC
Volker@40 338 RetC0, dRetC, nRetC = RetC, dRetC, nRetC
Volker@40 339 RotC0, dRotC, nRotC = RotC, dRotC, nRotC
Volker@40 340
Volker@40 341 TP0, dTP, nTP = TP, dTP, nTP
Volker@40 342 TS0, dTS, nTS = TS, dTS, nTS
Volker@40 343 RetT0, dRetT, nRetT = RetT, dRetT, nRetT
Volker@40 344
Volker@40 345 ERaT0, dERaT, nERaT = ERaT, dERaT, nERaT
Volker@40 346 RotaT0, dRotaT, nRotaT = RotaT, dRotaT, nRotaT
Volker@40 347
Volker@40 348 RP0, dRP, nRP = RP, dRP, nRP
Volker@40 349 RS0, dRS, nRS = RS, dRS, nRS
Volker@40 350 RetR0, dRetR, nRetR = RetR, dRetR, nRetR
Volker@40 351
Volker@40 352 ERaR0, dERaR, nERaR = ERaR, dERaR, nERaR
Volker@40 353 RotaR0, dRotaR, nRotaR = RotaR, dRotaR, nRotaR
Volker@40 354
Volker@40 355 LDRCal0, dLDRCal, nLDRCal = LDRCal, dLDRCal, nLDRCal
Volker@40 356
Volker@40 357 # BSR0, dBSR, nBSR = BSR, dBSR, nBSR
Volker@40 358 LDRm0, dLDRm, nLDRm = LDRm, dLDRm, nLDRm
Volker@40 359 # ---------- End of manual parameter change
Volker@40 360
Volker@40 361 RotL, RotE, RetE, DiE, RotO, RetO, DiO, RotC, RetC, DiC = RotL0, RotE0, RetE0, DiE0, RotO0, RetO0, DiO0, RotC0, RetC0, DiC0
Volker@40 362 TP, TS, RP, RS, ERaT, RotaT, RetT, ERaR, RotaR, RetR = TP0, TS0, RP0, RS0, ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0
Volker@40 363 LDRCal = LDRCal0
Volker@40 364 DTa0, TTa0, DRa0, TRa0, LDRsimx, LDRCorr = 0., 0., 0., 0., 0., 0.
Volker@40 365 TCalT0, TCalR0 = TCalT, TCalR
Volker@40 366
Volker@40 367 TiT = 0.5 * (TP + TS)
Volker@40 368 DiT = (TP - TS) / (TP + TS)
Volker@40 369 ZiT = (1. - DiT ** 2) ** 0.5
Volker@40 370 TiR = 0.5 * (RP + RS)
Volker@40 371 DiR = (RP - RS) / (RP + RS)
Volker@40 372 ZiR = (1. - DiR ** 2) ** 0.5
Volker@40 373
Volker@40 374 C2aT = np.cos(np.deg2rad(2. * RotaT))
Volker@40 375 C2aR = np.cos(np.deg2rad(2. * RotaR))
Volker@40 376 ATPT = float(1. + C2aT * DaT * DiT)
Volker@40 377 ARPT = float(1. + C2aR * DaR * DiR)
Volker@40 378 TTa = TiT * TaT * ATPT # unpolarized transmission
Volker@40 379 TRa = TiR * TaR * ARPT # unpolarized transmission
Volker@40 380 Eta0 = TRa / TTa
Volker@40 381
Volker@40 382 # --- alternative texts for output
Volker@40 383 dY = ['perpendicular', '', 'parallel']
Volker@40 384 dY2 = ['reflected', '', 'transmitted']
Volker@40 385 if ((abs(RotL) < 45 and Y == 1) or (abs(RotL) >= 45 and Y == -1)):
Volker@40 386 dY3 = "Parallel laser polarisation is detected in transmitted channel"
Volker@40 387 else:
Volker@40 388 dY3 = "Parallel laser polarisation is detected in reflected channel"
Volker@40 389
Volker@40 390 # --- check input errors
Volker@40 391 if ((Qin ** 2 + Vin ** 2) ** 0.5) > 1:
Volker@40 392 print("Error: degree of polarisation of laser > 1. Check Qin and Vin! ")
Volker@40 393 sys.exit()
Volker@40 394
Volker@40 395 # --- this subroutine is for the calculation of the PLDR from LDR, BSR, and LDRm -------------------
Volker@40 396 def CalcPLDR(LDR, BSR, LDRm):
Volker@40 397 PLDR = (BSR * (1. + LDRm) * LDR - LDRm * (1. + LDR)) / (BSR * (1. + LDRm) - (1. + LDR))
Volker@40 398 return (PLDR)
Volker@40 399 # --- this subroutine is for the calculation with certain fixed parameters ------------------------
Volker@40 400 def Calc(TCalT, TCalR, NCalT, NCalR, Qin, Vin, RotL, RotE, RetE, DiE, RotO, RetO, DiO,
Volker@40 401 RotC, RetC, DiC, TP, TS, RP, RS,
Volker@40 402 ERaT, RotaT, RetT, ERaR, RotaR, RetR, LDRCal):
Volker@40 403 # ---- Do the calculations of bra-ket vectors
Volker@40 404 h = -1. if TypeC == 2 else 1
Volker@40 405 # from input file: assumed LDRCal for calibration measurements
Volker@40 406 aCal = (1. - LDRCal) / (1. + LDRCal)
Volker@40 407 atrue = (1. - LDRtrue) / (1. + LDRtrue)
Volker@40 408
Volker@40 409 # angles of emitter and laser and calibrator and receiver optics
Volker@40 410 # RotL = alpha, RotE = beta, RotO = gamma, RotC = epsilon
Volker@40 411 S2a = np.sin(2 * np.deg2rad(RotL))
Volker@40 412 C2a = np.cos(2 * np.deg2rad(RotL))
Volker@40 413 S2b = np.sin(2 * np.deg2rad(RotE))
Volker@40 414 C2b = np.cos(2 * np.deg2rad(RotE))
Volker@40 415 S2ab = np.sin(np.deg2rad(2 * RotL - 2 * RotE))
Volker@40 416 C2ab = np.cos(np.deg2rad(2 * RotL - 2 * RotE))
Volker@40 417 S2g = np.sin(np.deg2rad(2 * RotO))
Volker@40 418 C2g = np.cos(np.deg2rad(2 * RotO))
Volker@40 419
Volker@40 420 # Laser with Degree of linear polarization DOLP
Volker@40 421 IinL = 1.
Volker@40 422 QinL = Qin
Volker@40 423 UinL = 0.
Volker@40 424 VinL = Vin
Volker@40 425 # VinL = (1. - DOLP ** 2) ** 0.5
Volker@40 426
Volker@40 427 # Stokes Input Vector rotation Eq. E.4
Volker@40 428 A = C2a * QinL - S2a * UinL
Volker@40 429 B = S2a * QinL + C2a * UinL
Volker@40 430 # Stokes Input Vector rotation Eq. E.9
Volker@40 431 C = C2ab * QinL - S2ab * UinL
Volker@40 432 D = S2ab * QinL + C2ab * UinL
Volker@40 433
Volker@40 434 # emitter optics
Volker@40 435 CosE = np.cos(np.deg2rad(RetE))
Volker@40 436 SinE = np.sin(np.deg2rad(RetE))
Volker@40 437 ZiE = (1. - DiE ** 2) ** 0.5
Volker@40 438 WiE = (1. - ZiE * CosE)
Volker@40 439
Volker@40 440 # Stokes Input Vector after emitter optics equivalent to Eq. E.9 with already rotated input vector from Eq. E.4
Volker@40 441 # b = beta
Volker@40 442 IinE = (IinL + DiE * C)
Volker@40 443 QinE = (C2b * DiE * IinL + A + S2b * (WiE * D - ZiE * SinE * VinL))
Volker@40 444 UinE = (S2b * DiE * IinL + B - C2b * (WiE * D - ZiE * SinE * VinL))
Volker@40 445 VinE = (-ZiE * SinE * D + ZiE * CosE * VinL)
Volker@40 446
Volker@40 447 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
Volker@40 448 IinF = IinE
Volker@40 449 QinF = aCal * QinE
Volker@40 450 UinF = -aCal * UinE
Volker@40 451 VinF = (1. - 2. * aCal) * VinE
Volker@40 452
Volker@40 453 # receiver optics
Volker@40 454 CosO = np.cos(np.deg2rad(RetO))
Volker@40 455 SinO = np.sin(np.deg2rad(RetO))
Volker@40 456 ZiO = (1. - DiO ** 2) ** 0.5
Volker@40 457 WiO = (1. - ZiO * CosO)
Volker@40 458
Volker@40 459 # calibrator
Volker@40 460 CosC = np.cos(np.deg2rad(RetC))
Volker@40 461 SinC = np.sin(np.deg2rad(RetC))
Volker@40 462 ZiC = (1. - DiC ** 2) ** 0.5
Volker@40 463 WiC = (1. - ZiC * CosC)
Volker@40 464
Volker@40 465 # Stokes Input Vector before the polarising beam splitter Eq. E.31
Volker@40 466 A = C2g * QinE - S2g * UinE
Volker@40 467 B = S2g * QinE + C2g * UinE
Volker@40 468
Volker@40 469 IinP = (IinE + DiO * aCal * A)
Volker@40 470 QinP = (C2g * DiO * IinE + aCal * QinE - S2g * (WiO * aCal * B + ZiO * SinO * (1. - 2. * aCal) * VinE))
Volker@40 471 UinP = (S2g * DiO * IinE - aCal * UinE + C2g * (WiO * aCal * B + ZiO * SinO * (1. - 2. * aCal) * VinE))
Volker@40 472 VinP = (ZiO * SinO * aCal * B + ZiO * CosO * (1. - 2. * aCal) * VinE)
Volker@40 473
Volker@40 474 # -------------------------
Volker@40 475 # F11 assuemd to be = 1 => measured: F11m = IinP / IinE with atrue
Volker@40 476 # F11sim = TiO*(IinE + DiO*atrue*A)/IinE
Volker@40 477 # -------------------------
Volker@40 478
Volker@40 479 # analyser
Volker@40 480 if (RS_RP_depend_on_TS_TP):
Volker@40 481 RS = 1. - TS
Volker@40 482 RP = 1. - TP
Volker@40 483
Volker@40 484 TiT = 0.5 * (TP + TS)
Volker@40 485 DiT = (TP - TS) / (TP + TS)
Volker@40 486 ZiT = (1. - DiT ** 2) ** 0.5
Volker@40 487 TiR = 0.5 * (RP + RS)
Volker@40 488 DiR = (RP - RS) / (RP + RS)
Volker@40 489 ZiR = (1. - DiR ** 2) ** 0.5
Volker@40 490 CosT = np.cos(np.deg2rad(RetT))
Volker@40 491 SinT = np.sin(np.deg2rad(RetT))
Volker@40 492 CosR = np.cos(np.deg2rad(RetR))
Volker@40 493 SinR = np.sin(np.deg2rad(RetR))
Volker@40 494
Volker@40 495 DaT = (1. - ERaT) / (1. + ERaT)
Volker@40 496 DaR = (1. - ERaR) / (1. + ERaR)
Volker@40 497 TaT = 0.5 * (1. + ERaT)
Volker@40 498 TaR = 0.5 * (1. + ERaR)
Volker@40 499
Volker@40 500 S2aT = np.sin(np.deg2rad(h * 2 * RotaT))
Volker@40 501 C2aT = np.cos(np.deg2rad(2 * RotaT))
Volker@40 502 S2aR = np.sin(np.deg2rad(h * 2 * RotaR))
Volker@40 503 C2aR = np.cos(np.deg2rad(2 * RotaR))
Volker@40 504
Volker@40 505 # Analyzer As before the PBS Eq. D.5; combined PBS and cleaning pol-filter
Volker@40 506 ATPT = (1. + C2aT * DaT * DiT) # unpolarized transmission correction
Volker@40 507 TTa = TiT * TaT * ATPT # unpolarized transmission
Volker@40 508 ATP1 = 1.
Volker@40 509 ATP2 = Y * (DiT + C2aT * DaT) / ATPT
Volker@40 510 ATP3 = Y * S2aT * DaT * ZiT * CosT / ATPT
Volker@40 511 ATP4 = S2aT * DaT * ZiT * SinT / ATPT
Volker@40 512 ATP = np.array([ATP1, ATP2, ATP3, ATP4])
Volker@40 513 DTa = ATP2 * Y
Volker@40 514
Volker@40 515 ARPT = (1 + C2aR * DaR * DiR) # unpolarized transmission correction
Volker@40 516 TRa = TiR * TaR * ARPT # unpolarized transmission
Volker@40 517 ARP1 = 1
Volker@40 518 ARP2 = Y * (DiR + C2aR * DaR) / ARPT
Volker@40 519 ARP3 = Y * S2aR * DaR * ZiR * CosR / ARPT
Volker@40 520 ARP4 = S2aR * DaR * ZiR * SinR / ARPT
Volker@40 521 ARP = np.array([ARP1, ARP2, ARP3, ARP4])
Volker@40 522 DRa = ARP2 * Y
Volker@40 523
Volker@40 524
Volker@40 525 # ---- Calculate signals and correction parameters for diffeent locations and calibrators
Volker@40 526 if LocC == 4: # Calibrator before the PBS
Volker@40 527 # print("Calibrator location not implemented yet")
Volker@40 528
Volker@40 529 # S2ge = np.sin(np.deg2rad(2*RotO + h*2*RotC))
Volker@40 530 # C2ge = np.cos(np.deg2rad(2*RotO + h*2*RotC))
Volker@40 531 S2e = np.sin(np.deg2rad(h * 2 * RotC))
Volker@40 532 C2e = np.cos(np.deg2rad(2 * RotC))
Volker@40 533 # rotated AinP by epsilon Eq. C.3
Volker@40 534 ATP2e = C2e * ATP2 + S2e * ATP3
Volker@40 535 ATP3e = C2e * ATP3 - S2e * ATP2
Volker@40 536 ARP2e = C2e * ARP2 + S2e * ARP3
Volker@40 537 ARP3e = C2e * ARP3 - S2e * ARP2
Volker@40 538 ATPe = np.array([ATP1, ATP2e, ATP3e, ATP4])
Volker@40 539 ARPe = np.array([ARP1, ARP2e, ARP3e, ARP4])
Volker@40 540 # Stokes Input Vector before the polarising beam splitter Eq. E.31
Volker@40 541 A = C2g * QinE - S2g * UinE
Volker@40 542 B = S2g * QinE + C2g * UinE
Volker@40 543 # C = (WiO*aCal*B + ZiO*SinO*(1-2*aCal)*VinE)
Volker@40 544 Co = ZiO * SinO * VinE
Volker@40 545 Ca = (WiO * B - 2 * ZiO * SinO * VinE)
Volker@40 546 # C = Co + aCal*Ca
Volker@40 547 # IinP = (IinE + DiO*aCal*A)
Volker@40 548 # QinP = (C2g*DiO*IinE + aCal*QinE - S2g*C)
Volker@40 549 # UinP = (S2g*DiO*IinE - aCal*UinE + C2g*C)
Volker@40 550 # VinP = (ZiO*SinO*aCal*B + ZiO*CosO*(1-2*aCal)*VinE)
Volker@40 551 IinPo = IinE
Volker@40 552 QinPo = (C2g * DiO * IinE - S2g * Co)
Volker@40 553 UinPo = (S2g * DiO * IinE + C2g * Co)
Volker@40 554 VinPo = ZiO * CosO * VinE
Volker@40 555
Volker@40 556 IinPa = DiO * A
Volker@40 557 QinPa = QinE - S2g * Ca
Volker@40 558 UinPa = -UinE + C2g * Ca
Volker@40 559 VinPa = ZiO * (SinO * B - 2 * CosO * VinE)
Volker@40 560
Volker@40 561 IinP = IinPo + aCal * IinPa
Volker@40 562 QinP = QinPo + aCal * QinPa
Volker@40 563 UinP = UinPo + aCal * UinPa
Volker@40 564 VinP = VinPo + aCal * VinPa
Volker@40 565 # Stokes Input Vector before the polarising beam splitter rotated by epsilon Eq. C.3
Volker@40 566 # QinPe = C2e*QinP + S2e*UinP
Volker@40 567 # UinPe = C2e*UinP - S2e*QinP
Volker@40 568 QinPoe = C2e * QinPo + S2e * UinPo
Volker@40 569 UinPoe = C2e * UinPo - S2e * QinPo
Volker@40 570 QinPae = C2e * QinPa + S2e * UinPa
Volker@40 571 UinPae = C2e * UinPa - S2e * QinPa
Volker@40 572 QinPe = C2e * QinP + S2e * UinP
Volker@40 573 UinPe = C2e * UinP - S2e * QinP
Volker@40 574
Volker@40 575 # Calibration signals and Calibration correction K from measurements with LDRCal / aCal
Volker@40 576 if (TypeC == 2) or (TypeC == 1): # rotator calibration Eq. C.4
Volker@40 577 # parameters for calibration with aCal
Volker@40 578 AT = ATP1 * IinP + h * ATP4 * VinP
Volker@40 579 BT = ATP3e * QinP - h * ATP2e * UinP
Volker@40 580 AR = ARP1 * IinP + h * ARP4 * VinP
Volker@40 581 BR = ARP3e * QinP - h * ARP2e * UinP
Volker@40 582 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 583 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 584 IS1 = np.array([IinPo, QinPo, UinPo, VinPo])
Volker@40 585 IS2 = np.array([IinPa, QinPa, UinPa, VinPa])
Volker@40 586 GT = np.dot(ATP, IS1)
Volker@40 587 GR = np.dot(ARP, IS1)
Volker@40 588 HT = np.dot(ATP, IS2)
Volker@40 589 HR = np.dot(ARP, IS2)
Volker@40 590 else:
Volker@40 591 IS1 = np.array([IinPo, QinPo, UinPo, VinPo])
Volker@40 592 IS2 = np.array([IinPa, QinPa, UinPa, VinPa])
Volker@40 593 GT = np.dot(ATPe, IS1)
Volker@40 594 GR = np.dot(ARPe, IS1)
Volker@40 595 HT = np.dot(ATPe, IS2)
Volker@40 596 HR = np.dot(ARPe, IS2)
Volker@40 597 elif (TypeC == 3) or (TypeC == 4): # linear polariser calibration Eq. C.5
Volker@40 598 # parameters for calibration with aCal
Volker@40 599 AT = ATP1 * IinP + ATP3e * UinPe + ZiC * CosC * (ATP2e * QinPe + ATP4 * VinP)
Volker@40 600 BT = DiC * (ATP1 * UinPe + ATP3e * IinP) - ZiC * SinC * (ATP2e * VinP - ATP4 * QinPe)
Volker@40 601 AR = ARP1 * IinP + ARP3e * UinPe + ZiC * CosC * (ARP2e * QinPe + ARP4 * VinP)
Volker@40 602 BR = DiC * (ARP1 * UinPe + ARP3e * IinP) - ZiC * SinC * (ARP2e * VinP - ARP4 * QinPe)
Volker@40 603 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 604 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 605 IS1 = np.array([IinPo, QinPo, UinPo, VinPo])
Volker@40 606 IS2 = np.array([IinPa, QinPa, UinPa, VinPa])
Volker@40 607 GT = np.dot(ATP, IS1)
Volker@40 608 GR = np.dot(ARP, IS1)
Volker@40 609 HT = np.dot(ATP, IS2)
Volker@40 610 HR = np.dot(ARP, IS2)
Volker@40 611 else:
Volker@40 612 IS1e = np.array([IinPo + DiC * QinPoe, DiC * IinPo + QinPoe, ZiC * (CosC * UinPoe + SinC * VinPo),
Volker@40 613 -ZiC * (SinC * UinPoe - CosC * VinPo)])
Volker@40 614 IS2e = np.array([IinPa + DiC * QinPae, DiC * IinPa + QinPae, ZiC * (CosC * UinPae + SinC * VinPa),
Volker@40 615 -ZiC * (SinC * UinPae - CosC * VinPa)])
Volker@40 616 GT = np.dot(ATPe, IS1e)
Volker@40 617 GR = np.dot(ARPe, IS1e)
Volker@40 618 HT = np.dot(ATPe, IS2e)
Volker@40 619 HR = np.dot(ARPe, IS2e)
Volker@40 620 elif (TypeC == 6): # diattenuator calibration +-22.5° rotated_diattenuator_X22x5deg.odt
Volker@40 621 # parameters for calibration with aCal
Volker@40 622 AT = ATP1 * IinP + sqr05 * DiC * (ATP1 * QinPe + ATP2e * IinP) + (1. - 0.5 * WiC) * (
Volker@40 623 ATP2e * QinPe + ATP3e * UinPe) + ZiC * (sqr05 * SinC * (ATP3e * VinP - ATP4 * UinPe) + ATP4 * CosC * VinP)
Volker@40 624 BT = sqr05 * DiC * (ATP1 * UinPe + ATP3e * IinP) + 0.5 * WiC * (
Volker@40 625 ATP2e * UinPe + ATP3e * QinPe) - sqr05 * ZiC * SinC * (ATP2e * VinP - ATP4 * QinPe)
Volker@40 626 AR = ARP1 * IinP + sqr05 * DiC * (ARP1 * QinPe + ARP2e * IinP) + (1. - 0.5 * WiC) * (
Volker@40 627 ARP2e * QinPe + ARP3e * UinPe) + ZiC * (sqr05 * SinC * (ARP3e * VinP - ARP4 * UinPe) + ARP4 * CosC * VinP)
Volker@40 628 BR = sqr05 * DiC * (ARP1 * UinPe + ARP3e * IinP) + 0.5 * WiC * (
Volker@40 629 ARP2e * UinPe + ARP3e * QinPe) - sqr05 * ZiC * SinC * (ARP2e * VinP - ARP4 * QinPe)
Volker@40 630 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 631 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 632 IS1 = np.array([IinPo, QinPo, UinPo, VinPo])
Volker@40 633 IS2 = np.array([IinPa, QinPa, UinPa, VinPa])
Volker@40 634 GT = np.dot(ATP, IS1)
Volker@40 635 GR = np.dot(ARP, IS1)
Volker@40 636 HT = np.dot(ATP, IS2)
Volker@40 637 HR = np.dot(ARP, IS2)
Volker@40 638 else:
Volker@40 639 IS1e = np.array([IinPo + DiC * QinPoe, DiC * IinPo + QinPoe, ZiC * (CosC * UinPoe + SinC * VinPo),
Volker@40 640 -ZiC * (SinC * UinPoe - CosC * VinPo)])
Volker@40 641 IS2e = np.array([IinPa + DiC * QinPae, DiC * IinPa + QinPae, ZiC * (CosC * UinPae + SinC * VinPa),
Volker@40 642 -ZiC * (SinC * UinPae - CosC * VinPa)])
Volker@40 643 GT = np.dot(ATPe, IS1e)
Volker@40 644 GR = np.dot(ARPe, IS1e)
Volker@40 645 HT = np.dot(ATPe, IS2e)
Volker@40 646 HR = np.dot(ARPe, IS2e)
Volker@40 647 else:
Volker@40 648 print("Calibrator not implemented yet")
Volker@40 649 sys.exit()
Volker@40 650
Volker@40 651 elif LocC == 3: # C before receiver optics Eq.57
Volker@40 652
Volker@40 653 # S2ge = np.sin(np.deg2rad(2*RotO - 2*RotC))
Volker@40 654 # C2ge = np.cos(np.deg2rad(2*RotO - 2*RotC))
Volker@40 655 S2e = np.sin(np.deg2rad(2. * RotC))
Volker@40 656 C2e = np.cos(np.deg2rad(2. * RotC))
Volker@40 657
Volker@40 658 # As with C before the receiver optics (rotated_diattenuator_X22x5deg.odt)
Volker@40 659 AF1 = np.array([1., C2g * DiO, S2g * DiO, 0.])
Volker@40 660 AF2 = np.array([C2g * DiO, 1. - S2g ** 2 * WiO, S2g * C2g * WiO, -S2g * ZiO * SinO])
Volker@40 661 AF3 = np.array([S2g * DiO, S2g * C2g * WiO, 1. - C2g ** 2 * WiO, C2g * ZiO * SinO])
Volker@40 662 AF4 = np.array([0., S2g * SinO, -C2g * SinO, CosO])
Volker@40 663
Volker@40 664 ATF = (ATP1 * AF1 + ATP2 * AF2 + ATP3 * AF3 + ATP4 * AF4)
Volker@40 665 ARF = (ARP1 * AF1 + ARP2 * AF2 + ARP3 * AF3 + ARP4 * AF4)
Volker@40 666 ATF2 = ATF[1]
Volker@40 667 ATF3 = ATF[2]
Volker@40 668 ARF2 = ARF[1]
Volker@40 669 ARF3 = ARF[2]
Volker@40 670
Volker@40 671 # rotated AinF by epsilon
Volker@40 672 ATF1 = ATF[0]
Volker@40 673 ATF4 = ATF[3]
Volker@40 674 ATF2e = C2e * ATF[1] + S2e * ATF[2]
Volker@40 675 ATF3e = C2e * ATF[2] - S2e * ATF[1]
Volker@40 676 ARF1 = ARF[0]
Volker@40 677 ARF4 = ARF[3]
Volker@40 678 ARF2e = C2e * ARF[1] + S2e * ARF[2]
Volker@40 679 ARF3e = C2e * ARF[2] - S2e * ARF[1]
Volker@40 680
Volker@40 681 ATFe = np.array([ATF1, ATF2e, ATF3e, ATF4])
Volker@40 682 ARFe = np.array([ARF1, ARF2e, ARF3e, ARF4])
Volker@40 683
Volker@40 684 QinEe = C2e * QinE + S2e * UinE
Volker@40 685 UinEe = C2e * UinE - S2e * QinE
Volker@40 686
Volker@40 687 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
Volker@40 688 IinF = IinE
Volker@40 689 QinF = aCal * QinE
Volker@40 690 UinF = -aCal * UinE
Volker@40 691 VinF = (1. - 2. * aCal) * VinE
Volker@40 692
Volker@40 693 IinFo = IinE
Volker@40 694 QinFo = 0.
Volker@40 695 UinFo = 0.
Volker@40 696 VinFo = VinE
Volker@40 697
Volker@40 698 IinFa = 0.
Volker@40 699 QinFa = QinE
Volker@40 700 UinFa = -UinE
Volker@40 701 VinFa = -2. * VinE
Volker@40 702
Volker@40 703 # Stokes Input Vector before receiver optics rotated by epsilon Eq. C.3
Volker@40 704 QinFe = C2e * QinF + S2e * UinF
Volker@40 705 UinFe = C2e * UinF - S2e * QinF
Volker@40 706 QinFoe = C2e * QinFo + S2e * UinFo
Volker@40 707 UinFoe = C2e * UinFo - S2e * QinFo
Volker@40 708 QinFae = C2e * QinFa + S2e * UinFa
Volker@40 709 UinFae = C2e * UinFa - S2e * QinFa
Volker@40 710
Volker@40 711 # Calibration signals and Calibration correction K from measurements with LDRCal / aCal
Volker@40 712 if (TypeC == 2) or (TypeC == 1): # rotator calibration Eq. C.4
Volker@40 713 # parameters for calibration with aCal
Volker@40 714 AT = ATF1 * IinF + ATF4 * h * VinF
Volker@40 715 BT = ATF3e * QinF - ATF2e * h * UinF
Volker@40 716 AR = ARF1 * IinF + ARF4 * h * VinF
Volker@40 717 BR = ARF3e * QinF - ARF2e * h * UinF
Volker@40 718 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 719 if (not RotationErrorEpsilonForNormalMeasurements):
Volker@40 720 GT = ATF1 * IinE + ATF4 * VinE
Volker@40 721 GR = ARF1 * IinE + ARF4 * VinE
Volker@40 722 HT = ATF2 * QinE - ATF3 * UinE - ATF4 * 2 * VinE
Volker@40 723 HR = ARF2 * QinE - ARF3 * UinE - ARF4 * 2 * VinE
Volker@40 724 else:
Volker@40 725 GT = ATF1 * IinE + ATF4 * h * VinE
Volker@40 726 GR = ARF1 * IinE + ARF4 * h * VinE
Volker@40 727 HT = ATF2e * QinE - ATF3e * h * UinE - ATF4 * h * 2 * VinE
Volker@40 728 HR = ARF2e * QinE - ARF3e * h * UinE - ARF4 * h * 2 * VinE
Volker@40 729 elif (TypeC == 3) or (TypeC == 4): # linear polariser calibration Eq. C.5
Volker@40 730 # p = +45°, m = -45°
Volker@40 731 IF1e = np.array([IinF, ZiC * CosC * QinFe, UinFe, ZiC * CosC * VinF])
Volker@40 732 IF2e = np.array([DiC * UinFe, -ZiC * SinC * VinF, DiC * IinF, ZiC * SinC * QinFe])
Volker@40 733 AT = np.dot(ATFe, IF1e)
Volker@40 734 AR = np.dot(ARFe, IF1e)
Volker@40 735 BT = np.dot(ATFe, IF2e)
Volker@40 736 BR = np.dot(ARFe, IF2e)
Volker@40 737
Volker@40 738 # Correction parameters for normal measurements; they are independent of LDR --- the same as for TypeC = 6
Volker@40 739 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 740 IS1 = np.array([IinE, 0., 0., VinE])
Volker@40 741 IS2 = np.array([0., QinE, -UinE, -2. * VinE])
Volker@40 742 GT = np.dot(ATF, IS1)
Volker@40 743 GR = np.dot(ARF, IS1)
Volker@40 744 HT = np.dot(ATF, IS2)
Volker@40 745 HR = np.dot(ARF, IS2)
Volker@40 746 else:
Volker@40 747 IS1e = np.array([IinFo + DiC * QinFoe, DiC * IinFo + QinFoe, ZiC * (CosC * UinFoe + SinC * VinFo),
Volker@40 748 -ZiC * (SinC * UinFoe - CosC * VinFo)])
Volker@40 749 IS2e = np.array([IinFa + DiC * QinFae, DiC * IinFa + QinFae, ZiC * (CosC * UinFae + SinC * VinFa),
Volker@40 750 -ZiC * (SinC * UinFae - CosC * VinFa)])
Volker@40 751 GT = np.dot(ATFe, IS1e)
Volker@40 752 GR = np.dot(ARFe, IS1e)
Volker@40 753 HT = np.dot(ATFe, IS2e)
Volker@40 754 HR = np.dot(ARFe, IS2e)
Volker@40 755
Volker@40 756 elif (TypeC == 6): # diattenuator calibration +-22.5° rotated_diattenuator_X22x5deg.odt
Volker@40 757 # parameters for calibration with aCal
Volker@40 758 IF1e = np.array([IinF + sqr05 * DiC * QinFe, sqr05 * DiC * IinF + (1. - 0.5 * WiC) * QinFe,
Volker@40 759 (1. - 0.5 * WiC) * UinFe + sqr05 * ZiC * SinC * VinF,
Volker@40 760 -sqr05 * ZiC * SinC * UinFe + ZiC * CosC * VinF])
Volker@40 761 IF2e = np.array([sqr05 * DiC * UinFe, 0.5 * WiC * UinFe - sqr05 * ZiC * SinC * VinF,
Volker@40 762 sqr05 * DiC * IinF + 0.5 * WiC * QinFe, sqr05 * ZiC * SinC * QinFe])
Volker@40 763 AT = np.dot(ATFe, IF1e)
Volker@40 764 AR = np.dot(ARFe, IF1e)
Volker@40 765 BT = np.dot(ATFe, IF2e)
Volker@40 766 BR = np.dot(ARFe, IF2e)
Volker@40 767
Volker@40 768 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 769 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 770 # IS1 = np.array([IinE,0,0,VinE])
Volker@40 771 # IS2 = np.array([0,QinE,-UinE,-2*VinE])
Volker@40 772 IS1 = np.array([IinFo, 0., 0., VinFo])
Volker@40 773 IS2 = np.array([0., QinFa, UinFa, VinFa])
Volker@40 774 GT = np.dot(ATF, IS1)
Volker@40 775 GR = np.dot(ARF, IS1)
Volker@40 776 HT = np.dot(ATF, IS2)
Volker@40 777 HR = np.dot(ARF, IS2)
Volker@40 778 else:
Volker@40 779 IS1e = np.array([IinFo + DiC * QinFoe, DiC * IinFo + QinFoe, ZiC * (CosC * UinFoe + SinC * VinFo),
Volker@40 780 -ZiC * (SinC * UinFoe - CosC * VinFo)])
Volker@40 781 IS2e = np.array([IinFa + DiC * QinFae, DiC * IinFa + QinFae, ZiC * (CosC * UinFae + SinC * VinFa),
Volker@40 782 -ZiC * (SinC * UinFae - CosC * VinFa)])
Volker@40 783 # IS1e = np.array([IinFo,0,0,VinFo])
Volker@40 784 # IS2e = np.array([0,QinFae,UinFae,VinFa])
Volker@40 785 GT = np.dot(ATFe, IS1e)
Volker@40 786 GR = np.dot(ARFe, IS1e)
Volker@40 787 HT = np.dot(ATFe, IS2e)
Volker@40 788 HR = np.dot(ARFe, IS2e)
Volker@40 789
Volker@40 790 else:
Volker@40 791 print('Calibrator not implemented yet')
Volker@40 792 sys.exit()
Volker@40 793
Volker@40 794 elif LocC == 2: # C behind emitter optics Eq.57 -------------------------------------------------------
Volker@40 795 # print("Calibrator location not implemented yet")
Volker@40 796 S2e = np.sin(np.deg2rad(2. * RotC))
Volker@40 797 C2e = np.cos(np.deg2rad(2. * RotC))
Volker@40 798
Volker@40 799 # AS with C before the receiver optics (see document rotated_diattenuator_X22x5deg.odt)
Volker@40 800 AF1 = np.array([1, C2g * DiO, S2g * DiO, 0.])
Volker@40 801 AF2 = np.array([C2g * DiO, 1. - S2g ** 2 * WiO, S2g * C2g * WiO, -S2g * ZiO * SinO])
Volker@40 802 AF3 = np.array([S2g * DiO, S2g * C2g * WiO, 1. - C2g ** 2 * WiO, C2g * ZiO * SinO])
Volker@40 803 AF4 = np.array([0., S2g * SinO, -C2g * SinO, CosO])
Volker@40 804
Volker@40 805 ATF = (ATP1 * AF1 + ATP2 * AF2 + ATP3 * AF3 + ATP4 * AF4)
Volker@40 806 ARF = (ARP1 * AF1 + ARP2 * AF2 + ARP3 * AF3 + ARP4 * AF4)
Volker@40 807 ATF1 = ATF[0]
Volker@40 808 ATF2 = ATF[1]
Volker@40 809 ATF3 = ATF[2]
Volker@40 810 ATF4 = ATF[3]
Volker@40 811 ARF1 = ARF[0]
Volker@40 812 ARF2 = ARF[1]
Volker@40 813 ARF3 = ARF[2]
Volker@40 814 ARF4 = ARF[3]
Volker@40 815
Volker@40 816 # AS with C behind the emitter
Volker@40 817 # terms without aCal
Volker@40 818 ATE1o, ARE1o = ATF1, ARF1
Volker@40 819 ATE2o, ARE2o = 0., 0.
Volker@40 820 ATE3o, ARE3o = 0., 0.
Volker@40 821 ATE4o, ARE4o = ATF4, ARF4
Volker@40 822 # terms with aCal
Volker@40 823 ATE1a, ARE1a = 0., 0.
Volker@40 824 ATE2a, ARE2a = ATF2, ARF2
Volker@40 825 ATE3a, ARE3a = -ATF3, -ARF3
Volker@40 826 ATE4a, ARE4a = -2. * ATF4, -2. * ARF4
Volker@40 827 # rotated AinEa by epsilon
Volker@40 828 ATE2ae = C2e * ATF2 + S2e * ATF3
Volker@40 829 ATE3ae = -S2e * ATF2 - C2e * ATF3
Volker@40 830 ARE2ae = C2e * ARF2 + S2e * ARF3
Volker@40 831 ARE3ae = -S2e * ARF2 - C2e * ARF3
Volker@40 832
Volker@40 833 ATE1 = ATE1o
Volker@40 834 ATE2e = aCal * ATE2ae
Volker@40 835 ATE3e = aCal * ATE3ae
Volker@40 836 ATE4 = (1 - 2 * aCal) * ATF4
Volker@40 837 ARE1 = ARE1o
Volker@40 838 ARE2e = aCal * ARE2ae
Volker@40 839 ARE3e = aCal * ARE3ae
Volker@40 840 ARE4 = (1 - 2 * aCal) * ARF4
Volker@40 841
Volker@40 842 # rotated IinE
Volker@40 843 QinEe = C2e * QinE + S2e * UinE
Volker@40 844 UinEe = C2e * UinE - S2e * QinE
Volker@40 845
Volker@40 846 # Calibration signals and Calibration correction K from measurements with LDRCal / aCal
Volker@40 847 if (TypeC == 2) or (TypeC == 1): # +++++++++ rotator calibration Eq. C.4
Volker@40 848 AT = ATE1o * IinE + (ATE4o + aCal * ATE4a) * h * VinE
Volker@40 849 BT = aCal * (ATE3ae * QinEe - ATE2ae * h * UinEe)
Volker@40 850 AR = ARE1o * IinE + (ARE4o + aCal * ARE4a) * h * VinE
Volker@40 851 BR = aCal * (ARE3ae * QinEe - ARE2ae * h * UinEe)
Volker@40 852
Volker@40 853 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 854 if (not RotationErrorEpsilonForNormalMeasurements):
Volker@40 855 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
Volker@40 856 GT = ATE1o * IinE + ATE4o * h * VinE
Volker@40 857 GR = ARE1o * IinE + ARE4o * h * VinE
Volker@40 858 HT = ATE2a * QinE + ATE3a * h * UinEe + ATE4a * h * VinE
Volker@40 859 HR = ARE2a * QinE + ARE3a * h * UinEe + ARE4a * h * VinE
Volker@40 860 else:
Volker@40 861 GT = ATE1o * IinE + ATE4o * h * VinE
Volker@40 862 GR = ARE1o * IinE + ARE4o * h * VinE
Volker@40 863 HT = ATE2ae * QinE + ATE3ae * h * UinEe + ATE4a * h * VinE
Volker@40 864 HR = ARE2ae * QinE + ARE3ae * h * UinEe + ARE4a * h * VinE
Volker@40 865
Volker@40 866 elif (TypeC == 3) or (TypeC == 4): # +++++++++ linear polariser calibration Eq. C.5
Volker@40 867 # p = +45°, m = -45°
Volker@40 868 AT = ATE1 * IinE + ZiC * CosC * (ATE2e * QinEe + ATE4 * VinE) + ATE3e * UinEe
Volker@40 869 BT = DiC * (ATE1 * UinEe + ATE3e * IinE) + ZiC * SinC * (ATE4 * QinEe - ATE2e * VinE)
Volker@40 870 AR = ARE1 * IinE + ZiC * CosC * (ARE2e * QinEe + ARE4 * VinE) + ARE3e * UinEe
Volker@40 871 BR = DiC * (ARE1 * UinEe + ARE3e * IinE) + ZiC * SinC * (ARE4 * QinEe - ARE2e * VinE)
Volker@40 872
Volker@40 873 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 874 if (not RotationErrorEpsilonForNormalMeasurements):
Volker@40 875 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
Volker@40 876 GT = ATE1o * IinE + ATE4o * VinE
Volker@40 877 GR = ARE1o * IinE + ARE4o * VinE
Volker@40 878 HT = ATE2a * QinE + ATE3a * UinE + ATE4a * VinE
Volker@40 879 HR = ARE2a * QinE + ARE3a * UinE + ARE4a * VinE
Volker@40 880 else:
Volker@40 881 D = IinE + DiC * QinEe
Volker@40 882 A = DiC * IinE + QinEe
Volker@40 883 B = ZiC * (CosC * UinEe + SinC * VinE)
Volker@40 884 C = -ZiC * (SinC * UinEe - CosC * VinE)
Volker@40 885 GT = ATE1o * D + ATE4o * C
Volker@40 886 GR = ARE1o * D + ARE4o * C
Volker@40 887 HT = ATE2a * A + ATE3a * B + ATE4a * C
Volker@40 888 HR = ARE2a * A + ARE3a * B + ARE4a * C
Volker@40 889
Volker@40 890 elif (TypeC == 6): # real HWP calibration +-22.5° rotated_diattenuator_X22x5deg.odt
Volker@40 891 # p = +22.5°, m = -22.5°
Volker@40 892 IE1e = np.array([IinE + sqr05 * DiC * QinEe, sqr05 * DiC * IinE + (1 - 0.5 * WiC) * QinEe,
Volker@40 893 (1 - 0.5 * WiC) * UinEe + sqr05 * ZiC * SinC * VinE,
Volker@40 894 -sqr05 * ZiC * SinC * UinEe + ZiC * CosC * VinE])
Volker@40 895 IE2e = np.array([sqr05 * DiC * UinEe, 0.5 * WiC * UinEe - sqr05 * ZiC * SinC * VinE,
Volker@40 896 sqr05 * DiC * IinE + 0.5 * WiC * QinEe, sqr05 * ZiC * SinC * QinEe])
Volker@40 897 ATEe = np.array([ATE1, ATE2e, ATE3e, ATE4])
Volker@40 898 AREe = np.array([ARE1, ARE2e, ARE3e, ARE4])
Volker@40 899 AT = np.dot(ATEe, IE1e)
Volker@40 900 AR = np.dot(AREe, IE1e)
Volker@40 901 BT = np.dot(ATEe, IE2e)
Volker@40 902 BR = np.dot(AREe, IE2e)
Volker@40 903
Volker@40 904 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 905 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 906 GT = ATE1o * IinE + ATE4o * VinE
Volker@40 907 GR = ARE1o * IinE + ARE4o * VinE
Volker@40 908 HT = ATE2a * QinE + ATE3a * UinE + ATE4a * VinE
Volker@40 909 HR = ARE2a * QinE + ARE3a * UinE + ARE4a * VinE
Volker@40 910 else:
Volker@40 911 D = IinE + DiC * QinEe
Volker@40 912 A = DiC * IinE + QinEe
Volker@40 913 B = ZiC * (CosC * UinEe + SinC * VinE)
Volker@40 914 C = -ZiC * (SinC * UinEe - CosC * VinE)
Volker@40 915 GT = ATE1o * D + ATE4o * C
Volker@40 916 GR = ARE1o * D + ARE4o * C
Volker@40 917 HT = ATE2a * A + ATE3a * B + ATE4a * C
Volker@40 918 HR = ARE2a * A + ARE3a * B + ARE4a * C
Volker@40 919
Volker@40 920 else:
Volker@40 921 print('Calibrator not implemented yet')
Volker@40 922 sys.exit()
Volker@40 923
Volker@40 924 else:
Volker@40 925 print("Calibrator location not implemented yet")
Volker@40 926 sys.exit()
Volker@40 927
Volker@40 928 # Determination of the correction K of the calibration factor.
Volker@40 929 IoutTp = TTa * TiC * TiO * TiE * (AT + BT)
Volker@40 930 IoutTm = TTa * TiC * TiO * TiE * (AT - BT)
Volker@40 931 IoutRp = TRa * TiC * TiO * TiE * (AR + BR)
Volker@40 932 IoutRm = TRa * TiC * TiO * TiE * (AR - BR)
Volker@40 933 # --- Results and Corrections; electronic etaR and etaT are assumed to be 1
Volker@40 934 Etapx = IoutRp / IoutTp
Volker@40 935 Etamx = IoutRm / IoutTm
Volker@40 936 Etax = (Etapx * Etamx) ** 0.5
Volker@40 937
Volker@40 938 Eta = (TRa / TTa) # = TRa / TTa; Eta = Eta*/K Eq. 84 => K = Eta* / Eta; equation corrected according to the papers supplement Eqs. (S.10.10.1) ff
Volker@40 939 K = Etax / Eta
Volker@40 940
Volker@40 941 # For comparison with Volkers Libreoffice Müller Matrix spreadsheet
Volker@40 942 # Eta_test_p = (IoutRp/IoutTp)
Volker@40 943 # Eta_test_m = (IoutRm/IoutTm)
Volker@40 944 # Eta_test = (Eta_test_p*Eta_test_m)**0.5
Volker@40 945
Volker@40 946 # ----- random error calculation ----------
Volker@40 947 # noise must be calculated with the photon counts of measured signals;
Volker@40 948 # relative standard deviation of calibration signals with LDRcal; assumed to be statisitcally independent
Volker@40 949 # normalised noise errors
Volker@40 950 if (CalcFrom0deg):
Volker@40 951 dIoutTp = (NCalT * IoutTp) ** -0.5
Volker@40 952 dIoutTm = (NCalT * IoutTm) ** -0.5
Volker@40 953 dIoutRp = (NCalR * IoutRp) ** -0.5
Volker@40 954 dIoutRm = (NCalR * IoutRm) ** -0.5
Volker@40 955 else:
Volker@40 956 dIoutTp = (NCalT ** -0.5)
Volker@40 957 dIoutTm = (NCalT ** -0.5)
Volker@40 958 dIoutRp = (NCalR ** -0.5)
Volker@40 959 dIoutRm = (NCalR ** -0.5)
Volker@40 960 # Forward simulated 0°-signals with LDRCal with atrue; from input file
Volker@40 961
Volker@40 962 It = TTa * TiO * TiE * (GT + atrue * HT)
Volker@40 963 Ir = TRa * TiO * TiE * (GR + atrue * HR)
Volker@40 964 # relative standard deviation of standard signals with LDRmeas; assumed to be statisitcally independent
Volker@40 965 if (CalcFrom0deg): # this works!
Volker@40 966 dIt = ((It * NI * eFacT) ** -0.5)
Volker@40 967 dIr = ((Ir * NI * eFacR) ** -0.5)
Volker@40 968 '''
Volker@40 969 dIt = ((NCalT * It / IoutTp * NILfac / TCalT) ** -0.5)
Volker@40 970 dIr = ((NCalR * Ir / IoutRp * NILfac / TCalR) ** -0.5)
Volker@40 971 '''
Volker@40 972 else: # does this work? Why not as above?
Volker@40 973 dIt = ((NCalT * 2 * NILfac / TCalT ) ** -0.5)
Volker@40 974 dIr = ((NCalR * 2 * NILfac / TCalR) ** -0.5)
Volker@40 975
Volker@40 976 # ----- Forward simulated LDRsim = 1/Eta*Ir/It # simulated LDR* with Y from input file
Volker@40 977 LDRsim = Ir / It # simulated uncorrected LDR with Y from input file
Volker@40 978 # Corrected LDRsimCorr from forward simulated LDRsim (atrue)
Volker@40 979 # LDRsimCorr = (1./Eta*LDRsim*(GT+HT)-(GR+HR))/((GR-HR)-1./Eta*LDRsim*(GT-HT))
Volker@40 980 '''
Volker@40 981 if ((Y == -1.) and (abs(RotL0) < 45)) or ((Y == +1.) and (abs(RotL0) > 45)):
Volker@40 982 LDRsimx = 1. / LDRsim / Etax
Volker@40 983 else:
Volker@40 984 LDRsimx = LDRsim / Etax
Volker@40 985 '''
Volker@40 986 LDRsimx = LDRsim
Volker@40 987
Volker@40 988 # The following is correct without doubt
Volker@40 989 # LDRCorr = (LDRsim/(Etax/K)*(GT+HT)-(GR+HR))/((GR-HR)-LDRsim/(Etax/K)*(GT-HT))
Volker@40 990
Volker@40 991 # The following is a test whether the equations for calibration Etax and normal signal (GHK, LDRsim) are consistent
Volker@40 992 LDRCorr = (LDRsim / (Etax / K) * (GT + HT) - (GR + HR)) / ((GR - HR) - LDRsim / (Etax / K) * (GT - HT))
Volker@40 993 # here we could also use Eta instead of Etax / K => how to test whether Etax is correct? => comparison with MüllerMatrix simulation!
Volker@40 994 # Without any correction: only measured It, Ir, EtaX are used
Volker@40 995 LDRunCorr = LDRsim / Etax
Volker@40 996 # LDRunCorr = (LDRsim / Etax * (GT / abs(GT) + HT / abs(HT)) - (GR / abs(GR) + HR / abs(HR))) / ((GR / abs(GR) - HR / abs(HR)) - LDRsim / Etax * (GT / abs(GT) - HT / abs(HT)))
Volker@40 997
Volker@40 998 #LDRCorr = LDRsimx # for test only
Volker@40 999
Volker@40 1000 F11sim = 1 / (TiO * TiE) * ((HR * Eta * It - HT * Ir) / (HR * GT - HT * GR)) # IL = 1, Etat = Etar = 1 ; AMT Eq.64; what is Etax/K? => see about 20 lines above: = Eta
Volker@40 1001
Volker@40 1002 return (IoutTp, IoutTm, IoutRp, IoutRm, It, Ir, dIoutTp, dIoutTm, dIoutRp, dIoutRm, dIt, dIr,
Volker@40 1003 GT, HT, GR, HR, K, Eta, LDRsimx, LDRCorr, DTa, DRa, TTa, TRa, F11sim, LDRunCorr)
Volker@40 1004
Volker@40 1005
Volker@40 1006
Volker@40 1007 # *******************************************************************************************************************************
Volker@40 1008
Volker@40 1009 # --- CALC with assumed true parameters from the input file
Volker@40 1010 LDRtrue = LDRtrue2
Volker@40 1011 IoutTp0, IoutTm0, IoutRp0, IoutRm0, It0, Ir0, dIoutTp0, dIoutTm0, dIoutRp0, dIoutRm0, dIt0, dIr0, \
Volker@40 1012 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0, LDRunCorr = \
Volker@40 1013 Calc(TCalT, TCalR, NCalT, NCalR, Qin0, Vin0, RotL0, RotE0, RetE0, DiE0,
Volker@40 1014 RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0,
Volker@40 1015 ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal0)
Volker@40 1016 Etax0 = K0 * Eta0
Volker@40 1017 Etapx0 = IoutRp0 / IoutTp0
Volker@40 1018 Etamx0 = IoutRm0 / IoutTm0
Volker@40 1019 # --- Print parameters to console and output file
Volker@40 1020 OutputFile = 'output_' + InputFile[0:-3] + '_' + fname[0:-3] +'.dat'
Volker@40 1021 with open('output_files\\' + OutputFile, 'w') as f:
Volker@40 1022 with redirect_stdout(f):
Volker@40 1023 print("From ", dname)
Volker@40 1024 print("Running ", fname)
Volker@40 1025 print("Reading input file ", InputFile) # , " for Lidar system :", EID, ", ", LID)
Volker@40 1026 print("for Lidar system: ", EID, ", ", LID)
Volker@40 1027 # --- Print iput information*********************************
Volker@40 1028 print(" --- Input parameters: value ±error / ±steps ----------------------")
Volker@40 1029 print("{0:7}{1:17} {2:6.4f}±{3:7.4f}/{4:2d}".format("Laser: ", "Qin =", Qin0, dQin, nQin))
Volker@40 1030 print("{0:7}{1:17} {2:6.4f}±{3:7.4f}/{4:2d}".format("", "Vin =", Vin0, dVin, nVin))
Volker@40 1031 print("{0:7}{1:17} {2:6.4f}±{3:7.4f}/{4:2d}".format("", "Rotation alpha = ", RotL0, dRotL, nRotL))
Volker@40 1032 print("{0:7}{1:15} {2:8.4f} {3:17}".format("", "=> DOP", ((Qin ** 2 + Vin ** 2) ** 0.5), " (degree of polarisation)"))
Volker@40 1033
Volker@40 1034 print("Optic: Diatt., Tunpol, Retard., Rotation (deg)")
Volker@40 1035 print("{0:12} {1:7.4f} ±{2:7.4f} /{8:2d}, {3:7.4f}, {4:3.0f}±{5:3.0f}/{9:2d}, {6:7.4f}±{7:7.4f}/{10:2d}".format(
Volker@40 1036 "Emitter ", DiE0, dDiE, TiE, RetE0, dRetE, RotE0, dRotE, nDiE, nRetE, nRotE))
Volker@40 1037 print("{0:12} {1:7.4f} ±{2:7.4f} /{8:2d}, {3:7.4f}, {4:3.0f}±{5:3.0f}/{9:2d}, {6:7.4f}±{7:7.4f}/{10:2d}".format(
Volker@40 1038 "Receiver ", DiO0, dDiO, TiO, RetO0, dRetO, RotO0, dRotO, nDiO, nRetO, nRotO))
Volker@40 1039 print("{0:12} {1:9.6f}±{2:9.6f}/{8:2d}, {3:7.4f}, {4:3.0f}±{5:3.0f}/{9:2d}, {6:7.4f}±{7:7.4f}/{10:2d}".format(
Volker@40 1040 "Calibrator ", DiC0, dDiC, TiC, RetC0, dRetC, RotC0, dRotC, nDiC, nRetC, nRotC))
Volker@40 1041 print("{0:12}".format(" Pol.-filter ------ "))
Volker@40 1042 print("{0:12}{1:7.4f}±{2:7.4f}/{3:2d}, {4:7.4f}±{5:7.4f}/{6:2d}".format(
Volker@40 1043 "ERT, RotT :", ERaT0, dERaT, nERaT, RotaT0, dRotaT, nRotaT))
Volker@40 1044 print("{0:12}{1:7.4f}±{2:7.4f}/{3:2d}, {4:7.4f}±{5:7.4f}/{6:2d}".format(
Volker@40 1045 "ERR, RotR :", ERaR0, dERaR, nERaR, RotaR0, dRotaR, nRotaR))
Volker@40 1046 print("{0:12}".format(" PBS ------ "))
Volker@40 1047 print("{0:12}{1:7.4f}±{2:7.4f}/{3:2d}, {4:7.4f}±{5:7.4f}/{6:2d}".format(
Volker@40 1048 "TP,TS :", TP0, dTP, nTP, TS0, dTS, nTS))
Volker@40 1049 print("{0:12}{1:7.4f}±{2:7.4f}/{3:2d}, {4:7.4f}±{5:7.4f}/{6:2d}".format(
Volker@40 1050 "RP,RS :", RP0, dRP, nRP, RS0, dRS, nRS))
Volker@40 1051 print("{0:12}{1:7.4f},{2:7.4f}, {3:7.4f},{4:7.4f}, {5:1.0f}".format(
Volker@40 1052 "DT,TT,DR,TR,Y :", DiT, TiT, DiR, TiR, Y))
Volker@40 1053 print("{0:12}".format(" Combined PBS + Pol.-filter ------ "))
Volker@40 1054 print("{0:12}{1:7.4f},{2:7.4f}, {3:7.4f},{4:7.4f}".format(
Volker@40 1055 "DT,TT,DR,TR :", DTa0, TTa0, DRa0, TRa0))
Volker@40 1056 print("{0:26}: {1:6.3f}± {2:5.3f}/{3:2d}".format(
Volker@40 1057 "LDRCal during calibration in calibration range", LDRCal0, dLDRCal, nLDRCal))
Volker@40 1058 print("{0:12}".format(" --- Additional ND filter attenuation (transmission) during the calibration ---"))
Volker@40 1059 print("{0:12}{1:7.4f}±{2:7.4f}/{3:2d}, {4:7.4f}±{5:7.4f}/{6:2d}".format(
Volker@40 1060 "TCalT,TCalR :", TCalT0, dTCalT, nTCalT, TCalR0, dTCalR, nTCalR))
Volker@40 1061 print()
Volker@40 1062 print("Rotation Error Epsilon For Normal Measurements = ", RotationErrorEpsilonForNormalMeasurements)
Volker@40 1063 print(Type[TypeC], Loc[LocC])
Volker@40 1064 print("PBS incidence plane is ", dY[int(Y + 1)], "to reference plane and polarisation in reference plane is finally", dY2[int(Y + 1)])
Volker@40 1065 print(dY3)
Volker@40 1066 print("RS_RP_depend_on_TS_TP = ", RS_RP_depend_on_TS_TP)
Volker@40 1067 # end of print actual system parameters
Volker@40 1068 # ******************************************************************************
Volker@40 1069
Volker@40 1070
Volker@40 1071 print()
Volker@40 1072
Volker@40 1073 K0List = np.zeros(7)
Volker@40 1074 LDRsimxList = np.zeros(7)
Volker@40 1075 LDRCalList = 0.0, 0.004, 0.02, 0.1, 0.2, 0.3, 0.45
Volker@40 1076 # The loop over LDRCalList is ony for checking whether and how much the LDR depends on the LDRCal during calibration and whether the corrections work.
Volker@40 1077 # Still with assumed true parameters in input file
Volker@40 1078
Volker@40 1079 '''
Volker@40 1080 facIt = NCalT / TCalT0 * NILfac
Volker@40 1081 facIr = NCalR / TCalR0 * NILfac
Volker@40 1082 '''
Volker@40 1083 facIt = NI * eFacT
Volker@40 1084 facIr = NI * eFacR
Volker@40 1085 if (bPlotEtax):
Volker@40 1086 # check error signals
Volker@40 1087 # dIs are relative stdevs
Volker@40 1088 print("LDRCal, IoutTp, IoutTm, IoutRp, IoutRm, It, Ir, dIoutTp,dIoutTm,dIoutRp,dIoutRm,dIt, dIr")
Volker@40 1089
Volker@40 1090 for i, LDRCal in enumerate(LDRCalList):
Volker@40 1091 IoutTp, IoutTm, IoutRp, IoutRm, It, Ir, dIoutTp, dIoutTm, dIoutRp, dIoutRm, dIt, dIr, \
Volker@40 1092 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0, LDRunCorr = \
Volker@40 1093 Calc(TCalT0, TCalR0, NCalT, NCalR, Qin0, Vin0, RotL0, RotE0, RetE0, DiE0,
Volker@40 1094 RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0,
Volker@40 1095 ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal)
Volker@40 1096 K0List[i] = K0
Volker@40 1097 LDRsimxList[i] = LDRsimx
Volker@40 1098
Volker@40 1099 if (bPlotEtax):
Volker@40 1100 # check error signals
Volker@40 1101 print( "{:0.2f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}".format(LDRCal, IoutTp * NCalT, IoutTm * NCalT, IoutRp * NCalR, IoutRm * NCalR, It * facIt, Ir * facIr, dIoutTp, dIoutTm, dIoutRp, dIoutRm, dIt, dIr))
Volker@40 1102 #print( "{:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}".format(IoutTp, IoutTm, IoutRp, IoutRm, It, Ir, dIoutTp, dIoutTm, dIoutRp, dIoutRm, dIt, dIr))
Volker@40 1103 # end check error signals
Volker@40 1104 print('===========================================================================================================')
Volker@40 1105 print("{0:8},{1:8},{2:8},{3:8},{4:9},{5:8},{6:9},{7:9},{8:9},{9:9},{10:9}".format(
Volker@40 1106 " GR", " GT", " HR", " HT", " K(0.000)", " K(0.004)", " K(0.02)", " K(0.1)", " K(0.2)", " K(0.3)", " K(0.45)"))
Volker@40 1107 print("{0:8.5f},{1:8.5f},{2:8.5f},{3:8.5f},{4:9.5f},{5:9.5f},{6:9.5f},{7:9.5f},{8:9.5f},{9:9.5f},{10:9.5f}".format(
Volker@40 1108 GR0, GT0, HR0, HT0, K0List[0], K0List[1], K0List[2], K0List[3], K0List[4], K0List[5], K0List[6]))
Volker@40 1109 print('===========================================================================================================')
Volker@40 1110 print()
Volker@40 1111 print("Errors from neglecting GHK corrections and/or calibration:")
Volker@40 1112 print("{0:>10},{1:>10},{2:>10},{3:>10},{4:>10},{5:>10}".format(
Volker@40 1113 "LDRtrue", "LDRunCorr", "1/LDRunCorr", "LDRsimx", "1/LDRsimx", "LDRCorr"))
Volker@40 1114
Volker@40 1115 aF11sim0 = np.zeros(5)
Volker@40 1116 LDRrange = np.zeros(5)
Volker@40 1117 LDRsim0 = np.zeros(5)
Volker@40 1118 LDRrange = [0.004, 0.02, 0.1, 0.3, 0.45] # list
Volker@40 1119 LDRrange[0] = LDRtrue2 # value in the input file; default 0.004
Volker@40 1120
Volker@40 1121 # The loop over LDRtrueList is only for checking how much the uncorrected LDRsimx deviates from LDRtrue ... and whether the corrections work.
Volker@40 1122 # LDRsimx = LDRsim = Ir / It or 1/LDRsim
Volker@40 1123 # Still with assumed true parameters in input file
Volker@40 1124 for i, LDRtrue in enumerate(LDRrange):
Volker@40 1125 #for LDRtrue in LDRrange:
Volker@40 1126 IoutTp, IoutTm, IoutRp, IoutRm, It, Ir, dIoutTp, dIoutTm, dIoutRp, dIoutRm, dIt, dIr, \
Volker@40 1127 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0, LDRunCorr = \
Volker@40 1128 Calc(TCalT0, TCalR0, NCalT, NCalR, Qin0, Vin0, RotL0, RotE0, RetE0, DiE0,
Volker@40 1129 RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0,
Volker@40 1130 ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal0)
Volker@40 1131 print("{0:10.5f},{1:10.5f},{2:10.5f},{3:10.5f},{4:10.5f},{5:10.5f}".format(LDRtrue, LDRunCorr, 1/LDRunCorr, LDRsimx, 1/LDRsimx, LDRCorr))
Volker@40 1132 aF11sim0[i] = F11sim0
Volker@40 1133 LDRsim0[i] = Ir / It
Volker@40 1134 # the assumed true aF11sim0 results will be used below to calc the deviation from the real signals
Volker@40 1135 print("LDRsimx = LDR of the nominal system directly from measured signals without calibration and GHK-corrections")
Volker@40 1136 print("LDRunCorr = LDR of the nominal system directly from measured signals with calibration but without GHK-corrections; electronic amplifications = 1 assumed")
Volker@40 1137 print("LDRCorr = LDR calibrated and GHK-corrected")
Volker@40 1138 print()
Volker@40 1139 print("Errors from signal noise:")
Volker@40 1140 print("Signal counts: NI, NCalT, NCalR, NILfac, nNCal, nNI, stdev(NI)/NI = {0:10.0f},{1:10.0f},{2:10.0f},{3:3.0f},{4:2.0f},{5:2.0f},{6:8.5f}".format(
Volker@40 1141 NI, NCalT, NCalR, NILfac, nNCal, nNI, 1.0 / NI ** 0.5))
Volker@40 1142 print()
Volker@40 1143 print()
Volker@40 1144 '''# das muß wieder weg
Volker@40 1145 print("IoutTp, IoutTm, IoutRp, IoutRm, It , Ir , dIoutTp, dIoutTm, dIoutRp, dIoutRm, dIt, dIr")
Volker@40 1146 LDRCal = 0.01
Volker@40 1147 for i, LDRtrue in enumerate(LDRrange):
Volker@40 1148 IoutTp, IoutTm, IoutRp, IoutRm, It, Ir, dIoutTp, dIoutTm, dIoutRp, dIoutRm, dIt, dIr, \
Volker@40 1149 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0, LDRunCorr = \
Volker@40 1150 Calc(TCalT0, TCalR0, NCalT, NCalR, DOLP0, RotL0, RotE0, RetE0, DiE0,
Volker@40 1151 RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0,
Volker@40 1152 ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal0)
Volker@40 1153 print( "{:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}, {:0.4f}".format(
Volker@40 1154 IoutTp * NCalT, IoutTm * NCalT, IoutRp * NCalR, IoutRm * NCalR, It * facIt, Ir * facIr,
Volker@40 1155 dIoutTp, dIoutTm, dIoutRp, dIoutRm, dIt, dIr))
Volker@40 1156 aF11sim0[i] = F11sim0
Volker@40 1157 # the assumed true aF11sim0 results will be used below to calc the deviation from the real signals
Volker@40 1158 # bis hierher weg
Volker@40 1159 '''
Volker@40 1160
Volker@40 1161 file = open('output_files\\' + OutputFile, 'r')
Volker@40 1162 print(file.read())
Volker@40 1163 file.close()
Volker@40 1164
Volker@40 1165 # --- CALC again assumed truth with LDRCal0 and with assumed true parameters in input file to reset all 0-values
Volker@40 1166 LDRtrue = LDRtrue2
Volker@40 1167 IoutTp0, IoutTm0, IoutRp0, IoutRm0, It0, Ir0, dIoutTp0, dIoutTm0, dIoutRp0, dIoutRm0, dIt0, dIr0, \
Volker@40 1168 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0, LDRunCorr = \
Volker@40 1169 Calc(TCalT0, TCalR0, NCalT, NCalR, Qin0, Vin0, RotL0, RotE0, RetE0, DiE0,
Volker@40 1170 RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0,
Volker@40 1171 ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal0)
Volker@40 1172 Etax0 = K0 * Eta0
Volker@40 1173 Etapx0 = IoutRp0 / IoutTp0
Volker@40 1174 Etamx0 = IoutRm0 / IoutTm0
Volker@40 1175 '''
Volker@40 1176 if(PrintToOutputFile):
Volker@40 1177 f = open('output_ver7.dat', 'w')
Volker@40 1178 old_target = sys.stdout
Volker@40 1179 sys.stdout = f
Volker@40 1180
Volker@40 1181 print("something")
Volker@40 1182
Volker@40 1183 if(PrintToOutputFile):
Volker@40 1184 sys.stdout.flush()
Volker@40 1185 f.close
Volker@40 1186 sys.stdout = old_target
Volker@40 1187 '''
Volker@40 1188 if (Error_Calc):
Volker@40 1189 # --- CALC again assumed truth with LDRCal0 and with assumed true parameters in input file to reset all 0-values
Volker@40 1190 LDRtrue = LDRtrue2
Volker@40 1191 IoutTp0, IoutTm0, IoutRp0, IoutRm0, It0, Ir0, dIoutTp0, dIoutTm0, dIoutRp0, dIoutRm0, dIt0, dIr0, \
Volker@40 1192 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0, LDRunCorr = \
Volker@40 1193 Calc(TCalT0, TCalR0, NCalT, NCalR, Qin0, Vin0, RotL0, RotE0, RetE0, DiE0,
Volker@40 1194 RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0,
Volker@40 1195 ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal0)
Volker@40 1196 Etax0 = K0 * Eta0
Volker@40 1197 Etapx0 = IoutRp0 / IoutTp0
Volker@40 1198 Etamx0 = IoutRm0 / IoutTm0
Volker@40 1199
Volker@40 1200 # --- Start Error calculation with variable parameters ------------------------------------------------------------------
Volker@40 1201 # error nNCal: one-sigma in steps to left and right for calibration signals
Volker@40 1202 # error nNI: one-sigma in steps to left and right for 0° signals
Volker@40 1203
Volker@40 1204 iN = -1
Volker@40 1205 N = ((nTCalT * 2 + 1) * (nTCalR * 2 + 1) *
Volker@40 1206 (nNCal * 2 + 1) ** 4 * (nNI * 2 + 1) ** 2 *
Volker@40 1207 (nQin * 2 + 1) * (nVin * 2 + 1) * (nRotL * 2 + 1) *
Volker@40 1208 (nRotE * 2 + 1) * (nRetE * 2 + 1) * (nDiE * 2 + 1) *
Volker@40 1209 (nRotO * 2 + 1) * (nRetO * 2 + 1) * (nDiO * 2 + 1) *
Volker@40 1210 (nRotC * 2 + 1) * (nRetC * 2 + 1) * (nDiC * 2 + 1) *
Volker@40 1211 (nTP * 2 + 1) * (nTS * 2 + 1) * (nRP * 2 + 1) * (nRS * 2 + 1) * (nERaT * 2 + 1) * (nERaR * 2 + 1) *
Volker@40 1212 (nRotaT * 2 + 1) * (nRotaR * 2 + 1) * (nRetT * 2 + 1) * (nRetR * 2 + 1) * (nLDRCal * 2 + 1))
Volker@40 1213 print("number of system variations N = ", N, " ", end="")
Volker@40 1214
Volker@40 1215 if N > 1e6:
Volker@40 1216 if user_yes_no_query('Warning: processing ' + str(
Volker@40 1217 N) + ' samples will take very long. Do you want to proceed?') == 0: sys.exit()
Volker@40 1218 if N > 5e6:
Volker@40 1219 if user_yes_no_query('Warning: the memory required for ' + str(N) + ' samples might be ' + '{0:5.1f}'.format(
Volker@40 1220 N / 4e6) + ' GB. Do you anyway want to proceed?') == 0: sys.exit()
Volker@40 1221
Volker@40 1222 # if user_yes_no_query('Warning: processing' + str(N) + ' samples will take very long. Do you want to proceed?') == 0: sys.exit()
Volker@40 1223
Volker@40 1224 # --- Arrays for plotting ------
Volker@40 1225 LDRmin = np.zeros(5)
Volker@40 1226 LDRmax = np.zeros(5)
Volker@40 1227 LDRstd = np.zeros(5)
Volker@40 1228 LDRmean = np.zeros(5)
Volker@40 1229 LDRmedian = np.zeros(5)
Volker@40 1230 LDRskew = np.zeros(5)
Volker@40 1231 LDRkurt = np.zeros(5)
Volker@40 1232 LDRsimmin = np.zeros(5)
Volker@40 1233 LDRsimmax = np.zeros(5)
Volker@40 1234 LDRsimmean = np.zeros(5)
Volker@40 1235
Volker@40 1236 F11min = np.zeros(5)
Volker@40 1237 F11max = np.zeros(5)
Volker@40 1238 Etaxmin = np.zeros(5)
Volker@40 1239 Etaxmax = np.zeros(5)
Volker@40 1240
Volker@40 1241 aQin = np.zeros(N)
Volker@40 1242 aVin = np.zeros(N)
Volker@40 1243 aERaT = np.zeros(N)
Volker@40 1244 aERaR = np.zeros(N)
Volker@40 1245 aRotaT = np.zeros(N)
Volker@40 1246 aRotaR = np.zeros(N)
Volker@40 1247 aRetT = np.zeros(N)
Volker@40 1248 aRetR = np.zeros(N)
Volker@40 1249 aTP = np.zeros(N)
Volker@40 1250 aTS = np.zeros(N)
Volker@40 1251 aRP = np.zeros(N)
Volker@40 1252 aRS = np.zeros(N)
Volker@40 1253 aDiE = np.zeros(N)
Volker@40 1254 aDiO = np.zeros(N)
Volker@40 1255 aDiC = np.zeros(N)
Volker@40 1256 aRotC = np.zeros(N)
Volker@40 1257 aRetC = np.zeros(N)
Volker@40 1258 aRotL = np.zeros(N)
Volker@40 1259 aRetE = np.zeros(N)
Volker@40 1260 aRotE = np.zeros(N)
Volker@40 1261 aRetO = np.zeros(N)
Volker@40 1262 aRotO = np.zeros(N)
Volker@40 1263 aLDRCal = np.zeros(N)
Volker@40 1264 aNCalTp = np.zeros(N)
Volker@40 1265 aNCalTm = np.zeros(N)
Volker@40 1266 aNCalRp = np.zeros(N)
Volker@40 1267 aNCalRm = np.zeros(N)
Volker@40 1268 aNIt = np.zeros(N)
Volker@40 1269 aNIr = np.zeros(N)
Volker@40 1270 aTCalT = np.zeros(N)
Volker@40 1271 aTCalR = np.zeros(N)
Volker@40 1272
Volker@40 1273 # each np.zeros((LDRrange, N)) array has the same N-dependency
Volker@40 1274 aLDRcorr = np.zeros((5, N))
Volker@40 1275 aLDRsim = np.zeros((5, N))
Volker@40 1276 aF11corr = np.zeros((5, N))
Volker@40 1277 aPLDR = np.zeros((5, N))
Volker@40 1278 aEtax = np.zeros((5, N))
Volker@40 1279 aEtapx = np.zeros((5, N))
Volker@40 1280 aEtamx = np.zeros((5, N))
Volker@40 1281
Volker@40 1282 # np.zeros((GHKs, N))
Volker@40 1283 aGHK = np.zeros((5, N))
Volker@40 1284
Volker@40 1285 atime = clock()
Volker@40 1286 dtime = clock()
Volker@40 1287
Volker@40 1288 # --- Calc Error signals
Volker@40 1289 # ---- Do the calculations of bra-ket vectors
Volker@40 1290 h = -1. if TypeC == 2 else 1
Volker@40 1291
Volker@40 1292 for iLDRCal in range(-nLDRCal, nLDRCal + 1):
Volker@40 1293 # from input file: LDRCal for calibration measurements
Volker@40 1294 LDRCal = LDRCal0
Volker@40 1295 if nLDRCal > 0:
Volker@40 1296 LDRCal = LDRCal0 + iLDRCal * dLDRCal / nLDRCal
Volker@40 1297 # provides the intensities of the calibration measurements at various LDRCal for signal noise errors
Volker@40 1298 # IoutTp, IoutTm, IoutRp, IoutRm, dIoutTp, dIoutTm, dIoutRp, dIoutRm
Volker@40 1299
Volker@40 1300 aCal = (1. - LDRCal) / (1. + LDRCal)
Volker@40 1301 for iQin, iVin, iRotL, iRotE, iRetE, iDiE \
Volker@40 1302 in [(iQin, iVin, iRotL, iRotE, iRetE, iDiE)
Volker@40 1303 for iQin in range(-nQin, nQin + 1)
Volker@40 1304 for iVin in range(-nVin, nVin + 1)
Volker@40 1305 for iRotL in range(-nRotL, nRotL + 1)
Volker@40 1306 for iRotE in range(-nRotE, nRotE + 1)
Volker@40 1307 for iRetE in range(-nRetE, nRetE + 1)
Volker@40 1308 for iDiE in range(-nDiE, nDiE + 1)]:
Volker@40 1309
Volker@40 1310 if nQin > 0: Qin = Qin0 + iQin * dQin / nQin
Volker@40 1311 if nVin > 0: Vin = Vin0 + iVin * dVin / nVin
Volker@40 1312 if nRotL > 0: RotL = RotL0 + iRotL * dRotL / nRotL
Volker@40 1313 if nRotE > 0: RotE = RotE0 + iRotE * dRotE / nRotE
Volker@40 1314 if nRetE > 0: RetE = RetE0 + iRetE * dRetE / nRetE
Volker@40 1315 if nDiE > 0: DiE = DiE0 + iDiE * dDiE / nDiE
Volker@40 1316
Volker@40 1317 if ((Qin ** 2 + Vin ** 2) ** 0.5) > 1.0:
Volker@40 1318 print("Error: degree of polarisation of laser > 1. Check Qin and Vin! ")
Volker@40 1319 sys.exit()
Volker@40 1320 # angles of emitter and laser and calibrator and receiver optics
Volker@40 1321 # RotL = alpha, RotE = beta, RotO = gamma, RotC = epsilon
Volker@40 1322 S2a = np.sin(2 * np.deg2rad(RotL))
Volker@40 1323 C2a = np.cos(2 * np.deg2rad(RotL))
Volker@40 1324 S2b = np.sin(2 * np.deg2rad(RotE))
Volker@40 1325 C2b = np.cos(2 * np.deg2rad(RotE))
Volker@40 1326 S2ab = np.sin(np.deg2rad(2 * RotL - 2 * RotE))
Volker@40 1327 C2ab = np.cos(np.deg2rad(2 * RotL - 2 * RotE))
Volker@40 1328
Volker@40 1329 # Laser with Degree of linear polarization DOLP
Volker@40 1330 IinL = 1.
Volker@40 1331 QinL = Qin
Volker@40 1332 UinL = 0.
Volker@40 1333 VinL = Vin
Volker@40 1334 # VinL = (1. - DOLP ** 2) ** 0.5
Volker@40 1335
Volker@40 1336 # Stokes Input Vector rotation Eq. E.4
Volker@40 1337 A = C2a * QinL - S2a * UinL
Volker@40 1338 B = S2a * QinL + C2a * UinL
Volker@40 1339 # Stokes Input Vector rotation Eq. E.9
Volker@40 1340 C = C2ab * QinL - S2ab * UinL
Volker@40 1341 D = S2ab * QinL + C2ab * UinL
Volker@40 1342
Volker@40 1343 # emitter optics
Volker@40 1344 CosE = np.cos(np.deg2rad(RetE))
Volker@40 1345 SinE = np.sin(np.deg2rad(RetE))
Volker@40 1346 ZiE = (1. - DiE ** 2) ** 0.5
Volker@40 1347 WiE = (1. - ZiE * CosE)
Volker@40 1348
Volker@40 1349 # Stokes Input Vector after emitter optics equivalent to Eq. E.9 with already rotated input vector from Eq. E.4
Volker@40 1350 # b = beta
Volker@40 1351 IinE = (IinL + DiE * C)
Volker@40 1352 QinE = (C2b * DiE * IinL + A + S2b * (WiE * D - ZiE * SinE * VinL))
Volker@40 1353 UinE = (S2b * DiE * IinL + B - C2b * (WiE * D - ZiE * SinE * VinL))
Volker@40 1354 VinE = (-ZiE * SinE * D + ZiE * CosE * VinL)
Volker@40 1355
Volker@40 1356 # -------------------------
Volker@40 1357 # F11 assuemd to be = 1 => measured: F11m = IinP / IinE with atrue
Volker@40 1358 # F11sim = (IinE + DiO*atrue*(C2g*QinE - S2g*UinE))/IinE
Volker@40 1359 # -------------------------
Volker@40 1360
Volker@40 1361 for iRotO, iRetO, iDiO, iRotC, iRetC, iDiC, iTP, iTS, iRP, iRS, iERaT, iRotaT, iRetT, iERaR, iRotaR, iRetR \
Volker@40 1362 in [
Volker@40 1363 (iRotO, iRetO, iDiO, iRotC, iRetC, iDiC, iTP, iTS, iRP, iRS, iERaT, iRotaT, iRetT, iERaR, iRotaR, iRetR)
Volker@40 1364 for iRotO in range(-nRotO, nRotO + 1)
Volker@40 1365 for iRetO in range(-nRetO, nRetO + 1)
Volker@40 1366 for iDiO in range(-nDiO, nDiO + 1)
Volker@40 1367 for iRotC in range(-nRotC, nRotC + 1)
Volker@40 1368 for iRetC in range(-nRetC, nRetC + 1)
Volker@40 1369 for iDiC in range(-nDiC, nDiC + 1)
Volker@40 1370 for iTP in range(-nTP, nTP + 1)
Volker@40 1371 for iTS in range(-nTS, nTS + 1)
Volker@40 1372 for iRP in range(-nRP, nRP + 1)
Volker@40 1373 for iRS in range(-nRS, nRS + 1)
Volker@40 1374 for iERaT in range(-nERaT, nERaT + 1)
Volker@40 1375 for iRotaT in range(-nRotaT, nRotaT + 1)
Volker@40 1376 for iRetT in range(-nRetT, nRetT + 1)
Volker@40 1377 for iERaR in range(-nERaR, nERaR + 1)
Volker@40 1378 for iRotaR in range(-nRotaR, nRotaR + 1)
Volker@40 1379 for iRetR in range(-nRetR, nRetR + 1)]:
Volker@40 1380
Volker@40 1381 if nRotO > 0: RotO = RotO0 + iRotO * dRotO / nRotO
Volker@40 1382 if nRetO > 0: RetO = RetO0 + iRetO * dRetO / nRetO
Volker@40 1383 if nDiO > 0: DiO = DiO0 + iDiO * dDiO / nDiO
Volker@40 1384 if nRotC > 0: RotC = RotC0 + iRotC * dRotC / nRotC
Volker@40 1385 if nRetC > 0: RetC = RetC0 + iRetC * dRetC / nRetC
Volker@40 1386 if nDiC > 0: DiC = DiC0 + iDiC * dDiC / nDiC
Volker@40 1387 if nTP > 0: TP = TP0 + iTP * dTP / nTP
Volker@40 1388 if nTS > 0: TS = TS0 + iTS * dTS / nTS
Volker@40 1389 if nRP > 0: RP = RP0 + iRP * dRP / nRP
Volker@40 1390 if nRS > 0: RS = RS0 + iRS * dRS / nRS
Volker@40 1391 if nERaT > 0: ERaT = ERaT0 + iERaT * dERaT / nERaT
Volker@40 1392 if nRotaT > 0: RotaT = RotaT0 + iRotaT * dRotaT / nRotaT
Volker@40 1393 if nRetT > 0: RetT = RetT0 + iRetT * dRetT / nRetT
Volker@40 1394 if nERaR > 0: ERaR = ERaR0 + iERaR * dERaR / nERaR
Volker@40 1395 if nRotaR > 0: RotaR = RotaR0 + iRotaR * dRotaR / nRotaR
Volker@40 1396 if nRetR > 0: RetR = RetR0 + iRetR * dRetR / nRetR
Volker@40 1397
Volker@40 1398 # print("{0:5.2f}, {1:5.2f}, {2:5.2f}, {3:10d}".format(RotL, RotE, RotO, iN))
Volker@40 1399
Volker@40 1400 # receiver optics
Volker@40 1401 CosO = np.cos(np.deg2rad(RetO))
Volker@40 1402 SinO = np.sin(np.deg2rad(RetO))
Volker@40 1403 ZiO = (1. - DiO ** 2) ** 0.5
Volker@40 1404 WiO = (1. - ZiO * CosO)
Volker@40 1405 S2g = np.sin(np.deg2rad(2 * RotO))
Volker@40 1406 C2g = np.cos(np.deg2rad(2 * RotO))
Volker@40 1407 # calibrator
Volker@40 1408 CosC = np.cos(np.deg2rad(RetC))
Volker@40 1409 SinC = np.sin(np.deg2rad(RetC))
Volker@40 1410 ZiC = (1. - DiC ** 2) ** 0.5
Volker@40 1411 WiC = (1. - ZiC * CosC)
Volker@40 1412
Volker@40 1413 # analyser
Volker@40 1414 # For POLLY_XTs
Volker@40 1415 if (RS_RP_depend_on_TS_TP):
Volker@40 1416 RS = 1.0 - TS
Volker@40 1417 RP = 1.0 - TP
Volker@40 1418 TiT = 0.5 * (TP + TS)
Volker@40 1419 DiT = (TP - TS) / (TP + TS)
Volker@40 1420 ZiT = (1. - DiT ** 2.) ** 0.5
Volker@40 1421 TiR = 0.5 * (RP + RS)
Volker@40 1422 DiR = (RP - RS) / (RP + RS)
Volker@40 1423 ZiR = (1. - DiR ** 2.) ** 0.5
Volker@40 1424 CosT = np.cos(np.deg2rad(RetT))
Volker@40 1425 SinT = np.sin(np.deg2rad(RetT))
Volker@40 1426 CosR = np.cos(np.deg2rad(RetR))
Volker@40 1427 SinR = np.sin(np.deg2rad(RetR))
Volker@40 1428
Volker@40 1429 # cleaning pol-filter
Volker@40 1430 DaT = (1.0 - ERaT) / (1.0 + ERaT)
Volker@40 1431 DaR = (1.0 - ERaR) / (1.0 + ERaR)
Volker@40 1432 TaT = 0.5 * (1.0 + ERaT)
Volker@40 1433 TaR = 0.5 * (1.0 + ERaR)
Volker@40 1434
Volker@40 1435 S2aT = np.sin(np.deg2rad(h * 2.0 * RotaT))
Volker@40 1436 C2aT = np.cos(np.deg2rad(2.0 * RotaT))
Volker@40 1437 S2aR = np.sin(np.deg2rad(h * 2.0 * RotaR))
Volker@40 1438 C2aR = np.cos(np.deg2rad(2.0 * RotaR))
Volker@40 1439
Volker@40 1440 # Analyzer As before the PBS Eq. D.5; combined PBS and cleaning pol-filter
Volker@40 1441 ATPT = (1 + C2aT * DaT * DiT) # unpolarized transmission correction
Volker@40 1442 TTa = TiT * TaT * ATPT # unpolarized transmission
Volker@40 1443 ATP1 = 1.0
Volker@40 1444 ATP2 = Y * (DiT + C2aT * DaT) / ATPT
Volker@40 1445 ATP3 = Y * S2aT * DaT * ZiT * CosT / ATPT
Volker@40 1446 ATP4 = S2aT * DaT * ZiT * SinT / ATPT
Volker@40 1447 ATP = np.array([ATP1, ATP2, ATP3, ATP4])
Volker@40 1448 DTa = ATP2 * Y
Volker@40 1449
Volker@40 1450 ARPT = (1 + C2aR * DaR * DiR) # unpolarized transmission correction
Volker@40 1451 TRa = TiR * TaR * ARPT # unpolarized transmission
Volker@40 1452 ARP1 = 1
Volker@40 1453 ARP2 = Y * (DiR + C2aR * DaR) / ARPT
Volker@40 1454 ARP3 = Y * S2aR * DaR * ZiR * CosR / ARPT
Volker@40 1455 ARP4 = S2aR * DaR * ZiR * SinR / ARPT
Volker@40 1456 ARP = np.array([ARP1, ARP2, ARP3, ARP4])
Volker@40 1457 DRa = ARP2 * Y
Volker@40 1458
Volker@40 1459 # ---- Calculate signals and correction parameters for diffeent locations and calibrators
Volker@40 1460 if LocC == 4: # Calibrator before the PBS
Volker@40 1461 # print("Calibrator location not implemented yet")
Volker@40 1462
Volker@40 1463 # S2ge = np.sin(np.deg2rad(2*RotO + h*2*RotC))
Volker@40 1464 # C2ge = np.cos(np.deg2rad(2*RotO + h*2*RotC))
Volker@40 1465 S2e = np.sin(np.deg2rad(h * 2 * RotC))
Volker@40 1466 C2e = np.cos(np.deg2rad(2 * RotC))
Volker@40 1467 # rotated AinP by epsilon Eq. C.3
Volker@40 1468 ATP2e = C2e * ATP2 + S2e * ATP3
Volker@40 1469 ATP3e = C2e * ATP3 - S2e * ATP2
Volker@40 1470 ARP2e = C2e * ARP2 + S2e * ARP3
Volker@40 1471 ARP3e = C2e * ARP3 - S2e * ARP2
Volker@40 1472 ATPe = np.array([ATP1, ATP2e, ATP3e, ATP4])
Volker@40 1473 ARPe = np.array([ARP1, ARP2e, ARP3e, ARP4])
Volker@40 1474 # Stokes Input Vector before the polarising beam splitter Eq. E.31
Volker@40 1475 A = C2g * QinE - S2g * UinE
Volker@40 1476 B = S2g * QinE + C2g * UinE
Volker@40 1477 # C = (WiO*aCal*B + ZiO*SinO*(1-2*aCal)*VinE)
Volker@40 1478 Co = ZiO * SinO * VinE
Volker@40 1479 Ca = (WiO * B - 2 * ZiO * SinO * VinE)
Volker@40 1480 # C = Co + aCal*Ca
Volker@40 1481 # IinP = (IinE + DiO*aCal*A)
Volker@40 1482 # QinP = (C2g*DiO*IinE + aCal*QinE - S2g*C)
Volker@40 1483 # UinP = (S2g*DiO*IinE - aCal*UinE + C2g*C)
Volker@40 1484 # VinP = (ZiO*SinO*aCal*B + ZiO*CosO*(1-2*aCal)*VinE)
Volker@40 1485 IinPo = IinE
Volker@40 1486 QinPo = (C2g * DiO * IinE - S2g * Co)
Volker@40 1487 UinPo = (S2g * DiO * IinE + C2g * Co)
Volker@40 1488 VinPo = ZiO * CosO * VinE
Volker@40 1489
Volker@40 1490 IinPa = DiO * A
Volker@40 1491 QinPa = QinE - S2g * Ca
Volker@40 1492 UinPa = -UinE + C2g * Ca
Volker@40 1493 VinPa = ZiO * (SinO * B - 2 * CosO * VinE)
Volker@40 1494
Volker@40 1495 IinP = IinPo + aCal * IinPa
Volker@40 1496 QinP = QinPo + aCal * QinPa
Volker@40 1497 UinP = UinPo + aCal * UinPa
Volker@40 1498 VinP = VinPo + aCal * VinPa
Volker@40 1499 # Stokes Input Vector before the polarising beam splitter rotated by epsilon Eq. C.3
Volker@40 1500 # QinPe = C2e*QinP + S2e*UinP
Volker@40 1501 # UinPe = C2e*UinP - S2e*QinP
Volker@40 1502 QinPoe = C2e * QinPo + S2e * UinPo
Volker@40 1503 UinPoe = C2e * UinPo - S2e * QinPo
Volker@40 1504 QinPae = C2e * QinPa + S2e * UinPa
Volker@40 1505 UinPae = C2e * UinPa - S2e * QinPa
Volker@40 1506 QinPe = C2e * QinP + S2e * UinP
Volker@40 1507 UinPe = C2e * UinP - S2e * QinP
Volker@40 1508
Volker@40 1509 # Calibration signals and Calibration correction K from measurements with LDRCal / aCal
Volker@40 1510 if (TypeC == 2) or (TypeC == 1): # rotator calibration Eq. C.4
Volker@40 1511 # parameters for calibration with aCal
Volker@40 1512 AT = ATP1 * IinP + h * ATP4 * VinP
Volker@40 1513 BT = ATP3e * QinP - h * ATP2e * UinP
Volker@40 1514 AR = ARP1 * IinP + h * ARP4 * VinP
Volker@40 1515 BR = ARP3e * QinP - h * ARP2e * UinP
Volker@40 1516 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 1517 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 1518 IS1 = np.array([IinPo, QinPo, UinPo, VinPo])
Volker@40 1519 IS2 = np.array([IinPa, QinPa, UinPa, VinPa])
Volker@40 1520 GT = np.dot(ATP, IS1)
Volker@40 1521 GR = np.dot(ARP, IS1)
Volker@40 1522 HT = np.dot(ATP, IS2)
Volker@40 1523 HR = np.dot(ARP, IS2)
Volker@40 1524 else:
Volker@40 1525 IS1 = np.array([IinPo, QinPo, UinPo, VinPo])
Volker@40 1526 IS2 = np.array([IinPa, QinPa, UinPa, VinPa])
Volker@40 1527 GT = np.dot(ATPe, IS1)
Volker@40 1528 GR = np.dot(ARPe, IS1)
Volker@40 1529 HT = np.dot(ATPe, IS2)
Volker@40 1530 HR = np.dot(ARPe, IS2)
Volker@40 1531 elif (TypeC == 3) or (TypeC == 4): # linear polariser calibration Eq. C.5
Volker@40 1532 # parameters for calibration with aCal
Volker@40 1533 AT = ATP1 * IinP + ATP3e * UinPe + ZiC * CosC * (ATP2e * QinPe + ATP4 * VinP)
Volker@40 1534 BT = DiC * (ATP1 * UinPe + ATP3e * IinP) - ZiC * SinC * (ATP2e * VinP - ATP4 * QinPe)
Volker@40 1535 AR = ARP1 * IinP + ARP3e * UinPe + ZiC * CosC * (ARP2e * QinPe + ARP4 * VinP)
Volker@40 1536 BR = DiC * (ARP1 * UinPe + ARP3e * IinP) - ZiC * SinC * (ARP2e * VinP - ARP4 * QinPe)
Volker@40 1537 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 1538 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 1539 IS1 = np.array([IinPo, QinPo, UinPo, VinPo])
Volker@40 1540 IS2 = np.array([IinPa, QinPa, UinPa, VinPa])
Volker@40 1541 GT = np.dot(ATP, IS1)
Volker@40 1542 GR = np.dot(ARP, IS1)
Volker@40 1543 HT = np.dot(ATP, IS2)
Volker@40 1544 HR = np.dot(ARP, IS2)
Volker@40 1545 else:
Volker@40 1546 IS1e = np.array(
Volker@40 1547 [IinPo + DiC * QinPoe, DiC * IinPo + QinPoe, ZiC * (CosC * UinPoe + SinC * VinPo),
Volker@40 1548 -ZiC * (SinC * UinPoe - CosC * VinPo)])
Volker@40 1549 IS2e = np.array(
Volker@40 1550 [IinPa + DiC * QinPae, DiC * IinPa + QinPae, ZiC * (CosC * UinPae + SinC * VinPa),
Volker@40 1551 -ZiC * (SinC * UinPae - CosC * VinPa)])
Volker@40 1552 GT = np.dot(ATPe, IS1e)
Volker@40 1553 GR = np.dot(ARPe, IS1e)
Volker@40 1554 HT = np.dot(ATPe, IS2e)
Volker@40 1555 HR = np.dot(ARPe, IS2e)
Volker@40 1556 elif (TypeC == 6): # diattenuator calibration +-22.5° rotated_diattenuator_X22x5deg.odt
Volker@40 1557 # parameters for calibration with aCal
Volker@40 1558 AT = ATP1 * IinP + sqr05 * DiC * (ATP1 * QinPe + ATP2e * IinP) + (1 - 0.5 * WiC) * (
Volker@40 1559 ATP2e * QinPe + ATP3e * UinPe) + ZiC * (
Volker@40 1560 sqr05 * SinC * (ATP3e * VinP - ATP4 * UinPe) + ATP4 * CosC * VinP)
Volker@40 1561 BT = sqr05 * DiC * (ATP1 * UinPe + ATP3e * IinP) + 0.5 * WiC * (
Volker@40 1562 ATP2e * UinPe + ATP3e * QinPe) - sqr05 * ZiC * SinC * (ATP2e * VinP - ATP4 * QinPe)
Volker@40 1563 AR = ARP1 * IinP + sqr05 * DiC * (ARP1 * QinPe + ARP2e * IinP) + (1 - 0.5 * WiC) * (
Volker@40 1564 ARP2e * QinPe + ARP3e * UinPe) + ZiC * (
Volker@40 1565 sqr05 * SinC * (ARP3e * VinP - ARP4 * UinPe) + ARP4 * CosC * VinP)
Volker@40 1566 BR = sqr05 * DiC * (ARP1 * UinPe + ARP3e * IinP) + 0.5 * WiC * (
Volker@40 1567 ARP2e * UinPe + ARP3e * QinPe) - sqr05 * ZiC * SinC * (ARP2e * VinP - ARP4 * QinPe)
Volker@40 1568 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 1569 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 1570 IS1 = np.array([IinPo, QinPo, UinPo, VinPo])
Volker@40 1571 IS2 = np.array([IinPa, QinPa, UinPa, VinPa])
Volker@40 1572 GT = np.dot(ATP, IS1)
Volker@40 1573 GR = np.dot(ARP, IS1)
Volker@40 1574 HT = np.dot(ATP, IS2)
Volker@40 1575 HR = np.dot(ARP, IS2)
Volker@40 1576 else:
Volker@40 1577 IS1e = np.array(
Volker@40 1578 [IinPo + DiC * QinPoe, DiC * IinPo + QinPoe, ZiC * (CosC * UinPoe + SinC * VinPo),
Volker@40 1579 -ZiC * (SinC * UinPoe - CosC * VinPo)])
Volker@40 1580 IS2e = np.array(
Volker@40 1581 [IinPa + DiC * QinPae, DiC * IinPa + QinPae, ZiC * (CosC * UinPae + SinC * VinPa),
Volker@40 1582 -ZiC * (SinC * UinPae - CosC * VinPa)])
Volker@40 1583 GT = np.dot(ATPe, IS1e)
Volker@40 1584 GR = np.dot(ARPe, IS1e)
Volker@40 1585 HT = np.dot(ATPe, IS2e)
Volker@40 1586 HR = np.dot(ARPe, IS2e)
Volker@40 1587 else:
Volker@40 1588 print("Calibrator not implemented yet")
Volker@40 1589 sys.exit()
Volker@40 1590
Volker@40 1591 elif LocC == 3: # C before receiver optics Eq.57
Volker@40 1592
Volker@40 1593 # S2ge = np.sin(np.deg2rad(2*RotO - 2*RotC))
Volker@40 1594 # C2ge = np.cos(np.deg2rad(2*RotO - 2*RotC))
Volker@40 1595 S2e = np.sin(np.deg2rad(2 * RotC))
Volker@40 1596 C2e = np.cos(np.deg2rad(2 * RotC))
Volker@40 1597
Volker@40 1598 # AS with C before the receiver optics (see document rotated_diattenuator_X22x5deg.odt)
Volker@40 1599 AF1 = np.array([1, C2g * DiO, S2g * DiO, 0])
Volker@40 1600 AF2 = np.array([C2g * DiO, 1 - S2g ** 2 * WiO, S2g * C2g * WiO, -S2g * ZiO * SinO])
Volker@40 1601 AF3 = np.array([S2g * DiO, S2g * C2g * WiO, 1 - C2g ** 2 * WiO, C2g * ZiO * SinO])
Volker@40 1602 AF4 = np.array([0, S2g * SinO, -C2g * SinO, CosO])
Volker@40 1603
Volker@40 1604 ATF = (ATP1 * AF1 + ATP2 * AF2 + ATP3 * AF3 + ATP4 * AF4)
Volker@40 1605 ARF = (ARP1 * AF1 + ARP2 * AF2 + ARP3 * AF3 + ARP4 * AF4)
Volker@40 1606 ATF1 = ATF[0]
Volker@40 1607 ATF2 = ATF[1]
Volker@40 1608 ATF3 = ATF[2]
Volker@40 1609 ATF4 = ATF[3]
Volker@40 1610 ARF1 = ARF[0]
Volker@40 1611 ARF2 = ARF[1]
Volker@40 1612 ARF3 = ARF[2]
Volker@40 1613 ARF4 = ARF[3]
Volker@40 1614
Volker@40 1615 # rotated AinF by epsilon
Volker@40 1616 ATF2e = C2e * ATF[1] + S2e * ATF[2]
Volker@40 1617 ATF3e = C2e * ATF[2] - S2e * ATF[1]
Volker@40 1618 ARF2e = C2e * ARF[1] + S2e * ARF[2]
Volker@40 1619 ARF3e = C2e * ARF[2] - S2e * ARF[1]
Volker@40 1620
Volker@40 1621 ATFe = np.array([ATF1, ATF2e, ATF3e, ATF4])
Volker@40 1622 ARFe = np.array([ARF1, ARF2e, ARF3e, ARF4])
Volker@40 1623
Volker@40 1624 QinEe = C2e * QinE + S2e * UinE
Volker@40 1625 UinEe = C2e * UinE - S2e * QinE
Volker@40 1626
Volker@40 1627 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
Volker@40 1628 IinF = IinE
Volker@40 1629 QinF = aCal * QinE
Volker@40 1630 UinF = -aCal * UinE
Volker@40 1631 VinF = (1. - 2. * aCal) * VinE
Volker@40 1632
Volker@40 1633 IinFo = IinE
Volker@40 1634 QinFo = 0.
Volker@40 1635 UinFo = 0.
Volker@40 1636 VinFo = VinE
Volker@40 1637
Volker@40 1638 IinFa = 0.
Volker@40 1639 QinFa = QinE
Volker@40 1640 UinFa = -UinE
Volker@40 1641 VinFa = -2. * VinE
Volker@40 1642
Volker@40 1643 # Stokes Input Vector before receiver optics rotated by epsilon Eq. C.3
Volker@40 1644 QinFe = C2e * QinF + S2e * UinF
Volker@40 1645 UinFe = C2e * UinF - S2e * QinF
Volker@40 1646 QinFoe = C2e * QinFo + S2e * UinFo
Volker@40 1647 UinFoe = C2e * UinFo - S2e * QinFo
Volker@40 1648 QinFae = C2e * QinFa + S2e * UinFa
Volker@40 1649 UinFae = C2e * UinFa - S2e * QinFa
Volker@40 1650
Volker@40 1651 # Calibration signals and Calibration correction K from measurements with LDRCal / aCal
Volker@40 1652 if (TypeC == 2) or (TypeC == 1): # rotator calibration Eq. C.4
Volker@40 1653 AT = ATF1 * IinF + ATF4 * h * VinF
Volker@40 1654 BT = ATF3e * QinF - ATF2e * h * UinF
Volker@40 1655 AR = ARF1 * IinF + ARF4 * h * VinF
Volker@40 1656 BR = ARF3e * QinF - ARF2e * h * UinF
Volker@40 1657
Volker@40 1658 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 1659 if (not RotationErrorEpsilonForNormalMeasurements):
Volker@40 1660 GT = ATF1 * IinE + ATF4 * VinE
Volker@40 1661 GR = ARF1 * IinE + ARF4 * VinE
Volker@40 1662 HT = ATF2 * QinE - ATF3 * UinE - ATF4 * 2 * VinE
Volker@40 1663 HR = ARF2 * QinE - ARF3 * UinE - ARF4 * 2 * VinE
Volker@40 1664 else:
Volker@40 1665 GT = ATF1 * IinE + ATF4 * h * VinE
Volker@40 1666 GR = ARF1 * IinE + ARF4 * h * VinE
Volker@40 1667 HT = ATF2e * QinE - ATF3e * h * UinE - ATF4 * h * 2 * VinE
Volker@40 1668 HR = ARF2e * QinE - ARF3e * h * UinE - ARF4 * h * 2 * VinE
Volker@40 1669
Volker@40 1670 elif (TypeC == 3) or (TypeC == 4): # linear polariser calibration Eq. C.5
Volker@40 1671 # p = +45°, m = -45°
Volker@40 1672 IF1e = np.array([IinF, ZiC * CosC * QinFe, UinFe, ZiC * CosC * VinF])
Volker@40 1673 IF2e = np.array([DiC * UinFe, -ZiC * SinC * VinF, DiC * IinF, ZiC * SinC * QinFe])
Volker@40 1674
Volker@40 1675 AT = np.dot(ATFe, IF1e)
Volker@40 1676 AR = np.dot(ARFe, IF1e)
Volker@40 1677 BT = np.dot(ATFe, IF2e)
Volker@40 1678 BR = np.dot(ARFe, IF2e)
Volker@40 1679
Volker@40 1680 # Correction parameters for normal measurements; they are independent of LDR --- the same as for TypeC = 6
Volker@40 1681 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 1682 IS1 = np.array([IinE, 0, 0, VinE])
Volker@40 1683 IS2 = np.array([0, QinE, -UinE, -2 * VinE])
Volker@40 1684
Volker@40 1685 GT = np.dot(ATF, IS1)
Volker@40 1686 GR = np.dot(ARF, IS1)
Volker@40 1687 HT = np.dot(ATF, IS2)
Volker@40 1688 HR = np.dot(ARF, IS2)
Volker@40 1689 else:
Volker@40 1690 IS1e = np.array(
Volker@40 1691 [IinFo + DiC * QinFoe, DiC * IinFo + QinFoe, ZiC * (CosC * UinFoe + SinC * VinFo),
Volker@40 1692 -ZiC * (SinC * UinFoe - CosC * VinFo)])
Volker@40 1693 IS2e = np.array(
Volker@40 1694 [IinFa + DiC * QinFae, DiC * IinFa + QinFae, ZiC * (CosC * UinFae + SinC * VinFa),
Volker@40 1695 -ZiC * (SinC * UinFae - CosC * VinFa)])
Volker@40 1696 GT = np.dot(ATFe, IS1e)
Volker@40 1697 GR = np.dot(ARFe, IS1e)
Volker@40 1698 HT = np.dot(ATFe, IS2e)
Volker@40 1699 HR = np.dot(ARFe, IS2e)
Volker@40 1700
Volker@40 1701 elif (TypeC == 6): # diattenuator calibration +-22.5° rotated_diattenuator_X22x5deg.odt
Volker@40 1702 # p = +22.5°, m = -22.5°
Volker@40 1703 IF1e = np.array([IinF + sqr05 * DiC * QinFe, sqr05 * DiC * IinF + (1 - 0.5 * WiC) * QinFe,
Volker@40 1704 (1 - 0.5 * WiC) * UinFe + sqr05 * ZiC * SinC * VinF,
Volker@40 1705 -sqr05 * ZiC * SinC * UinFe + ZiC * CosC * VinF])
Volker@40 1706 IF2e = np.array([sqr05 * DiC * UinFe, 0.5 * WiC * UinFe - sqr05 * ZiC * SinC * VinF,
Volker@40 1707 sqr05 * DiC * IinF + 0.5 * WiC * QinFe, sqr05 * ZiC * SinC * QinFe])
Volker@40 1708
Volker@40 1709 AT = np.dot(ATFe, IF1e)
Volker@40 1710 AR = np.dot(ARFe, IF1e)
Volker@40 1711 BT = np.dot(ATFe, IF2e)
Volker@40 1712 BR = np.dot(ARFe, IF2e)
Volker@40 1713
Volker@40 1714 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 1715 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 1716 # IS1 = np.array([IinE,0,0,VinE])
Volker@40 1717 # IS2 = np.array([0,QinE,-UinE,-2*VinE])
Volker@40 1718 IS1 = np.array([IinFo, 0, 0, VinFo])
Volker@40 1719 IS2 = np.array([0, QinFa, UinFa, VinFa])
Volker@40 1720 GT = np.dot(ATF, IS1)
Volker@40 1721 GR = np.dot(ARF, IS1)
Volker@40 1722 HT = np.dot(ATF, IS2)
Volker@40 1723 HR = np.dot(ARF, IS2)
Volker@40 1724 else:
Volker@40 1725 # IS1e = np.array([IinE,DiC*IinE,ZiC*SinC*VinE,ZiC*CosC*VinE])
Volker@40 1726 # IS2e = np.array([DiC*QinEe,QinEe,-ZiC*(CosC*UinEe+2*SinC*VinE),ZiC*(SinC*UinEe-2*CosC*VinE)])
Volker@40 1727 IS1e = np.array(
Volker@40 1728 [IinFo + DiC * QinFoe, DiC * IinFo + QinFoe, ZiC * (CosC * UinFoe + SinC * VinFo),
Volker@40 1729 -ZiC * (SinC * UinFoe - CosC * VinFo)])
Volker@40 1730 IS2e = np.array(
Volker@40 1731 [IinFa + DiC * QinFae, DiC * IinFa + QinFae, ZiC * (CosC * UinFae + SinC * VinFa),
Volker@40 1732 -ZiC * (SinC * UinFae - CosC * VinFa)])
Volker@40 1733 GT = np.dot(ATFe, IS1e)
Volker@40 1734 GR = np.dot(ARFe, IS1e)
Volker@40 1735 HT = np.dot(ATFe, IS2e)
Volker@40 1736 HR = np.dot(ARFe, IS2e)
Volker@40 1737
Volker@40 1738
Volker@40 1739 else:
Volker@40 1740 print('Calibrator not implemented yet')
Volker@40 1741 sys.exit()
Volker@40 1742
Volker@40 1743 elif LocC == 2: # C behind emitter optics Eq.57
Volker@40 1744 # print("Calibrator location not implemented yet")
Volker@40 1745 S2e = np.sin(np.deg2rad(2 * RotC))
Volker@40 1746 C2e = np.cos(np.deg2rad(2 * RotC))
Volker@40 1747
Volker@40 1748 # AS with C before the receiver optics (see document rotated_diattenuator_X22x5deg.odt)
Volker@40 1749 AF1 = np.array([1, C2g * DiO, S2g * DiO, 0])
Volker@40 1750 AF2 = np.array([C2g * DiO, 1 - S2g ** 2 * WiO, S2g * C2g * WiO, -S2g * ZiO * SinO])
Volker@40 1751 AF3 = np.array([S2g * DiO, S2g * C2g * WiO, 1 - C2g ** 2 * WiO, C2g * ZiO * SinO])
Volker@40 1752 AF4 = np.array([0, S2g * SinO, -C2g * SinO, CosO])
Volker@40 1753
Volker@40 1754 ATF = (ATP1 * AF1 + ATP2 * AF2 + ATP3 * AF3 + ATP4 * AF4)
Volker@40 1755 ARF = (ARP1 * AF1 + ARP2 * AF2 + ARP3 * AF3 + ARP4 * AF4)
Volker@40 1756 ATF1 = ATF[0]
Volker@40 1757 ATF2 = ATF[1]
Volker@40 1758 ATF3 = ATF[2]
Volker@40 1759 ATF4 = ATF[3]
Volker@40 1760 ARF1 = ARF[0]
Volker@40 1761 ARF2 = ARF[1]
Volker@40 1762 ARF3 = ARF[2]
Volker@40 1763 ARF4 = ARF[3]
Volker@40 1764
Volker@40 1765 # AS with C behind the emitter --------------------------------------------
Volker@40 1766 # terms without aCal
Volker@40 1767 ATE1o, ARE1o = ATF1, ARF1
Volker@40 1768 ATE2o, ARE2o = 0., 0.
Volker@40 1769 ATE3o, ARE3o = 0., 0.
Volker@40 1770 ATE4o, ARE4o = ATF4, ARF4
Volker@40 1771 # terms with aCal
Volker@40 1772 ATE1a, ARE1a = 0., 0.
Volker@40 1773 ATE2a, ARE2a = ATF2, ARF2
Volker@40 1774 ATE3a, ARE3a = -ATF3, -ARF3
Volker@40 1775 ATE4a, ARE4a = -2 * ATF4, -2 * ARF4
Volker@40 1776 # rotated AinEa by epsilon
Volker@40 1777 ATE2ae = C2e * ATF2 + S2e * ATF3
Volker@40 1778 ATE3ae = -S2e * ATF2 - C2e * ATF3
Volker@40 1779 ARE2ae = C2e * ARF2 + S2e * ARF3
Volker@40 1780 ARE3ae = -S2e * ARF2 - C2e * ARF3
Volker@40 1781
Volker@40 1782 ATE1 = ATE1o
Volker@40 1783 ATE2e = aCal * ATE2ae
Volker@40 1784 ATE3e = aCal * ATE3ae
Volker@40 1785 ATE4 = (1 - 2 * aCal) * ATF4
Volker@40 1786 ARE1 = ARE1o
Volker@40 1787 ARE2e = aCal * ARE2ae
Volker@40 1788 ARE3e = aCal * ARE3ae
Volker@40 1789 ARE4 = (1. - 2. * aCal) * ARF4
Volker@40 1790
Volker@40 1791 # rotated IinE
Volker@40 1792 QinEe = C2e * QinE + S2e * UinE
Volker@40 1793 UinEe = C2e * UinE - S2e * QinE
Volker@40 1794
Volker@40 1795 # --- Calibration signals and Calibration correction K from measurements with LDRCal / aCal
Volker@40 1796 if (TypeC == 2) or (TypeC == 1): # +++++++++ rotator calibration Eq. C.4
Volker@40 1797 AT = ATE1o * IinE + (ATE4o + aCal * ATE4a) * h * VinE
Volker@40 1798 BT = aCal * (ATE3ae * QinEe - ATE2ae * h * UinEe)
Volker@40 1799 AR = ARE1o * IinE + (ARE4o + aCal * ARE4a) * h * VinE
Volker@40 1800 BR = aCal * (ARE3ae * QinEe - ARE2ae * h * UinEe)
Volker@40 1801
Volker@40 1802 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 1803 if (not RotationErrorEpsilonForNormalMeasurements):
Volker@40 1804 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
Volker@40 1805 GT = ATE1o * IinE + ATE4o * h * VinE
Volker@40 1806 GR = ARE1o * IinE + ARE4o * h * VinE
Volker@40 1807 HT = ATE2a * QinE + ATE3a * h * UinEe + ATE4a * h * VinE
Volker@40 1808 HR = ARE2a * QinE + ARE3a * h * UinEe + ARE4a * h * VinE
Volker@40 1809 else:
Volker@40 1810 GT = ATE1o * IinE + ATE4o * h * VinE
Volker@40 1811 GR = ARE1o * IinE + ARE4o * h * VinE
Volker@40 1812 HT = ATE2ae * QinE + ATE3ae * h * UinEe + ATE4a * h * VinE
Volker@40 1813 HR = ARE2ae * QinE + ARE3ae * h * UinEe + ARE4a * h * VinE
Volker@40 1814
Volker@40 1815 elif (TypeC == 3) or (TypeC == 4): # +++++++++ linear polariser calibration Eq. C.5
Volker@40 1816 # p = +45°, m = -45°
Volker@40 1817 AT = ATE1 * IinE + ZiC * CosC * (ATE2e * QinEe + ATE4 * VinE) + ATE3e * UinEe
Volker@40 1818 BT = DiC * (ATE1 * UinEe + ATE3e * IinE) + ZiC * SinC * (ATE4 * QinEe - ATE2e * VinE)
Volker@40 1819 AR = ARE1 * IinE + ZiC * CosC * (ARE2e * QinEe + ARE4 * VinE) + ARE3e * UinEe
Volker@40 1820 BR = DiC * (ARE1 * UinEe + ARE3e * IinE) + ZiC * SinC * (ARE4 * QinEe - ARE2e * VinE)
Volker@40 1821
Volker@40 1822 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 1823 if (not RotationErrorEpsilonForNormalMeasurements):
Volker@40 1824 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
Volker@40 1825 GT = ATE1o * IinE + ATE4o * VinE
Volker@40 1826 GR = ARE1o * IinE + ARE4o * VinE
Volker@40 1827 HT = ATE2a * QinE + ATE3a * UinE + ATE4a * VinE
Volker@40 1828 HR = ARE2a * QinE + ARE3a * UinE + ARE4a * VinE
Volker@40 1829 else:
Volker@40 1830 D = IinE + DiC * QinEe
Volker@40 1831 A = DiC * IinE + QinEe
Volker@40 1832 B = ZiC * (CosC * UinEe + SinC * VinE)
Volker@40 1833 C = -ZiC * (SinC * UinEe - CosC * VinE)
Volker@40 1834 GT = ATE1o * D + ATE4o * C
Volker@40 1835 GR = ARE1o * D + ARE4o * C
Volker@40 1836 HT = ATE2a * A + ATE3a * B + ATE4a * C
Volker@40 1837 HR = ARE2a * A + ARE3a * B + ARE4a * C
Volker@40 1838
Volker@40 1839 elif (TypeC == 6): # real HWP calibration +-22.5° rotated_diattenuator_X22x5deg.odt
Volker@40 1840 # p = +22.5°, m = -22.5°
Volker@40 1841 IE1e = np.array([IinE + sqr05 * DiC * QinEe, sqr05 * DiC * IinE + (1 - 0.5 * WiC) * QinEe,
Volker@40 1842 (1. - 0.5 * WiC) * UinEe + sqr05 * ZiC * SinC * VinE,
Volker@40 1843 -sqr05 * ZiC * SinC * UinEe + ZiC * CosC * VinE])
Volker@40 1844 IE2e = np.array([sqr05 * DiC * UinEe, 0.5 * WiC * UinEe - sqr05 * ZiC * SinC * VinE,
Volker@40 1845 sqr05 * DiC * IinE + 0.5 * WiC * QinEe, sqr05 * ZiC * SinC * QinEe])
Volker@40 1846 ATEe = np.array([ATE1, ATE2e, ATE3e, ATE4])
Volker@40 1847 AREe = np.array([ARE1, ARE2e, ARE3e, ARE4])
Volker@40 1848 AT = np.dot(ATEe, IE1e)
Volker@40 1849 AR = np.dot(AREe, IE1e)
Volker@40 1850 BT = np.dot(ATEe, IE2e)
Volker@40 1851 BR = np.dot(AREe, IE2e)
Volker@40 1852
Volker@40 1853 # Correction parameters for normal measurements; they are independent of LDR
Volker@40 1854 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
Volker@40 1855 GT = ATE1o * IinE + ATE4o * VinE
Volker@40 1856 GR = ARE1o * IinE + ARE4o * VinE
Volker@40 1857 HT = ATE2a * QinE + ATE3a * UinE + ATE4a * VinE
Volker@40 1858 HR = ARE2a * QinE + ARE3a * UinE + ARE4a * VinE
Volker@40 1859 else:
Volker@40 1860 D = IinE + DiC * QinEe
Volker@40 1861 A = DiC * IinE + QinEe
Volker@40 1862 B = ZiC * (CosC * UinEe + SinC * VinE)
Volker@40 1863 C = -ZiC * (SinC * UinEe - CosC * VinE)
Volker@40 1864 GT = ATE1o * D + ATE4o * C
Volker@40 1865 GR = ARE1o * D + ARE4o * C
Volker@40 1866 HT = ATE2a * A + ATE3a * B + ATE4a * C
Volker@40 1867 HR = ARE2a * A + ARE3a * B + ARE4a * C
Volker@40 1868 else:
Volker@40 1869 print('Calibrator not implemented yet')
Volker@40 1870 sys.exit()
Volker@40 1871
Volker@40 1872 for iTCalT, iTCalR, iNCalTp, iNCalTm, iNCalRp, iNCalRm, iNIt, iNIr \
Volker@40 1873 in [
Volker@40 1874 (iTCalT, iTCalR, iNCalTp, iNCalTm, iNCalRp, iNCalRm, iNIt, iNIr)
Volker@40 1875 for iTCalT in range(-nTCalT, nTCalT + 1) # Etax
Volker@40 1876 for iTCalR in range(-nTCalR, nTCalR + 1) # Etax
Volker@40 1877 for iNCalTp in range(-nNCal, nNCal + 1) # noise error of calibration signals => Etax
Volker@40 1878 for iNCalTm in range(-nNCal, nNCal + 1) # noise error of calibration signals => Etax
Volker@40 1879 for iNCalRp in range(-nNCal, nNCal + 1) # noise error of calibration signals => Etax
Volker@40 1880 for iNCalRm in range(-nNCal, nNCal + 1) # noise error of calibration signals => Etax
Volker@40 1881 for iNIt in range(-nNI, nNI + 1)
Volker@40 1882 for iNIr in range(-nNI, nNI + 1)]:
Volker@40 1883
Volker@40 1884 # Calibration signals with aCal => Determination of the correction K of the real calibration factor
Volker@40 1885 IoutTp = TTa * TiC * TiO * TiE * (AT + BT)
Volker@40 1886 IoutTm = TTa * TiC * TiO * TiE * (AT - BT)
Volker@40 1887 IoutRp = TRa * TiC * TiO * TiE * (AR + BR)
Volker@40 1888 IoutRm = TRa * TiC * TiO * TiE * (AR - BR)
Volker@40 1889
Volker@40 1890 if nTCalT > 0: TCalT = TCalT0 + iTCalT * dTCalT / nTCalT
Volker@40 1891 if nTCalR > 0: TCalR = TCalR0 + iTCalR * dTCalR / nTCalR
Volker@40 1892 # signal noise errors
Volker@40 1893 # ----- random error calculation ----------
Volker@40 1894 # noise must be calculated from/with the actually measured signals; influence of TCalT, TCalR errors on noise are not considered ?
Volker@40 1895 # actually measured signal counts are in input file and don't change
Volker@40 1896 # relative standard deviation of calibration signals with LDRcal; assumed to be statisitcally independent
Volker@40 1897 # error nNCal: one-sigma in steps to left and right for calibration signals
Volker@40 1898 if nNCal > 0:
Volker@40 1899 if (CalcFrom0deg):
Volker@40 1900 dIoutTp = (NCalT * IoutTp) ** -0.5
Volker@40 1901 dIoutTm = (NCalT * IoutTm) ** -0.5
Volker@40 1902 dIoutRp = (NCalR * IoutRp) ** -0.5
Volker@40 1903 dIoutRm = (NCalR * IoutRm) ** -0.5
Volker@40 1904 else:
Volker@40 1905 dIoutTp = dIoutTp0 * (IoutTp / IoutTp0)
Volker@40 1906 dIoutTm = dIoutTm0 * (IoutTm / IoutTm0)
Volker@40 1907 dIoutRp = dIoutRp0 * (IoutRp / IoutRp0)
Volker@40 1908 dIoutRm = dIoutRm0 * (IoutRm / IoutRm0)
Volker@40 1909 # print(iTCalT, iTCalR, iNCalTp, iNCalTm, iNCalRp, iNCalRm, iNIt, iNIr, IoutTp, dIoutTp)
Volker@40 1910 IoutTp = IoutTp * (1. + iNCalTp * dIoutTp / nNCal)
Volker@40 1911 IoutTm = IoutTm * (1. + iNCalTm * dIoutTm / nNCal)
Volker@40 1912 IoutRp = IoutRp * (1. + iNCalRp * dIoutRp / nNCal)
Volker@40 1913 IoutRm = IoutRm * (1. + iNCalRm * dIoutRm / nNCal)
Volker@40 1914
Volker@40 1915 IoutTp = IoutTp * TCalT / TCalT0
Volker@40 1916 IoutTm = IoutTm * TCalT / TCalT0
Volker@40 1917 IoutRp = IoutRp * TCalR / TCalR0
Volker@40 1918 IoutRm = IoutRm * TCalR / TCalR0
Volker@40 1919 # --- Results and Corrections; electronic etaR and etaT are assumed to be 1 for true and assumed true systems
Volker@40 1920 # calibration factor
Volker@40 1921 Eta = (TRa / TTa) # = TRa / TTa; Eta = Eta*/K Eq. 84; corrected according to the papers supplement Eqs. (S.10.10.1) ff
Volker@40 1922 # possibly real calibration factor
Volker@40 1923 Etapx = IoutRp / IoutTp
Volker@40 1924 Etamx = IoutRm / IoutTm
Volker@40 1925 Etax = (Etapx * Etamx) ** 0.5
Volker@40 1926 K = Etax / Eta
Volker@40 1927 # print("{0:6.3f},{1:6.3f},{2:6.3f},{3:6.3f},{4:6.3f},{5:6.3f},{6:6.3f},{7:6.3f},{8:6.3f},{9:6.3f},{10:6.3f}".format(AT, BT, AR, BR, DiC, ZiC, RetO, TP, TS, Kp, Km))
Volker@40 1928 # print("{0:6.3f},{1:6.3f},{2:6.3f},{3:6.3f}".format(DiC, ZiC, Kp, Km))
Volker@40 1929
Volker@40 1930 # For comparison with Volkers Libreoffice Müller Matrix spreadsheet
Volker@40 1931 # Eta_test_p = (IoutRp/IoutTp)
Volker@40 1932 # Eta_test_m = (IoutRm/IoutTm)
Volker@40 1933 # Eta_test = (Eta_test_p*Eta_test_m)**0.5
Volker@40 1934 '''
Volker@40 1935 for iIt, iIr \
Volker@40 1936 in [(iIt, iIr)
Volker@40 1937 for iIt in range(-nNI, nNI + 1)
Volker@40 1938 for iIr in range(-nNI, nNI + 1)]:
Volker@40 1939 '''
Volker@40 1940
Volker@40 1941 iN = iN + 1
Volker@40 1942 if (iN == 10001):
Volker@40 1943 ctime = clock()
Volker@40 1944 print(" estimated time ", "{0:4.2f}".format(N / 10000 * (ctime - atime)), "sec ") # , end="")
Volker@40 1945 print("\r elapsed time ", "{0:5.0f}".format((ctime - atime)), "sec ", end="\r")
Volker@40 1946 ctime = clock()
Volker@40 1947 if ((ctime - dtime) > 10):
Volker@40 1948 print("\r elapsed time ", "{0:5.0f}".format((ctime - atime)), "sec ", end="\r")
Volker@40 1949 dtime = ctime
Volker@40 1950
Volker@40 1951 # *** loop for different real LDRs **********************************************************************
Volker@40 1952 iLDR = -1
Volker@40 1953 for LDRTrue in LDRrange:
Volker@40 1954 iLDR = iLDR + 1
Volker@40 1955 atrue = (1. - LDRTrue) / (1. + LDRTrue)
Volker@40 1956 # ----- Forward simulated signals and LDRsim with atrue; from input file; not considering TiC.
Volker@40 1957 It = TTa * TiO * TiE * (GT + atrue * HT) # TaT*TiT*TiC*TiO*IinL*(GT+atrue*HT)
Volker@40 1958 Ir = TRa * TiO * TiE * (GR + atrue * HR) # TaR*TiR*TiC*TiO*IinL*(GR+atrue*HR)
Volker@40 1959 # # signal noise errors; standard deviation of signals; assumed to be statisitcally independent
Volker@40 1960 # because the signals depend on LDRtrue, the errors dIt and dIr must be calculated for each LDRtrue
Volker@40 1961 if (CalcFrom0deg):
Volker@40 1962 '''
Volker@40 1963 dIt = ((NCalT * It / IoutTp * NILfac / TCalT) ** -0.5)
Volker@40 1964 dIr = ((NCalR * Ir / IoutRp * NILfac / TCalR) ** -0.5)
Volker@40 1965 '''
Volker@40 1966 dIt = ((It * NI * eFacT) ** -0.5)
Volker@40 1967 dIr = ((Ir * NI * eFacR) ** -0.5)
Volker@40 1968 else:
Volker@40 1969 dIt = ((It * NI * eFacT) ** -0.5)
Volker@40 1970 dIr = ((Ir * NI * eFacR) ** -0.5)
Volker@40 1971 '''
Volker@40 1972 # does this work? Why not as above?
Volker@40 1973 dIt = ((NCalT * 2. * NILfac / TCalT ) ** -0.5)
Volker@40 1974 dIr = ((NCalR * 2. * NILfac / TCalR) ** -0.5)
Volker@40 1975 '''
Volker@40 1976 # error nNI: one-sigma in steps to left and right for 0° signals
Volker@40 1977 if nNI > 0:
Volker@40 1978 It = It * (1. + iNIt * dIt / nNI)
Volker@40 1979 Ir = Ir * (1. + iNIr * dIr / nNI)
Volker@40 1980
Volker@40 1981 # LDRsim = 1/Eta*Ir/It # simulated LDR* with Y from input file
Volker@40 1982 LDRsim = Ir / It # simulated uncorrected LDR with Y from input file
Volker@40 1983
Volker@40 1984 # ----- Backward correction
Volker@40 1985 # Corrected LDRCorr with assumed true G0,H0,K0,Eta0 from forward simulated (real) LDRsim(atrue)
Volker@40 1986 LDRCorr = (LDRsim / (Etax / K0) * (GT0 + HT0) - (GR0 + HR0)) / ((GR0 - HR0) - LDRsim / (Etax / K0) * (GT0 - HT0))
Volker@40 1987
Volker@40 1988 # The following is a test whether the equations for calibration Etax and normal signal (GHK, LDRsim) are consistent
Volker@40 1989 # LDRCorr = (LDRsim / Eta * (GT + HT) - (GR + HR)) / ((GR - HR) - LDRsim / Eta * (GT - HT))
Volker@40 1990 # Without any correction
Volker@40 1991 LDRunCorr = LDRsim / Etax
Volker@40 1992 # LDRunCorr = (LDRsim / Etax * (GT / abs(GT) + HT / abs(HT)) - (GR / abs(GR) + HR / abs(HR))) / ((GR / abs(GR) - HR / abs(HR)) - LDRsim / Etax * (GT / abs(GT) - HT / abs(HT)))
Volker@40 1993
Volker@40 1994
Volker@40 1995 '''
Volker@40 1996 # -- F11corr from It and Ir and calibration EtaX
Volker@40 1997 Text1 = "!!! EXPERIMENTAL !!! F11corr from It and Ir with calibration EtaX: x-axis: F11corr(LDRtrue) / F11corr(LDRtrue = 0.004) - 1"
Volker@40 1998 F11corr = 1 / (TiO * TiE) * (
Volker@40 1999 (HR0 * Etax / K0 * It / TTa - HT0 * Ir / TRa) / (HR0 * GT0 - HT0 * GR0)) # IL = 1 Eq.(64); Etax/K0 = Eta0.
Volker@40 2000 '''
Volker@40 2001 # Corrected F11corr with assumed true G0,H0,K0 from forward simulated (real) It and Ir (atrue)
Volker@40 2002 Text1 = "!!! EXPERIMENTAL !!! F11corr from real It and Ir with real calibration EtaX: x-axis: F11corr(LDRtrue) / aF11sim0(LDRtrue) - 1"
Volker@40 2003 F11corr = 1 / (TiO * TiE) * (
Volker@40 2004 (HR0 * Etax / K0 * It / TTa - HT0 * Ir / TRa) / (HR0 * GT0 - HT0 * GR0)) # IL = 1 Eq.(64); Etax/K0 = Eta0.
Volker@40 2005
Volker@40 2006 # Text1 = "F11corr from It and Ir without corrections but with calibration EtaX: x-axis: F11corr(LDRtrue) devided by F11corr(LDRtrue = 0.004)"
Volker@40 2007 # F11corr = 0.5/(TiO*TiE)*(Etax*It/TTa+Ir/TRa) # IL = 1 Eq.(64)
Volker@40 2008
Volker@40 2009 # -- It from It only with atrue without corrections - for BERTHA (and PollyXTs)
Volker@40 2010 # Text1 = " x-axis: IT(LDRtrue) / IT(LDRtrue = 0.004) - 1"
Volker@40 2011 # F11corr = It/(TaT*TiT*TiO*TiE) #/(TaT*TiT*TiO*TiE*(GT0+atrue*HT0))
Volker@40 2012 # ! see below line 1673ff
Volker@40 2013
Volker@40 2014 aF11corr[iLDR, iN] = F11corr
Volker@40 2015 aLDRcorr[iLDR, iN] = LDRCorr # LDRCorr # LDRsim # for test only
Volker@40 2016 aLDRsim[iLDR, iN] = LDRsim # LDRCorr # LDRsim # for test only
Volker@40 2017 # aPLDR[iLDR, iN] = CalcPLDR(LDRCorr, BSR[iLDR], LDRm0)
Volker@40 2018 aEtax[iLDR, iN] = Etax
Volker@40 2019 aEtapx[iLDR, iN] = Etapx
Volker@40 2020 aEtamx[iLDR, iN] = Etamx
Volker@40 2021
Volker@40 2022 aGHK[0, iN] = GR
Volker@40 2023 aGHK[1, iN] = GT
Volker@40 2024 aGHK[2, iN] = HR
Volker@40 2025 aGHK[3, iN] = HT
Volker@40 2026 aGHK[4, iN] = K
Volker@40 2027
Volker@40 2028 aLDRCal[iN] = iLDRCal
Volker@40 2029 aQin[iN] = iQin
Volker@40 2030 aVin[iN] = iVin
Volker@40 2031 aERaT[iN] = iERaT
Volker@40 2032 aERaR[iN] = iERaR
Volker@40 2033 aRotaT[iN] = iRotaT
Volker@40 2034 aRotaR[iN] = iRotaR
Volker@40 2035 aRetT[iN] = iRetT
Volker@40 2036 aRetR[iN] = iRetR
Volker@40 2037
Volker@40 2038 aRotL[iN] = iRotL
Volker@40 2039 aRotE[iN] = iRotE
Volker@40 2040 aRetE[iN] = iRetE
Volker@40 2041 aRotO[iN] = iRotO
Volker@40 2042 aRetO[iN] = iRetO
Volker@40 2043 aRotC[iN] = iRotC
Volker@40 2044 aRetC[iN] = iRetC
Volker@40 2045 aDiO[iN] = iDiO
Volker@40 2046 aDiE[iN] = iDiE
Volker@40 2047 aDiC[iN] = iDiC
Volker@40 2048 aTP[iN] = iTP
Volker@40 2049 aTS[iN] = iTS
Volker@40 2050 aRP[iN] = iRP
Volker@40 2051 aRS[iN] = iRS
Volker@40 2052 aTCalT[iN] = iTCalT
Volker@40 2053 aTCalR[iN] = iTCalR
Volker@40 2054
Volker@40 2055 aNCalTp[iN] = iNCalTp # IoutTp, IoutTm, IoutRp, IoutRm => Etax
Volker@40 2056 aNCalTm[iN] = iNCalTm # IoutTp, IoutTm, IoutRp, IoutRm => Etax
Volker@40 2057 aNCalRp[iN] = iNCalRp # IoutTp, IoutTm, IoutRp, IoutRm => Etax
Volker@40 2058 aNCalRm[iN] = iNCalRm # IoutTp, IoutTm, IoutRp, IoutRm => Etax
Volker@40 2059 aNIt[iN] = iNIt # It, Tr
Volker@40 2060 aNIr[iN] = iNIr # It, Tr
Volker@40 2061
Volker@40 2062 # --- END loop
Volker@40 2063 btime = clock()
Volker@40 2064 # print("\r done in ", "{0:5.0f}".format(btime - atime), "sec. => producing plots now .... some more seconds ..."), # , end="\r");
Volker@40 2065 print(" done in ", "{0:5.0f}".format(btime - atime), "sec. => producing plots now .... some more seconds ...")
Volker@40 2066 # --- Plot -----------------------------------------------------------------
Volker@40 2067 print("Errors from GHK correction uncertainties:")
Volker@40 2068 if (sns_loaded):
Volker@40 2069 sns.set_style("whitegrid")
Volker@40 2070 sns.set_palette("bright6", 6)
Volker@40 2071 # for older seaborn versions use:
Volker@40 2072 # sns.set_palette("bright", 6)
Volker@40 2073
Volker@40 2074 '''
Volker@40 2075 fig2 = plt.figure()
Volker@40 2076 plt.plot(aLDRcorr[2,:],'b.')
Volker@40 2077 plt.plot(aLDRcorr[3,:],'r.')
Volker@40 2078 plt.plot(aLDRcorr[4,:],'g.')
Volker@40 2079 #plt.plot(aLDRcorr[6,:],'c.')
Volker@40 2080 plt.show
Volker@40 2081 '''
Volker@40 2082
Volker@40 2083 # Plot LDR
Volker@40 2084 def PlotSubHist(aVar, aX, X0, daX, iaX, naX):
Volker@40 2085 # aVar is the name of the parameter and aX is the subset of aLDRcorr which is coloured in the plot
Volker@40 2086 # example: PlotSubHist("DOLP", aDOLP, DOLP0, dDOLP, iDOLP, nDOLP)
Volker@40 2087 fig, ax = plt.subplots(nrows=1, ncols=5, sharex=True, sharey=True, figsize=(25, 2))
Volker@40 2088 iLDR = -1
Volker@40 2089 for LDRTrue in LDRrange:
Volker@40 2090 aXmean = np.zeros(2 * naX + 1)
Volker@40 2091 iLDR = iLDR + 1
Volker@40 2092 LDRmin[iLDR] = np.amin(aLDRcorr[iLDR, :])
Volker@40 2093 LDRmax[iLDR] = np.amax(aLDRcorr[iLDR, :])
Volker@40 2094 if (LDRmax[iLDR] > 10): LDRmax[iLDR] = 10
Volker@40 2095 if (LDRmin[iLDR] < -10): LDRmin[iLDR] = -10
Volker@40 2096 Rmin = LDRmin[iLDR] * 0.995 # np.min(aLDRcorr[iLDR,:]) * 0.995
Volker@40 2097 Rmax = LDRmax[iLDR] * 1.005 # np.max(aLDRcorr[iLDR,:]) * 1.005
Volker@40 2098
Volker@40 2099 # Determine mean distance of all aXmean from each other for each iLDR
Volker@40 2100 meanDist = 0.0
Volker@40 2101 for iaX in range(-naX, naX + 1):
Volker@40 2102 # mean LDRCorr value for certain error (iaX) of parameter aVar
Volker@40 2103 aXmean[iaX + naX] = np.mean(aLDRcorr[iLDR, aX == iaX])
Volker@40 2104 # relative to absolute spread of LDRCorrs
Volker@40 2105 meanDist = (np.max(aXmean) - np.min(aXmean)) / (LDRmax[iLDR] - LDRmin[iLDR]) * 100
Volker@40 2106
Volker@40 2107 plt.subplot(1, 5, iLDR + 1)
Volker@40 2108 (n, bins, patches) = plt.hist(aLDRcorr[iLDR, :],
Volker@40 2109 bins=100, log=False,
Volker@40 2110 range=[Rmin, Rmax],
Volker@40 2111 alpha=0.5, density=False, color='0.5', histtype='stepfilled')
Volker@40 2112
Volker@40 2113 for iaX in range(-naX, naX + 1):
Volker@40 2114 # mean LDRCorr value for certain error (iaX) of parameter aVar
Volker@40 2115 plt.hist(aLDRcorr[iLDR, aX == iaX],
Volker@40 2116 range=[Rmin, Rmax],
Volker@40 2117 bins=100, log=False, alpha=0.3, density=False, histtype='stepfilled',
Volker@40 2118 label=str(round(X0 + iaX * daX / naX, 5)))
Volker@40 2119
Volker@40 2120 if (iLDR == 2):
Volker@40 2121 leg = plt.legend()
Volker@40 2122 leg.get_frame().set_alpha(0.1)
Volker@40 2123
Volker@40 2124 plt.tick_params(axis='both', labelsize=10)
Volker@40 2125 plt.plot([LDRTrue, LDRTrue], [0, np.max(n)], 'r-', lw=2)
Volker@40 2126 plt.gca().set_title("{0:3.0f}%".format(meanDist))
Volker@40 2127 plt.gca().set_xlabel('LDRtrue', color="red")
Volker@40 2128
Volker@40 2129 # plt.ylabel('frequency', fontsize=10)
Volker@40 2130 # plt.xlabel('LDRCorr', fontsize=10)
Volker@40 2131 # fig.tight_layout()
Volker@40 2132 fig.suptitle(LID + ' with ' + str(Type[TypeC]) + ' ' + str(Loc[LocC]) + ' - ' + aVar + ' error contribution', fontsize=14, y=1.10)
Volker@40 2133 # plt.show()
Volker@40 2134 # fig.savefig(LID + '_' + aVar + '.png', dpi=150, bbox_inches='tight', pad_inches=0)
Volker@40 2135 # plt.close
Volker@40 2136 return
Volker@40 2137
Volker@40 2138 def PlotLDRsim(aVar, aX, X0, daX, iaX, naX):
Volker@40 2139 # aVar is the name of the parameter and aX is the subset of aLDRsim which is coloured in the plot
Volker@40 2140 # example: PlotSubHist("DOLP", aDOLP, DOLP0, dDOLP, iDOLP, nDOLP)
Volker@40 2141 fig, ax = plt.subplots(nrows=1, ncols=5, sharex=True, sharey=True, figsize=(25, 2))
Volker@40 2142 iLDR = -1
Volker@40 2143 for LDRTrue in LDRrange:
Volker@40 2144 aXmean = np.zeros(2 * naX + 1)
Volker@40 2145 iLDR = iLDR + 1
Volker@40 2146 LDRsimmin[iLDR] = np.amin(aLDRsim[iLDR, :])
Volker@40 2147 LDRsimmax[iLDR] = np.amax(aLDRsim[iLDR, :])
Volker@40 2148 # print("LDRsimmin[iLDR], LDRsimmax[iLDR] = ", LDRsimmin[iLDR], LDRsimmax[iLDR])
Volker@40 2149 # if (LDRsimmax[iLDR] > 10): LDRsimmax[iLDR] = 10
Volker@40 2150 # if (LDRsimmin[iLDR] < -10): LDRsimmin[iLDR] = -10
Volker@40 2151 Rmin = LDRsimmin[iLDR] * 0.995 # np.min(aLDRsim[iLDR,:]) * 0.995
Volker@40 2152 Rmax = LDRsimmax[iLDR] * 1.005 # np.max(aLDRsim[iLDR,:]) * 1.005
Volker@40 2153 # print("Rmin, Rmax = ", Rmin, Rmax)
Volker@40 2154
Volker@40 2155 # Determine mean distance of all aXmean from each other for each iLDR
Volker@40 2156 meanDist = 0.0
Volker@40 2157 for iaX in range(-naX, naX + 1):
Volker@40 2158 # mean LDRCorr value for certain error (iaX) of parameter aVar
Volker@40 2159 aXmean[iaX + naX] = np.mean(aLDRsim[iLDR, aX == iaX])
Volker@40 2160 # relative to absolute spread of LDRCorrs
Volker@40 2161 meanDist = (np.max(aXmean) - np.min(aXmean)) / (LDRsimmax[iLDR] - LDRsimmin[iLDR]) * 100
Volker@40 2162
Volker@40 2163 plt.subplot(1, 5, iLDR + 1)
Volker@40 2164 (n, bins, patches) = plt.hist(aLDRsim[iLDR, :],
Volker@40 2165 bins=100, log=False,
Volker@40 2166 range=[Rmin, Rmax],
Volker@40 2167 alpha=0.5, density=False, color='0.5', histtype='stepfilled')
Volker@40 2168
Volker@40 2169 for iaX in range(-naX, naX + 1):
Volker@40 2170 # mean LDRCorr value for certain error (iaX) of parameter aVar
Volker@40 2171 plt.hist(aLDRsim[iLDR, aX == iaX],
Volker@40 2172 range=[Rmin, Rmax],
Volker@40 2173 bins=100, log=False, alpha=0.3, density=False, histtype='stepfilled',
Volker@40 2174 label=str(round(X0 + iaX * daX / naX, 5)))
Volker@40 2175
Volker@40 2176 if (iLDR == 2):
Volker@40 2177 leg = plt.legend()
Volker@40 2178 leg.get_frame().set_alpha(0.1)
Volker@40 2179
Volker@40 2180 plt.tick_params(axis='both', labelsize=10)
Volker@40 2181 plt.plot([LDRsim0[iLDR], LDRsim0[iLDR]], [0, np.max(n)], 'r-', lw=2)
Volker@40 2182 plt.gca().set_title("{0:3.0f}%".format(meanDist))
Volker@40 2183 plt.gca().set_xlabel('LDRsim0', color="red")
Volker@40 2184
Volker@40 2185 fig.suptitle('LDRsim - ' +LID + ' with ' + str(Type[TypeC]) + ' ' + str(Loc[LocC]) + ' - ' + aVar + ' error contribution', fontsize=14, y=1.10)
Volker@40 2186 return
Volker@40 2187
Volker@40 2188
Volker@40 2189 # Plot Etax
Volker@40 2190 def PlotEtax(aVar, aX, X0, daX, iaX, naX):
Volker@40 2191 # aVar is the name of the parameter and aX is the subset of aLDRcorr which is coloured in the plot
Volker@40 2192 # example: PlotSubHist("DOLP", aDOLP, DOLP0, dDOLP, iDOLP, nDOLP)
Volker@40 2193 fig, ax = plt.subplots(nrows=1, ncols=5, sharex=True, sharey=True, figsize=(25, 2))
Volker@40 2194 iLDR = -1
Volker@40 2195 for LDRTrue in LDRrange:
Volker@40 2196 aXmean = np.zeros(2 * naX + 1)
Volker@40 2197 iLDR = iLDR + 1
Volker@40 2198 Etaxmin = np.amin(aEtax[iLDR, :])
Volker@40 2199 Etaxmax = np.amax(aEtax[iLDR, :])
Volker@40 2200 Rmin = Etaxmin * 0.995 # np.min(aLDRcorr[iLDR,:]) * 0.995
Volker@40 2201 Rmax = Etaxmax * 1.005 # np.max(aLDRcorr[iLDR,:]) * 1.005
Volker@40 2202
Volker@40 2203 # Determine mean distance of all aXmean from each other for each iLDR
Volker@40 2204 meanDist = 0.0
Volker@40 2205 for iaX in range(-naX, naX + 1):
Volker@40 2206 # mean Etax value for certain error (iaX) of parameter aVar
Volker@40 2207 aXmean[iaX + naX] = np.mean(aEtax[iLDR, aX == iaX])
Volker@40 2208 # relative to absolute spread of Etax
Volker@40 2209 meanDist = (np.max(aXmean) - np.min(aXmean)) / (Etaxmax - Etaxmin) * 100
Volker@40 2210
Volker@40 2211 plt.subplot(1, 5, iLDR + 1)
Volker@40 2212 (n, bins, patches) = plt.hist(aEtax[iLDR, :],
Volker@40 2213 bins=50, log=False,
Volker@40 2214 range=[Rmin, Rmax],
Volker@40 2215 alpha=0.5, density=False, color='0.5', histtype='stepfilled')
Volker@40 2216 for iaX in range(-naX, naX + 1):
Volker@40 2217 plt.hist(aEtax[iLDR, aX == iaX],
Volker@40 2218 range=[Rmin, Rmax],
Volker@40 2219 bins=50, log=False, alpha=0.3, density=False, histtype='stepfilled',
Volker@40 2220 label=str(round(X0 + iaX * daX / naX, 5)))
Volker@40 2221 if (iLDR == 2):
Volker@40 2222 leg = plt.legend()
Volker@40 2223 leg.get_frame().set_alpha(0.1)
Volker@40 2224 plt.tick_params(axis='both', labelsize=10)
Volker@40 2225 plt.plot([Etax0, Etax0], [0, np.max(n)], 'r-', lw=2)
Volker@40 2226 plt.gca().set_title("{0:3.0f}%".format(meanDist))
Volker@40 2227 plt.gca().set_xlabel('Etax0', color="red")
Volker@40 2228 fig.suptitle('Etax - ' + LID + ' with ' + str(Type[TypeC]) + ' ' + str(Loc[LocC]) + ' - ' + aVar + ' error contribution', fontsize=14, y=1.10)
Volker@40 2229 return
Volker@40 2230
Volker@40 2231 def PlotEtapx(aVar, aX, X0, daX, iaX, naX):
Volker@40 2232 # aVar is the name of the parameter and aX is the subset of aLDRcorr which is coloured in the plot
Volker@40 2233 # example: PlotSubHist("DOLP", aDOLP, DOLP0, dDOLP, iDOLP, nDOLP)
Volker@40 2234 fig, ax = plt.subplots(nrows=1, ncols=5, sharex=True, sharey=True, figsize=(25, 2))
Volker@40 2235 iLDR = -1
Volker@40 2236 for LDRTrue in LDRrange:
Volker@40 2237 aXmean = np.zeros(2 * naX + 1)
Volker@40 2238 iLDR = iLDR + 1
Volker@40 2239 Etapxmin = np.amin(aEtapx[iLDR, :])
Volker@40 2240 Etapxmax = np.amax(aEtapx[iLDR, :])
Volker@40 2241 Rmin = Etapxmin * 0.995 # np.min(aLDRcorr[iLDR,:]) * 0.995
Volker@40 2242 Rmax = Etapxmax * 1.005 # np.max(aLDRcorr[iLDR,:]) * 1.005
Volker@40 2243
Volker@40 2244 # Determine mean distance of all aXmean from each other for each iLDR
Volker@40 2245 meanDist = 0.0
Volker@40 2246 for iaX in range(-naX, naX + 1):
Volker@40 2247 # mean Etapx value for certain error (iaX) of parameter aVar
Volker@40 2248 aXmean[iaX + naX] = np.mean(aEtapx[iLDR, aX == iaX])
Volker@40 2249 # relative to absolute spread of Etapx
Volker@40 2250 meanDist = (np.max(aXmean) - np.min(aXmean)) / (Etapxmax - Etapxmin) * 100
Volker@40 2251
Volker@40 2252 plt.subplot(1, 5, iLDR + 1)
Volker@40 2253 (n, bins, patches) = plt.hist(aEtapx[iLDR, :],
Volker@40 2254 bins=50, log=False,
Volker@40 2255 range=[Rmin, Rmax],
Volker@40 2256 alpha=0.5, density=False, color='0.5', histtype='stepfilled')
Volker@40 2257 for iaX in range(-naX, naX + 1):
Volker@40 2258 plt.hist(aEtapx[iLDR, aX == iaX],
Volker@40 2259 range=[Rmin, Rmax],
Volker@40 2260 bins=50, log=False, alpha=0.3, density=False, histtype='stepfilled',
Volker@40 2261 label=str(round(X0 + iaX * daX / naX, 5)))
Volker@40 2262 if (iLDR == 2):
Volker@40 2263 leg = plt.legend()
Volker@40 2264 leg.get_frame().set_alpha(0.1)
Volker@40 2265 plt.tick_params(axis='both', labelsize=10)
Volker@40 2266 plt.plot([Etapx0, Etapx0], [0, np.max(n)], 'r-', lw=2)
Volker@40 2267 plt.gca().set_title("{0:3.0f}%".format(meanDist))
Volker@40 2268 plt.gca().set_xlabel('Etapx0', color="red")
Volker@40 2269 fig.suptitle('Etapx - ' + LID + ' with ' + str(Type[TypeC]) + ' ' + str(Loc[LocC]) + ' - ' + aVar + ' error contribution', fontsize=14, y=1.10)
Volker@40 2270 return
Volker@40 2271
Volker@40 2272 def PlotEtamx(aVar, aX, X0, daX, iaX, naX):
Volker@40 2273 # aVar is the name of the parameter and aX is the subset of aLDRcorr which is coloured in the plot
Volker@40 2274 # example: PlotSubHist("DOLP", aDOLP, DOLP0, dDOLP, iDOLP, nDOLP)
Volker@40 2275 fig, ax = plt.subplots(nrows=1, ncols=5, sharex=True, sharey=True, figsize=(25, 2))
Volker@40 2276 iLDR = -1
Volker@40 2277 for LDRTrue in LDRrange:
Volker@40 2278 aXmean = np.zeros(2 * naX + 1)
Volker@40 2279 iLDR = iLDR + 1
Volker@40 2280 Etamxmin = np.amin(aEtamx[iLDR, :])
Volker@40 2281 Etamxmax = np.amax(aEtamx[iLDR, :])
Volker@40 2282 Rmin = Etamxmin * 0.995 # np.min(aLDRcorr[iLDR,:]) * 0.995
Volker@40 2283 Rmax = Etamxmax * 1.005 # np.max(aLDRcorr[iLDR,:]) * 1.005
Volker@40 2284
Volker@40 2285 # Determine mean distance of all aXmean from each other for each iLDR
Volker@40 2286 meanDist = 0.0
Volker@40 2287 for iaX in range(-naX, naX + 1):
Volker@40 2288 # mean Etamx value for certain error (iaX) of parameter aVar
Volker@40 2289 aXmean[iaX + naX] = np.mean(aEtamx[iLDR, aX == iaX])
Volker@40 2290 # relative to absolute spread of Etamx
Volker@40 2291 meanDist = (np.max(aXmean) - np.min(aXmean)) / (Etamxmax - Etamxmin) * 100
Volker@40 2292
Volker@40 2293 plt.subplot(1, 5, iLDR + 1)
Volker@40 2294 (n, bins, patches) = plt.hist(aEtamx[iLDR, :],
Volker@40 2295 bins=50, log=False,
Volker@40 2296 range=[Rmin, Rmax],
Volker@40 2297 alpha=0.5, density=False, color='0.5', histtype='stepfilled')
Volker@40 2298 for iaX in range(-naX, naX + 1):
Volker@40 2299 plt.hist(aEtamx[iLDR, aX == iaX],
Volker@40 2300 range=[Rmin, Rmax],
Volker@40 2301 bins=50, log=False, alpha=0.3, density=False, histtype='stepfilled',
Volker@40 2302 label=str(round(X0 + iaX * daX / naX, 5)))
Volker@40 2303 if (iLDR == 2):
Volker@40 2304 leg = plt.legend()
Volker@40 2305 leg.get_frame().set_alpha(0.1)
Volker@40 2306 plt.tick_params(axis='both', labelsize=10)
Volker@40 2307 plt.plot([Etamx0, Etamx0], [0, np.max(n)], 'r-', lw=2)
Volker@40 2308 plt.gca().set_title("{0:3.0f}%".format(meanDist))
Volker@40 2309 plt.gca().set_xlabel('Etamx0', color="red")
Volker@40 2310 fig.suptitle('Etamx - ' + LID + ' with ' + str(Type[TypeC]) + ' ' + str(Loc[LocC]) + ' - ' + aVar + ' error contribution', fontsize=14, y=1.10)
Volker@40 2311 return
Volker@40 2312
Volker@40 2313 # calc contribution of the error of aVar = aX to aY for each LDRtrue
Volker@40 2314 def Contribution(aVar, aX, X0, daX, iaX, naX, aY, Ysum, widthSum):
Volker@40 2315 # aVar is the name of the parameter and aX is the subset of aY which is coloured in the plot
Volker@40 2316 # example: Contribution("DOLP", aDOLP, DOLP0, dDOLP, iDOLP, nDOLP, aLDRcorr, DOLPcontr)
Volker@40 2317 iLDR = -1
Volker@40 2318 # Ysum, widthSum = np.zeros(5)
Volker@40 2319 meanDist = np.zeros(5) # iLDR
Volker@40 2320 widthDist = np.zeros(5) # iLDR
Volker@40 2321 for LDRTrue in LDRrange:
Volker@40 2322 aXmean = np.zeros(2 * naX + 1)
Volker@40 2323 aXwidth = np.zeros(2 * naX + 1)
Volker@40 2324 iLDR = iLDR + 1
Volker@40 2325 # total width of distribution
Volker@40 2326 aYmin = np.amin(aY[iLDR, :])
Volker@40 2327 aYmax = np.amax(aY[iLDR, :])
Volker@40 2328 aYwidth = aYmax - aYmin
Volker@40 2329 # Determine mean distance of all aXmean from each other for each iLDR
Volker@40 2330 for iaX in range(-naX, naX + 1):
Volker@40 2331 # mean LDRCorr value for all errors iaX of parameter aVar
Volker@40 2332 aXmean[iaX + naX] = np.mean(aY[iLDR, aX == iaX])
Volker@40 2333 aXwidth[iaX + naX] = np.max(aY[iLDR, aX == iaX]) - np.min(aY[iLDR, aX == iaX])
Volker@40 2334 # relative to absolute spread of LDRCorrs
Volker@40 2335 meanDist[iLDR] = (np.max(aXmean) - np.min(aXmean)) / aYwidth * 1000
Volker@40 2336 # meanDist[iLDR] = (aYwidth - aXwidth[naX]) / aYwidth * 1000
Volker@40 2337 widthDist[iLDR] = (np.max(aXwidth) - aXwidth[naX]) / aYwidth * 1000
Volker@40 2338
Volker@40 2339 print("{:12}{:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f}"\
Volker@40 2340 .format(aVar,meanDist[0],meanDist[1],meanDist[2],meanDist[3],meanDist[4],widthDist[0],widthDist[1],widthDist[2],widthDist[3],widthDist[4]))
Volker@40 2341 Ysum = Ysum + meanDist
Volker@40 2342 widthSum = widthSum + widthDist
Volker@40 2343 return(Ysum, widthSum)
Volker@40 2344
Volker@40 2345 # print(.format(LDRrangeA[iLDR],))
Volker@40 2346
Volker@40 2347 # error contributions to a certain output aY; loop over all variables
Volker@40 2348 def Contribution_aY(aYvar, aY):
Volker@40 2349 Ysum = np.zeros(5)
Volker@40 2350 widthSum = np.zeros(5)
Volker@40 2351 # meanDist = np.zeros(5) # iLDR
Volker@40 2352 LDRrangeA = np.array(LDRrange)
Volker@40 2353 print()
Volker@40 2354 print(aYvar + ": contribution to the total error (per mill)")
Volker@40 2355 print(" of individual parameter errors of combined parameter errors")
Volker@40 2356 print(" at LDRtrue {:5.3f} {:5.3f} {:5.3f} {:5.3f} {:5.3f} {:5.3f} {:5.3f} {:5.3f} {:5.3f} {:5.3f}"\
Volker@40 2357 .format(LDRrangeA[0],LDRrangeA[1],LDRrangeA[2],LDRrangeA[3],LDRrangeA[4],LDRrangeA[0],LDRrangeA[1],LDRrangeA[2],LDRrangeA[3],LDRrangeA[4]))
Volker@40 2358 print()
Volker@40 2359 if (nQin > 0): Ysum, widthSum = Contribution("Qin", aQin, Qin0, dQin, iQin, nQin, aY, Ysum, widthSum)
Volker@40 2360 if (nVin > 0): Ysum, widthSum = Contribution("Vin", aVin, Vin0, dVin, iVin, nVin, aY, Ysum, widthSum)
Volker@40 2361 if (nRotL > 0): Ysum, widthSum = Contribution("RotL", aRotL, RotL0, dRotL, iRotL, nRotL, aY, Ysum, widthSum)
Volker@40 2362 if (nRetE > 0): Ysum, widthSum = Contribution("RetE", aRetE, RetE0, dRetE, iRetE, nRetE, aY, Ysum, widthSum)
Volker@40 2363 if (nRotE > 0): Ysum, widthSum = Contribution("RotE", aRotE, RotE0, dRotE, iRotE, nRotE, aY, Ysum, widthSum)
Volker@40 2364 if (nDiE > 0): Ysum, widthSum = Contribution("DiE", aDiE, DiE0, dDiE, iDiE, nDiE, aY, Ysum, widthSum)
Volker@40 2365 if (nRetO > 0): Ysum, widthSum = Contribution("RetO", aRetO, RetO0, dRetO, iRetO, nRetO, aY, Ysum, widthSum)
Volker@40 2366 if (nRotO > 0): Ysum, widthSum = Contribution("RotO", aRotO, RotO0, dRotO, iRotO, nRotO, aY, Ysum, widthSum)
Volker@40 2367 if (nDiO > 0): Ysum, widthSum = Contribution("DiO", aDiO, DiO0, dDiO, iDiO, nDiO, aY, Ysum, widthSum)
Volker@40 2368 if (nDiC > 0): Ysum, widthSum = Contribution("DiC", aDiC, DiC0, dDiC, iDiC, nDiC, aY, Ysum, widthSum)
Volker@40 2369 if (nRotC > 0): Ysum, widthSum = Contribution("RotC", aRotC, RotC0, dRotC, iRotC, nRotC, aY, Ysum, widthSum)
Volker@40 2370 if (nRetC > 0): Ysum, widthSum = Contribution("RetC", aRetC, RetC0, dRetC, iRetC, nRetC, aY, Ysum, widthSum)
Volker@40 2371 if (nTP > 0): Ysum, widthSum = Contribution("TP", aTP, TP0, dTP, iTP, nTP, aY, Ysum, widthSum)
Volker@40 2372 if (nTS > 0): Ysum, widthSum = Contribution("TS", aTS, TS0, dTS, iTS, nTS, aY, Ysum, widthSum)
Volker@40 2373 if (nRP > 0): Ysum, widthSum = Contribution("RP", aRP, RP0, dRP, iRP, nRP, aY, Ysum, widthSum)
Volker@40 2374 if (nRS > 0): Ysum, widthSum = Contribution("RS", aRS, RS0, dRS, iRS, nRS, aY, Ysum, widthSum)
Volker@40 2375 if (nRetT > 0): Ysum, widthSum = Contribution("RetT", aRetT, RetT0, dRetT, iRetT, nRetT, aY, Ysum, widthSum)
Volker@40 2376 if (nRetR > 0): Ysum, widthSum = Contribution("RetR", aRetR, RetR0, dRetR, iRetR, nRetR, aY, Ysum, widthSum)
Volker@40 2377 if (nERaT > 0): Ysum, widthSum = Contribution("ERaT", aERaT, ERaT0, dERaT, iERaT, nERaT, aY, Ysum, widthSum)
Volker@40 2378 if (nERaR > 0): Ysum, widthSum = Contribution("ERaR", aERaR, ERaR0, dERaR, iERaR, nERaR, aY, Ysum, widthSum)
Volker@40 2379 if (nRotaT > 0): Ysum, widthSum = Contribution("RotaT", aRotaT, RotaT0, dRotaT, iRotaT, nRotaT, aY, Ysum, widthSum)
Volker@40 2380 if (nRotaR > 0): Ysum, widthSum = Contribution("RotaR", aRotaR, RotaR0, dRotaR, iRotaR, nRotaR, aY, Ysum, widthSum)
Volker@40 2381 if (nLDRCal > 0): Ysum, widthSum = Contribution("LDRCal", aLDRCal, LDRCal0, dLDRCal, iLDRCal, nLDRCal, aY, Ysum, widthSum)
Volker@40 2382 if (nTCalT > 0): Ysum, widthSum = Contribution("TCalT", aTCalT, TCalT0, dTCalT, iTCalT, nTCalT, aY, Ysum, widthSum)
Volker@40 2383 if (nTCalR > 0): Ysum, widthSum = Contribution("TCalR", aTCalR, TCalR0, dTCalR, iTCalR, nTCalR, aY, Ysum, widthSum)
Volker@40 2384 if (nNCal > 0): Ysum, widthSum = Contribution("CalNoiseTp", aNCalTp, 0, 1, iNCalTp, nNCal, aY, Ysum, widthSum)
Volker@40 2385 if (nNCal > 0): Ysum, widthSum = Contribution("CalNoiseTm", aNCalTm, 0, 1, iNCalTm, nNCal, aY, Ysum, widthSum)
Volker@40 2386 if (nNCal > 0): Ysum, widthSum = Contribution("CalNoiseRp", aNCalRp, 0, 1, iNCalRp, nNCal, aY, Ysum, widthSum)
Volker@40 2387 if (nNCal > 0): Ysum, widthSum = Contribution("CalNoiseRm", aNCalRm, 0, 1, iNCalRm, nNCal, aY, Ysum, widthSum)
Volker@40 2388 if (nNI > 0): Ysum, widthSum = Contribution("SigNoiseIt", aNIt, 0, 1, iNIt, nNI, aY, Ysum, widthSum)
Volker@40 2389 if (nNI > 0): Ysum, widthSum = Contribution("SigNoiseIr", aNIr, 0, 1, iNIr, nNI, aY, Ysum, widthSum)
Volker@40 2390 print("{:12}{:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f} {:5.0f}"\
Volker@40 2391 .format("Sum ",Ysum[0],Ysum[1],Ysum[2],Ysum[3],Ysum[4],widthSum[0],widthSum[1],widthSum[2],widthSum[3],widthSum[4]))
Volker@40 2392
Volker@40 2393
Volker@40 2394 # Plot LDR histograms
Volker@40 2395 if (nQin > 0): PlotSubHist("Qin", aQin, Qin0, dQin, iQin, nQin)
Volker@40 2396 if (nVin > 0): PlotSubHist("Vin", aVin, Vin0, dVin, iVin, nVin)
Volker@40 2397 if (nRotL > 0): PlotSubHist("RotL", aRotL, RotL0, dRotL, iRotL, nRotL)
Volker@40 2398 if (nRetE > 0): PlotSubHist("RetE", aRetE, RetE0, dRetE, iRetE, nRetE)
Volker@40 2399 if (nRotE > 0): PlotSubHist("RotE", aRotE, RotE0, dRotE, iRotE, nRotE)
Volker@40 2400 if (nDiE > 0): PlotSubHist("DiE", aDiE, DiE0, dDiE, iDiE, nDiE)
Volker@40 2401 if (nRetO > 0): PlotSubHist("RetO", aRetO, RetO0, dRetO, iRetO, nRetO)
Volker@40 2402 if (nRotO > 0): PlotSubHist("RotO", aRotO, RotO0, dRotO, iRotO, nRotO)
Volker@40 2403 if (nDiO > 0): PlotSubHist("DiO", aDiO, DiO0, dDiO, iDiO, nDiO)
Volker@40 2404 if (nDiC > 0): PlotSubHist("DiC", aDiC, DiC0, dDiC, iDiC, nDiC)
Volker@40 2405 if (nRotC > 0): PlotSubHist("RotC", aRotC, RotC0, dRotC, iRotC, nRotC)
Volker@40 2406 if (nRetC > 0): PlotSubHist("RetC", aRetC, RetC0, dRetC, iRetC, nRetC)
Volker@40 2407 if (nTP > 0): PlotSubHist("TP", aTP, TP0, dTP, iTP, nTP)
Volker@40 2408 if (nTS > 0): PlotSubHist("TS", aTS, TS0, dTS, iTS, nTS)
Volker@40 2409 if (nRP > 0): PlotSubHist("RP", aRP, RP0, dRP, iRP, nRP)
Volker@40 2410 if (nRS > 0): PlotSubHist("RS", aRS, RS0, dRS, iRS, nRS)
Volker@40 2411 if (nRetT > 0): PlotSubHist("RetT", aRetT, RetT0, dRetT, iRetT, nRetT)
Volker@40 2412 if (nRetR > 0): PlotSubHist("RetR", aRetR, RetR0, dRetR, iRetR, nRetR)
Volker@40 2413 if (nERaT > 0): PlotSubHist("ERaT", aERaT, ERaT0, dERaT, iERaT, nERaT)
Volker@40 2414 if (nERaR > 0): PlotSubHist("ERaR", aERaR, ERaR0, dERaR, iERaR, nERaR)
Volker@40 2415 if (nRotaT > 0): PlotSubHist("RotaT", aRotaT, RotaT0, dRotaT, iRotaT, nRotaT)
Volker@40 2416 if (nRotaR > 0): PlotSubHist("RotaR", aRotaR, RotaR0, dRotaR, iRotaR, nRotaR)
Volker@40 2417 if (nLDRCal > 0): PlotSubHist("LDRCal", aLDRCal, LDRCal0, dLDRCal, iLDRCal, nLDRCal)
Volker@40 2418 if (nTCalT > 0): PlotSubHist("TCalT", aTCalT, TCalT0, dTCalT, iTCalT, nTCalT)
Volker@40 2419 if (nTCalR > 0): PlotSubHist("TCalR", aTCalR, TCalR0, dTCalR, iTCalR, nTCalR)
Volker@40 2420 if (nNCal > 0): PlotSubHist("CalNoiseTp", aNCalTp, 0, 1, iNCalTp, nNCal)
Volker@40 2421 if (nNCal > 0): PlotSubHist("CalNoiseTm", aNCalTm, 0, 1, iNCalTm, nNCal)
Volker@40 2422 if (nNCal > 0): PlotSubHist("CalNoiseRp", aNCalRp, 0, 1, iNCalRp, nNCal)
Volker@40 2423 if (nNCal > 0): PlotSubHist("CalNoiseRm", aNCalRm, 0, 1, iNCalRm, nNCal)
Volker@40 2424 if (nNI > 0): PlotSubHist("SigNoiseIt", aNIt, 0, 1, iNIt, nNI)
Volker@40 2425 if (nNI > 0): PlotSubHist("SigNoiseIr", aNIr, 0, 1, iNIr, nNI)
Volker@40 2426 plt.show()
Volker@40 2427 plt.close
Volker@40 2428
Volker@40 2429
Volker@40 2430
Volker@40 2431 # --- Plot LDRmin, LDRmax
Volker@40 2432 iLDR = -1
Volker@40 2433 for LDRTrue in LDRrange:
Volker@40 2434 iLDR = iLDR + 1
Volker@40 2435 LDRmin[iLDR] = np.amin(aLDRcorr[iLDR, :])
Volker@40 2436 LDRmax[iLDR] = np.amax(aLDRcorr[iLDR, :])
Volker@40 2437 LDRstd[iLDR] = np.std(aLDRcorr[iLDR, :])
Volker@40 2438 LDRmean[iLDR] = np.mean(aLDRcorr[iLDR, :])
Volker@40 2439 LDRmedian[iLDR] = np.median(aLDRcorr[iLDR, :])
Volker@40 2440 LDRskew[iLDR] = skew(aLDRcorr[iLDR, :],bias=False)
Volker@40 2441 LDRkurt[iLDR] = kurtosis(aLDRcorr[iLDR, :],fisher=True,bias=False)
Volker@40 2442
Volker@40 2443 fig2 = plt.figure()
Volker@40 2444 LDRrangeA = np.array(LDRrange)
Volker@40 2445 if((np.amax(LDRmax - LDRrangeA)-np.amin(LDRmin - LDRrangeA)) < 0.001):
Volker@40 2446 plt.ylim(-0.001,0.001)
Volker@40 2447 plt.plot(LDRrangeA, LDRmax - LDRrangeA, linewidth=2.0, color='b')
Volker@40 2448 plt.plot(LDRrangeA, LDRmin - LDRrangeA, linewidth=2.0, color='g')
Volker@40 2449
Volker@40 2450 plt.xlabel('LDRtrue', fontsize=18)
Volker@40 2451 plt.ylabel('LDRTrue-LDRmin, LDRTrue-LDRmax', fontsize=14)
Volker@40 2452 plt.title(LID + ' ' + str(Type[TypeC]) + ' ' + str(Loc[LocC]), fontsize=18)
Volker@40 2453 # plt.ylimit(-0.07, 0.07)
Volker@40 2454 plt.show()
Volker@40 2455 plt.close
Volker@40 2456
Volker@40 2457 # --- Save LDRmin, LDRmax to file
Volker@40 2458 # http://stackoverflow.com/questions/4675728/redirect-stdout-to-a-file-in-python
Volker@40 2459 with open('output_files\\' + OutputFile, 'a') as f:
Volker@40 2460 # with open('output_files\\' + LID + '-' + InputFile[0:-3] + '-LDR_min_max.dat', 'w') as f:
Volker@40 2461 with redirect_stdout(f):
Volker@40 2462 print("Lidar ID: " + LID)
Volker@40 2463 print()
Volker@40 2464 print("minimum and maximum values of the distributions of possibly measured LDR for different LDRtrue")
Volker@40 2465 print("LDRtrue , LDRmin, LDRmax")
Volker@40 2466 for i in range(len(LDRrangeA)):
Volker@40 2467 print("{0:7.4f},{1:7.4f},{2:7.4f}".format(LDRrangeA[i], LDRmin[i], LDRmax[i]))
Volker@40 2468 print()
Volker@40 2469 # Print LDR statistics
Volker@40 2470 print("LDRtrue , mean , median, max-mean, min-mean, std, excess_kurtosis, skewness")
Volker@40 2471 iLDR = -1
Volker@40 2472 LDRrangeA = np.array(LDRrange)
Volker@40 2473 for LDRTrue in LDRrange:
Volker@40 2474 iLDR = iLDR + 1
Volker@40 2475 print("{0:8.5f},{1:8.5f},{2:8.5f}, {3:8.5f},{4:8.5f},{5:8.5f}, {6:8.5f},{7:8.5f}"\
Volker@40 2476 .format(LDRrangeA[iLDR], LDRmean[iLDR], LDRmedian[iLDR], LDRmax[iLDR]-LDRrangeA[iLDR], \
Volker@40 2477 LDRmin[iLDR]-LDRrangeA[iLDR], LDRstd[iLDR], LDRkurt[iLDR], LDRskew[iLDR]))
Volker@40 2478 print()
Volker@40 2479 # Calculate and print statistics for calibration factors
Volker@40 2480 print("minimum and maximum values of the distributions of signal ratios and calibration factors for different LDRtrue")
Volker@40 2481 iLDR = -1
Volker@40 2482 LDRrangeA = np.array(LDRrange)
Volker@40 2483 print("LDRtrue , LDRsim, (max-min)/2, relerr")
Volker@40 2484 for LDRTrue in LDRrange:
Volker@40 2485 iLDR = iLDR + 1
Volker@40 2486 LDRsimmin[iLDR] = np.amin(aLDRsim[iLDR, :])
Volker@40 2487 LDRsimmax[iLDR] = np.amax(aLDRsim[iLDR, :])
Volker@40 2488 # LDRsimstd = np.std(aLDRsim[iLDR, :])
Volker@40 2489 LDRsimmean[iLDR] = np.mean(aLDRsim[iLDR, :])
Volker@40 2490 # LDRsimmedian = np.median(aLDRsim[iLDR, :])
Volker@40 2491 print("{0:8.5f}, {1:8.5f}, {2:8.5f}, {3:8.5f}".format(LDRrangeA[iLDR],LDRsimmean[iLDR],(LDRsimmax[iLDR]-LDRsimmin[iLDR])/2,(LDRsimmax[iLDR]-LDRsimmin[iLDR])/2/LDRsimmean[iLDR]))
Volker@40 2492 iLDR = -1
Volker@40 2493 print("LDRtrue , Etax , (max-min)/2, relerr")
Volker@40 2494 for LDRTrue in LDRrange:
Volker@40 2495 iLDR = iLDR + 1
Volker@40 2496 Etaxmin = np.amin(aEtax[iLDR, :])
Volker@40 2497 Etaxmax = np.amax(aEtax[iLDR, :])
Volker@40 2498 # Etaxstd = np.std(aEtax[iLDR, :])
Volker@40 2499 Etaxmean = np.mean(aEtax[iLDR, :])
Volker@40 2500 # Etaxmedian = np.median(aEtax[iLDR, :])
Volker@40 2501 print("{0:8.5f}, {1:8.5f}, {2:8.5f}, {3:8.5f}".format(LDRrangeA[iLDR], Etaxmean, (Etaxmax-Etaxmin)/2, (Etaxmax-Etaxmin)/2/Etaxmean))
Volker@40 2502 iLDR = -1
Volker@40 2503 print("LDRtrue , Etapx , (max-min)/2, relerr")
Volker@40 2504 for LDRTrue in LDRrange:
Volker@40 2505 iLDR = iLDR + 1
Volker@40 2506 Etapxmin = np.amin(aEtapx[iLDR, :])
Volker@40 2507 Etapxmax = np.amax(aEtapx[iLDR, :])
Volker@40 2508 # Etapxstd = np.std(aEtapx[iLDR, :])
Volker@40 2509 Etapxmean = np.mean(aEtapx[iLDR, :])
Volker@40 2510 # Etapxmedian = np.median(aEtapx[iLDR, :])
Volker@40 2511 print("{0:8.5f}, {1:8.5f}, {2:8.5f}, {3:8.5f}".format(LDRrangeA[iLDR], Etapxmean, (Etapxmax-Etapxmin)/2, (Etapxmax-Etapxmin)/2/Etapxmean))
Volker@40 2512 iLDR = -1
Volker@40 2513 print("LDRtrue , Etamx , (max-min)/2, relerr")
Volker@40 2514 for LDRTrue in LDRrange:
Volker@40 2515 iLDR = iLDR + 1
Volker@40 2516 Etamxmin = np.amin(aEtamx[iLDR, :])
Volker@40 2517 Etamxmax = np.amax(aEtamx[iLDR, :])
Volker@40 2518 # Etamxstd = np.std(aEtamx[iLDR, :])
Volker@40 2519 Etamxmean = np.mean(aEtamx[iLDR, :])
Volker@40 2520 # Etamxmedian = np.median(aEtamx[iLDR, :])
Volker@40 2521 print("{0:8.5f}, {1:8.5f}, {2:8.5f}, {3:8.5f}".format(LDRrangeA[iLDR], Etamxmean, (Etamxmax-Etamxmin)/2, (Etamxmax-Etamxmin)/2/Etamxmean))
Volker@40 2522
Volker@40 2523 # Print LDR statistics
Volker@40 2524 print("LDRtrue , mean , median, max-mean, min-mean, std, excess_kurtosis, skewness")
Volker@40 2525 iLDR = -1
Volker@40 2526 LDRrangeA = np.array(LDRrange)
Volker@40 2527 for LDRTrue in LDRrange:
Volker@40 2528 iLDR = iLDR + 1
Volker@40 2529 print("{0:8.5f},{1:8.5f},{2:8.5f}, {3:8.5f},{4:8.5f},{5:8.5f}, {6:8.5f},{7:8.5f}".format(LDRrangeA[iLDR], LDRmean[iLDR], LDRmedian[iLDR], LDRmax[iLDR]-LDRrangeA[iLDR], LDRmin[iLDR]-LDRrangeA[iLDR], LDRstd[iLDR],LDRkurt[iLDR],LDRskew[iLDR]))
Volker@40 2530
Volker@40 2531
Volker@40 2532 with open('output_files\\' + OutputFile, 'a') as f:
Volker@40 2533 # with open('output_files\\' + LID + '-' + InputFile[0:-3] + '-LDR_min_max.dat', 'a') as f:
Volker@40 2534 with redirect_stdout(f):
Volker@40 2535 Contribution_aY("LDRCorr", aLDRcorr)
Volker@40 2536 Contribution_aY("LDRsim", aLDRsim)
Volker@40 2537 Contribution_aY("EtaX, D90", aEtax)
Volker@40 2538 Contribution_aY("Etapx, +45°", aEtapx)
Volker@40 2539 Contribution_aY("Etamx -45°", aEtamx)
Volker@40 2540
Volker@40 2541
Volker@40 2542 # Plot other histograms
Volker@40 2543 if (bPlotEtax):
Volker@40 2544
Volker@40 2545 if (nQin > 0): PlotLDRsim("Qin", aQin, Qin0, dQin, iQin, nQin)
Volker@40 2546 if (nVin > 0): PlotLDRsim("Vin", aVin, Vin0, dVin, iVin, nVin)
Volker@40 2547 if (nRotL > 0): PlotLDRsim("RotL", aRotL, RotL0, dRotL, iRotL, nRotL)
Volker@40 2548 if (nRetE > 0): PlotLDRsim("RetE", aRetE, RetE0, dRetE, iRetE, nRetE)
Volker@40 2549 if (nRotE > 0): PlotLDRsim("RotE", aRotE, RotE0, dRotE, iRotE, nRotE)
Volker@40 2550 if (nDiE > 0): PlotLDRsim("DiE", aDiE, DiE0, dDiE, iDiE, nDiE)
Volker@40 2551 if (nRetO > 0): PlotLDRsim("RetO", aRetO, RetO0, dRetO, iRetO, nRetO)
Volker@40 2552 if (nRotO > 0): PlotLDRsim("RotO", aRotO, RotO0, dRotO, iRotO, nRotO)
Volker@40 2553 if (nDiO > 0): PlotLDRsim("DiO", aDiO, DiO0, dDiO, iDiO, nDiO)
Volker@40 2554 if (nDiC > 0): PlotLDRsim("DiC", aDiC, DiC0, dDiC, iDiC, nDiC)
Volker@40 2555 if (nRotC > 0): PlotLDRsim("RotC", aRotC, RotC0, dRotC, iRotC, nRotC)
Volker@40 2556 if (nRetC > 0): PlotLDRsim("RetC", aRetC, RetC0, dRetC, iRetC, nRetC)
Volker@40 2557 if (nTP > 0): PlotLDRsim("TP", aTP, TP0, dTP, iTP, nTP)
Volker@40 2558 if (nTS > 0): PlotLDRsim("TS", aTS, TS0, dTS, iTS, nTS)
Volker@40 2559 if (nRP > 0): PlotLDRsim("RP", aRP, RP0, dRP, iRP, nRP)
Volker@40 2560 if (nRS > 0): PlotLDRsim("RS", aRS, RS0, dRS, iRS, nRS)
Volker@40 2561 if (nRetT > 0): PlotLDRsim("RetT", aRetT, RetT0, dRetT, iRetT, nRetT)
Volker@40 2562 if (nRetR > 0): PlotLDRsim("RetR", aRetR, RetR0, dRetR, iRetR, nRetR)
Volker@40 2563 if (nERaT > 0): PlotLDRsim("ERaT", aERaT, ERaT0, dERaT, iERaT, nERaT)
Volker@40 2564 if (nERaR > 0): PlotLDRsim("ERaR", aERaR, ERaR0, dERaR, iERaR, nERaR)
Volker@40 2565 if (nRotaT > 0): PlotLDRsim("RotaT", aRotaT, RotaT0, dRotaT, iRotaT, nRotaT)
Volker@40 2566 if (nRotaR > 0): PlotLDRsim("RotaR", aRotaR, RotaR0, dRotaR, iRotaR, nRotaR)
Volker@40 2567 if (nLDRCal > 0): PlotLDRsim("LDRCal", aLDRCal, LDRCal0, dLDRCal, iLDRCal, nLDRCal)
Volker@40 2568 if (nTCalT > 0): PlotLDRsim("TCalT", aTCalT, TCalT0, dTCalT, iTCalT, nTCalT)
Volker@40 2569 if (nTCalR > 0): PlotLDRsim("TCalR", aTCalR, TCalR0, dTCalR, iTCalR, nTCalR)
Volker@40 2570 if (nNCal > 0): PlotLDRsim("CalNoiseTp", aNCalTp, 0, 1, iNCalTp, nNCal)
Volker@40 2571 if (nNCal > 0): PlotLDRsim("CalNoiseTm", aNCalTm, 0, 1, iNCalTm, nNCal)
Volker@40 2572 if (nNCal > 0): PlotLDRsim("CalNoiseRp", aNCalRp, 0, 1, iNCalRp, nNCal)
Volker@40 2573 if (nNCal > 0): PlotLDRsim("CalNoiseRm", aNCalRm, 0, 1, iNCalRm, nNCal)
Volker@40 2574 if (nNI > 0): PlotLDRsim("SigNoiseIt", aNIt, 0, 1, iNIt, nNI)
Volker@40 2575 if (nNI > 0): PlotLDRsim("SigNoiseIr", aNIr, 0, 1, iNIr, nNI)
Volker@40 2576 plt.show()
Volker@40 2577 plt.close
Volker@40 2578 print("---------------------------------------...producing more plots...------------------------------------------------------------------")
Volker@40 2579
Volker@40 2580 if (nQin > 0): PlotEtax("Qin", aQin, Qin0, dQin, iQin, nQin)
Volker@40 2581 if (nVin > 0): PlotEtax("Vin", aVin, Vin0, dVin, iVin, nVin)
Volker@40 2582 if (nRotL > 0): PlotEtax("RotL", aRotL, RotL0, dRotL, iRotL, nRotL)
Volker@40 2583 if (nRetE > 0): PlotEtax("RetE", aRetE, RetE0, dRetE, iRetE, nRetE)
Volker@40 2584 if (nRotE > 0): PlotEtax("RotE", aRotE, RotE0, dRotE, iRotE, nRotE)
Volker@40 2585 if (nDiE > 0): PlotEtax("DiE", aDiE, DiE0, dDiE, iDiE, nDiE)
Volker@40 2586 if (nRetO > 0): PlotEtax("RetO", aRetO, RetO0, dRetO, iRetO, nRetO)
Volker@40 2587 if (nRotO > 0): PlotEtax("RotO", aRotO, RotO0, dRotO, iRotO, nRotO)
Volker@40 2588 if (nDiO > 0): PlotEtax("DiO", aDiO, DiO0, dDiO, iDiO, nDiO)
Volker@40 2589 if (nDiC > 0): PlotEtax("DiC", aDiC, DiC0, dDiC, iDiC, nDiC)
Volker@40 2590 if (nRotC > 0): PlotEtax("RotC", aRotC, RotC0, dRotC, iRotC, nRotC)
Volker@40 2591 if (nRetC > 0): PlotEtax("RetC", aRetC, RetC0, dRetC, iRetC, nRetC)
Volker@40 2592 if (nTP > 0): PlotEtax("TP", aTP, TP0, dTP, iTP, nTP)
Volker@40 2593 if (nTS > 0): PlotEtax("TS", aTS, TS0, dTS, iTS, nTS)
Volker@40 2594 if (nRP > 0): PlotEtax("RP", aRP, RP0, dRP, iRP, nRP)
Volker@40 2595 if (nRS > 0): PlotEtax("RS", aRS, RS0, dRS, iRS, nRS)
Volker@40 2596 if (nRetT > 0): PlotEtax("RetT", aRetT, RetT0, dRetT, iRetT, nRetT)
Volker@40 2597 if (nRetR > 0): PlotEtax("RetR", aRetR, RetR0, dRetR, iRetR, nRetR)
Volker@40 2598 if (nERaT > 0): PlotEtax("ERaT", aERaT, ERaT0, dERaT, iERaT, nERaT)
Volker@40 2599 if (nERaR > 0): PlotEtax("ERaR", aERaR, ERaR0, dERaR, iERaR, nERaR)
Volker@40 2600 if (nRotaT > 0): PlotEtax("RotaT", aRotaT, RotaT0, dRotaT, iRotaT, nRotaT)
Volker@40 2601 if (nRotaR > 0): PlotEtax("RotaR", aRotaR, RotaR0, dRotaR, iRotaR, nRotaR)
Volker@40 2602 if (nLDRCal > 0): PlotEtax("LDRCal", aLDRCal, LDRCal0, dLDRCal, iLDRCal, nLDRCal)
Volker@40 2603 if (nTCalT > 0): PlotEtax("TCalT", aTCalT, TCalT0, dTCalT, iTCalT, nTCalT)
Volker@40 2604 if (nTCalR > 0): PlotEtax("TCalR", aTCalR, TCalR0, dTCalR, iTCalR, nTCalR)
Volker@40 2605 if (nNCal > 0): PlotEtax("CalNoiseTp", aNCalTp, 0, 1, iNCalTp, nNCal)
Volker@40 2606 if (nNCal > 0): PlotEtax("CalNoiseTm", aNCalTm, 0, 1, iNCalTm, nNCal)
Volker@40 2607 if (nNCal > 0): PlotEtax("CalNoiseRp", aNCalRp, 0, 1, iNCalRp, nNCal)
Volker@40 2608 if (nNCal > 0): PlotEtax("CalNoiseRm", aNCalRm, 0, 1, iNCalRm, nNCal)
Volker@40 2609 if (nNI > 0): PlotEtax("SigNoiseIt", aNIt, 0, 1, iNIt, nNI)
Volker@40 2610 if (nNI > 0): PlotEtax("SigNoiseIr", aNIr, 0, 1, iNIr, nNI)
Volker@40 2611 plt.show()
Volker@40 2612 plt.close
Volker@40 2613 print("---------------------------------------...producing more plots...------------------------------------------------------------------")
Volker@40 2614
Volker@40 2615 if (nQin > 0): PlotEtapx("Qin", aQin, Qin0, dQin, iQin, nQin)
Volker@40 2616 if (nVin > 0): PlotEtapx("Vin", aVin, Vin0, dVin, iVin, nVin)
Volker@40 2617 if (nRotL > 0): PlotEtapx("RotL", aRotL, RotL0, dRotL, iRotL, nRotL)
Volker@40 2618 if (nRetE > 0): PlotEtapx("RetE", aRetE, RetE0, dRetE, iRetE, nRetE)
Volker@40 2619 if (nRotE > 0): PlotEtapx("RotE", aRotE, RotE0, dRotE, iRotE, nRotE)
Volker@40 2620 if (nDiE > 0): PlotEtapx("DiE", aDiE, DiE0, dDiE, iDiE, nDiE)
Volker@40 2621 if (nRetO > 0): PlotEtapx("RetO", aRetO, RetO0, dRetO, iRetO, nRetO)
Volker@40 2622 if (nRotO > 0): PlotEtapx("RotO", aRotO, RotO0, dRotO, iRotO, nRotO)
Volker@40 2623 if (nDiO > 0): PlotEtapx("DiO", aDiO, DiO0, dDiO, iDiO, nDiO)
Volker@40 2624 if (nDiC > 0): PlotEtapx("DiC", aDiC, DiC0, dDiC, iDiC, nDiC)
Volker@40 2625 if (nRotC > 0): PlotEtapx("RotC", aRotC, RotC0, dRotC, iRotC, nRotC)
Volker@40 2626 if (nRetC > 0): PlotEtapx("RetC", aRetC, RetC0, dRetC, iRetC, nRetC)
Volker@40 2627 if (nTP > 0): PlotEtapx("TP", aTP, TP0, dTP, iTP, nTP)
Volker@40 2628 if (nTS > 0): PlotEtapx("TS", aTS, TS0, dTS, iTS, nTS)
Volker@40 2629 if (nRP > 0): PlotEtapx("RP", aRP, RP0, dRP, iRP, nRP)
Volker@40 2630 if (nRS > 0): PlotEtapx("RS", aRS, RS0, dRS, iRS, nRS)
Volker@40 2631 if (nRetT > 0): PlotEtapx("RetT", aRetT, RetT0, dRetT, iRetT, nRetT)
Volker@40 2632 if (nRetR > 0): PlotEtapx("RetR", aRetR, RetR0, dRetR, iRetR, nRetR)
Volker@40 2633 if (nERaT > 0): PlotEtapx("ERaT", aERaT, ERaT0, dERaT, iERaT, nERaT)
Volker@40 2634 if (nERaR > 0): PlotEtapx("ERaR", aERaR, ERaR0, dERaR, iERaR, nERaR)
Volker@40 2635 if (nRotaT > 0): PlotEtapx("RotaT", aRotaT, RotaT0, dRotaT, iRotaT, nRotaT)
Volker@40 2636 if (nRotaR > 0): PlotEtapx("RotaR", aRotaR, RotaR0, dRotaR, iRotaR, nRotaR)
Volker@40 2637 if (nLDRCal > 0): PlotEtapx("LDRCal", aLDRCal, LDRCal0, dLDRCal, iLDRCal, nLDRCal)
Volker@40 2638 if (nTCalT > 0): PlotEtapx("TCalT", aTCalT, TCalT0, dTCalT, iTCalT, nTCalT)
Volker@40 2639 if (nTCalR > 0): PlotEtapx("TCalR", aTCalR, TCalR0, dTCalR, iTCalR, nTCalR)
Volker@40 2640 if (nNCal > 0): PlotEtapx("CalNoiseTp", aNCalTp, 0, 1, iNCalTp, nNCal)
Volker@40 2641 if (nNCal > 0): PlotEtapx("CalNoiseTm", aNCalTm, 0, 1, iNCalTm, nNCal)
Volker@40 2642 if (nNCal > 0): PlotEtapx("CalNoiseRp", aNCalRp, 0, 1, iNCalRp, nNCal)
Volker@40 2643 if (nNCal > 0): PlotEtapx("CalNoiseRm", aNCalRm, 0, 1, iNCalRm, nNCal)
Volker@40 2644 if (nNI > 0): PlotEtapx("SigNoiseIt", aNIt, 0, 1, iNIt, nNI)
Volker@40 2645 if (nNI > 0): PlotEtapx("SigNoiseIr", aNIr, 0, 1, iNIr, nNI)
Volker@40 2646 plt.show()
Volker@40 2647 plt.close
Volker@40 2648 print("---------------------------------------...producing more plots...------------------------------------------------------------------")
Volker@40 2649
Volker@40 2650 if (nQin > 0): PlotEtamx("Qin", aQin, Qin0, dQin, iQin, nQin)
Volker@40 2651 if (nVin > 0): PlotEtamx("Vin", aVin, Vin0, dVin, iVin, nVin)
Volker@40 2652 if (nRotL > 0): PlotEtamx("RotL", aRotL, RotL0, dRotL, iRotL, nRotL)
Volker@40 2653 if (nRetE > 0): PlotEtamx("RetE", aRetE, RetE0, dRetE, iRetE, nRetE)
Volker@40 2654 if (nRotE > 0): PlotEtamx("RotE", aRotE, RotE0, dRotE, iRotE, nRotE)
Volker@40 2655 if (nDiE > 0): PlotEtamx("DiE", aDiE, DiE0, dDiE, iDiE, nDiE)
Volker@40 2656 if (nRetO > 0): PlotEtamx("RetO", aRetO, RetO0, dRetO, iRetO, nRetO)
Volker@40 2657 if (nRotO > 0): PlotEtamx("RotO", aRotO, RotO0, dRotO, iRotO, nRotO)
Volker@40 2658 if (nDiO > 0): PlotEtamx("DiO", aDiO, DiO0, dDiO, iDiO, nDiO)
Volker@40 2659 if (nDiC > 0): PlotEtamx("DiC", aDiC, DiC0, dDiC, iDiC, nDiC)
Volker@40 2660 if (nRotC > 0): PlotEtamx("RotC", aRotC, RotC0, dRotC, iRotC, nRotC)
Volker@40 2661 if (nRetC > 0): PlotEtamx("RetC", aRetC, RetC0, dRetC, iRetC, nRetC)
Volker@40 2662 if (nTP > 0): PlotEtamx("TP", aTP, TP0, dTP, iTP, nTP)
Volker@40 2663 if (nTS > 0): PlotEtamx("TS", aTS, TS0, dTS, iTS, nTS)
Volker@40 2664 if (nRP > 0): PlotEtamx("RP", aRP, RP0, dRP, iRP, nRP)
Volker@40 2665 if (nRS > 0): PlotEtamx("RS", aRS, RS0, dRS, iRS, nRS)
Volker@40 2666 if (nRetT > 0): PlotEtamx("RetT", aRetT, RetT0, dRetT, iRetT, nRetT)
Volker@40 2667 if (nRetR > 0): PlotEtamx("RetR", aRetR, RetR0, dRetR, iRetR, nRetR)
Volker@40 2668 if (nERaT > 0): PlotEtamx("ERaT", aERaT, ERaT0, dERaT, iERaT, nERaT)
Volker@40 2669 if (nERaR > 0): PlotEtamx("ERaR", aERaR, ERaR0, dERaR, iERaR, nERaR)
Volker@40 2670 if (nRotaT > 0): PlotEtamx("RotaT", aRotaT, RotaT0, dRotaT, iRotaT, nRotaT)
Volker@40 2671 if (nRotaR > 0): PlotEtamx("RotaR", aRotaR, RotaR0, dRotaR, iRotaR, nRotaR)
Volker@40 2672 if (nLDRCal > 0): PlotEtamx("LDRCal", aLDRCal, LDRCal0, dLDRCal, iLDRCal, nLDRCal)
Volker@40 2673 if (nTCalT > 0): PlotEtamx("TCalT", aTCalT, TCalT0, dTCalT, iTCalT, nTCalT)
Volker@40 2674 if (nTCalR > 0): PlotEtamx("TCalR", aTCalR, TCalR0, dTCalR, iTCalR, nTCalR)
Volker@40 2675 if (nNCal > 0): PlotEtamx("CalNoiseTp", aNCalTp, 0, 1, iNCalTp, nNCal)
Volker@40 2676 if (nNCal > 0): PlotEtamx("CalNoiseTm", aNCalTm, 0, 1, iNCalTm, nNCal)
Volker@40 2677 if (nNCal > 0): PlotEtamx("CalNoiseRp", aNCalRp, 0, 1, iNCalRp, nNCal)
Volker@40 2678 if (nNCal > 0): PlotEtamx("CalNoiseRm", aNCalRm, 0, 1, iNCalRm, nNCal)
Volker@40 2679 if (nNI > 0): PlotEtamx("SigNoiseIt", aNIt, 0, 1, iNIt, nNI)
Volker@40 2680 if (nNI > 0): PlotEtamx("SigNoiseIr", aNIr, 0, 1, iNIr, nNI)
Volker@40 2681 plt.show()
Volker@40 2682 plt.close
Volker@40 2683
Volker@40 2684 # Print Etax statistics
Volker@40 2685 Etaxmin = np.amin(aEtax[1, :])
Volker@40 2686 Etaxmax = np.amax(aEtax[1, :])
Volker@40 2687 Etaxstd = np.std(aEtax[1, :])
Volker@40 2688 Etaxmean = np.mean(aEtax[1, :])
Volker@40 2689 Etaxmedian = np.median(aEtax[1, :])
Volker@40 2690 print("Etax , max-mean, min-mean, median, mean ± std, eta")
Volker@40 2691 print("{0:8.5f} ±({1:8.5f},{2:8.5f}),{3:8.5f},{4:8.5f}±{5:8.5f},{6:8.5f}".format(Etax0, Etaxmax-Etax0, Etaxmin-Etax0, Etaxmedian, Etaxmean, Etaxstd, Etax0 / K0))
Volker@40 2692 print()
Volker@40 2693
Volker@40 2694 # Calculate and print statistics for calibration factors
Volker@40 2695 iLDR = -1
Volker@40 2696 LDRrangeA = np.array(LDRrange)
Volker@40 2697 print("LDR...., LDRsim, (max-min)/2, relerr")
Volker@40 2698 for LDRTrue in LDRrange:
Volker@40 2699 iLDR = iLDR + 1
Volker@40 2700 LDRsimmin[iLDR] = np.amin(aLDRsim[iLDR, :])
Volker@40 2701 LDRsimmax[iLDR] = np.amax(aLDRsim[iLDR, :])
Volker@40 2702 # LDRsimstd = np.std(aLDRsim[iLDR, :])
Volker@40 2703 LDRsimmean[iLDR] = np.mean(aLDRsim[iLDR, :])
Volker@40 2704 # LDRsimmedian = np.median(aLDRsim[iLDR, :])
Volker@40 2705 print("{0:8.5f}, {1:8.5f}, {2:8.5f}, {3:8.5f}".format(LDRrangeA[iLDR], LDRsimmean[iLDR], (LDRsimmax[iLDR]-LDRsimmin[iLDR])/2, (LDRsimmax[iLDR]-LDRsimmin[iLDR])/2/LDRsimmean[iLDR]))
Volker@40 2706 iLDR = -1
Volker@40 2707 print("LDR...., Etax , (max-min)/2, relerr")
Volker@40 2708 for LDRTrue in LDRrange:
Volker@40 2709 iLDR = iLDR + 1
Volker@40 2710 Etaxmin = np.amin(aEtax[iLDR, :])
Volker@40 2711 Etaxmax = np.amax(aEtax[iLDR, :])
Volker@40 2712 # Etaxstd = np.std(aEtax[iLDR, :])
Volker@40 2713 Etaxmean = np.mean(aEtax[iLDR, :])
Volker@40 2714 # Etaxmedian = np.median(aEtax[iLDR, :])
Volker@40 2715 print("{0:8.5f}, {1:8.5f}, {2:8.5f}, {3:8.5f}".format(LDRrangeA[iLDR], Etaxmean, (Etaxmax-Etaxmin)/2, (Etaxmax-Etaxmin)/2/Etaxmean))
Volker@40 2716 iLDR = -1
Volker@40 2717 print("LDR...., Etapx , (max-min)/2, relerr")
Volker@40 2718 for LDRTrue in LDRrange:
Volker@40 2719 iLDR = iLDR + 1
Volker@40 2720 Etapxmin = np.amin(aEtapx[iLDR, :])
Volker@40 2721 Etapxmax = np.amax(aEtapx[iLDR, :])
Volker@40 2722 # Etapxstd = np.std(aEtapx[iLDR, :])
Volker@40 2723 Etapxmean = np.mean(aEtapx[iLDR, :])
Volker@40 2724 # Etapxmedian = np.median(aEtapx[iLDR, :])
Volker@40 2725 print("{0:8.5f}, {1:8.5f}, {2:8.5f}, {3:8.5f}".format(LDRrangeA[iLDR], Etapxmean, (Etapxmax-Etapxmin)/2, (Etapxmax-Etapxmin)/2/Etapxmean))
Volker@40 2726 iLDR = -1
Volker@40 2727 print("LDR...., Etamx , (max-min)/2, relerr")
Volker@40 2728 for LDRTrue in LDRrange:
Volker@40 2729 iLDR = iLDR + 1
Volker@40 2730 Etamxmin = np.amin(aEtamx[iLDR, :])
Volker@40 2731 Etamxmax = np.amax(aEtamx[iLDR, :])
Volker@40 2732 # Etamxstd = np.std(aEtamx[iLDR, :])
Volker@40 2733 Etamxmean = np.mean(aEtamx[iLDR, :])
Volker@40 2734 # Etamxmedian = np.median(aEtamx[iLDR, :])
Volker@40 2735 print("{0:8.5f}, {1:8.5f}, {2:8.5f}, {3:8.5f}".format(LDRrangeA[iLDR], Etamxmean, (Etamxmax-Etamxmin)/2, (Etamxmax-Etamxmin)/2/Etamxmean))
Volker@40 2736
Volker@40 2737 f.close()
Volker@40 2738
Volker@40 2739
Volker@40 2740 '''
Volker@40 2741 # --- Plot F11 histograms
Volker@40 2742 print()
Volker@40 2743 print(" ############################################################################## ")
Volker@40 2744 print(Text1)
Volker@40 2745 print()
Volker@40 2746
Volker@40 2747 iLDR = 5
Volker@40 2748 for LDRTrue in LDRrange:
Volker@40 2749 iLDR = iLDR - 1
Volker@40 2750 #aF11corr[iLDR,:] = aF11corr[iLDR,:] / aF11corr[0,:] - 1.0
Volker@40 2751 aF11corr[iLDR,:] = aF11corr[iLDR,:] / aF11sim0[iLDR] - 1.0
Volker@40 2752 # Plot F11
Volker@40 2753 def PlotSubHistF11(aVar, aX, X0, daX, iaX, naX):
Volker@40 2754 fig, ax = plt.subplots(nrows=1, ncols=5, sharex=True, sharey=True, figsize=(25, 2))
Volker@40 2755 iLDR = -1
Volker@40 2756 for LDRTrue in LDRrange:
Volker@40 2757 iLDR = iLDR + 1
Volker@40 2758
Volker@40 2759 #F11min[iLDR] = np.min(aF11corr[iLDR,:])
Volker@40 2760 #F11max[iLDR] = np.max(aF11corr[iLDR,:])
Volker@40 2761 #Rmin = F11min[iLDR] * 0.995 # np.min(aLDRcorr[iLDR,:]) * 0.995
Volker@40 2762 #Rmax = F11max[iLDR] * 1.005 # np.max(aLDRcorr[iLDR,:]) * 1.005
Volker@40 2763
Volker@40 2764 #Rmin = 0.8
Volker@40 2765 #Rmax = 1.2
Volker@40 2766
Volker@40 2767 #plt.subplot(5,2,iLDR+1)
Volker@40 2768 plt.subplot(1,5,iLDR+1)
Volker@40 2769 (n, bins, patches) = plt.hist(aF11corr[iLDR,:],
Volker@40 2770 bins=100, log=False,
Volker@40 2771 alpha=0.5, density=False, color = '0.5', histtype='stepfilled')
Volker@40 2772
Volker@40 2773 for iaX in range(-naX,naX+1):
Volker@40 2774 plt.hist(aF11corr[iLDR,aX == iaX],
Volker@40 2775 bins=100, log=False, alpha=0.3, density=False, histtype='stepfilled', label = str(round(X0 + iaX*daX/naX,5)))
Volker@40 2776
Volker@40 2777 if (iLDR == 2): plt.legend()
Volker@40 2778
Volker@40 2779 plt.tick_params(axis='both', labelsize=9)
Volker@40 2780 #plt.plot([LDRTrue, LDRTrue], [0, np.max(n)], 'r-', lw=2)
Volker@40 2781
Volker@40 2782 #plt.title(LID + ' ' + aVar, fontsize=18)
Volker@40 2783 #plt.ylabel('frequency', fontsize=10)
Volker@40 2784 #plt.xlabel('LDRCorr', fontsize=10)
Volker@40 2785 #fig.tight_layout()
Volker@40 2786 fig.suptitle(LID + ' ' + str(Type[TypeC]) + ' ' + str(Loc[LocC]) + ' - ' + aVar, fontsize=14, y=1.05)
Volker@40 2787 #plt.show()
Volker@40 2788 #fig.savefig(LID + '_' + aVar + '.png', dpi=150, bbox_inches='tight', pad_inches=0)
Volker@40 2789 #plt.close
Volker@40 2790 return
Volker@40 2791
Volker@40 2792 if (nQin > 0): PlotSubHistF11("Qin", aQin, Qin0, dQin, iQin, nQin)
Volker@40 2793 if (nVin > 0): PlotSubHistF11("Vin", aVin, Vin0, dVin, iVin, nVin)
Volker@40 2794 if (nRotL > 0): PlotSubHistF11("RotL", aRotL, RotL0, dRotL, iRotL, nRotL)
Volker@40 2795 if (nRetE > 0): PlotSubHistF11("RetE", aRetE, RetE0, dRetE, iRetE, nRetE)
Volker@40 2796 if (nRotE > 0): PlotSubHistF11("RotE", aRotE, RotE0, dRotE, iRotE, nRotE)
Volker@40 2797 if (nDiE > 0): PlotSubHistF11("DiE", aDiE, DiE0, dDiE, iDiE, nDiE)
Volker@40 2798 if (nRetO > 0): PlotSubHistF11("RetO", aRetO, RetO0, dRetO, iRetO, nRetO)
Volker@40 2799 if (nRotO > 0): PlotSubHistF11("RotO", aRotO, RotO0, dRotO, iRotO, nRotO)
Volker@40 2800 if (nDiO > 0): PlotSubHistF11("DiO", aDiO, DiO0, dDiO, iDiO, nDiO)
Volker@40 2801 if (nDiC > 0): PlotSubHistF11("DiC", aDiC, DiC0, dDiC, iDiC, nDiC)
Volker@40 2802 if (nRotC > 0): PlotSubHistF11("RotC", aRotC, RotC0, dRotC, iRotC, nRotC)
Volker@40 2803 if (nRetC > 0): PlotSubHistF11("RetC", aRetC, RetC0, dRetC, iRetC, nRetC)
Volker@40 2804 if (nTP > 0): PlotSubHistF11("TP", aTP, TP0, dTP, iTP, nTP)
Volker@40 2805 if (nTS > 0): PlotSubHistF11("TS", aTS, TS0, dTS, iTS, nTS)
Volker@40 2806 if (nRP > 0): PlotSubHistF11("RP", aRP, RP0, dRP, iRP, nRP)
Volker@40 2807 if (nRS > 0): PlotSubHistF11("RS", aRS, RS0, dRS, iRS, nRS)
Volker@40 2808 if (nRetT > 0): PlotSubHistF11("RetT", aRetT, RetT0, dRetT, iRetT, nRetT)
Volker@40 2809 if (nRetR > 0): PlotSubHistF11("RetR", aRetR, RetR0, dRetR, iRetR, nRetR)
Volker@40 2810 if (nERaT > 0): PlotSubHistF11("ERaT", aERaT, ERaT0, dERaT, iERaT, nERaT)
Volker@40 2811 if (nERaR > 0): PlotSubHistF11("ERaR", aERaR, ERaR0, dERaR, iERaR, nERaR)
Volker@40 2812 if (nRotaT > 0): PlotSubHistF11("RotaT", aRotaT, RotaT0, dRotaT, iRotaT, nRotaT)
Volker@40 2813 if (nRotaR > 0): PlotSubHistF11("RotaR", aRotaR, RotaR0, dRotaR, iRotaR, nRotaR)
Volker@40 2814 if (nLDRCal > 0): PlotSubHistF11("LDRCal", aLDRCal, LDRCal0, dLDRCal, iLDRCal, nLDRCal)
Volker@40 2815 if (nTCalT > 0): PlotSubHistF11("TCalT", aTCalT, TCalT0, dTCalT, iTCalT, nTCalT)
Volker@40 2816 if (nTCalR > 0): PlotSubHistF11("TCalR", aTCalR, TCalR0, dTCalR, iTCalR, nTCalR)
Volker@40 2817 if (nNCal > 0): PlotSubHistF11("CalNoise", aNCal, 0, 1/nNCal, iNCal, nNCal)
Volker@40 2818 if (nNI > 0): PlotSubHistF11("SigNoise", aNI, 0, 1/nNI, iNI, nNI)
Volker@40 2819
Volker@40 2820
Volker@40 2821 plt.show()
Volker@40 2822 plt.close
Volker@40 2823
Volker@40 2824 '''
Volker@40 2825 '''
Volker@40 2826 # only histogram
Volker@40 2827 #print("******************* " + aVar + " *******************")
Volker@40 2828 fig, ax = plt.subplots(nrows=5, ncols=2, sharex=True, sharey=True, figsize=(10, 10))
Volker@40 2829 iLDR = -1
Volker@40 2830 for LDRTrue in LDRrange:
Volker@40 2831 iLDR = iLDR + 1
Volker@40 2832 LDRmin[iLDR] = np.min(aLDRcorr[iLDR,:])
Volker@40 2833 LDRmax[iLDR] = np.max(aLDRcorr[iLDR,:])
Volker@40 2834 Rmin = np.min(aLDRcorr[iLDR,:]) * 0.999
Volker@40 2835 Rmax = np.max(aLDRcorr[iLDR,:]) * 1.001
Volker@40 2836 plt.subplot(5,2,iLDR+1)
Volker@40 2837 (n, bins, patches) = plt.hist(aLDRcorr[iLDR,:],
Volker@40 2838 range=[Rmin, Rmax],
Volker@40 2839 bins=200, log=False, alpha=0.2, density=False, color = '0.5', histtype='stepfilled')
Volker@40 2840 plt.tick_params(axis='both', labelsize=9)
Volker@40 2841 plt.plot([LDRTrue, LDRTrue], [0, np.max(n)], 'r-', lw=2)
Volker@40 2842 plt.show()
Volker@40 2843 plt.close
Volker@40 2844 # --- End of Plot F11 histograms
Volker@40 2845 '''
Volker@40 2846
Volker@40 2847
Volker@40 2848 '''
Volker@40 2849 # --- Plot K over LDRCal
Volker@40 2850 fig3 = plt.figure()
Volker@40 2851 plt.plot(LDRCal0+aLDRCal*dLDRCal/nLDRCal,aGHK[4,:], linewidth=2.0, color='b')
Volker@40 2852
Volker@40 2853 plt.xlabel('LDRCal', fontsize=18)
Volker@40 2854 plt.ylabel('K', fontsize=14)
Volker@40 2855 plt.title(LID, fontsize=18)
Volker@40 2856 plt.show()
Volker@40 2857 plt.close
Volker@40 2858 '''
Volker@40 2859
Volker@40 2860 # Additional plot routines ======>
Volker@40 2861 '''
Volker@40 2862 #******************************************************************************
Volker@40 2863 # 1. Plot LDRCorrected - LDR(measured Icross/Iparallel)
Volker@40 2864 LDRa = np.arange(1.,100.)*0.005
Volker@40 2865 LDRCorra = np.arange(1.,100.)
Volker@40 2866 if Y == - 1.: LDRa = 1./LDRa
Volker@40 2867 LDRCorra = (1./Eta*LDRa*(GT+HT)-(GR+HR))/((GR-HR)-1./Eta*LDRa*(GT-HT))
Volker@40 2868 if Y == - 1.: LDRa = 1./LDRa
Volker@40 2869 #
Volker@40 2870 #fig = plt.figure()
Volker@40 2871 plt.plot(LDRa,LDRCorra-LDRa)
Volker@40 2872 plt.plot([0.,0.5],[0.,0.5])
Volker@40 2873 plt.suptitle('LDRCorrected - LDR(measured Icross/Iparallel)', fontsize=16)
Volker@40 2874 plt.xlabel('LDR', fontsize=18)
Volker@40 2875 plt.ylabel('LDRCorr - LDR', fontsize=16)
Volker@40 2876 #plt.savefig('test.png')
Volker@40 2877 #
Volker@40 2878 '''
Volker@40 2879 '''
Volker@40 2880 #******************************************************************************
Volker@40 2881 # 2. Plot LDRsim (simulated measurements without corrections = Icross/Iparallel) over LDRtrue
Volker@40 2882 LDRa = np.arange(1.,100.)*0.005
Volker@40 2883 LDRsima = np.arange(1.,100.)
Volker@40 2884
Volker@40 2885 atruea = (1.-LDRa)/(1+LDRa)
Volker@40 2886 Ita = TiT*TiO*IinL*(GT+atruea*HT)
Volker@40 2887 Ira = TiR*TiO*IinL*(GR+atruea*HR)
Volker@40 2888 LDRsima = Ira/Ita # simulated uncorrected LDR with Y from input file
Volker@40 2889 if Y == -1.: LDRsima = 1./LDRsima
Volker@40 2890 #
Volker@40 2891 #fig = plt.figure()
Volker@40 2892 plt.plot(LDRa,LDRsima)
Volker@40 2893 plt.plot([0.,0.5],[0.,0.5])
Volker@40 2894 plt.suptitle('LDRsim (simulated measurements without corrections = Icross/Iparallel) over LDRtrue', fontsize=10)
Volker@40 2895 plt.xlabel('LDRtrue', fontsize=18)
Volker@40 2896 plt.ylabel('LDRsim', fontsize=16)
Volker@40 2897 #plt.savefig('test.png')
Volker@40 2898 #
Volker@40 2899 '''

mercurial