lidar_correction_ghk.py

Mon, 14 Nov 2016 16:27:26 +0200

author
Ioannis Binietoglou <binietoglou@noa.gr>
date
Mon, 14 Nov 2016 16:27:26 +0200
changeset 8
63672c5f29ed
parent 5
9d5aa2422c02
child 9
349178d9e658
permissions
-rw-r--r--

Empty lines for testing.

ulalume3@0 1 # -*- coding: utf-8 -*-
ulalume3@0 2 """
ulalume3@0 3 Copyright 2016 Volker Freudenthaler
ulalume3@0 4
ulalume3@0 5 Licensed under the EUPL, Version 1.1 only (the "Licence").
ulalume3@0 6
ulalume3@0 7 You may not use this work except in compliance with the Licence.
ulalume3@0 8 A copy of the licence is distributed with the code. Alternatively, you may obtain
ulalume3@0 9 a copy of the Licence at:
ulalume3@0 10
ulalume3@0 11 https://joinup.ec.europa.eu/community/eupl/og_page/eupl
ulalume3@0 12
ulalume3@0 13 Unless required by applicable law or agreed to in writing, software distributed
ulalume3@0 14 under the Licence is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS
ulalume3@0 15 OF ANY KIND, either express or implied. See the Licence for the specific language governing
ulalume3@0 16 permissions and limitations under the Licence.
ulalume3@0 17
ulalume3@0 18 Equation reference: http://www.atmos-meas-tech-discuss.net/amt-2015-338/amt-2015-338.pdf
ulalume3@0 19 With equations code from Appendix C
volker@5 20 Python 3.4.2 ,
ulalume3@0 21 """
ulalume3@0 22 #!/usr/bin/env python3
ulalume3@0 23 from __future__ import print_function
ulalume3@0 24 #import math
ulalume3@0 25 import numpy as np
ulalume3@0 26 import sys
ulalume3@0 27 import os
ulalume3@0 28
ulalume3@0 29 #import seaborn as sns
ulalume3@0 30 import matplotlib.pyplot as plt
ulalume3@0 31 from time import clock
ulalume3@0 32
binietoglou@8 33
binietoglou@8 34
ulalume3@0 35 #from matplotlib.backends.backend_pdf import PdfPages
ulalume3@0 36 #pdffile = '{}.pdf'.format('path')
ulalume3@0 37 #pp = PdfPages(pdffile)
ulalume3@0 38 ## pp.savefig can be called multiple times to save to multiple pages
ulalume3@0 39 #pp.savefig()
ulalume3@0 40 #pp.close()
ulalume3@0 41
ulalume3@0 42 from contextlib import contextmanager
ulalume3@0 43 @contextmanager
ulalume3@0 44 def redirect_stdout(new_target):
ulalume3@0 45 old_target, sys.stdout = sys.stdout, new_target # replace sys.stdout
ulalume3@0 46 try:
ulalume3@0 47 yield new_target # run some code with the replaced stdout
ulalume3@0 48 finally:
ulalume3@0 49 sys.stdout.flush()
ulalume3@0 50 sys.stdout = old_target # restore to the previous value
ulalume3@0 51 '''
ulalume3@0 52 real_raw_input = vars(__builtins__).get('raw_input',input)
ulalume3@0 53 '''
ulalume3@0 54 try:
ulalume3@0 55 import __builtin__
ulalume3@0 56 input = getattr(__builtin__, 'raw_input')
ulalume3@0 57 except (ImportError, AttributeError):
ulalume3@0 58 pass
ulalume3@0 59
ulalume3@0 60 from distutils.util import strtobool
ulalume3@0 61 def user_yes_no_query(question):
ulalume3@0 62 sys.stdout.write('%s [y/n]\n' % question)
ulalume3@0 63 while True:
ulalume3@0 64 try:
ulalume3@0 65 return strtobool(input().lower())
ulalume3@0 66 except ValueError:
ulalume3@0 67 sys.stdout.write('Please respond with \'y\' or \'n\'.\n')
ulalume3@0 68
ulalume3@0 69 #if user_yes_no_query('want to exit?') == 1: sys.exit()
ulalume3@0 70
ulalume3@0 71 '''
ulalume3@0 72 ## {{{ http://code.activestate.com/recipes/577058/ (r2)
ulalume3@0 73 def query_yes_no(question, default="yes"):
ulalume3@0 74 valid = {"yes":"yes", "y":"yes", "ye":"yes",
ulalume3@0 75 "no":"no", "n":"no"}
ulalume3@0 76 if default == None:
ulalume3@0 77 prompt = " [y/n] "
ulalume3@0 78 elif default == "yes":
ulalume3@0 79 prompt = " [Y/n] "
ulalume3@0 80 elif default == "no":
ulalume3@0 81 prompt = " [y/N] "
ulalume3@0 82 else:
ulalume3@0 83 raise ValueError("invalid default answer: '%s'" % default)
ulalume3@0 84
ulalume3@0 85 while 1:
ulalume3@0 86 sys.stdout.write(question + prompt)
ulalume3@0 87 choice = input().lower()
ulalume3@0 88 if default is not None and choice == '':
ulalume3@0 89 return default
ulalume3@0 90 elif choice in valid.keys():
ulalume3@0 91 return valid[choice]
ulalume3@0 92 else:
ulalume3@0 93 sys.stdout.write("Please respond with 'yes' or 'no' "\
ulalume3@0 94 "(or 'y' or 'n').\n")
ulalume3@0 95 ## end of http://code.activestate.com/recipes/577058/ }}}
ulalume3@0 96 '''
ulalume3@0 97 abspath = os.path.abspath(__file__)
ulalume3@0 98 dname = os.path.dirname(abspath)
ulalume3@0 99 fname = os.path.basename(abspath)
ulalume3@0 100 os.chdir(dname)
ulalume3@0 101
ulalume3@0 102 #PrintToOutputFile = True
ulalume3@0 103
ulalume3@0 104 sqr05 = 0.5**0.5
ulalume3@0 105
ulalume3@0 106 # ---- Initial definition of variables; the actual values will be read in with exec(open('./optic_input.py').read()) below
ulalume3@0 107 LID = "internal"
ulalume3@0 108 EID = "internal"
ulalume3@0 109 # --- IL Laser IL and +-Uncertainty
ulalume3@0 110 bL = 1. #degree of linear polarization; default 1
ulalume3@0 111 RotL, dRotL, nRotL = 0.0, 0.0, 1 #alpha; rotation of laser polarization in degrees; default 0
ulalume3@0 112 # --- ME Emitter and +-Uncertainty
ulalume3@0 113 DiE, dDiE, nDiE = 0., 0.00, 1 # Diattenuation
ulalume3@0 114 TiE = 1. # Unpolarized transmittance
ulalume3@0 115 RetE, dRetE, nRetE = 0., 180.0, 0 # Retardance in degrees
ulalume3@0 116 RotE, dRotE, nRotE = 0., 0.0, 0 # beta: Rotation of optical element in degrees
ulalume3@0 117 # --- MO Receiver Optics including telescope
ulalume3@0 118 DiO, dDiO, nDiO = -0.055, 0.003, 1
ulalume3@0 119 TiO = 0.9
ulalume3@0 120 RetO, dRetO, nRetO = 0., 180.0, 2
ulalume3@0 121 RotO, dRotO, nRotO = 0., 0.1, 1 #gamma
ulalume3@0 122 # --- PBS MT transmitting path defined with (TS,TP); and +-Uncertainty
ulalume3@0 123 TP, dTP, nTP = 0.98, 0.02, 1
ulalume3@0 124 TS, dTS, nTS = 0.001, 0.001, 1
ulalume3@0 125 TiT = 0.5 * (TP + TS)
ulalume3@0 126 DiT = (TP-TS)/(TP+TS)
ulalume3@0 127 # PolFilter
ulalume3@0 128 RetT, dRetT, nRetT = 0., 180., 0
ulalume3@0 129 ERaT, dERaT, nERaT = 0.001, 0.001, 1
ulalume3@0 130 RotaT, dRotaT, nRotaT = 0., 3., 1
ulalume3@0 131 DaT = (1-ERaT)/(1+ERaT)
ulalume3@0 132 TaT = 0.5*(1+ERaT)
ulalume3@0 133 # --- PBS MR reflecting path defined with (RS,RP); and +-Uncertainty
ulalume3@0 134 RS, dRS, nRS = 1 - TS, 0., 0
ulalume3@0 135 RP, dRP, nRP = 1 - TP, 0., 0
ulalume3@0 136 TiR = 0.5 * (RP + RS)
ulalume3@0 137 DiR = (RP-RS)/(RP+RS)
ulalume3@0 138 # PolFilter
ulalume3@0 139 RetR, dRetR, nRetR = 0., 180., 0
ulalume3@0 140 ERaR, dERaR, nERaR = 0.001, 0.001, 1
ulalume3@0 141 RotaR,dRotaR,nRotaR = 90., 3., 1
ulalume3@0 142 DaR = (1-ERaR)/(1+ERaR)
ulalume3@0 143 TaR = 0.5*(1+ERaR)
ulalume3@0 144
ulalume3@0 145 # Parellel signal detected in the transmitted channel => Y = 1, or in the reflected channel => Y = -1
ulalume3@0 146 Y = -1.
ulalume3@0 147
ulalume3@0 148 # Calibrator = type defined by matrix values
ulalume3@0 149 LocC = 4 # location of calibrator: behind laser = 1; behind emitter = 2; before receiver = 3; before PBS = 4
ulalume3@0 150
ulalume3@0 151 TypeC = 3 # linear polarizer calibrator
ulalume3@0 152 # example with extinction ratio 0.001
ulalume3@0 153 DiC, dDiC, nDiC = 1.0, 0., 0 # ideal 1.0
ulalume3@0 154 TiC = 0.5 # ideal 0.5
ulalume3@0 155 RetC, dRetC, nRetC = 0., 0., 0
ulalume3@0 156 RotC, dRotC, nRotC = 0.0, 0.1, 0 #constant calibrator offset epsilon
ulalume3@0 157 RotationErrorEpsilonForNormalMeasurements = False # is in general False for TypeC == 3 calibrator
ulalume3@0 158
ulalume3@0 159 # Rotation error without calibrator: if False, then epsilon = 0 for normal measurements
ulalume3@0 160 RotationErrorEpsilonForNormalMeasurements = True
ulalume3@0 161
ulalume3@0 162 # LDRCal assumed atmospheric linear depolarization ratio during the calibration measurements (first guess)
ulalume3@0 163 LDRCal0,dLDRCal,nLDRCal= 0.25, 0.04, 1
ulalume3@0 164 LDRCal = LDRCal0
ulalume3@0 165 # measured LDRm will be corrected with calculated parameters
ulalume3@0 166 LDRmeas = 0.015
ulalume3@0 167 # LDRtrue for simulation of measurement => LDRsim
ulalume3@0 168 LDRtrue = 0.5
ulalume3@0 169 LDRtrue2 = 0.004
ulalume3@0 170
ulalume3@0 171 # Initialize other values to 0
ulalume3@0 172 ER, nER, dER = 0.001, 0, 0.001
ulalume3@0 173 K = 0.
ulalume3@0 174 Km = 0.
ulalume3@0 175 Kp = 0.
ulalume3@0 176 LDRcorr = 0.
ulalume3@0 177 Eta = 0.
ulalume3@0 178 Ir = 0.
ulalume3@0 179 It = 0.
ulalume3@0 180 h = 1.
ulalume3@0 181
ulalume3@0 182 Loc = ['', 'behind laser', 'behind emitter', 'before receiver', 'before PBS']
ulalume3@0 183 Type = ['', 'mechanical rotator', 'hwp rotator', 'linear polarizer', 'qwp rotator', 'circular polarizer', 'real HWP +-22.5°']
ulalume3@0 184 dY = ['reflected channel', '', 'transmitted channel']
ulalume3@0 185
ulalume3@0 186 # end of initial definition of variables
ulalume3@0 187 # *******************************************************************************************************************************
ulalume3@0 188
ulalume3@0 189 # --- Read actual lidar system parameters from ./optic_input.py (must be in the same directory)
ulalume3@0 190
ulalume3@0 191 #InputFile = 'optic_input_ver6e_POLIS_355.py'
ulalume3@0 192 #InputFile = 'optic_input_ver6e_POLIS_355_JA.py'
ulalume3@0 193 #InputFile = 'optic_input_ver6c_POLIS_532.py'
ulalume3@0 194 #InputFile = 'optic_input_ver6e_POLIS_532.py'
ulalume3@0 195 #InputFile = 'optic_input_ver8c_POLIS_532.py'
ulalume3@0 196 #InputFile = 'optic_input_ver6e_MUSA.py'
ulalume3@0 197 #InputFile = 'optic_input_ver6e_MUSA_JA.py'
ulalume3@0 198 #InputFile = 'optic_input_ver6e_PollyXTSea.py'
ulalume3@0 199 #InputFile = 'optic_input_ver6e_PollyXTSea_JA.py'
ulalume3@0 200 #InputFile = 'optic_input_ver6e_PollyXT_RALPH.py'
ulalume3@0 201 #InputFile = 'optic_input_ver8c_PollyXT_RALPH.py'
ulalume3@0 202 #InputFile = 'optic_input_ver8c_PollyXT_RALPH_2.py'
ulalume3@0 203 #InputFile = 'optic_input_ver8c_PollyXT_RALPH_3.py'
ulalume3@0 204 #InputFile = 'optic_input_ver8c_PollyXT_RALPH_4.py'
ulalume3@0 205 #InputFile = 'optic_input_ver8c_PollyXT_RALPH_5.py'
ulalume3@0 206 #InputFile = 'optic_input_ver8c_PollyXT_RALPH_6.py'
ulalume3@0 207 InputFile = 'optic_input_ver8c_PollyXT_RALPH_7.py'
ulalume3@0 208 #InputFile = 'optic_input_ver8a_MOHP_DPL_355.py'
ulalume3@0 209 #InputFile = 'optic_input_ver9_MOHP_DPL_355.py'
ulalume3@0 210 #InputFile = 'optic_input_ver6e_RALI.py'
ulalume3@0 211 #InputFile = 'optic_input_ver6e_RALI_JA.py'
ulalume3@0 212 #InputFile = 'optic_input_ver6e_RALI_new.py'
ulalume3@0 213 #InputFile = 'optic_input_ver6e_RALI_act.py'
ulalume3@0 214 #InputFile = 'optic_input_ver6e_MULHACEN.py'
ulalume3@0 215 #InputFile = 'optic_input_ver6e_MULHACEN_JA.py'
ulalume3@0 216 #InputFile = 'optic_input_ver6e-IPRAL.py'
ulalume3@0 217 #InputFile = 'optic_input_ver6e-IPRAL_JA.py'
ulalume3@0 218 #InputFile = 'optic_input_ver6e-LB21.py'
ulalume3@0 219 #InputFile = 'optic_input_ver6e-LB21_JA.py'
ulalume3@0 220 #InputFile = 'optic_input_ver6e_Bertha_b_355.py'
ulalume3@0 221 #InputFile = 'optic_input_ver6e_Bertha_b_532.py'
ulalume3@0 222 #InputFile = 'optic_input_ver6e_Bertha_b_1064.py'
ulalume3@0 223
ulalume3@0 224 '''
ulalume3@0 225 print("From ", dname)
ulalume3@0 226 print("Running ", fname)
ulalume3@0 227 print("Reading input file ", InputFile, " for")
ulalume3@0 228 '''
ulalume3@0 229 input_path = os.path.join('.', 'system_settings', InputFile)
ulalume3@0 230 # this works with Python 2 - and 3?
ulalume3@0 231 exec(open(input_path).read(), globals())
ulalume3@0 232 # end of read actual system parameters
ulalume3@0 233
ulalume3@0 234 # --- Manual Parameter Change ---
ulalume3@0 235 # (use for quick parameter changes without changing the input file )
ulalume3@0 236 #DiO = 0.
ulalume3@0 237 #LDRtrue = 0.45
ulalume3@0 238 #LDRtrue2 = 0.004
ulalume3@0 239 #Y = -1
ulalume3@0 240 #LocC = 4 #location of calibrator: 1 = behind laser; 2 = behind emitter; 3 = before receiver; 4 = before PBS
ulalume3@0 241 ##TypeC = 6 Don't change the TypeC here
ulalume3@0 242 #RotationErrorEpsilonForNormalMeasurements = True
ulalume3@0 243 #LDRCal = 0.25
ulalume3@0 244 #bL = 0.8
ulalume3@0 245 ## --- Errors
ulalume3@0 246 RotL0, dRotL, nRotL = RotL, dRotL, nRotL
ulalume3@0 247
ulalume3@0 248 DiE0, dDiE, nDiE = DiE, dDiE, nDiE
ulalume3@0 249 RetE0, dRetE, nRetE = RetE, dRetE, nRetE
ulalume3@0 250 RotE0, dRotE, nRotE = RotE, dRotE, nRotE
ulalume3@0 251
ulalume3@0 252 DiO0, dDiO, nDiO = DiO, dDiO, nDiO
ulalume3@0 253 RetO0, dRetO, nRetO = RetO, dRetO, nRetO
ulalume3@0 254 RotO0, dRotO, nRotO = RotO, dRotO, nRotO
ulalume3@0 255
ulalume3@0 256 DiC0, dDiC, nDiC = DiC, dDiC, nDiC
ulalume3@0 257 RetC0, dRetC, nRetC = RetC, dRetC, nRetC
ulalume3@0 258 RotC0, dRotC, nRotC = RotC, dRotC, nRotC
ulalume3@0 259
ulalume3@0 260 TP0, dTP, nTP = TP, dTP, nTP
ulalume3@0 261 TS0, dTS, nTS = TS, dTS, nTS
ulalume3@0 262 RetT0, dRetT, nRetT = RetT, dRetT, nRetT
ulalume3@0 263
ulalume3@0 264 ERaT0, dERaT, nERaT = ERaT, dERaT, nERaT
ulalume3@0 265 RotaT0,dRotaT,nRotaT= RotaT,dRotaT,nRotaT
ulalume3@0 266
ulalume3@0 267 RP0, dRP, nRP = RP, dRP, nRP
ulalume3@0 268 RS0, dRS, nRS = RS, dRS, nRS
ulalume3@0 269 RetR0, dRetR, nRetR = RetR, dRetR, nRetR
ulalume3@0 270
ulalume3@0 271 ERaR0, dERaR, nERaR = ERaR, dERaR, nERaR
ulalume3@0 272 RotaR0,dRotaR,nRotaR= RotaR,dRotaR,nRotaR
ulalume3@0 273
ulalume3@0 274 LDRCal0,dLDRCal,nLDRCal=LDRCal,dLDRCal,nLDRCal
ulalume3@0 275 #LDRCal0,dLDRCal,nLDRCal=LDRCal,dLDRCal,0
ulalume3@0 276 # ---------- End of manual parameter change
ulalume3@0 277
ulalume3@0 278 RotL, RotE, RetE, DiE, RotO, RetO, DiO, RotC, RetC, DiC = RotL0, RotE0, RetE0, DiE0, RotO0, RetO0, DiO0, RotC0, RetC0, DiC0
ulalume3@0 279 TP, TS, RP, RS, ERaT, RotaT, RetT, ERaR, RotaR, RetR = TP0, TS0, RP0, RS0 , ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0
ulalume3@0 280 LDRCal = LDRCal0
ulalume3@0 281 DTa0, TTa0, DRa0, TRa0, LDRsimx, LDRCorr = 0,0,0,0,0,0
ulalume3@0 282
ulalume3@0 283 TiT = 0.5 * (TP + TS)
ulalume3@0 284 DiT = (TP-TS)/(TP+TS)
ulalume3@0 285 ZiT = (1. - DiT**2)**0.5
ulalume3@0 286 TiR = 0.5 * (RP + RS)
ulalume3@0 287 DiR = (RP-RS)/(RP+RS)
ulalume3@0 288 ZiR = (1. - DiR**2)**0.5
ulalume3@0 289
ulalume3@0 290 # --------------------------------------------------------
ulalume3@0 291 def Calc(RotL, RotE, RetE, DiE, RotO, RetO, DiO, RotC, RetC, DiC, TP, TS, RP, RS, ERaT, RotaT, RetT, ERaR, RotaR, RetR, LDRCal):
ulalume3@0 292 # ---- Do the calculations of bra-ket vectors
ulalume3@0 293 h = -1. if TypeC == 2 else 1
ulalume3@0 294 # from input file: assumed LDRCal for calibration measurements
ulalume3@0 295 aCal = (1.-LDRCal)/(1+LDRCal)
ulalume3@0 296 # from input file: measured LDRm and true LDRtrue, LDRtrue2 =>
ulalume3@0 297 #ameas = (1.-LDRmeas)/(1+LDRmeas)
ulalume3@0 298 atrue = (1.-LDRtrue)/(1+LDRtrue)
ulalume3@0 299 #atrue2 = (1.-LDRtrue2)/(1+LDRtrue2)
ulalume3@0 300
ulalume3@0 301 # angles of emitter and laser and calibrator and receiver optics
ulalume3@0 302 # RotL = alpha, RotE = beta, RotO = gamma, RotC = epsilon
ulalume3@0 303 S2a = np.sin(2*np.deg2rad(RotL))
ulalume3@0 304 C2a = np.cos(2*np.deg2rad(RotL))
ulalume3@0 305 S2b = np.sin(2*np.deg2rad(RotE))
ulalume3@0 306 C2b = np.cos(2*np.deg2rad(RotE))
ulalume3@0 307 S2ab = np.sin(np.deg2rad(2*RotL-2*RotE))
ulalume3@0 308 C2ab = np.cos(np.deg2rad(2*RotL-2*RotE))
ulalume3@0 309 S2g = np.sin(np.deg2rad(2*RotO))
ulalume3@0 310 C2g = np.cos(np.deg2rad(2*RotO))
ulalume3@0 311
ulalume3@0 312 # Laser with Degree of linear polarization DOLP = bL
ulalume3@0 313 IinL = 1.
ulalume3@0 314 QinL = bL
ulalume3@0 315 UinL = 0.
ulalume3@0 316 VinL = (1. - bL**2)**0.5
ulalume3@0 317
ulalume3@0 318 # Stokes Input Vector rotation Eq. E.4
ulalume3@0 319 A = C2a*QinL - S2a*UinL
ulalume3@0 320 B = S2a*QinL + C2a*UinL
ulalume3@0 321 # Stokes Input Vector rotation Eq. E.9
ulalume3@0 322 C = C2ab*QinL - S2ab*UinL
ulalume3@0 323 D = S2ab*QinL + C2ab*UinL
ulalume3@0 324
ulalume3@0 325 # emitter optics
ulalume3@0 326 CosE = np.cos(np.deg2rad(RetE))
ulalume3@0 327 SinE = np.sin(np.deg2rad(RetE))
ulalume3@0 328 ZiE = (1. - DiE**2)**0.5
ulalume3@0 329 WiE = (1. - ZiE*CosE)
ulalume3@0 330
ulalume3@0 331 # Stokes Input Vector after emitter optics equivalent to Eq. E.9 with already rotated input vector from Eq. E.4
ulalume3@0 332 # b = beta
ulalume3@0 333 IinE = (IinL + DiE*C)
ulalume3@0 334 QinE = (C2b*DiE*IinL + A + S2b*(WiE*D - ZiE*SinE*VinL))
ulalume3@0 335 UinE = (S2b*DiE*IinL + B - C2b*(WiE*D - ZiE*SinE*VinL))
ulalume3@0 336 VinE = (-ZiE*SinE*D + ZiE*CosE*VinL)
ulalume3@0 337
ulalume3@0 338 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
ulalume3@0 339 IinF = IinE
ulalume3@0 340 QinF = aCal*QinE
ulalume3@0 341 UinF = -aCal*UinE
ulalume3@0 342 VinF = (1.-2.*aCal)*VinE
ulalume3@0 343
ulalume3@0 344 # receiver optics
ulalume3@0 345 CosO = np.cos(np.deg2rad(RetO))
ulalume3@0 346 SinO = np.sin(np.deg2rad(RetO))
ulalume3@0 347 ZiO = (1. - DiO**2)**0.5
ulalume3@0 348 WiO = (1. - ZiO*CosO)
ulalume3@0 349
ulalume3@0 350 # calibrator
ulalume3@0 351 CosC = np.cos(np.deg2rad(RetC))
ulalume3@0 352 SinC = np.sin(np.deg2rad(RetC))
ulalume3@0 353 ZiC = (1. - DiC**2)**0.5
ulalume3@0 354 WiC = (1. - ZiC*CosC)
ulalume3@0 355
ulalume3@0 356 # Stokes Input Vector before the polarising beam splitter Eq. E.31
ulalume3@0 357 A = C2g*QinE - S2g*UinE
ulalume3@0 358 B = S2g*QinE + C2g*UinE
ulalume3@0 359
ulalume3@0 360 IinP = (IinE + DiO*aCal*A)
ulalume3@0 361 QinP = (C2g*DiO*IinE + aCal*QinE - S2g*(WiO*aCal*B + ZiO*SinO*(1-2*aCal)*VinE))
ulalume3@0 362 UinP = (S2g*DiO*IinE - aCal*UinE + C2g*(WiO*aCal*B + ZiO*SinO*(1-2*aCal)*VinE))
ulalume3@0 363 VinP = (ZiO*SinO*aCal*B + ZiO*CosO*(1-2*aCal)*VinE)
ulalume3@0 364
ulalume3@0 365 #-------------------------
ulalume3@0 366 # F11 assuemd to be = 1 => measured: F11m = IinP / IinE with atrue
ulalume3@0 367 #F11sim = TiO*(IinE + DiO*atrue*A)/IinE
ulalume3@0 368 #-------------------------
ulalume3@0 369
ulalume3@0 370 # For PollyXT
ulalume3@0 371 # analyser
ulalume3@0 372 #RS = 1 - TS
ulalume3@0 373 #RP = 1 - TP
ulalume3@0 374
ulalume3@0 375 TiT = 0.5 * (TP + TS)
ulalume3@0 376 DiT = (TP-TS)/(TP+TS)
ulalume3@0 377 ZiT = (1. - DiT**2)**0.5
ulalume3@0 378 TiR = 0.5 * (RP + RS)
ulalume3@0 379 DiR = (RP-RS)/(RP+RS)
ulalume3@0 380 ZiR = (1. - DiR**2)**0.5
ulalume3@0 381 CosT = np.cos(np.deg2rad(RetT))
ulalume3@0 382 SinT = np.sin(np.deg2rad(RetT))
ulalume3@0 383 CosR = np.cos(np.deg2rad(RetR))
ulalume3@0 384 SinR = np.sin(np.deg2rad(RetR))
ulalume3@0 385
ulalume3@0 386 DaT = (1-ERaT)/(1+ERaT)
ulalume3@0 387 DaR = (1-ERaR)/(1+ERaR)
ulalume3@0 388 TaT = 0.5*(1+ERaT)
ulalume3@0 389 TaR = 0.5*(1+ERaR)
ulalume3@0 390
ulalume3@0 391 S2aT = np.sin(np.deg2rad(h*2*RotaT))
ulalume3@0 392 C2aT = np.cos(np.deg2rad(2*RotaT))
ulalume3@0 393 S2aR = np.sin(np.deg2rad(h*2*RotaR))
ulalume3@0 394 C2aR = np.cos(np.deg2rad(2*RotaR))
ulalume3@0 395
ulalume3@0 396 # Aanalyzer As before the PBS Eq. D.5
ulalume3@0 397 ATP1 = (1+C2aT*DaT*DiT)
ulalume3@0 398 ATP2 = Y*(DiT+C2aT*DaT)
ulalume3@0 399 ATP3 = Y*S2aT*DaT*ZiT*CosT
ulalume3@0 400 ATP4 = S2aT*DaT*ZiT*SinT
ulalume3@0 401 ATP = np.array([ATP1,ATP2,ATP3,ATP4])
ulalume3@0 402
ulalume3@0 403 ARP1 = (1+C2aR*DaR*DiR)
ulalume3@0 404 ARP2 = Y*(DiR+C2aR*DaR)
ulalume3@0 405 ARP3 = Y*S2aR*DaR*ZiR*CosR
ulalume3@0 406 ARP4 = S2aR*DaR*ZiR*SinR
ulalume3@0 407 ARP = np.array([ARP1,ARP2,ARP3,ARP4])
ulalume3@0 408
ulalume3@0 409 DTa = ATP2*Y/ATP1
ulalume3@0 410 DRa = ARP2*Y/ARP1
ulalume3@0 411
ulalume3@0 412 # ---- Calculate signals and correction parameters for diffeent locations and calibrators
ulalume3@0 413 if LocC == 4: # Calibrator before the PBS
ulalume3@0 414 #print("Calibrator location not implemented yet")
ulalume3@0 415
ulalume3@0 416 #S2ge = np.sin(np.deg2rad(2*RotO + h*2*RotC))
ulalume3@0 417 #C2ge = np.cos(np.deg2rad(2*RotO + h*2*RotC))
ulalume3@0 418 S2e = np.sin(np.deg2rad(h*2*RotC))
ulalume3@0 419 C2e = np.cos(np.deg2rad(2*RotC))
ulalume3@0 420 # rotated AinP by epsilon Eq. C.3
ulalume3@0 421 ATP2e = C2e*ATP2 + S2e*ATP3
ulalume3@0 422 ATP3e = C2e*ATP3 - S2e*ATP2
ulalume3@0 423 ARP2e = C2e*ARP2 + S2e*ARP3
ulalume3@0 424 ARP3e = C2e*ARP3 - S2e*ARP2
ulalume3@0 425 ATPe = np.array([ATP1,ATP2e,ATP3e,ATP4])
ulalume3@0 426 ARPe = np.array([ARP1,ARP2e,ARP3e,ARP4])
ulalume3@0 427 # Stokes Input Vector before the polarising beam splitter Eq. E.31
ulalume3@0 428 A = C2g*QinE - S2g*UinE
ulalume3@0 429 B = S2g*QinE + C2g*UinE
ulalume3@0 430 #C = (WiO*aCal*B + ZiO*SinO*(1-2*aCal)*VinE)
ulalume3@0 431 Co = ZiO*SinO*VinE
ulalume3@0 432 Ca = (WiO*B - 2*ZiO*SinO*VinE)
ulalume3@0 433 #C = Co + aCal*Ca
ulalume3@0 434 #IinP = (IinE + DiO*aCal*A)
ulalume3@0 435 #QinP = (C2g*DiO*IinE + aCal*QinE - S2g*C)
ulalume3@0 436 #UinP = (S2g*DiO*IinE - aCal*UinE + C2g*C)
ulalume3@0 437 #VinP = (ZiO*SinO*aCal*B + ZiO*CosO*(1-2*aCal)*VinE)
ulalume3@0 438 IinPo = IinE
ulalume3@0 439 QinPo = (C2g*DiO*IinE - S2g*Co)
ulalume3@0 440 UinPo = (S2g*DiO*IinE + C2g*Co)
ulalume3@0 441 VinPo = ZiO*CosO*VinE
ulalume3@0 442
ulalume3@0 443 IinPa = DiO*A
ulalume3@0 444 QinPa = QinE - S2g*Ca
ulalume3@0 445 UinPa = -UinE + C2g*Ca
ulalume3@0 446 VinPa = ZiO*(SinO*B - 2*CosO*VinE)
ulalume3@0 447
ulalume3@0 448 IinP = IinPo + aCal*IinPa
ulalume3@0 449 QinP = QinPo + aCal*QinPa
ulalume3@0 450 UinP = UinPo + aCal*UinPa
ulalume3@0 451 VinP = VinPo + aCal*VinPa
ulalume3@0 452 # Stokes Input Vector before the polarising beam splitter rotated by epsilon Eq. C.3
ulalume3@0 453 #QinPe = C2e*QinP + S2e*UinP
ulalume3@0 454 #UinPe = C2e*UinP - S2e*QinP
ulalume3@0 455 QinPoe = C2e*QinPo + S2e*UinPo
ulalume3@0 456 UinPoe = C2e*UinPo - S2e*QinPo
ulalume3@0 457 QinPae = C2e*QinPa + S2e*UinPa
ulalume3@0 458 UinPae = C2e*UinPa - S2e*QinPa
ulalume3@0 459 QinPe = C2e*QinP + S2e*UinP
ulalume3@0 460 UinPe = C2e*UinP - S2e*QinP
ulalume3@0 461
ulalume3@0 462 # Calibration signals and Calibration correction K from measurements with LDRCal / aCal
ulalume3@0 463 if (TypeC == 2) or (TypeC == 1): # rotator calibration Eq. C.4
ulalume3@0 464 # parameters for calibration with aCal
ulalume3@0 465 AT = ATP1*IinP + h*ATP4*VinP
ulalume3@0 466 BT = ATP3e*QinP - h*ATP2e*UinP
ulalume3@0 467 AR = ARP1*IinP + h*ARP4*VinP
ulalume3@0 468 BR = ARP3e*QinP - h*ARP2e*UinP
ulalume3@0 469 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 470 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 471 IS1 = np.array([IinPo,QinPo,UinPo,VinPo])
ulalume3@0 472 IS2 = np.array([IinPa,QinPa,UinPa,VinPa])
ulalume3@0 473 GT = np.dot(ATP,IS1)
ulalume3@0 474 GR = np.dot(ARP,IS1)
ulalume3@0 475 HT = np.dot(ATP,IS2)
ulalume3@0 476 HR = np.dot(ARP,IS2)
ulalume3@0 477 else:
ulalume3@0 478 IS1 = np.array([IinPo,QinPo,UinPo,VinPo])
ulalume3@0 479 IS2 = np.array([IinPa,QinPa,UinPa,VinPa])
ulalume3@0 480 GT = np.dot(ATPe,IS1)
ulalume3@0 481 GR = np.dot(ARPe,IS1)
ulalume3@0 482 HT = np.dot(ATPe,IS2)
ulalume3@0 483 HR = np.dot(ARPe,IS2)
ulalume3@0 484 elif (TypeC == 3) or (TypeC == 4): # linear polariser calibration Eq. C.5
ulalume3@0 485 # parameters for calibration with aCal
ulalume3@0 486 AT = ATP1*IinP + ATP3e*UinPe + ZiC*CosC*(ATP2e*QinPe + ATP4*VinP)
ulalume3@0 487 BT = DiC*(ATP1*UinPe + ATP3e*IinP) - ZiC*SinC*(ATP2e*VinP - ATP4*QinPe)
ulalume3@0 488 AR = ARP1*IinP + ARP3e*UinPe + ZiC*CosC*(ARP2e*QinPe + ARP4*VinP)
ulalume3@0 489 BR = DiC*(ARP1*UinPe + ARP3e*IinP) - ZiC*SinC*(ARP2e*VinP - ARP4*QinPe)
ulalume3@0 490 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 491 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 492 IS1 = np.array([IinPo,QinPo,UinPo,VinPo])
ulalume3@0 493 IS2 = np.array([IinPa,QinPa,UinPa,VinPa])
ulalume3@0 494 GT = np.dot(ATP,IS1)
ulalume3@0 495 GR = np.dot(ARP,IS1)
ulalume3@0 496 HT = np.dot(ATP,IS2)
ulalume3@0 497 HR = np.dot(ARP,IS2)
ulalume3@0 498 else:
ulalume3@0 499 IS1e = np.array([IinPo+DiC*QinPoe,DiC*IinPo+QinPoe,ZiC*(CosC*UinPoe+SinC*VinPo),-ZiC*(SinC*UinPoe-CosC*VinPo)])
ulalume3@0 500 IS2e = np.array([IinPa+DiC*QinPae,DiC*IinPa+QinPae,ZiC*(CosC*UinPae+SinC*VinPa),-ZiC*(SinC*UinPae-CosC*VinPa)])
ulalume3@0 501 GT = np.dot(ATPe,IS1e)
ulalume3@0 502 GR = np.dot(ARPe,IS1e)
ulalume3@0 503 HT = np.dot(ATPe,IS2e)
ulalume3@0 504 HR = np.dot(ARPe,IS2e)
ulalume3@0 505 elif (TypeC == 6): # diattenuator calibration +-22.5° rotated_diattenuator_X22x5deg.odt
ulalume3@0 506 # parameters for calibration with aCal
ulalume3@0 507 AT = ATP1*IinP + sqr05*DiC*(ATP1*QinPe + ATP2e*IinP) + (1-0.5*WiC)*(ATP2e*QinPe + ATP3e*UinPe) + ZiC*(sqr05*SinC*(ATP3e*VinP-ATP4*UinPe) + ATP4*CosC*VinP)
ulalume3@0 508 BT = sqr05*DiC*(ATP1*UinPe + ATP3e*IinP) + 0.5*WiC*(ATP2e*UinPe + ATP3e*QinPe) - sqr05*ZiC*SinC*(ATP2e*VinP - ATP4*QinPe)
ulalume3@0 509 AR = ARP1*IinP + sqr05*DiC*(ARP1*QinPe + ARP2e*IinP) + (1-0.5*WiC)*(ARP2e*QinPe + ARP3e*UinPe) + ZiC*(sqr05*SinC*(ARP3e*VinP-ARP4*UinPe) + ARP4*CosC*VinP)
ulalume3@0 510 BR = sqr05*DiC*(ARP1*UinPe + ARP3e*IinP) + 0.5*WiC*(ARP2e*UinPe + ARP3e*QinPe) - sqr05*ZiC*SinC*(ARP2e*VinP - ARP4*QinPe)
ulalume3@0 511 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 512 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 513 IS1 = np.array([IinPo,QinPo,UinPo,VinPo])
ulalume3@0 514 IS2 = np.array([IinPa,QinPa,UinPa,VinPa])
ulalume3@0 515 GT = np.dot(ATP,IS1)
ulalume3@0 516 GR = np.dot(ARP,IS1)
ulalume3@0 517 HT = np.dot(ATP,IS2)
ulalume3@0 518 HR = np.dot(ARP,IS2)
ulalume3@0 519 else:
ulalume3@0 520 IS1e = np.array([IinPo+DiC*QinPoe,DiC*IinPo+QinPoe,ZiC*(CosC*UinPoe+SinC*VinPo),-ZiC*(SinC*UinPoe-CosC*VinPo)])
ulalume3@0 521 IS2e = np.array([IinPa+DiC*QinPae,DiC*IinPa+QinPae,ZiC*(CosC*UinPae+SinC*VinPa),-ZiC*(SinC*UinPae-CosC*VinPa)])
ulalume3@0 522 GT = np.dot(ATPe,IS1e)
ulalume3@0 523 GR = np.dot(ARPe,IS1e)
ulalume3@0 524 HT = np.dot(ATPe,IS2e)
ulalume3@0 525 HR = np.dot(ARPe,IS2e)
ulalume3@0 526 else:
ulalume3@0 527 print("Calibrator not implemented yet")
ulalume3@0 528 sys.exit()
ulalume3@0 529
ulalume3@0 530 elif LocC == 3: # C before receiver optics Eq.57
ulalume3@0 531
ulalume3@0 532 #S2ge = np.sin(np.deg2rad(2*RotO - 2*RotC))
ulalume3@0 533 #C2ge = np.cos(np.deg2rad(2*RotO - 2*RotC))
ulalume3@0 534 S2e = np.sin(np.deg2rad(2*RotC))
ulalume3@0 535 C2e = np.cos(np.deg2rad(2*RotC))
ulalume3@0 536
ulalume3@0 537 # As with C before the receiver optics (rotated_diattenuator_X22x5deg.odt)
ulalume3@0 538 AF1 = np.array([1,C2g*DiO,S2g*DiO,0])
ulalume3@0 539 AF2 = np.array([C2g*DiO,1-S2g**2*WiO,S2g*C2g*WiO,-S2g*ZiO*SinO])
ulalume3@0 540 AF3 = np.array([S2g*DiO,S2g*C2g*WiO,1-C2g**2*WiO,C2g*ZiO*SinO])
ulalume3@0 541 AF4 = np.array([0,S2g*SinO,-C2g*SinO,CosO])
ulalume3@0 542
ulalume3@0 543 ATF = (ATP1*AF1+ATP2*AF2+ATP3*AF3+ATP4*AF4)
ulalume3@0 544 ARF = (ARP1*AF1+ARP2*AF2+ARP3*AF3+ARP4*AF4)
ulalume3@0 545 ATF2 = ATF[1]
ulalume3@0 546 ATF3 = ATF[2]
ulalume3@0 547 ARF2 = ARF[1]
ulalume3@0 548 ARF3 = ARF[2]
ulalume3@0 549
ulalume3@0 550 # rotated AinF by epsilon
ulalume3@0 551 ATF1 = ATF[0]
ulalume3@0 552 ATF4 = ATF[3]
ulalume3@0 553 ATF2e = C2e*ATF[1] + S2e*ATF[2]
ulalume3@0 554 ATF3e = C2e*ATF[2] - S2e*ATF[1]
ulalume3@0 555 ARF1 = ARF[0]
ulalume3@0 556 ARF4 = ARF[3]
ulalume3@0 557 ARF2e = C2e*ARF[1] + S2e*ARF[2]
ulalume3@0 558 ARF3e = C2e*ARF[2] - S2e*ARF[1]
ulalume3@0 559
ulalume3@0 560 ATFe = np.array([ATF1,ATF2e,ATF3e,ATF4])
ulalume3@0 561 ARFe = np.array([ARF1,ARF2e,ARF3e,ARF4])
ulalume3@0 562
ulalume3@0 563 QinEe = C2e*QinE + S2e*UinE
ulalume3@0 564 UinEe = C2e*UinE - S2e*QinE
ulalume3@0 565
ulalume3@0 566 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
ulalume3@0 567 IinF = IinE
ulalume3@0 568 QinF = aCal*QinE
ulalume3@0 569 UinF = -aCal*UinE
ulalume3@0 570 VinF = (1.-2.*aCal)*VinE
ulalume3@0 571
ulalume3@0 572 IinFo = IinE
ulalume3@0 573 QinFo = 0.
ulalume3@0 574 UinFo = 0.
ulalume3@0 575 VinFo = VinE
ulalume3@0 576
ulalume3@0 577 IinFa = 0.
ulalume3@0 578 QinFa = QinE
ulalume3@0 579 UinFa = -UinE
ulalume3@0 580 VinFa = -2.*VinE
ulalume3@0 581
ulalume3@0 582 # Stokes Input Vector before receiver optics rotated by epsilon Eq. C.3
ulalume3@0 583 QinFe = C2e*QinF + S2e*UinF
ulalume3@0 584 UinFe = C2e*UinF - S2e*QinF
ulalume3@0 585 QinFoe = C2e*QinFo + S2e*UinFo
ulalume3@0 586 UinFoe = C2e*UinFo - S2e*QinFo
ulalume3@0 587 QinFae = C2e*QinFa + S2e*UinFa
ulalume3@0 588 UinFae = C2e*UinFa - S2e*QinFa
ulalume3@0 589
ulalume3@0 590 # Calibration signals and Calibration correction K from measurements with LDRCal / aCal
ulalume3@0 591 if (TypeC == 2) or (TypeC == 1): # rotator calibration Eq. C.4
ulalume3@0 592 # parameters for calibration with aCal
ulalume3@0 593 AT = ATF1*IinF + ATF4*h*VinF
ulalume3@0 594 BT = ATF3e*QinF - ATF2e*h*UinF
ulalume3@0 595 AR = ARF1*IinF + ARF4*h*VinF
ulalume3@0 596 BR = ARF3e*QinF - ARF2e*h*UinF
ulalume3@0 597 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 598 if (not RotationErrorEpsilonForNormalMeasurements):
ulalume3@0 599 GT = ATF1*IinE + ATF4*VinE
ulalume3@0 600 GR = ARF1*IinE + ARF4*VinE
ulalume3@0 601 HT = ATF2*QinE - ATF3*UinE - ATF4*2*VinE
ulalume3@0 602 HR = ARF2*QinE - ARF3*UinE - ARF4*2*VinE
ulalume3@0 603 else:
ulalume3@0 604 GT = ATF1*IinE + ATF4*h*VinE
ulalume3@0 605 GR = ARF1*IinE + ARF4*h*VinE
ulalume3@0 606 HT = ATF2e*QinE - ATF3e*h*UinE - ATF4*h*2*VinE
ulalume3@0 607 HR = ARF2e*QinE - ARF3e*h*UinE - ARF4*h*2*VinE
ulalume3@0 608 elif (TypeC == 3) or (TypeC == 4): # linear polariser calibration Eq. C.5
ulalume3@0 609 # p = +45°, m = -45°
ulalume3@0 610 IF1e = np.array([IinF, ZiC*CosC*QinFe, UinFe, ZiC*CosC*VinF])
ulalume3@0 611 IF2e = np.array([DiC*UinFe, -ZiC*SinC*VinF, DiC*IinF, ZiC*SinC*QinFe])
ulalume3@0 612 AT = np.dot(ATFe,IF1e)
ulalume3@0 613 AR = np.dot(ARFe,IF1e)
ulalume3@0 614 BT = np.dot(ATFe,IF2e)
ulalume3@0 615 BR = np.dot(ARFe,IF2e)
ulalume3@0 616
ulalume3@0 617 # Correction paremeters for normal measurements; they are independent of LDR --- the same as for TypeC = 6
ulalume3@0 618 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 619 IS1 = np.array([IinE,0,0,VinE])
ulalume3@0 620 IS2 = np.array([0,QinE,-UinE,-2*VinE])
ulalume3@0 621 GT = np.dot(ATF,IS1)
ulalume3@0 622 GR = np.dot(ARF,IS1)
ulalume3@0 623 HT = np.dot(ATF,IS2)
ulalume3@0 624 HR = np.dot(ARF,IS2)
ulalume3@0 625 else:
ulalume3@0 626 IS1e = np.array([IinFo+DiC*QinFoe,DiC*IinFo+QinFoe,ZiC*(CosC*UinFoe+SinC*VinFo),-ZiC*(SinC*UinFoe-CosC*VinFo)])
ulalume3@0 627 IS2e = np.array([IinFa+DiC*QinFae,DiC*IinFa+QinFae,ZiC*(CosC*UinFae+SinC*VinFa),-ZiC*(SinC*UinFae-CosC*VinFa)])
ulalume3@0 628 GT = np.dot(ATFe,IS1e)
ulalume3@0 629 GR = np.dot(ARFe,IS1e)
ulalume3@0 630 HT = np.dot(ATFe,IS2e)
ulalume3@0 631 HR = np.dot(ARFe,IS2e)
ulalume3@0 632
ulalume3@0 633 elif (TypeC == 6): # diattenuator calibration +-22.5° rotated_diattenuator_X22x5deg.odt
ulalume3@0 634 # parameters for calibration with aCal
ulalume3@0 635 IF1e = np.array([IinF+sqr05*DiC*QinFe, sqr05*DiC*IinF+(1-0.5*WiC)*QinFe, (1-0.5*WiC)*UinFe+sqr05*ZiC*SinC*VinF, -sqr05*ZiC*SinC*UinFe+ZiC*CosC*VinF])
ulalume3@0 636 IF2e = np.array([sqr05*DiC*UinFe, 0.5*WiC*UinFe-sqr05*ZiC*SinC*VinF, sqr05*DiC*IinF+0.5*WiC*QinFe, sqr05*ZiC*SinC*QinFe])
ulalume3@0 637 AT = np.dot(ATFe,IF1e)
ulalume3@0 638 AR = np.dot(ARFe,IF1e)
ulalume3@0 639 BT = np.dot(ATFe,IF2e)
ulalume3@0 640 BR = np.dot(ARFe,IF2e)
ulalume3@0 641
ulalume3@0 642 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 643 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 644 #IS1 = np.array([IinE,0,0,VinE])
ulalume3@0 645 #IS2 = np.array([0,QinE,-UinE,-2*VinE])
ulalume3@0 646 IS1 = np.array([IinFo,0,0,VinFo])
ulalume3@0 647 IS2 = np.array([0,QinFa,UinFa,VinFa])
ulalume3@0 648 GT = np.dot(ATF,IS1)
ulalume3@0 649 GR = np.dot(ARF,IS1)
ulalume3@0 650 HT = np.dot(ATF,IS2)
ulalume3@0 651 HR = np.dot(ARF,IS2)
ulalume3@0 652 else:
ulalume3@0 653 IS1e = np.array([IinFo+DiC*QinFoe,DiC*IinFo+QinFoe,ZiC*(CosC*UinFoe+SinC*VinFo),-ZiC*(SinC*UinFoe-CosC*VinFo)])
ulalume3@0 654 IS2e = np.array([IinFa+DiC*QinFae,DiC*IinFa+QinFae,ZiC*(CosC*UinFae+SinC*VinFa),-ZiC*(SinC*UinFae-CosC*VinFa)])
ulalume3@0 655 #IS1e = np.array([IinFo,0,0,VinFo])
ulalume3@0 656 #IS2e = np.array([0,QinFae,UinFae,VinFa])
ulalume3@0 657 GT = np.dot(ATFe,IS1e)
ulalume3@0 658 GR = np.dot(ARFe,IS1e)
ulalume3@0 659 HT = np.dot(ATFe,IS2e)
ulalume3@0 660 HR = np.dot(ARFe,IS2e)
ulalume3@0 661
ulalume3@0 662 else:
ulalume3@0 663 print('Calibrator not implemented yet')
ulalume3@0 664 sys.exit()
ulalume3@0 665
ulalume3@0 666 elif LocC == 2: # C behind emitter optics Eq.57 -------------------------------------------------------
ulalume3@0 667 #print("Calibrator location not implemented yet")
ulalume3@0 668 S2e = np.sin(np.deg2rad(2*RotC))
ulalume3@0 669 C2e = np.cos(np.deg2rad(2*RotC))
ulalume3@0 670
ulalume3@0 671 # AS with C before the receiver optics (see document rotated_diattenuator_X22x5deg.odt)
ulalume3@0 672 AF1 = np.array([1,C2g*DiO,S2g*DiO,0])
ulalume3@0 673 AF2 = np.array([C2g*DiO,1-S2g**2*WiO,S2g*C2g*WiO,-S2g*ZiO*SinO])
ulalume3@0 674 AF3 = np.array([S2g*DiO, S2g*C2g*WiO, 1-C2g**2*WiO, C2g*ZiO*SinO])
ulalume3@0 675 AF4 = np.array([0, S2g*SinO, -C2g*SinO, CosO])
ulalume3@0 676
ulalume3@0 677 ATF = (ATP1*AF1+ATP2*AF2+ATP3*AF3+ATP4*AF4)
ulalume3@0 678 ARF = (ARP1*AF1+ARP2*AF2+ARP3*AF3+ARP4*AF4)
ulalume3@0 679 ATF1 = ATF[0]
ulalume3@0 680 ATF2 = ATF[1]
ulalume3@0 681 ATF3 = ATF[2]
ulalume3@0 682 ATF4 = ATF[3]
ulalume3@0 683 ARF1 = ARF[0]
ulalume3@0 684 ARF2 = ARF[1]
ulalume3@0 685 ARF3 = ARF[2]
ulalume3@0 686 ARF4 = ARF[3]
ulalume3@0 687
ulalume3@0 688 # AS with C behind the emitter
ulalume3@0 689 # terms without aCal
ulalume3@0 690 ATE1o, ARE1o = ATF1, ARF1
ulalume3@0 691 ATE2o, ARE2o = 0., 0.
ulalume3@0 692 ATE3o, ARE3o = 0., 0.
ulalume3@0 693 ATE4o, ARE4o = ATF4, ARF4
ulalume3@0 694 # terms with aCal
ulalume3@0 695 ATE1a, ARE1a = 0. , 0.
ulalume3@0 696 ATE2a, ARE2a = ATF2, ARF2
ulalume3@0 697 ATE3a, ARE3a = -ATF3, -ARF3
ulalume3@0 698 ATE4a, ARE4a = -2*ATF4, -2*ARF4
ulalume3@0 699 # rotated AinEa by epsilon
ulalume3@0 700 ATE2ae = C2e*ATF2 + S2e*ATF3
ulalume3@0 701 ATE3ae = -S2e*ATF2 - C2e*ATF3
ulalume3@0 702 ARE2ae = C2e*ARF2 + S2e*ARF3
ulalume3@0 703 ARE3ae = -S2e*ARF2 - C2e*ARF3
ulalume3@0 704
ulalume3@0 705 ATE1 = ATE1o
ulalume3@0 706 ATE2e = aCal*ATE2ae
ulalume3@0 707 ATE3e = aCal*ATE3ae
ulalume3@0 708 ATE4 = (1-2*aCal)*ATF4
ulalume3@0 709 ARE1 = ARE1o
ulalume3@0 710 ARE2e = aCal*ARE2ae
ulalume3@0 711 ARE3e = aCal*ARE3ae
ulalume3@0 712 ARE4 = (1-2*aCal)*ARF4
ulalume3@0 713
ulalume3@0 714 # rotated IinE
ulalume3@0 715 QinEe = C2e*QinE + S2e*UinE
ulalume3@0 716 UinEe = C2e*UinE - S2e*QinE
ulalume3@0 717
ulalume3@0 718 # Calibration signals and Calibration correction K from measurements with LDRCal / aCal
ulalume3@0 719 if (TypeC == 2) or (TypeC == 1): # +++++++++ rotator calibration Eq. C.4
ulalume3@0 720 AT = ATE1o*IinE + (ATE4o+aCal*ATE4a)*h*VinE
ulalume3@0 721 BT = aCal * (ATE3ae*QinEe - ATE2ae*h*UinEe)
ulalume3@0 722 AR = ARE1o*IinE + (ARE4o+aCal*ARE4a)*h*VinE
ulalume3@0 723 BR = aCal * (ARE3ae*QinEe - ARE2ae*h*UinEe)
ulalume3@0 724
ulalume3@0 725 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 726 if (not RotationErrorEpsilonForNormalMeasurements):
ulalume3@0 727 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
ulalume3@0 728 GT = ATE1o*IinE + ATE4o*h*VinE
ulalume3@0 729 GR = ARE1o*IinE + ARE4o*h*VinE
ulalume3@0 730 HT = ATE2a*QinE + ATE3a*h*UinEe + ATE4a*h*VinE
ulalume3@0 731 HR = ARE2a*QinE + ARE3a*h*UinEe + ARE4a*h*VinE
ulalume3@0 732 else:
ulalume3@0 733 GT = ATE1o*IinE + ATE4o*h*VinE
ulalume3@0 734 GR = ARE1o*IinE + ARE4o*h*VinE
ulalume3@0 735 HT = ATE2ae*QinE + ATE3ae*h*UinEe + ATE4a*h*VinE
ulalume3@0 736 HR = ARE2ae*QinE + ARE3ae*h*UinEe + ARE4a*h*VinE
ulalume3@0 737
ulalume3@0 738 elif (TypeC == 3) or (TypeC == 4): # +++++++++ linear polariser calibration Eq. C.5
ulalume3@0 739 # p = +45°, m = -45°
ulalume3@0 740 AT = ATE1*IinE + ZiC*CosC*(ATE2e*QinEe + ATE4*VinE) + ATE3e*UinEe
ulalume3@0 741 BT = DiC*(ATE1*UinEe + ATE3e*IinE) + ZiC*SinC*(ATE4*QinEe - ATE2e*VinE)
ulalume3@0 742 AR = ARE1*IinE + ZiC*CosC*(ARE2e*QinEe + ARE4*VinE) + ARE3e*UinEe
ulalume3@0 743 BR = DiC*(ARE1*UinEe + ARE3e*IinE) + ZiC*SinC*(ARE4*QinEe - ARE2e*VinE)
ulalume3@0 744
ulalume3@0 745 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 746 if (not RotationErrorEpsilonForNormalMeasurements):
ulalume3@0 747 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
ulalume3@0 748 GT = ATE1o*IinE + ATE4o*VinE
ulalume3@0 749 GR = ARE1o*IinE + ARE4o*VinE
ulalume3@0 750 HT = ATE2a*QinE + ATE3a*UinE + ATE4a*VinE
ulalume3@0 751 HR = ARE2a*QinE + ARE3a*UinE + ARE4a*VinE
ulalume3@0 752 else:
ulalume3@0 753 D = IinE + DiC*QinEe
ulalume3@0 754 A = DiC*IinE + QinEe
ulalume3@0 755 B = ZiC*(CosC*UinEe + SinC*VinE)
ulalume3@0 756 C = -ZiC*(SinC*UinEe - CosC*VinE)
ulalume3@0 757 GT = ATE1o*D + ATE4o*C
ulalume3@0 758 GR = ARE1o*D + ARE4o*C
ulalume3@0 759 HT = ATE2a*A + ATE3a*B + ATE4a*C
ulalume3@0 760 HR = ARE2a*A + ARE3a*B + ARE4a*C
ulalume3@0 761
ulalume3@0 762 elif (TypeC == 6): # real HWP calibration +-22.5° rotated_diattenuator_X22x5deg.odt
ulalume3@0 763 # p = +22.5°, m = -22.5°
ulalume3@0 764 IE1e = np.array([IinE+sqr05*DiC*QinEe, sqr05*DiC*IinE+(1-0.5*WiC)*QinEe, (1-0.5*WiC)*UinEe+sqr05*ZiC*SinC*VinE, -sqr05*ZiC*SinC*UinEe+ZiC*CosC*VinE])
ulalume3@0 765 IE2e = np.array([sqr05*DiC*UinEe, 0.5*WiC*UinEe-sqr05*ZiC*SinC*VinE, sqr05*DiC*IinE+0.5*WiC*QinEe, sqr05*ZiC*SinC*QinEe])
ulalume3@0 766 ATEe = np.array([ATE1,ATE2e,ATE3e,ATE4])
ulalume3@0 767 AREe = np.array([ARE1,ARE2e,ARE3e,ARE4])
ulalume3@0 768 AT = np.dot(ATEe,IE1e)
ulalume3@0 769 AR = np.dot(AREe,IE1e)
ulalume3@0 770 BT = np.dot(ATEe,IE2e)
ulalume3@0 771 BR = np.dot(AREe,IE2e)
ulalume3@0 772
ulalume3@0 773 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 774 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 775 GT = ATE1o*IinE + ATE4o*VinE
ulalume3@0 776 GR = ARE1o*IinE + ARE4o*VinE
ulalume3@0 777 HT = ATE2a*QinE + ATE3a*UinE + ATE4a*VinE
ulalume3@0 778 HR = ARE2a*QinE + ARE3a*UinE + ARE4a*VinE
ulalume3@0 779 else:
ulalume3@0 780 D = IinE + DiC*QinEe
ulalume3@0 781 A = DiC*IinE + QinEe
ulalume3@0 782 B = ZiC*(CosC*UinEe + SinC*VinE)
ulalume3@0 783 C = -ZiC*(SinC*UinEe - CosC*VinE)
ulalume3@0 784 GT = ATE1o*D + ATE4o*C
ulalume3@0 785 GR = ARE1o*D + ARE4o*C
ulalume3@0 786 HT = ATE2a*A + ATE3a*B + ATE4a*C
ulalume3@0 787 HR = ARE2a*A + ARE3a*B + ARE4a*C
ulalume3@0 788
ulalume3@0 789 else:
ulalume3@0 790 print('Calibrator not implemented yet')
ulalume3@0 791 sys.exit()
ulalume3@0 792
ulalume3@0 793 else:
ulalume3@0 794 print("Calibrator location not implemented yet")
ulalume3@0 795 sys.exit()
ulalume3@0 796
ulalume3@0 797 # Determination of the correction K of the calibration factor
ulalume3@0 798 IoutTp = TaT*TiT*TiO*TiE*(AT + BT)
ulalume3@0 799 IoutTm = TaT*TiT*TiO*TiE*(AT - BT)
ulalume3@0 800 IoutRp = TaR*TiR*TiO*TiE*(AR + BR)
ulalume3@0 801 IoutRm = TaR*TiR*TiO*TiE*(AR - BR)
ulalume3@0 802
ulalume3@0 803 # --- Results and Corrections; electronic etaR and etaT are assumed to be 1
ulalume3@0 804 Etapx = IoutRp/IoutTp
ulalume3@0 805 Etamx = IoutRm/IoutTm
ulalume3@0 806 Etax = (Etapx*Etamx)**0.5
ulalume3@0 807
ulalume3@0 808 Eta = (TaR*TiR)/(TaT*TiT) # Eta = Eta*/K Eq. 84
ulalume3@0 809 K = Etax / Eta
ulalume3@0 810
ulalume3@0 811 # For comparison with Volkers Libreoffice Müller Matrix spreadsheet
ulalume3@0 812 #Eta_test_p = (IoutRp/IoutTp)
ulalume3@0 813 #Eta_test_m = (IoutRm/IoutTm)
ulalume3@0 814 #Eta_test = (Eta_test_p*Eta_test_m)**0.5
ulalume3@0 815
ulalume3@0 816 # ----- Forward simulated signals and LDRsim with atrue; from input file
ulalume3@0 817 It = TaT*TiT*TiO*TiE*(GT+atrue*HT)
ulalume3@0 818 Ir = TaR*TiR*TiO*TiE*(GR+atrue*HR)
ulalume3@0 819 # LDRsim = 1/Eta*Ir/It # simulated LDR* with Y from input file
ulalume3@0 820 LDRsim = Ir/It # simulated uncorrected LDR with Y from input file
ulalume3@0 821 # Corrected LDRsimCorr from forward simulated LDRsim (atrue)
ulalume3@0 822 # LDRsimCorr = (1./Eta*LDRsim*(GT+HT)-(GR+HR))/((GR-HR)-1./Eta*LDRsim*(GT-HT))
ulalume3@0 823 if Y == -1.:
ulalume3@0 824 LDRsimx = 1./LDRsim
ulalume3@0 825 else:
ulalume3@0 826 LDRsimx = LDRsim
ulalume3@0 827
ulalume3@0 828 # The following is correct without doubt
ulalume3@0 829 #LDRCorr = (LDRsim*K/Etax*(GT+HT)-(GR+HR))/((GR-HR)-LDRsim*K/Etax*(GT-HT))
ulalume3@0 830
ulalume3@0 831 # The following is a test whether the equations for calibration Etax and normal signal (GHK, LDRsim) are consistent
ulalume3@0 832 LDRCorr = (LDRsim/Eta*(GT+HT)-(GR+HR))/((GR-HR)-LDRsim*K/Etax*(GT-HT))
ulalume3@0 833
ulalume3@0 834 TTa = TiT*TaT #*ATP1
ulalume3@0 835 TRa = TiR*TaR #*ARP1
ulalume3@0 836
ulalume3@0 837 F11sim = 1/(TiO*TiE)*((HR*Etax/K*It/TTa-HT*Ir/TRa)/(HR*GT-HT*GR)) # IL = 1, Etat = Etar = 1
ulalume3@0 838
ulalume3@0 839 return (GT, HT, GR, HR, K, Eta, LDRsimx, LDRCorr, DTa, DRa, TTa, TRa, F11sim)
ulalume3@0 840 # *******************************************************************************************************************************
ulalume3@0 841
ulalume3@0 842 # --- CALC truth
ulalume3@0 843 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0 = Calc(RotL0, RotE0, RetE0, DiE0, RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0, ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal0)
ulalume3@0 844
ulalume3@0 845 # --------------------------------------------------------
ulalume3@0 846 with open('output_' + LID + '.dat', 'w') as f:
ulalume3@0 847 with redirect_stdout(f):
ulalume3@0 848 print("From ", dname)
ulalume3@0 849 print("Running ", fname)
ulalume3@0 850 print("Reading input file ", InputFile) #, " for Lidar system :", EID, ", ", LID)
ulalume3@0 851 print("for Lidar system: ", EID, ", ", LID)
ulalume3@0 852 # --- Print iput information*********************************
ulalume3@0 853 print(" --- Input parameters: value ±error / ±steps ----------------------")
ulalume3@0 854 print("{0:8} {1:8} {2:8.5f}; {3:8} {4:7.4f}±{5:7.4f}/{6:2d}".format("Laser: ", "DOLP = ", bL, " rotation alpha = ", RotL0, dRotL, nRotL))
ulalume3@0 855 print(" Diatt., Tunpol, Retard., Rotation (deg)")
ulalume3@0 856 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("Emitter ", DiE0, dDiE, TiE, RetE0, dRetE, RotE0, dRotE, nDiE, nRetE, nRotE))
ulalume3@0 857 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("Receiver ", DiO0, dDiO, TiO, RetO0, dRetO, RotO0, dRotO, nDiO, nRetO, nRotO))
ulalume3@0 858 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("Calibrator ", DiC0, dDiC, TiC, RetC0, dRetC, RotC0, dRotC, nDiC, nRetC, nRotC))
ulalume3@0 859 print("{0:12}".format(" --- Pol.-filter ---"))
ulalume3@0 860 print("{0:12}{1:7.4f}±{2:7.4f}/{3:2d}, {4:7.4f}±{5:7.4f}/{6:2d}".format("ERT, ERR :", ERaT0, dERaT, nERaT, ERaR0, dERaR, nERaR))
ulalume3@0 861 print("{0:12}{1:7.4f}±{2:7.4f}/{3:2d}, {4:7.4f}±{5:7.4f}/{6:2d}".format("RotaT , RotaR :", RotaT0, dRotaT, nRotaT, RotaR0,dRotaR,nRotaR))
ulalume3@0 862 print("{0:12}".format(" --- PBS ---"))
ulalume3@0 863 print("{0:12}{1:7.4f}±{2:7.4f}/{9:2d}, {3:7.4f}±{4:7.4f}/{10:2d}, {5:7.4f}±{6:7.4f}/{11:2d},{7:7.4f}±{8:7.4f}/{12:2d}".format("TP,TS,RP,RS :", TP0, dTP, TS0, dTS, RP0, dRP, RS0, dRS, nTP, nTS, nRP, nRS))
ulalume3@0 864 print("{0:12}{1:7.4f},{2:7.4f}, {3:7.4f},{4:7.4f}, {5:1.0f}".format("DT,TT,DR,TR,Y :", DiT, TiT, DiR, TiR, Y))
ulalume3@0 865 print("{0:12}".format(" --- Combined PBS + Pol.-filter ---"))
ulalume3@0 866 print("{0:12}{1:7.4f},{2:7.4f}, {3:7.4f},{4:7.4f}".format("DTa,TTa,DRa,TRa: ", DTa0, TTa0, DRa0, TRa0))
ulalume3@0 867 print()
ulalume3@0 868 print("Rotation Error Epsilon For Normal Measurements = ", RotationErrorEpsilonForNormalMeasurements)
ulalume3@0 869 #print ('LocC = ', LocC, Loc[LocC], '; TypeC = ',TypeC, Type[TypeC])
ulalume3@0 870 print(Type[TypeC], Loc[LocC], "; Parallel signal detected in", dY[int(Y+1)])
ulalume3@0 871 # end of print actual system parameters
ulalume3@0 872 # ******************************************************************************
ulalume3@0 873
ulalume3@0 874 #print()
ulalume3@0 875 #print(" --- LDRCal during calibration | simulated and corrected LDRs -------------")
ulalume3@0 876 #print("{0:8} |{1:8}->{2:8},{3:9}->{4:9} |{5:8}->{6:8}".format(" LDRCal"," LDRtrue", " LDRsim"," LDRtrue2", " LDRsim2", " LDRmeas", " LDRcorr"))
ulalume3@0 877 #print("{0:8.5f} |{1:8.5f}->{2:8.5f},{3:9.5f}->{4:9.5f} |{5:8.5f}->{6:8.5f}".format(LDRCal, LDRtrue, LDRsim, LDRtrue2, LDRsim2, LDRmeas, LDRCorr))
ulalume3@0 878 #print("{0:8} |{1:8}->{2:8}->{3:8}".format(" LDRCal"," LDRtrue", " LDRsimx", " LDRcorr"))
ulalume3@0 879 #print("{0:6.3f}±{1:5.3f}/{2:2d}|{3:8.5f}->{4:8.5f}->{5:8.5f}".format(LDRCal0, dLDRCal, nLDRCal, LDRtrue, LDRsimx, LDRCorr))
ulalume3@0 880 #print("{0:8} |{1:8}->{2:8}->{3:8}".format(" LDRCal"," LDRtrue", " LDRsimx", " LDRcorr"))
ulalume3@0 881 #print(" --- LDRCal during calibration")
ulalume3@0 882 print("{0:26}: {1:6.3f}±{2:5.3f}/{3:2d}".format("LDRCal during calibration", LDRCal0, dLDRCal, nLDRCal))
ulalume3@0 883
ulalume3@0 884 #print("{0:8}={1:8.5f};{2:8}={3:8.5f}".format(" IinP",IinP," F11sim",F11sim))
ulalume3@0 885 print()
ulalume3@0 886
ulalume3@0 887 K0List = np.zeros(3)
ulalume3@0 888 LDRsimxList = np.zeros(3)
ulalume3@0 889 LDRCalList = 0.004, 0.2, 0.45
ulalume3@0 890 for i,LDRCal in enumerate(LDRCalList):
ulalume3@0 891 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0 = Calc(RotL0, RotE0, RetE0, DiE0, RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0, ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal)
ulalume3@0 892 K0List[i] = K0
ulalume3@0 893 LDRsimxList[i] = LDRsimx
ulalume3@0 894
ulalume3@0 895 print("{0:8},{1:8},{2:8},{3:8},{4:9},{5:9},{6:9}".format(" GR", " GT", " HR", " HT", " K(0.004)", " K(0.2)", " K(0.45)"))
ulalume3@0 896 print("{0:8.5f},{1:8.5f},{2:8.5f},{3:8.5f},{4:9.5f},{5:9.5f},{6:9.5f}".format(GR0, GT0, HR0, HT0, K0List[0], K0List[1], K0List[2]))
ulalume3@0 897 print('========================================================================')
ulalume3@0 898
ulalume3@0 899 print("{0:9},{1:9},{2:9}".format(" LDRtrue", " LDRsimx", " LDRCorr"))
ulalume3@0 900 LDRtrueList = 0.004, 0.02, 0.2, 0.45
ulalume3@0 901 for i,LDRtrue in enumerate(LDRtrueList):
ulalume3@0 902 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0 = Calc(RotL0, RotE0, RetE0, DiE0, RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0, ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal0)
ulalume3@0 903 print("{0:9.5f},{1:9.5f},{2:9.5f}".format(LDRtrue, LDRsimx, LDRCorr))
ulalume3@0 904
ulalume3@0 905
ulalume3@0 906 file = open('output_' + LID + '.dat', 'r')
ulalume3@0 907 print (file.read())
ulalume3@0 908 file.close()
ulalume3@0 909
ulalume3@0 910 '''
ulalume3@0 911 if(PrintToOutputFile):
ulalume3@0 912 f = open('output_ver7.dat', 'w')
ulalume3@0 913 old_target = sys.stdout
ulalume3@0 914 sys.stdout = f
ulalume3@0 915
ulalume3@0 916 print("something")
ulalume3@0 917
ulalume3@0 918 if(PrintToOutputFile):
ulalume3@0 919 sys.stdout.flush()
ulalume3@0 920 f.close
ulalume3@0 921 sys.stdout = old_target
ulalume3@0 922 '''
ulalume3@0 923 # --- CALC again truth with LDRCal0 to reset all 0-values
ulalume3@0 924 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0 = Calc(RotL0, RotE0, RetE0, DiE0, RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0, ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal0)
ulalume3@0 925
ulalume3@0 926 # --- Start Errors calculation
ulalume3@0 927
ulalume3@0 928 iN = -1
ulalume3@0 929 N = ((nRotL*2+1)*
ulalume3@0 930 (nRotE*2+1)*(nRetE*2+1)*(nDiE*2+1)*
ulalume3@0 931 (nRotO*2+1)*(nRetO*2+1)*(nDiO*2+1)*
ulalume3@0 932 (nRotC*2+1)*(nRetC*2+1)*(nDiC*2+1)*
ulalume3@0 933 (nTP*2+1)*(nTS*2+1)*(nRP*2+1)*(nRS*2+1)*(nERaT*2+1)*(nERaR*2+1)*
ulalume3@0 934 (nRotaT*2+1)*(nRotaR*2+1)*(nRetT*2+1)*(nRetR*2+1)*(nLDRCal*2+1))
ulalume3@0 935 print("N = ",N ," ", end="")
ulalume3@0 936
ulalume3@0 937 if N > 1e6:
ulalume3@0 938 if user_yes_no_query('Warning: processing ' + str(N) + ' samples will take very long. Do you want to proceed?') == 0: sys.exit()
ulalume3@0 939 if N > 5e6:
ulalume3@0 940 if user_yes_no_query('Warning: the memory required for ' + str(N) + ' samples might be ' + '{0:5.1f}'.format(N/4e6) + ' GB. Do you anyway want to proceed?') == 0: sys.exit()
ulalume3@0 941
ulalume3@0 942 #if user_yes_no_query('Warning: processing' + str(N) + ' samples will take very long. Do you want to proceed?') == 0: sys.exit()
ulalume3@0 943
ulalume3@0 944 # --- Arrays for plotting ------
ulalume3@0 945 LDRmin = np.zeros(5)
ulalume3@0 946 LDRmax = np.zeros(5)
ulalume3@0 947 F11min = np.zeros(5)
ulalume3@0 948 F11max = np.zeros(5)
ulalume3@0 949
ulalume3@0 950 LDRrange = np.zeros(5)
ulalume3@0 951 LDRrange = 0.004, 0.02, 0.1, 0.3, 0.45
ulalume3@0 952 #aLDRsimx = np.zeros(N)
ulalume3@0 953 #aLDRsimx2 = np.zeros(N)
ulalume3@0 954 #aLDRcorr = np.zeros(N)
ulalume3@0 955 #aLDRcorr2 = np.zeros(N)
ulalume3@0 956 aERaT = np.zeros(N)
ulalume3@0 957 aERaR = np.zeros(N)
ulalume3@0 958 aRotaT = np.zeros(N)
ulalume3@0 959 aRotaR = np.zeros(N)
ulalume3@0 960 aRetT = np.zeros(N)
ulalume3@0 961 aRetR = np.zeros(N)
ulalume3@0 962 aTP = np.zeros(N)
ulalume3@0 963 aTS = np.zeros(N)
ulalume3@0 964 aRP = np.zeros(N)
ulalume3@0 965 aRS = np.zeros(N)
ulalume3@0 966 aDiE = np.zeros(N)
ulalume3@0 967 aDiO = np.zeros(N)
ulalume3@0 968 aDiC = np.zeros(N)
ulalume3@0 969 aRotC = np.zeros(N)
ulalume3@0 970 aRetC = np.zeros(N)
ulalume3@0 971 aRotL = np.zeros(N)
ulalume3@0 972 aRetE = np.zeros(N)
ulalume3@0 973 aRotE = np.zeros(N)
ulalume3@0 974 aRetO = np.zeros(N)
ulalume3@0 975 aRotO = np.zeros(N)
ulalume3@0 976 aLDRCal = np.zeros(N)
ulalume3@0 977 aA = np.zeros((5,N))
ulalume3@0 978 aX = np.zeros((5,N))
ulalume3@0 979 aF11corr = np.zeros((5,N))
ulalume3@0 980
ulalume3@0 981 atime = clock()
ulalume3@0 982 dtime = clock()
ulalume3@0 983
ulalume3@0 984 # --- Calc Error signals
ulalume3@0 985 #GT, HT, GR, HR, K, Eta, LDRsim = Calc(RotL, RotE, RetE, DiE, RotO, RetO, DiO, RotC, RetC, DiC, TP, TS)
ulalume3@0 986 # ---- Do the calculations of bra-ket vectors
ulalume3@0 987 h = -1. if TypeC == 2 else 1
ulalume3@0 988
ulalume3@0 989 # from input file: measured LDRm and true LDRtrue, LDRtrue2 =>
ulalume3@0 990 ameas = (1.-LDRmeas)/(1+LDRmeas)
ulalume3@0 991 atrue = (1.-LDRtrue)/(1+LDRtrue)
ulalume3@0 992 atrue2 = (1.-LDRtrue2)/(1+LDRtrue2)
ulalume3@0 993
ulalume3@0 994 for iLDRCal in range(-nLDRCal,nLDRCal+1):
ulalume3@0 995 # from input file: assumed LDRCal for calibration measurements
ulalume3@0 996 LDRCal = LDRCal0
ulalume3@0 997 if nLDRCal > 0: LDRCal = LDRCal0 + iLDRCal*dLDRCal/nLDRCal
ulalume3@0 998
ulalume3@0 999 GT0, HT0, GR0, HR0, K0, Eta0, LDRsimx, LDRCorr, DTa0, DRa0, TTa0, TRa0, F11sim0 = Calc(RotL0, RotE0, RetE0, DiE0, RotO0, RetO0, DiO0, RotC0, RetC0, DiC0, TP0, TS0, RP0, RS0, ERaT0, RotaT0, RetT0, ERaR0, RotaR0, RetR0, LDRCal)
ulalume3@0 1000 aCal = (1.-LDRCal)/(1+LDRCal)
ulalume3@0 1001 for iRotL, iRotE, iRetE, iDiE \
ulalume3@0 1002 in [(iRotL,iRotE,iRetE,iDiE)
ulalume3@0 1003 for iRotL in range(-nRotL,nRotL+1)
ulalume3@0 1004 for iRotE in range(-nRotE,nRotE+1)
ulalume3@0 1005 for iRetE in range(-nRetE,nRetE+1)
ulalume3@0 1006 for iDiE in range(-nDiE,nDiE+1)]:
ulalume3@0 1007
ulalume3@0 1008 if nRotL > 0: RotL = RotL0 + iRotL*dRotL/nRotL
ulalume3@0 1009 if nRotE > 0: RotE = RotE0 + iRotE*dRotE/nRotE
ulalume3@0 1010 if nRetE > 0: RetE = RetE0 + iRetE*dRetE/nRetE
ulalume3@0 1011 if nDiE > 0: DiE = DiE0 + iDiE*dDiE/nDiE
ulalume3@0 1012
ulalume3@0 1013 # angles of emitter and laser and calibrator and receiver optics
ulalume3@0 1014 # RotL = alpha, RotE = beta, RotO = gamma, RotC = epsilon
ulalume3@0 1015 S2a = np.sin(2*np.deg2rad(RotL))
ulalume3@0 1016 C2a = np.cos(2*np.deg2rad(RotL))
ulalume3@0 1017 S2b = np.sin(2*np.deg2rad(RotE))
ulalume3@0 1018 C2b = np.cos(2*np.deg2rad(RotE))
ulalume3@0 1019 S2ab = np.sin(np.deg2rad(2*RotL-2*RotE))
ulalume3@0 1020 C2ab = np.cos(np.deg2rad(2*RotL-2*RotE))
ulalume3@0 1021
ulalume3@0 1022 # Laser with Degree of linear polarization DOLP = bL
ulalume3@0 1023 IinL = 1.
ulalume3@0 1024 QinL = bL
ulalume3@0 1025 UinL = 0.
ulalume3@0 1026 VinL = (1. - bL**2)**0.5
ulalume3@0 1027
ulalume3@0 1028 # Stokes Input Vector rotation Eq. E.4
ulalume3@0 1029 A = C2a*QinL - S2a*UinL
ulalume3@0 1030 B = S2a*QinL + C2a*UinL
ulalume3@0 1031 # Stokes Input Vector rotation Eq. E.9
ulalume3@0 1032 C = C2ab*QinL - S2ab*UinL
ulalume3@0 1033 D = S2ab*QinL + C2ab*UinL
ulalume3@0 1034
ulalume3@0 1035 # emitter optics
ulalume3@0 1036 CosE = np.cos(np.deg2rad(RetE))
ulalume3@0 1037 SinE = np.sin(np.deg2rad(RetE))
ulalume3@0 1038 ZiE = (1. - DiE**2)**0.5
ulalume3@0 1039 WiE = (1. - ZiE*CosE)
ulalume3@0 1040
ulalume3@0 1041 # Stokes Input Vector after emitter optics equivalent to Eq. E.9 with already rotated input vector from Eq. E.4
ulalume3@0 1042 # b = beta
ulalume3@0 1043 IinE = (IinL + DiE*C)
ulalume3@0 1044 QinE = (C2b*DiE*IinL + A + S2b*(WiE*D - ZiE*SinE*VinL))
ulalume3@0 1045 UinE = (S2b*DiE*IinL + B - C2b*(WiE*D - ZiE*SinE*VinL))
ulalume3@0 1046 VinE = (-ZiE*SinE*D + ZiE*CosE*VinL)
ulalume3@0 1047
ulalume3@0 1048 #-------------------------
ulalume3@0 1049 # F11 assuemd to be = 1 => measured: F11m = IinP / IinE with atrue
ulalume3@0 1050 #F11sim = (IinE + DiO*atrue*(C2g*QinE - S2g*UinE))/IinE
ulalume3@0 1051 #-------------------------
ulalume3@0 1052
ulalume3@0 1053 for iRotO, iRetO, iDiO, iRotC, iRetC, iDiC, iTP, iTS, iRP, iRS, iERaT, iRotaT, iRetT, iERaR, iRotaR, iRetR \
ulalume3@0 1054 in [(iRotO,iRetO,iDiO,iRotC,iRetC,iDiC,iTP,iTS,iRP,iRS,iERaT,iRotaT,iRetT,iERaR,iRotaR,iRetR )
ulalume3@0 1055 for iRotO in range(-nRotO,nRotO+1)
ulalume3@0 1056 for iRetO in range(-nRetO,nRetO+1)
ulalume3@0 1057 for iDiO in range(-nDiO,nDiO+1)
ulalume3@0 1058 for iRotC in range(-nRotC,nRotC+1)
ulalume3@0 1059 for iRetC in range(-nRetC,nRetC+1)
ulalume3@0 1060 for iDiC in range(-nDiC,nDiC+1)
ulalume3@0 1061 for iTP in range(-nTP,nTP+1)
ulalume3@0 1062 for iTS in range(-nTS,nTS+1)
ulalume3@0 1063 for iRP in range(-nRP,nRP+1)
ulalume3@0 1064 for iRS in range(-nRS,nRS+1)
ulalume3@0 1065 for iERaT in range(-nERaT,nERaT+1)
ulalume3@0 1066 for iRotaT in range(-nRotaT,nRotaT+1)
ulalume3@0 1067 for iRetT in range(-nRetT,nRetT+1)
ulalume3@0 1068 for iERaR in range(-nERaR,nERaR+1)
ulalume3@0 1069 for iRotaR in range(-nRotaR,nRotaR+1)
ulalume3@0 1070 for iRetR in range(-nRetR,nRetR+1)]:
ulalume3@0 1071
ulalume3@0 1072 iN = iN + 1
ulalume3@0 1073 if (iN == 10001):
ulalume3@0 1074 ctime = clock()
ulalume3@0 1075 print(" estimated time ", "{0:4.2f}".format(N/10000 * (ctime-atime)), "sec ") #, end="")
ulalume3@0 1076 print("\r elapsed time ", "{0:5.0f}".format((ctime-atime)), "sec ", end="\r")
ulalume3@0 1077 ctime = clock()
ulalume3@0 1078 if ((ctime - dtime) > 10):
ulalume3@0 1079 print("\r elapsed time ", "{0:5.0f}".format((ctime-atime)), "sec ", end="\r")
ulalume3@0 1080 dtime = ctime
ulalume3@0 1081
ulalume3@0 1082 if nRotO > 0: RotO = RotO0 + iRotO*dRotO/nRotO
ulalume3@0 1083 if nRetO > 0: RetO = RetO0 + iRetO*dRetO/nRetO
ulalume3@0 1084 if nDiO > 0: DiO = DiO0 + iDiO*dDiO/nDiO
ulalume3@0 1085 if nRotC > 0: RotC = RotC0 + iRotC*dRotC/nRotC
ulalume3@0 1086 if nRetC > 0: RetC = RetC0 + iRetC*dRetC/nRetC
ulalume3@0 1087 if nDiC > 0: DiC = DiC0 + iDiC*dDiC/nDiC
ulalume3@0 1088 if nTP > 0: TP = TP0 + iTP*dTP/nTP
ulalume3@0 1089 if nTS > 0: TS = TS0 + iTS*dTS/nTS
ulalume3@0 1090 if nRP > 0: RP = RP0 + iRP*dRP/nRP
ulalume3@0 1091 if nRS > 0: RS = RS0 + iRS*dRS/nRS
ulalume3@0 1092 if nERaT > 0: ERaT = ERaT0 + iERaT*dERaT/nERaT
ulalume3@0 1093 if nRotaT > 0:RotaT= RotaT0+ iRotaT*dRotaT/nRotaT
ulalume3@0 1094 if nRetT > 0: RetT = RetT0 + iRetT*dRetT/nRetT
ulalume3@0 1095 if nERaR > 0: ERaR = ERaR0 + iERaR*dERaR/nERaR
ulalume3@0 1096 if nRotaR > 0:RotaR= RotaR0+ iRotaR*dRotaR/nRotaR
ulalume3@0 1097 if nRetR > 0: RetR = RetR0 + iRetR*dRetR/nRetR
ulalume3@0 1098
ulalume3@0 1099 #print("{0:5.2f}, {1:5.2f}, {2:5.2f}, {3:10d}".format(RotL, RotE, RotO, iN))
ulalume3@0 1100
ulalume3@0 1101 # receiver optics
ulalume3@0 1102 CosO = np.cos(np.deg2rad(RetO))
ulalume3@0 1103 SinO = np.sin(np.deg2rad(RetO))
ulalume3@0 1104 ZiO = (1. - DiO**2)**0.5
ulalume3@0 1105 WiO = (1. - ZiO*CosO)
ulalume3@0 1106 S2g = np.sin(np.deg2rad(2*RotO))
ulalume3@0 1107 C2g = np.cos(np.deg2rad(2*RotO))
ulalume3@0 1108 # calibrator
ulalume3@0 1109 CosC = np.cos(np.deg2rad(RetC))
ulalume3@0 1110 SinC = np.sin(np.deg2rad(RetC))
ulalume3@0 1111 ZiC = (1. - DiC**2)**0.5
ulalume3@0 1112 WiC = (1. - ZiC*CosC)
ulalume3@0 1113
ulalume3@0 1114 #For POLLY_XT
ulalume3@0 1115 # analyser
ulalume3@0 1116 #RS = 1 - TS
ulalume3@0 1117 #RP = 1 - TP
ulalume3@0 1118 TiT = 0.5 * (TP + TS)
ulalume3@0 1119 DiT = (TP-TS)/(TP+TS)
ulalume3@0 1120 ZiT = (1. - DiT**2)**0.5
ulalume3@0 1121 TiR = 0.5 * (RP + RS)
ulalume3@0 1122 DiR = (RP-RS)/(RP+RS)
ulalume3@0 1123 ZiR = (1. - DiR**2)**0.5
ulalume3@0 1124 CosT = np.cos(np.deg2rad(RetT))
ulalume3@0 1125 SinT = np.sin(np.deg2rad(RetT))
ulalume3@0 1126 CosR = np.cos(np.deg2rad(RetR))
ulalume3@0 1127 SinR = np.sin(np.deg2rad(RetR))
ulalume3@0 1128
ulalume3@0 1129 DaT = (1-ERaT)/(1+ERaT)
ulalume3@0 1130 DaR = (1-ERaR)/(1+ERaR)
ulalume3@0 1131 TaT = 0.5*(1+ERaT)
ulalume3@0 1132 TaR = 0.5*(1+ERaR)
ulalume3@0 1133
ulalume3@0 1134 S2aT = np.sin(np.deg2rad(h*2*RotaT))
ulalume3@0 1135 C2aT = np.cos(np.deg2rad(2*RotaT))
ulalume3@0 1136 S2aR = np.sin(np.deg2rad(h*2*RotaR))
ulalume3@0 1137 C2aR = np.cos(np.deg2rad(2*RotaR))
ulalume3@0 1138
ulalume3@0 1139 # Aanalyzer As before the PBS Eq. D.5
ulalume3@0 1140 ATP1 = (1+C2aT*DaT*DiT)
ulalume3@0 1141 ATP2 = Y*(DiT+C2aT*DaT)
ulalume3@0 1142 ATP3 = Y*S2aT*DaT*ZiT*CosT
ulalume3@0 1143 ATP4 = S2aT*DaT*ZiT*SinT
ulalume3@0 1144 ATP = np.array([ATP1,ATP2,ATP3,ATP4])
ulalume3@0 1145
ulalume3@0 1146 ARP1 = (1+C2aR*DaR*DiR)
ulalume3@0 1147 ARP2 = Y*(DiR+C2aR*DaR)
ulalume3@0 1148 ARP3 = Y*S2aR*DaR*ZiR*CosR
ulalume3@0 1149 ARP4 = S2aR*DaR*ZiR*SinR
ulalume3@0 1150 ARP = np.array([ARP1,ARP2,ARP3,ARP4])
ulalume3@0 1151
ulalume3@0 1152 TTa = TiT*TaT #*ATP1
ulalume3@0 1153 TRa = TiR*TaR #*ARP1
ulalume3@0 1154
ulalume3@0 1155 # ---- Calculate signals and correction parameters for diffeent locations and calibrators
ulalume3@0 1156 if LocC == 4: # Calibrator before the PBS
ulalume3@0 1157 #print("Calibrator location not implemented yet")
ulalume3@0 1158
ulalume3@0 1159 #S2ge = np.sin(np.deg2rad(2*RotO + h*2*RotC))
ulalume3@0 1160 #C2ge = np.cos(np.deg2rad(2*RotO + h*2*RotC))
ulalume3@0 1161 S2e = np.sin(np.deg2rad(h*2*RotC))
ulalume3@0 1162 C2e = np.cos(np.deg2rad(2*RotC))
ulalume3@0 1163 # rotated AinP by epsilon Eq. C.3
ulalume3@0 1164 ATP2e = C2e*ATP2 + S2e*ATP3
ulalume3@0 1165 ATP3e = C2e*ATP3 - S2e*ATP2
ulalume3@0 1166 ARP2e = C2e*ARP2 + S2e*ARP3
ulalume3@0 1167 ARP3e = C2e*ARP3 - S2e*ARP2
ulalume3@0 1168 ATPe = np.array([ATP1,ATP2e,ATP3e,ATP4])
ulalume3@0 1169 ARPe = np.array([ARP1,ARP2e,ARP3e,ARP4])
ulalume3@0 1170 # Stokes Input Vector before the polarising beam splitter Eq. E.31
ulalume3@0 1171 A = C2g*QinE - S2g*UinE
ulalume3@0 1172 B = S2g*QinE + C2g*UinE
ulalume3@0 1173 #C = (WiO*aCal*B + ZiO*SinO*(1-2*aCal)*VinE)
ulalume3@0 1174 Co = ZiO*SinO*VinE
ulalume3@0 1175 Ca = (WiO*B - 2*ZiO*SinO*VinE)
ulalume3@0 1176 #C = Co + aCal*Ca
ulalume3@0 1177 #IinP = (IinE + DiO*aCal*A)
ulalume3@0 1178 #QinP = (C2g*DiO*IinE + aCal*QinE - S2g*C)
ulalume3@0 1179 #UinP = (S2g*DiO*IinE - aCal*UinE + C2g*C)
ulalume3@0 1180 #VinP = (ZiO*SinO*aCal*B + ZiO*CosO*(1-2*aCal)*VinE)
ulalume3@0 1181 IinPo = IinE
ulalume3@0 1182 QinPo = (C2g*DiO*IinE - S2g*Co)
ulalume3@0 1183 UinPo = (S2g*DiO*IinE + C2g*Co)
ulalume3@0 1184 VinPo = ZiO*CosO*VinE
ulalume3@0 1185
ulalume3@0 1186 IinPa = DiO*A
ulalume3@0 1187 QinPa = QinE - S2g*Ca
ulalume3@0 1188 UinPa = -UinE + C2g*Ca
ulalume3@0 1189 VinPa = ZiO*(SinO*B - 2*CosO*VinE)
ulalume3@0 1190
ulalume3@0 1191 IinP = IinPo + aCal*IinPa
ulalume3@0 1192 QinP = QinPo + aCal*QinPa
ulalume3@0 1193 UinP = UinPo + aCal*UinPa
ulalume3@0 1194 VinP = VinPo + aCal*VinPa
ulalume3@0 1195 # Stokes Input Vector before the polarising beam splitter rotated by epsilon Eq. C.3
ulalume3@0 1196 #QinPe = C2e*QinP + S2e*UinP
ulalume3@0 1197 #UinPe = C2e*UinP - S2e*QinP
ulalume3@0 1198 QinPoe = C2e*QinPo + S2e*UinPo
ulalume3@0 1199 UinPoe = C2e*UinPo - S2e*QinPo
ulalume3@0 1200 QinPae = C2e*QinPa + S2e*UinPa
ulalume3@0 1201 UinPae = C2e*UinPa - S2e*QinPa
ulalume3@0 1202 QinPe = C2e*QinP + S2e*UinP
ulalume3@0 1203 UinPe = C2e*UinP - S2e*QinP
ulalume3@0 1204
ulalume3@0 1205 # Calibration signals and Calibration correction K from measurements with LDRCal / aCal
ulalume3@0 1206 if (TypeC == 2) or (TypeC == 1): # rotator calibration Eq. C.4
ulalume3@0 1207 # parameters for calibration with aCal
ulalume3@0 1208 AT = ATP1*IinP + h*ATP4*VinP
ulalume3@0 1209 BT = ATP3e*QinP - h*ATP2e*UinP
ulalume3@0 1210 AR = ARP1*IinP + h*ARP4*VinP
ulalume3@0 1211 BR = ARP3e*QinP - h*ARP2e*UinP
ulalume3@0 1212 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 1213 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 1214 IS1 = np.array([IinPo,QinPo,UinPo,VinPo])
ulalume3@0 1215 IS2 = np.array([IinPa,QinPa,UinPa,VinPa])
ulalume3@0 1216 GT = np.dot(ATP,IS1)
ulalume3@0 1217 GR = np.dot(ARP,IS1)
ulalume3@0 1218 HT = np.dot(ATP,IS2)
ulalume3@0 1219 HR = np.dot(ARP,IS2)
ulalume3@0 1220 else:
ulalume3@0 1221 IS1 = np.array([IinPo,QinPo,UinPo,VinPo])
ulalume3@0 1222 IS2 = np.array([IinPa,QinPa,UinPa,VinPa])
ulalume3@0 1223 GT = np.dot(ATPe,IS1)
ulalume3@0 1224 GR = np.dot(ARPe,IS1)
ulalume3@0 1225 HT = np.dot(ATPe,IS2)
ulalume3@0 1226 HR = np.dot(ARPe,IS2)
ulalume3@0 1227 elif (TypeC == 3) or (TypeC == 4): # linear polariser calibration Eq. C.5
ulalume3@0 1228 # parameters for calibration with aCal
ulalume3@0 1229 AT = ATP1*IinP + ATP3e*UinPe + ZiC*CosC*(ATP2e*QinPe + ATP4*VinP)
ulalume3@0 1230 BT = DiC*(ATP1*UinPe + ATP3e*IinP) - ZiC*SinC*(ATP2e*VinP - ATP4*QinPe)
ulalume3@0 1231 AR = ARP1*IinP + ARP3e*UinPe + ZiC*CosC*(ARP2e*QinPe + ARP4*VinP)
ulalume3@0 1232 BR = DiC*(ARP1*UinPe + ARP3e*IinP) - ZiC*SinC*(ARP2e*VinP - ARP4*QinPe)
ulalume3@0 1233 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 1234 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 1235 IS1 = np.array([IinPo,QinPo,UinPo,VinPo])
ulalume3@0 1236 IS2 = np.array([IinPa,QinPa,UinPa,VinPa])
ulalume3@0 1237 GT = np.dot(ATP,IS1)
ulalume3@0 1238 GR = np.dot(ARP,IS1)
ulalume3@0 1239 HT = np.dot(ATP,IS2)
ulalume3@0 1240 HR = np.dot(ARP,IS2)
ulalume3@0 1241 else:
ulalume3@0 1242 IS1e = np.array([IinPo+DiC*QinPoe,DiC*IinPo+QinPoe,ZiC*(CosC*UinPoe+SinC*VinPo),-ZiC*(SinC*UinPoe-CosC*VinPo)])
ulalume3@0 1243 IS2e = np.array([IinPa+DiC*QinPae,DiC*IinPa+QinPae,ZiC*(CosC*UinPae+SinC*VinPa),-ZiC*(SinC*UinPae-CosC*VinPa)])
ulalume3@0 1244 GT = np.dot(ATPe,IS1e)
ulalume3@0 1245 GR = np.dot(ARPe,IS1e)
ulalume3@0 1246 HT = np.dot(ATPe,IS2e)
ulalume3@0 1247 HR = np.dot(ARPe,IS2e)
ulalume3@0 1248 elif (TypeC == 6): # diattenuator calibration +-22.5° rotated_diattenuator_X22x5deg.odt
ulalume3@0 1249 # parameters for calibration with aCal
ulalume3@0 1250 AT = ATP1*IinP + sqr05*DiC*(ATP1*QinPe + ATP2e*IinP) + (1-0.5*WiC)*(ATP2e*QinPe + ATP3e*UinPe) + ZiC*(sqr05*SinC*(ATP3e*VinP-ATP4*UinPe) + ATP4*CosC*VinP)
ulalume3@0 1251 BT = sqr05*DiC*(ATP1*UinPe + ATP3e*IinP) + 0.5*WiC*(ATP2e*UinPe + ATP3e*QinPe) - sqr05*ZiC*SinC*(ATP2e*VinP - ATP4*QinPe)
ulalume3@0 1252 AR = ARP1*IinP + sqr05*DiC*(ARP1*QinPe + ARP2e*IinP) + (1-0.5*WiC)*(ARP2e*QinPe + ARP3e*UinPe) + ZiC*(sqr05*SinC*(ARP3e*VinP-ARP4*UinPe) + ARP4*CosC*VinP)
ulalume3@0 1253 BR = sqr05*DiC*(ARP1*UinPe + ARP3e*IinP) + 0.5*WiC*(ARP2e*UinPe + ARP3e*QinPe) - sqr05*ZiC*SinC*(ARP2e*VinP - ARP4*QinPe)
ulalume3@0 1254 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 1255 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 1256 IS1 = np.array([IinPo,QinPo,UinPo,VinPo])
ulalume3@0 1257 IS2 = np.array([IinPa,QinPa,UinPa,VinPa])
ulalume3@0 1258 GT = np.dot(ATP,IS1)
ulalume3@0 1259 GR = np.dot(ARP,IS1)
ulalume3@0 1260 HT = np.dot(ATP,IS2)
ulalume3@0 1261 HR = np.dot(ARP,IS2)
ulalume3@0 1262 else:
ulalume3@0 1263 IS1e = np.array([IinPo+DiC*QinPoe,DiC*IinPo+QinPoe,ZiC*(CosC*UinPoe+SinC*VinPo),-ZiC*(SinC*UinPoe-CosC*VinPo)])
ulalume3@0 1264 IS2e = np.array([IinPa+DiC*QinPae,DiC*IinPa+QinPae,ZiC*(CosC*UinPae+SinC*VinPa),-ZiC*(SinC*UinPae-CosC*VinPa)])
ulalume3@0 1265 GT = np.dot(ATPe,IS1e)
ulalume3@0 1266 GR = np.dot(ARPe,IS1e)
ulalume3@0 1267 HT = np.dot(ATPe,IS2e)
ulalume3@0 1268 HR = np.dot(ARPe,IS2e)
ulalume3@0 1269 else:
ulalume3@0 1270 print("Calibrator not implemented yet")
ulalume3@0 1271 sys.exit()
ulalume3@0 1272
ulalume3@0 1273 elif LocC == 3: # C before receiver optics Eq.57
ulalume3@0 1274
ulalume3@0 1275 #S2ge = np.sin(np.deg2rad(2*RotO - 2*RotC))
ulalume3@0 1276 #C2ge = np.cos(np.deg2rad(2*RotO - 2*RotC))
ulalume3@0 1277 S2e = np.sin(np.deg2rad(2*RotC))
ulalume3@0 1278 C2e = np.cos(np.deg2rad(2*RotC))
ulalume3@0 1279
ulalume3@0 1280 # AS with C before the receiver optics (see document rotated_diattenuator_X22x5deg.odt)
ulalume3@0 1281 AF1 = np.array([1,C2g*DiO,S2g*DiO,0])
ulalume3@0 1282 AF2 = np.array([C2g*DiO,1-S2g**2*WiO,S2g*C2g*WiO,-S2g*ZiO*SinO])
ulalume3@0 1283 AF3 = np.array([S2g*DiO, S2g*C2g*WiO, 1-C2g**2*WiO, C2g*ZiO*SinO])
ulalume3@0 1284 AF4 = np.array([0, S2g*SinO, -C2g*SinO, CosO])
ulalume3@0 1285
ulalume3@0 1286 ATF = (ATP1*AF1+ATP2*AF2+ATP3*AF3+ATP4*AF4)
ulalume3@0 1287 ARF = (ARP1*AF1+ARP2*AF2+ARP3*AF3+ARP4*AF4)
ulalume3@0 1288 ATF1 = ATF[0]
ulalume3@0 1289 ATF2 = ATF[1]
ulalume3@0 1290 ATF3 = ATF[2]
ulalume3@0 1291 ATF4 = ATF[3]
ulalume3@0 1292 ARF1 = ARF[0]
ulalume3@0 1293 ARF2 = ARF[1]
ulalume3@0 1294 ARF3 = ARF[2]
ulalume3@0 1295 ARF4 = ARF[3]
ulalume3@0 1296
ulalume3@0 1297 # rotated AinF by epsilon
ulalume3@0 1298 ATF2e = C2e*ATF[1] + S2e*ATF[2]
ulalume3@0 1299 ATF3e = C2e*ATF[2] - S2e*ATF[1]
ulalume3@0 1300 ARF2e = C2e*ARF[1] + S2e*ARF[2]
ulalume3@0 1301 ARF3e = C2e*ARF[2] - S2e*ARF[1]
ulalume3@0 1302
ulalume3@0 1303 ATFe = np.array([ATF1,ATF2e,ATF3e,ATF4])
ulalume3@0 1304 ARFe = np.array([ARF1,ARF2e,ARF3e,ARF4])
ulalume3@0 1305
ulalume3@0 1306 QinEe = C2e*QinE + S2e*UinE
ulalume3@0 1307 UinEe = C2e*UinE - S2e*QinE
ulalume3@0 1308
ulalume3@0 1309 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
ulalume3@0 1310 IinF = IinE
ulalume3@0 1311 QinF = aCal*QinE
ulalume3@0 1312 UinF = -aCal*UinE
ulalume3@0 1313 VinF = (1.-2.*aCal)*VinE
ulalume3@0 1314
ulalume3@0 1315 IinFo = IinE
ulalume3@0 1316 QinFo = 0.
ulalume3@0 1317 UinFo = 0.
ulalume3@0 1318 VinFo = VinE
ulalume3@0 1319
ulalume3@0 1320 IinFa = 0.
ulalume3@0 1321 QinFa = QinE
ulalume3@0 1322 UinFa = -UinE
ulalume3@0 1323 VinFa = -2.*VinE
ulalume3@0 1324
ulalume3@0 1325 # Stokes Input Vector before receiver optics rotated by epsilon Eq. C.3
ulalume3@0 1326 QinFe = C2e*QinF + S2e*UinF
ulalume3@0 1327 UinFe = C2e*UinF - S2e*QinF
ulalume3@0 1328 QinFoe = C2e*QinFo + S2e*UinFo
ulalume3@0 1329 UinFoe = C2e*UinFo - S2e*QinFo
ulalume3@0 1330 QinFae = C2e*QinFa + S2e*UinFa
ulalume3@0 1331 UinFae = C2e*UinFa - S2e*QinFa
ulalume3@0 1332
ulalume3@0 1333 # Calibration signals and Calibration correction K from measurements with LDRCal / aCal
ulalume3@0 1334 if (TypeC == 2) or (TypeC == 1): # rotator calibration Eq. C.4
ulalume3@0 1335 AT = ATF1*IinF + ATF4*h*VinF
ulalume3@0 1336 BT = ATF3e*QinF - ATF2e*h*UinF
ulalume3@0 1337 AR = ARF1*IinF + ARF4*h*VinF
ulalume3@0 1338 BR = ARF3e*QinF - ARF2e*h*UinF
ulalume3@0 1339
ulalume3@0 1340 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 1341 if (not RotationErrorEpsilonForNormalMeasurements):
ulalume3@0 1342 GT = ATF1*IinE + ATF4*VinE
ulalume3@0 1343 GR = ARF1*IinE + ARF4*VinE
ulalume3@0 1344 HT = ATF2*QinE - ATF3*UinE - ATF4*2*VinE
ulalume3@0 1345 HR = ARF2*QinE - ARF3*UinE - ARF4*2*VinE
ulalume3@0 1346 else:
ulalume3@0 1347 GT = ATF1*IinE + ATF4*h*VinE
ulalume3@0 1348 GR = ARF1*IinE + ARF4*h*VinE
ulalume3@0 1349 HT = ATF2e*QinE - ATF3e*h*UinE - ATF4*h*2*VinE
ulalume3@0 1350 HR = ARF2e*QinE - ARF3e*h*UinE - ARF4*h*2*VinE
ulalume3@0 1351
ulalume3@0 1352 elif (TypeC == 3) or (TypeC == 4): # linear polariser calibration Eq. C.5
ulalume3@0 1353 # p = +45°, m = -45°
ulalume3@0 1354 IF1e = np.array([IinF, ZiC*CosC*QinFe, UinFe, ZiC*CosC*VinF])
ulalume3@0 1355 IF2e = np.array([DiC*UinFe, -ZiC*SinC*VinF, DiC*IinF, ZiC*SinC*QinFe])
ulalume3@0 1356
ulalume3@0 1357 AT = np.dot(ATFe,IF1e)
ulalume3@0 1358 AR = np.dot(ARFe,IF1e)
ulalume3@0 1359 BT = np.dot(ATFe,IF2e)
ulalume3@0 1360 BR = np.dot(ARFe,IF2e)
ulalume3@0 1361
ulalume3@0 1362 # Correction paremeters for normal measurements; they are independent of LDR --- the same as for TypeC = 6
ulalume3@0 1363 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 1364 IS1 = np.array([IinE,0,0,VinE])
ulalume3@0 1365 IS2 = np.array([0,QinE,-UinE,-2*VinE])
ulalume3@0 1366
ulalume3@0 1367 GT = np.dot(ATF,IS1)
ulalume3@0 1368 GR = np.dot(ARF,IS1)
ulalume3@0 1369 HT = np.dot(ATF,IS2)
ulalume3@0 1370 HR = np.dot(ARF,IS2)
ulalume3@0 1371 else:
ulalume3@0 1372 IS1e = np.array([IinFo+DiC*QinFoe,DiC*IinFo+QinFoe,ZiC*(CosC*UinFoe+SinC*VinFo),-ZiC*(SinC*UinFoe-CosC*VinFo)])
ulalume3@0 1373 IS2e = np.array([IinFa+DiC*QinFae,DiC*IinFa+QinFae,ZiC*(CosC*UinFae+SinC*VinFa),-ZiC*(SinC*UinFae-CosC*VinFa)])
ulalume3@0 1374 GT = np.dot(ATFe,IS1e)
ulalume3@0 1375 GR = np.dot(ARFe,IS1e)
ulalume3@0 1376 HT = np.dot(ATFe,IS2e)
ulalume3@0 1377 HR = np.dot(ARFe,IS2e)
ulalume3@0 1378
ulalume3@0 1379 elif (TypeC == 6): # diattenuator calibration +-22.5° rotated_diattenuator_X22x5deg.odt
ulalume3@0 1380 # p = +22.5°, m = -22.5°
ulalume3@0 1381 IF1e = np.array([IinF+sqr05*DiC*QinFe, sqr05*DiC*IinF+(1-0.5*WiC)*QinFe, (1-0.5*WiC)*UinFe+sqr05*ZiC*SinC*VinF, -sqr05*ZiC*SinC*UinFe+ZiC*CosC*VinF])
ulalume3@0 1382 IF2e = np.array([sqr05*DiC*UinFe, 0.5*WiC*UinFe-sqr05*ZiC*SinC*VinF, sqr05*DiC*IinF+0.5*WiC*QinFe, sqr05*ZiC*SinC*QinFe])
ulalume3@0 1383
ulalume3@0 1384 AT = np.dot(ATFe,IF1e)
ulalume3@0 1385 AR = np.dot(ARFe,IF1e)
ulalume3@0 1386 BT = np.dot(ATFe,IF2e)
ulalume3@0 1387 BR = np.dot(ARFe,IF2e)
ulalume3@0 1388
ulalume3@0 1389 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 1390 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 1391 #IS1 = np.array([IinE,0,0,VinE])
ulalume3@0 1392 #IS2 = np.array([0,QinE,-UinE,-2*VinE])
ulalume3@0 1393 IS1 = np.array([IinFo,0,0,VinFo])
ulalume3@0 1394 IS2 = np.array([0,QinFa,UinFa,VinFa])
ulalume3@0 1395 GT = np.dot(ATF,IS1)
ulalume3@0 1396 GR = np.dot(ARF,IS1)
ulalume3@0 1397 HT = np.dot(ATF,IS2)
ulalume3@0 1398 HR = np.dot(ARF,IS2)
ulalume3@0 1399 else:
ulalume3@0 1400 #IS1e = np.array([IinE,DiC*IinE,ZiC*SinC*VinE,ZiC*CosC*VinE])
ulalume3@0 1401 #IS2e = np.array([DiC*QinEe,QinEe,-ZiC*(CosC*UinEe+2*SinC*VinE),ZiC*(SinC*UinEe-2*CosC*VinE)])
ulalume3@0 1402 IS1e = np.array([IinFo+DiC*QinFoe,DiC*IinFo+QinFoe,ZiC*(CosC*UinFoe+SinC*VinFo),-ZiC*(SinC*UinFoe-CosC*VinFo)])
ulalume3@0 1403 IS2e = np.array([IinFa+DiC*QinFae,DiC*IinFa+QinFae,ZiC*(CosC*UinFae+SinC*VinFa),-ZiC*(SinC*UinFae-CosC*VinFa)])
ulalume3@0 1404 GT = np.dot(ATFe,IS1e)
ulalume3@0 1405 GR = np.dot(ARFe,IS1e)
ulalume3@0 1406 HT = np.dot(ATFe,IS2e)
ulalume3@0 1407 HR = np.dot(ARFe,IS2e)
ulalume3@0 1408
ulalume3@0 1409
ulalume3@0 1410 else:
ulalume3@0 1411 print('Calibrator not implemented yet')
ulalume3@0 1412 sys.exit()
ulalume3@0 1413
ulalume3@0 1414 elif LocC == 2: # C behind emitter optics Eq.57
ulalume3@0 1415 #print("Calibrator location not implemented yet")
ulalume3@0 1416 S2e = np.sin(np.deg2rad(2*RotC))
ulalume3@0 1417 C2e = np.cos(np.deg2rad(2*RotC))
ulalume3@0 1418
ulalume3@0 1419 # AS with C before the receiver optics (see document rotated_diattenuator_X22x5deg.odt)
ulalume3@0 1420 AF1 = np.array([1,C2g*DiO,S2g*DiO,0])
ulalume3@0 1421 AF2 = np.array([C2g*DiO,1-S2g**2*WiO,S2g*C2g*WiO,-S2g*ZiO*SinO])
ulalume3@0 1422 AF3 = np.array([S2g*DiO, S2g*C2g*WiO, 1-C2g**2*WiO, C2g*ZiO*SinO])
ulalume3@0 1423 AF4 = np.array([0, S2g*SinO, -C2g*SinO, CosO])
ulalume3@0 1424
ulalume3@0 1425 ATF = (ATP1*AF1+ATP2*AF2+ATP3*AF3+ATP4*AF4)
ulalume3@0 1426 ARF = (ARP1*AF1+ARP2*AF2+ARP3*AF3+ARP4*AF4)
ulalume3@0 1427 ATF1 = ATF[0]
ulalume3@0 1428 ATF2 = ATF[1]
ulalume3@0 1429 ATF3 = ATF[2]
ulalume3@0 1430 ATF4 = ATF[3]
ulalume3@0 1431 ARF1 = ARF[0]
ulalume3@0 1432 ARF2 = ARF[1]
ulalume3@0 1433 ARF3 = ARF[2]
ulalume3@0 1434 ARF4 = ARF[3]
ulalume3@0 1435
ulalume3@0 1436 # AS with C behind the emitter --------------------------------------------
ulalume3@0 1437 # terms without aCal
ulalume3@0 1438 ATE1o, ARE1o = ATF1, ARF1
ulalume3@0 1439 ATE2o, ARE2o = 0., 0.
ulalume3@0 1440 ATE3o, ARE3o = 0., 0.
ulalume3@0 1441 ATE4o, ARE4o = ATF4, ARF4
ulalume3@0 1442 # terms with aCal
ulalume3@0 1443 ATE1a, ARE1a = 0. , 0.
ulalume3@0 1444 ATE2a, ARE2a = ATF2, ARF2
ulalume3@0 1445 ATE3a, ARE3a = -ATF3, -ARF3
ulalume3@0 1446 ATE4a, ARE4a = -2*ATF4, -2*ARF4
ulalume3@0 1447 # rotated AinEa by epsilon
ulalume3@0 1448 ATE2ae = C2e*ATF2 + S2e*ATF3
ulalume3@0 1449 ATE3ae = -S2e*ATF2 - C2e*ATF3
ulalume3@0 1450 ARE2ae = C2e*ARF2 + S2e*ARF3
ulalume3@0 1451 ARE3ae = -S2e*ARF2 - C2e*ARF3
ulalume3@0 1452
ulalume3@0 1453 ATE1 = ATE1o
ulalume3@0 1454 ATE2e = aCal*ATE2ae
ulalume3@0 1455 ATE3e = aCal*ATE3ae
ulalume3@0 1456 ATE4 = (1-2*aCal)*ATF4
ulalume3@0 1457 ARE1 = ARE1o
ulalume3@0 1458 ARE2e = aCal*ARE2ae
ulalume3@0 1459 ARE3e = aCal*ARE3ae
ulalume3@0 1460 ARE4 = (1-2*aCal)*ARF4
ulalume3@0 1461
ulalume3@0 1462 # rotated IinE
ulalume3@0 1463 QinEe = C2e*QinE + S2e*UinE
ulalume3@0 1464 UinEe = C2e*UinE - S2e*QinE
ulalume3@0 1465
ulalume3@0 1466 # --- Calibration signals and Calibration correction K from measurements with LDRCal / aCal
ulalume3@0 1467 if (TypeC == 2) or (TypeC == 1): # +++++++++ rotator calibration Eq. C.4
ulalume3@0 1468 AT = ATE1o*IinE + (ATE4o+aCal*ATE4a)*h*VinE
ulalume3@0 1469 BT = aCal * (ATE3ae*QinEe - ATE2ae*h*UinEe)
ulalume3@0 1470 AR = ARE1o*IinE + (ARE4o+aCal*ARE4a)*h*VinE
ulalume3@0 1471 BR = aCal * (ARE3ae*QinEe - ARE2ae*h*UinEe)
ulalume3@0 1472
ulalume3@0 1473 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 1474 if (not RotationErrorEpsilonForNormalMeasurements):
ulalume3@0 1475 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
ulalume3@0 1476 GT = ATE1o*IinE + ATE4o*h*VinE
ulalume3@0 1477 GR = ARE1o*IinE + ARE4o*h*VinE
ulalume3@0 1478 HT = ATE2a*QinE + ATE3a*h*UinEe + ATE4a*h*VinE
ulalume3@0 1479 HR = ARE2a*QinE + ARE3a*h*UinEe + ARE4a*h*VinE
ulalume3@0 1480 else:
ulalume3@0 1481 GT = ATE1o*IinE + ATE4o*h*VinE
ulalume3@0 1482 GR = ARE1o*IinE + ARE4o*h*VinE
ulalume3@0 1483 HT = ATE2ae*QinE + ATE3ae*h*UinEe + ATE4a*h*VinE
ulalume3@0 1484 HR = ARE2ae*QinE + ARE3ae*h*UinEe + ARE4a*h*VinE
ulalume3@0 1485
ulalume3@0 1486 elif (TypeC == 3) or (TypeC == 4): # +++++++++ linear polariser calibration Eq. C.5
ulalume3@0 1487 # p = +45°, m = -45°
ulalume3@0 1488 AT = ATE1*IinE + ZiC*CosC*(ATE2e*QinEe + ATE4*VinE) + ATE3e*UinEe
ulalume3@0 1489 BT = DiC*(ATE1*UinEe + ATE3e*IinE) + ZiC*SinC*(ATE4*QinEe - ATE2e*VinE)
ulalume3@0 1490 AR = ARE1*IinE + ZiC*CosC*(ARE2e*QinEe + ARE4*VinE) + ARE3e*UinEe
ulalume3@0 1491 BR = DiC*(ARE1*UinEe + ARE3e*IinE) + ZiC*SinC*(ARE4*QinEe - ARE2e*VinE)
ulalume3@0 1492
ulalume3@0 1493 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 1494 if (not RotationErrorEpsilonForNormalMeasurements):
ulalume3@0 1495 # Stokes Input Vector before receiver optics Eq. E.19 (after atmosphere F)
ulalume3@0 1496 GT = ATE1o*IinE + ATE4o*VinE
ulalume3@0 1497 GR = ARE1o*IinE + ARE4o*VinE
ulalume3@0 1498 HT = ATE2a*QinE + ATE3a*UinE + ATE4a*VinE
ulalume3@0 1499 HR = ARE2a*QinE + ARE3a*UinE + ARE4a*VinE
ulalume3@0 1500 else:
ulalume3@0 1501 D = IinE + DiC*QinEe
ulalume3@0 1502 A = DiC*IinE + QinEe
ulalume3@0 1503 B = ZiC*(CosC*UinEe + SinC*VinE)
ulalume3@0 1504 C = -ZiC*(SinC*UinEe - CosC*VinE)
ulalume3@0 1505 GT = ATE1o*D + ATE4o*C
ulalume3@0 1506 GR = ARE1o*D + ARE4o*C
ulalume3@0 1507 HT = ATE2a*A + ATE3a*B + ATE4a*C
ulalume3@0 1508 HR = ARE2a*A + ARE3a*B + ARE4a*C
ulalume3@0 1509
ulalume3@0 1510 elif (TypeC == 6): # real HWP calibration +-22.5° rotated_diattenuator_X22x5deg.odt
ulalume3@0 1511 # p = +22.5°, m = -22.5°
ulalume3@0 1512 IE1e = np.array([IinE+sqr05*DiC*QinEe, sqr05*DiC*IinE+(1-0.5*WiC)*QinEe, (1-0.5*WiC)*UinEe+sqr05*ZiC*SinC*VinE, -sqr05*ZiC*SinC*UinEe+ZiC*CosC*VinE])
ulalume3@0 1513 IE2e = np.array([sqr05*DiC*UinEe, 0.5*WiC*UinEe-sqr05*ZiC*SinC*VinE, sqr05*DiC*IinE+0.5*WiC*QinEe, sqr05*ZiC*SinC*QinEe])
ulalume3@0 1514 ATEe = np.array([ATE1,ATE2e,ATE3e,ATE4])
ulalume3@0 1515 AREe = np.array([ARE1,ARE2e,ARE3e,ARE4])
ulalume3@0 1516 AT = np.dot(ATEe,IE1e)
ulalume3@0 1517 AR = np.dot(AREe,IE1e)
ulalume3@0 1518 BT = np.dot(ATEe,IE2e)
ulalume3@0 1519 BR = np.dot(AREe,IE2e)
ulalume3@0 1520
ulalume3@0 1521 # Correction paremeters for normal measurements; they are independent of LDR
ulalume3@0 1522 if (not RotationErrorEpsilonForNormalMeasurements): # calibrator taken out
ulalume3@0 1523 GT = ATE1o*IinE + ATE4o*VinE
ulalume3@0 1524 GR = ARE1o*IinE + ARE4o*VinE
ulalume3@0 1525 HT = ATE2a*QinE + ATE3a*UinE + ATE4a*VinE
ulalume3@0 1526 HR = ARE2a*QinE + ARE3a*UinE + ARE4a*VinE
ulalume3@0 1527 else:
ulalume3@0 1528 D = IinE + DiC*QinEe
ulalume3@0 1529 A = DiC*IinE + QinEe
ulalume3@0 1530 B = ZiC*(CosC*UinEe + SinC*VinE)
ulalume3@0 1531 C = -ZiC*(SinC*UinEe - CosC*VinE)
ulalume3@0 1532 GT = ATE1o*D + ATE4o*C
ulalume3@0 1533 GR = ARE1o*D + ARE4o*C
ulalume3@0 1534 HT = ATE2a*A + ATE3a*B + ATE4a*C
ulalume3@0 1535 HR = ARE2a*A + ARE3a*B + ARE4a*C
ulalume3@0 1536
ulalume3@0 1537 else:
ulalume3@0 1538 print('Calibrator not implemented yet')
ulalume3@0 1539 sys.exit()
ulalume3@0 1540
ulalume3@0 1541 # Calibration signals with aCal => Determination of the correction K of the real calibration factor
ulalume3@0 1542 IoutTp = TaT*TiT*TiO*TiE*(AT + BT)
ulalume3@0 1543 IoutTm = TaT*TiT*TiO*TiE*(AT - BT)
ulalume3@0 1544 IoutRp = TaR*TiR*TiO*TiE*(AR + BR)
ulalume3@0 1545 IoutRm = TaR*TiR*TiO*TiE*(AR - BR)
ulalume3@0 1546 # --- Results and Corrections; electronic etaR and etaT are assumed to be 1
ulalume3@0 1547 #Eta = TiR/TiT # Eta = Eta*/K Eq. 84
ulalume3@0 1548 Etapx = IoutRp/IoutTp
ulalume3@0 1549 Etamx = IoutRm/IoutTm
ulalume3@0 1550 Etax = (Etapx*Etamx)**0.5
ulalume3@0 1551 K = Etax / Eta0
ulalume3@0 1552 #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))
ulalume3@0 1553 #print("{0:6.3f},{1:6.3f},{2:6.3f},{3:6.3f}".format(DiC, ZiC, Kp, Km))
ulalume3@0 1554
ulalume3@0 1555 # For comparison with Volkers Libreoffice Müller Matrix spreadsheet
ulalume3@0 1556 #Eta_test_p = (IoutRp/IoutTp)
ulalume3@0 1557 #Eta_test_m = (IoutRm/IoutTm)
ulalume3@0 1558 #Eta_test = (Eta_test_p*Eta_test_m)**0.5
ulalume3@0 1559
ulalume3@0 1560 # *************************************************************************
ulalume3@0 1561 iLDR = -1
ulalume3@0 1562 for LDRTrue in LDRrange:
ulalume3@0 1563 iLDR = iLDR + 1
ulalume3@0 1564 atrue = (1-LDRTrue)/(1+LDRTrue)
ulalume3@0 1565 # ----- Forward simulated signals and LDRsim with atrue; from input file
ulalume3@0 1566 It = TaT*TiT*TiO*TiE*(GT+atrue*HT) # TaT*TiT*TiC*TiO*IinL*(GT+atrue*HT)
ulalume3@0 1567 Ir = TaR*TiR*TiO*TiE*(GR+atrue*HR) # TaR*TiR*TiC*TiO*IinL*(GR+atrue*HR)
ulalume3@0 1568
ulalume3@0 1569 # LDRsim = 1/Eta*Ir/It # simulated LDR* with Y from input file
ulalume3@0 1570 LDRsim = Ir/It # simulated uncorrected LDR with Y from input file
ulalume3@0 1571 '''
ulalume3@0 1572 if Y == 1.:
ulalume3@0 1573 LDRsimx = LDRsim
ulalume3@0 1574 LDRsimx2 = LDRsim2
ulalume3@0 1575 else:
ulalume3@0 1576 LDRsimx = 1./LDRsim
ulalume3@0 1577 LDRsimx2 = 1./LDRsim2
ulalume3@0 1578 '''
ulalume3@0 1579 # ----- Backward correction
ulalume3@0 1580 # Corrected LDRCorr from forward simulated LDRsim (atrue) with assumed true G0,H0,K0
ulalume3@0 1581 LDRCorr = (LDRsim*K0/Etax*(GT0+HT0)-(GR0+HR0))/((GR0-HR0)-LDRsim*K0/Etax*(GT0-HT0))
ulalume3@0 1582
ulalume3@0 1583 # -- F11corr from It and Ir and calibration EtaX
ulalume3@0 1584 Text1 = "F11corr from It and Ir with calibration EtaX: x-axis: F11corr(LDRtrue) / F11corr(LDRtrue = 0.004) - 1"
ulalume3@0 1585 F11corr = 1/(TiO*TiE)*((HR0*Etax/K0*It/TTa-HT0*Ir/TRa)/(HR0*GT0-HT0*GR0)) # IL = 1 Eq.(64)
ulalume3@0 1586
ulalume3@0 1587 #Text1 = "F11corr from It and Ir without corrections but with calibration EtaX: x-axis: F11corr(LDRtrue) devided by F11corr(LDRtrue = 0.004)"
ulalume3@0 1588 #F11corr = 0.5/(TiO*TiE)*(Etax*It/TTa+Ir/TRa) # IL = 1 Eq.(64)
ulalume3@0 1589
ulalume3@0 1590 # -- It from It only with atrue without corrections - for BERTHA (and PollyXTs)
ulalume3@0 1591 #Text1 = " x-axis: IT(LDRtrue) / IT(LDRtrue = 0.004) - 1"
ulalume3@0 1592 #F11corr = It/(TaT*TiT*TiO*TiE) #/(TaT*TiT*TiO*TiE*(GT0+atrue*HT0))
ulalume3@0 1593 # !!! see below line 1673ff
ulalume3@0 1594
ulalume3@0 1595 aF11corr[iLDR,iN] = F11corr
ulalume3@0 1596 aA[iLDR,iN] = LDRCorr
ulalume3@0 1597
ulalume3@0 1598 aX[0,iN] = GR
ulalume3@0 1599 aX[1,iN] = GT
ulalume3@0 1600 aX[2,iN] = HR
ulalume3@0 1601 aX[3,iN] = HT
ulalume3@0 1602 aX[4,iN] = K
ulalume3@0 1603
ulalume3@0 1604 aLDRCal[iN] = iLDRCal
ulalume3@0 1605 aERaT[iN] = iERaT
ulalume3@0 1606 aERaR[iN] = iERaR
ulalume3@0 1607 aRotaT[iN] = iRotaT
ulalume3@0 1608 aRotaR[iN] = iRotaR
ulalume3@0 1609 aRetT[iN] = iRetT
ulalume3@0 1610 aRetR[iN] = iRetR
ulalume3@0 1611
ulalume3@0 1612 aRotL[iN] = iRotL
ulalume3@0 1613 aRotE[iN] = iRotE
ulalume3@0 1614 aRetE[iN] = iRetE
ulalume3@0 1615 aRotO[iN] = iRotO
ulalume3@0 1616 aRetO[iN] = iRetO
ulalume3@0 1617 aRotC[iN] = iRotC
ulalume3@0 1618 aRetC[iN] = iRetC
ulalume3@0 1619 aDiO[iN] = iDiO
ulalume3@0 1620 aDiE[iN] = iDiE
ulalume3@0 1621 aDiC[iN] = iDiC
ulalume3@0 1622 aTP[iN] = iTP
ulalume3@0 1623 aTS[iN] = iTS
ulalume3@0 1624 aRP[iN] = iRP
ulalume3@0 1625 aRS[iN] = iRS
ulalume3@0 1626
ulalume3@0 1627 # --- END loop
ulalume3@0 1628 btime = clock()
ulalume3@0 1629 print("\r done in ", "{0:5.0f}".format(btime-atime), "sec") #, end="\r")
ulalume3@0 1630
ulalume3@0 1631 # --- Plot -----------------------------------------------------------------
ulalume3@0 1632 #sns.set_style("whitegrid")
ulalume3@0 1633 #sns.set_palette("bright", 6)
ulalume3@0 1634
ulalume3@0 1635 '''
ulalume3@0 1636 fig2 = plt.figure()
ulalume3@0 1637 plt.plot(aA[2,:],'b.')
ulalume3@0 1638 plt.plot(aA[3,:],'r.')
ulalume3@0 1639 plt.plot(aA[4,:],'g.')
ulalume3@0 1640 #plt.plot(aA[6,:],'c.')
ulalume3@0 1641 plt.show
ulalume3@0 1642 '''
ulalume3@0 1643 # Plot LDR
ulalume3@0 1644 def PlotSubHist(aVar, aX, X0, daX, iaX, naX):
ulalume3@0 1645 fig, ax = plt.subplots(nrows=1, ncols=5, sharex=True, sharey=True, figsize=(25, 2))
ulalume3@0 1646 iLDR = -1
ulalume3@0 1647 for LDRTrue in LDRrange:
ulalume3@0 1648 iLDR = iLDR + 1
ulalume3@0 1649
ulalume3@0 1650 LDRmin[iLDR] = np.min(aA[iLDR,:])
ulalume3@0 1651 LDRmax[iLDR] = np.max(aA[iLDR,:])
ulalume3@0 1652 Rmin = LDRmin[iLDR] * 0.995 # np.min(aA[iLDR,:]) * 0.995
ulalume3@0 1653 Rmax = LDRmax[iLDR] * 1.005 # np.max(aA[iLDR,:]) * 1.005
ulalume3@0 1654
ulalume3@0 1655 #plt.subplot(5,2,iLDR+1)
ulalume3@0 1656 plt.subplot(1,5,iLDR+1)
ulalume3@0 1657 (n, bins, patches) = plt.hist(aA[iLDR,:],
ulalume3@0 1658 bins=100, log=False,
ulalume3@0 1659 range=[Rmin, Rmax],
ulalume3@0 1660 alpha=0.5, normed=False, color = '0.5', histtype='stepfilled')
ulalume3@0 1661
ulalume3@0 1662 for iaX in range(-naX,naX+1):
ulalume3@0 1663 plt.hist(aA[iLDR,aX == iaX],
ulalume3@0 1664 range=[Rmin, Rmax],
ulalume3@0 1665 bins=100, log=False, alpha=0.3, normed=False, histtype='stepfilled', label = str(round(X0 + iaX*daX/naX,5)))
ulalume3@0 1666
ulalume3@0 1667 if (iLDR == 2): plt.legend()
ulalume3@0 1668
ulalume3@0 1669 plt.tick_params(axis='both', labelsize=9)
ulalume3@0 1670 plt.plot([LDRTrue, LDRTrue], [0, np.max(n)], 'r-', lw=2)
ulalume3@0 1671
ulalume3@0 1672 #plt.title(LID + ' ' + aVar, fontsize=18)
ulalume3@0 1673 #plt.ylabel('frequency', fontsize=10)
ulalume3@0 1674 #plt.xlabel('LDRcorr', fontsize=10)
ulalume3@0 1675 #fig.tight_layout()
ulalume3@0 1676 fig.suptitle(LID + ' ' + str(Type[TypeC]) + ' ' + str(Loc[LocC]) + ' - ' + aVar, fontsize=14, y=1.05)
ulalume3@0 1677 #plt.show()
ulalume3@0 1678 #fig.savefig(LID + '_' + aVar + '.png', dpi=150, bbox_inches='tight', pad_inches=0)
ulalume3@0 1679 #plt.close
ulalume3@0 1680 return
ulalume3@0 1681
ulalume3@0 1682 if (nRotL > 0): PlotSubHist("RotL", aRotL, RotL0, dRotL, iRotL, nRotL)
ulalume3@0 1683 if (nRetE > 0): PlotSubHist("RetE", aRetE, RetE0, dRetE, iRetE, nRetE)
ulalume3@0 1684 if (nRotE > 0): PlotSubHist("RotE", aRotE, RotE0, dRotE, iRotE, nRotE)
ulalume3@0 1685 if (nDiE > 0): PlotSubHist("DiE", aDiE, DiE0, dDiE, iDiE, nDiE)
ulalume3@0 1686 if (nRetO > 0): PlotSubHist("RetO", aRetO, RetO0, dRetO, iRetO, nRetO)
ulalume3@0 1687 if (nRotO > 0): PlotSubHist("RotO", aRotO, RotO0, dRotO, iRotO, nRotO)
ulalume3@0 1688 if (nDiO > 0): PlotSubHist("DiO", aDiO, DiO0, dDiO, iDiO, nDiO)
ulalume3@0 1689 if (nDiC > 0): PlotSubHist("DiC", aDiC, DiC0, dDiC, iDiC, nDiC)
ulalume3@0 1690 if (nRotC > 0): PlotSubHist("RotC", aRotC, RotC0, dRotC, iRotC, nRotC)
ulalume3@0 1691 if (nRetC > 0): PlotSubHist("RetC", aRetC, RetC0, dRetC, iRetC, nRetC)
ulalume3@0 1692 if (nTP > 0): PlotSubHist("TP", aTP, TP0, dTP, iTP, nTP)
ulalume3@0 1693 if (nTS > 0): PlotSubHist("TS", aTS, TS0, dTS, iTS, nTS)
ulalume3@0 1694 if (nRP > 0): PlotSubHist("RP", aRP, RP0, dRP, iRP, nRP)
ulalume3@0 1695 if (nRS > 0): PlotSubHist("RS", aRS, RS0, dRS, iRS, nRS)
ulalume3@0 1696 if (nRetT > 0): PlotSubHist("RetT", aRetT, RetT0, dRetT, iRetT, nRetT)
ulalume3@0 1697 if (nRetR > 0): PlotSubHist("RetR", aRetR, RetR0, dRetR, iRetR, nRetR)
ulalume3@0 1698 if (nERaT > 0): PlotSubHist("ERaT", aERaT, ERaT0, dERaT, iERaT, nERaT)
ulalume3@0 1699 if (nERaR > 0): PlotSubHist("ERaR", aERaR, ERaR0, dERaR, iERaR, nERaR)
ulalume3@0 1700 if (nRotaT > 0): PlotSubHist("RotaT", aRotaT, RotaT0, dRotaT, iRotaT, nRotaT)
ulalume3@0 1701 if (nRotaR > 0): PlotSubHist("RotaR", aRotaR, RotaR0, dRotaR, iRotaR, nRotaR)
ulalume3@0 1702 if (nLDRCal > 0): PlotSubHist("LDRCal", aLDRCal, LDRCal0, dLDRCal, iLDRCal, nLDRCal)
ulalume3@0 1703
ulalume3@0 1704 plt.show()
ulalume3@0 1705 plt.close
ulalume3@0 1706
ulalume3@0 1707 print()
ulalume3@0 1708 #print("IT(LDRtrue) devided by IT(LDRtrue = 0.004)")
ulalume3@0 1709 print(Text1)
ulalume3@0 1710 print()
ulalume3@0 1711
ulalume3@0 1712 iLDR = 5
ulalume3@0 1713 for LDRTrue in LDRrange:
ulalume3@0 1714 iLDR = iLDR - 1
ulalume3@0 1715 aF11corr[iLDR,:] = aF11corr[iLDR,:] / aF11corr[0,:] - 1.0
ulalume3@0 1716
ulalume3@0 1717 # Plot F11
ulalume3@0 1718 def PlotSubHistF11(aVar, aX, X0, daX, iaX, naX):
ulalume3@0 1719 fig, ax = plt.subplots(nrows=1, ncols=5, sharex=True, sharey=True, figsize=(25, 2))
ulalume3@0 1720 iLDR = -1
ulalume3@0 1721 for LDRTrue in LDRrange:
ulalume3@0 1722 iLDR = iLDR + 1
ulalume3@0 1723
ulalume3@0 1724 '''
ulalume3@0 1725 F11min[iLDR] = np.min(aF11corr[iLDR,:])
ulalume3@0 1726 F11max[iLDR] = np.max(aF11corr[iLDR,:])
ulalume3@0 1727 Rmin = F11min[iLDR] * 0.995 # np.min(aA[iLDR,:]) * 0.995
ulalume3@0 1728 Rmax = F11max[iLDR] * 1.005 # np.max(aA[iLDR,:]) * 1.005
ulalume3@0 1729 '''
ulalume3@0 1730 #Rmin = 0.8
ulalume3@0 1731 #Rmax = 1.2
ulalume3@0 1732
ulalume3@0 1733 #plt.subplot(5,2,iLDR+1)
ulalume3@0 1734 plt.subplot(1,5,iLDR+1)
ulalume3@0 1735 (n, bins, patches) = plt.hist(aF11corr[iLDR,:],
ulalume3@0 1736 bins=100, log=False,
ulalume3@0 1737 alpha=0.5, normed=False, color = '0.5', histtype='stepfilled')
ulalume3@0 1738
ulalume3@0 1739 for iaX in range(-naX,naX+1):
ulalume3@0 1740 plt.hist(aF11corr[iLDR,aX == iaX],
ulalume3@0 1741 bins=100, log=False, alpha=0.3, normed=False, histtype='stepfilled', label = str(round(X0 + iaX*daX/naX,5)))
ulalume3@0 1742
ulalume3@0 1743 if (iLDR == 2): plt.legend()
ulalume3@0 1744
ulalume3@0 1745 plt.tick_params(axis='both', labelsize=9)
ulalume3@0 1746 #plt.plot([LDRTrue, LDRTrue], [0, np.max(n)], 'r-', lw=2)
ulalume3@0 1747
ulalume3@0 1748 #plt.title(LID + ' ' + aVar, fontsize=18)
ulalume3@0 1749 #plt.ylabel('frequency', fontsize=10)
ulalume3@0 1750 #plt.xlabel('LDRcorr', fontsize=10)
ulalume3@0 1751 #fig.tight_layout()
ulalume3@0 1752 fig.suptitle(LID + ' ' + str(Type[TypeC]) + ' ' + str(Loc[LocC]) + ' - ' + aVar, fontsize=14, y=1.05)
ulalume3@0 1753 #plt.show()
ulalume3@0 1754 #fig.savefig(LID + '_' + aVar + '.png', dpi=150, bbox_inches='tight', pad_inches=0)
ulalume3@0 1755 #plt.close
ulalume3@0 1756 return
ulalume3@0 1757
ulalume3@0 1758 if (nRotL > 0): PlotSubHistF11("RotL", aRotL, RotL0, dRotL, iRotL, nRotL)
ulalume3@0 1759 if (nRetE > 0): PlotSubHistF11("RetE", aRetE, RetE0, dRetE, iRetE, nRetE)
ulalume3@0 1760 if (nRotE > 0): PlotSubHistF11("RotE", aRotE, RotE0, dRotE, iRotE, nRotE)
ulalume3@0 1761 if (nDiE > 0): PlotSubHistF11("DiE", aDiE, DiE0, dDiE, iDiE, nDiE)
ulalume3@0 1762 if (nRetO > 0): PlotSubHistF11("RetO", aRetO, RetO0, dRetO, iRetO, nRetO)
ulalume3@0 1763 if (nRotO > 0): PlotSubHistF11("RotO", aRotO, RotO0, dRotO, iRotO, nRotO)
ulalume3@0 1764 if (nDiO > 0): PlotSubHistF11("DiO", aDiO, DiO0, dDiO, iDiO, nDiO)
ulalume3@0 1765 if (nDiC > 0): PlotSubHistF11("DiC", aDiC, DiC0, dDiC, iDiC, nDiC)
ulalume3@0 1766 if (nRotC > 0): PlotSubHistF11("RotC", aRotC, RotC0, dRotC, iRotC, nRotC)
ulalume3@0 1767 if (nRetC > 0): PlotSubHistF11("RetC", aRetC, RetC0, dRetC, iRetC, nRetC)
ulalume3@0 1768 if (nTP > 0): PlotSubHistF11("TP", aTP, TP0, dTP, iTP, nTP)
ulalume3@0 1769 if (nTS > 0): PlotSubHistF11("TS", aTS, TS0, dTS, iTS, nTS)
ulalume3@0 1770 if (nRP > 0): PlotSubHistF11("RP", aRP, RP0, dRP, iRP, nRP)
ulalume3@0 1771 if (nRS > 0): PlotSubHistF11("RS", aRS, RS0, dRS, iRS, nRS)
ulalume3@0 1772 if (nRetT > 0): PlotSubHistF11("RetT", aRetT, RetT0, dRetT, iRetT, nRetT)
ulalume3@0 1773 if (nRetR > 0): PlotSubHistF11("RetR", aRetR, RetR0, dRetR, iRetR, nRetR)
ulalume3@0 1774 if (nERaT > 0): PlotSubHistF11("ERaT", aERaT, ERaT0, dERaT, iERaT, nERaT)
ulalume3@0 1775 if (nERaR > 0): PlotSubHistF11("ERaR", aERaR, ERaR0, dERaR, iERaR, nERaR)
ulalume3@0 1776 if (nRotaT > 0): PlotSubHistF11("RotaT", aRotaT, RotaT0, dRotaT, iRotaT, nRotaT)
ulalume3@0 1777 if (nRotaR > 0): PlotSubHistF11("RotaR", aRotaR, RotaR0, dRotaR, iRotaR, nRotaR)
ulalume3@0 1778 if (nLDRCal > 0): PlotSubHistF11("LDRCal", aLDRCal, LDRCal0, dLDRCal, iLDRCal, nLDRCal)
ulalume3@0 1779
ulalume3@0 1780 plt.show()
ulalume3@0 1781 plt.close
ulalume3@0 1782 '''
ulalume3@0 1783 # only histogram
ulalume3@0 1784 #print("******************* " + aVar + " *******************")
ulalume3@0 1785 fig, ax = plt.subplots(nrows=5, ncols=2, sharex=True, sharey=True, figsize=(10, 10))
ulalume3@0 1786 iLDR = -1
ulalume3@0 1787 for LDRTrue in LDRrange:
ulalume3@0 1788 iLDR = iLDR + 1
ulalume3@0 1789 LDRmin[iLDR] = np.min(aA[iLDR,:])
ulalume3@0 1790 LDRmax[iLDR] = np.max(aA[iLDR,:])
ulalume3@0 1791 Rmin = np.min(aA[iLDR,:]) * 0.999
ulalume3@0 1792 Rmax = np.max(aA[iLDR,:]) * 1.001
ulalume3@0 1793 plt.subplot(5,2,iLDR+1)
ulalume3@0 1794 (n, bins, patches) = plt.hist(aA[iLDR,:],
ulalume3@0 1795 range=[Rmin, Rmax],
ulalume3@0 1796 bins=200, log=False, alpha=0.2, normed=False, color = '0.5', histtype='stepfilled')
ulalume3@0 1797 plt.tick_params(axis='both', labelsize=9)
ulalume3@0 1798 plt.plot([LDRTrue, LDRTrue], [0, np.max(n)], 'r-', lw=2)
ulalume3@0 1799 plt.show()
ulalume3@0 1800 plt.close
ulalume3@0 1801 '''
ulalume3@0 1802
ulalume3@0 1803 # --- Plot LDRmin, LDRmax
ulalume3@0 1804 fig2 = plt.figure()
ulalume3@0 1805 plt.plot(LDRrange,LDRmax-LDRrange, linewidth=2.0, color='b')
ulalume3@0 1806 plt.plot(LDRrange,LDRmin-LDRrange, linewidth=2.0, color='g')
ulalume3@0 1807
ulalume3@0 1808 plt.xlabel('LDRtrue', fontsize=18)
ulalume3@0 1809 plt.ylabel('LDRTrue-LDRmin, LDRTrue-LDRmax', fontsize=14)
ulalume3@0 1810 plt.title(LID + ' ' + str(Type[TypeC]) + ' ' + str(Loc[LocC]), fontsize=18)
ulalume3@0 1811 #plt.ylimit(-0.07, 0.07)
ulalume3@0 1812 plt.show()
ulalume3@0 1813 plt.close
ulalume3@0 1814
ulalume3@0 1815 # --- Save LDRmin, LDRmax to file
ulalume3@0 1816 # http://stackoverflow.com/questions/4675728/redirect-stdout-to-a-file-in-python
ulalume3@0 1817 with open('LDR_min_max_ver7_' + LID + '.dat', 'w') as f:
ulalume3@0 1818 with redirect_stdout(f):
ulalume3@0 1819 print(LID)
ulalume3@0 1820 print("LDRtrue, LDRmin, LDRmax")
ulalume3@0 1821 for i in range(len(LDRrange)):
ulalume3@0 1822 print("{0:7.4f},{1:7.4f},{2:7.4f}".format(LDRrange[i], LDRmin[i], LDRmax[i]))
ulalume3@0 1823
ulalume3@0 1824 '''
ulalume3@0 1825 # --- Plot K over LDRCal
ulalume3@0 1826 fig3 = plt.figure()
ulalume3@0 1827 plt.plot(LDRCal0+aLDRCal*dLDRCal/nLDRCal,aX[4,:], linewidth=2.0, color='b')
ulalume3@0 1828
ulalume3@0 1829 plt.xlabel('LDRCal', fontsize=18)
ulalume3@0 1830 plt.ylabel('K', fontsize=14)
ulalume3@0 1831 plt.title(LID, fontsize=18)
ulalume3@0 1832 plt.show()
ulalume3@0 1833 plt.close
ulalume3@0 1834 '''
ulalume3@0 1835
ulalume3@0 1836 # Additional plot routines ======>
ulalume3@0 1837 '''
ulalume3@0 1838 #******************************************************************************
ulalume3@0 1839 # 1. Plot LDRcorrected - LDR(measured Icross/Iparallel)
ulalume3@0 1840 LDRa = np.arange(1.,100.)*0.005
ulalume3@0 1841 LDRCorra = np.arange(1.,100.)
ulalume3@0 1842 if Y == - 1.: LDRa = 1./LDRa
ulalume3@0 1843 LDRCorra = (1./Eta*LDRa*(GT+HT)-(GR+HR))/((GR-HR)-1./Eta*LDRa*(GT-HT))
ulalume3@0 1844 if Y == - 1.: LDRa = 1./LDRa
ulalume3@0 1845 #
ulalume3@0 1846 #fig = plt.figure()
ulalume3@0 1847 plt.plot(LDRa,LDRCorra-LDRa)
ulalume3@0 1848 plt.plot([0.,0.5],[0.,0.5])
ulalume3@0 1849 plt.suptitle('LDRcorrected - LDR(measured Icross/Iparallel)', fontsize=16)
ulalume3@0 1850 plt.xlabel('LDR', fontsize=18)
ulalume3@0 1851 plt.ylabel('LDRCorr - LDR', fontsize=16)
ulalume3@0 1852 #plt.savefig('test.png')
ulalume3@0 1853 #
ulalume3@0 1854 '''
ulalume3@0 1855 '''
ulalume3@0 1856 #******************************************************************************
ulalume3@0 1857 # 2. Plot LDRsim (simulated measurements without corrections = Icross/Iparallel) over LDRtrue
ulalume3@0 1858 LDRa = np.arange(1.,100.)*0.005
ulalume3@0 1859 LDRsima = np.arange(1.,100.)
ulalume3@0 1860
ulalume3@0 1861 atruea = (1.-LDRa)/(1+LDRa)
ulalume3@0 1862 Ita = TiT*TiO*IinL*(GT+atruea*HT)
ulalume3@0 1863 Ira = TiR*TiO*IinL*(GR+atruea*HR)
ulalume3@0 1864 LDRsima = Ira/Ita # simulated uncorrected LDR with Y from input file
ulalume3@0 1865 if Y == -1.: LDRsima = 1./LDRsima
ulalume3@0 1866 #
ulalume3@0 1867 #fig = plt.figure()
ulalume3@0 1868 plt.plot(LDRa,LDRsima)
ulalume3@0 1869 plt.plot([0.,0.5],[0.,0.5])
ulalume3@0 1870 plt.suptitle('LDRsim (simulated measurements without corrections = Icross/Iparallel) over LDRtrue', fontsize=10)
ulalume3@0 1871 plt.xlabel('LDRtrue', fontsize=18)
ulalume3@0 1872 plt.ylabel('LDRsim', fontsize=16)
ulalume3@0 1873 #plt.savefig('test.png')
ulalume3@0 1874 #
ulalume3@0 1875 '''

mercurial