Volker@51: # This Python script will be executed from within the main lidar_correction_ghk.py Volker@51: # Probably it will be better in the future to let the main script rather read a conguration file, Volker@51: # which might improve the portability of the code within an executable. Volker@51: # Due to problems I had with some two letter variables, most variables are now with at least Volker@51: # three letters mixed small and capital. Volker@51: # To be used with lidar_correction_ghk.py ver. 0.9.5 and larger Volker@51: Volker@51: # Do you want to calculate the errors? If not, just the GHK-parameters are determined. Volker@51: Error_Calc = True Volker@51: Volker@51: # Header to identify the lidar system Volker@51: EID = "li" # Earlinet station ID Volker@51: LID = "PollyXT Cyprus 210429 532 approx 4" # Additional lidar ID (short descriptive text) Volker@51: print(" Lidar system :", EID, ", ", LID) Volker@51: Volker@51: # +++ IL Laser and +-Uncertainty Volker@51: Qin, dQin, nQin = 0.9672, 0.01, 1 # second Stokes vector parameter; default 1 => linear polarization 0.999 => LDR = 0.0005 Volker@51: Vin, dVin, nVin = 0.0, 0.0, 0 # fourth Stokes vector parameter; default 0 => corresponds to LDR 0.0005 with DOP 1 Volker@51: RotL, dRotL, nRotL = 91.65, 0.24, 1 #alpha; rotation of laser polarization in degrees; alle wellenlängen im PollyXT Lacros sind vertical zum opt. Tisch polarisiert. Volker@51: Volker@51: # +++ ME Emitter optics and +-Uncertainty; default = no emitter optics Volker@51: DiE, dDiE, nDiE = 0.0, 0.02, 0 # Diattenuation Volker@51: TiE = 1.0 # Unpolarized transmittance Volker@51: RetE, dRetE, nRetE = 0., 180., 0 # Retardance in degrees Volker@51: RotE, dRotE, nRotE = 0., 1.0, 0 # beta: Rotation of the optical element in degrees Volker@51: Volker@51: # +++ MO Receiver optics including telescope Volker@51: DiO, dDiO, nDiO = 0.0, 0.02, 0 # Diattenuation Volker@51: TiO = 1.0 # Unpolarized transmittance Volker@51: RetO, dRetO, nRetO = 0., 180., 0 # Retardance in degrees Volker@51: RotO, dRotO, nRotO = 0., 0.5, 0 # gamma: Rotation of the optical element in degrees Volker@51: Volker@51: # +++++ PBS MT Transmitting path defined with TS, TP, PolFilter extinction ratio ERaT, and +-Uncertainty Volker@51: # --- Polarizing beam splitter transmitting path Volker@51: TP, dTP, nTP = 0.5, 0.01, 1 # transmittance of the PBS for parallel polarized light Volker@51: TS, dTS, nTS = 0.5, 0.01, 1 # transmittance of the PBS for cross polarized light Volker@51: RetT, dRetT, nRetT = 0.0, 180., 0 # Retardance in degrees Volker@51: # --- Pol.Filter behind transmitted path of PBS Volker@51: ERaT, dERaT, nERaT = 1.0 , 0 , 0 # Extinction ratio 0.00075 +/- 0.00025 Volker@51: RotaT, dRotaT, nRotaT = 0., 1., 1 # Rotation of the Pol.-filter in degrees; usually close to 0° because TP >> TS, but for PollyXTs it can also be close to 90° Volker@51: # -- Volker@51: TiT = 0.5 * (TP + TS) Volker@51: DiT = (TP-TS)/(TP+TS) Volker@51: DaT = (1-ERaT)/(1+ERaT) Volker@51: TaT = 0.5*(1+ERaT) Volker@51: Volker@51: # +++++ PBS MR Reflecting path defined with RS, RP, PolFilter extinction ratio ERaR and +-Uncertainty Volker@51: # ---- for PBS without absorption the change of RS and RP must depend on the change of TP and TS. Hence the values and uncertainties are not independent. Volker@51: RS_RP_depend_on_TS_TP = False Volker@51: # --- Polarizing beam splitter reflecting path Volker@51: #if(RS_RP_depend_on_TS_TP): Volker@51: # RP, dRP, nRP = 1-TP, 0.00, 0 # do not change this Volker@51: # RS, dRS, nRS = 1-TS, 0.00, 0 # do not change this Volker@51: #else: Volker@51: RP, dRP, nRP = 0.002, 0.001, 1 # change this if RS_RP_depend_on_TS_TP = False; reflectance of the PBS for parallel polarized light Volker@51: RS, dRS, nRS = 0.998, 0.001, 1 # change this if RS_RP_depend_on_TS_TP = False; reflectance of the PBS for cross polarized light Volker@51: RetR, dRetR, nRetR = 0.0, 180., 0 # Retardance in degrees Volker@51: # --- Pol.Filter behind reflected path of PBS Volker@51: ERaR, dERaR, nERaR = 1.0, 0.0, 0 # Extinction ratio Volker@51: RotaR, dRotaR, nRotaR = 0., 1., 0 # Rotation of the Pol.-filter in degrees; usually close to 90° because RS >> RP, but for PollyXTs it can also be close to 0° Volker@51: # -- Volker@51: TiR = 0.5* (RP + RS) Volker@51: DiR = (RP-RS)/(RP+RS) Volker@51: DaR = (1-ERaR)/(1+ERaR) Volker@51: TaR = 0.5*(1+ERaR) Volker@51: Volker@51: # NEW --- Additional ND filter transmission (attenuation) during the calibration Volker@51: TCalT, dTCalT, nTCalT = 1, 0.01, 0 # transmitting path, default 1, 0, 0 Volker@51: TCalR, dTCalR, nTCalR = 1, 0.0001, 0 # reflecting path, default 1, 0, 0 Volker@51: Volker@51: # +++ Orientation of the PBS with respect to the reference plane (see Improvements_of_lidar_correction_ghk_ver.0.9.8_190124.pdf) Volker@51: # Y = +1: polarisation in reference plane is finally transmitted, Volker@51: # Y = -1: polarisation in reference plane is finally reflected. Volker@51: Y = -1. Volker@51: Volker@51: # +++ Calibrator Location Volker@51: # --- Calibrator Type used; defined by matrix values below Volker@51: TypeC = 3 #Type of calibrator: 1 = mechanical rotator; 2 = hwp rotator (fixed retardation); 3 = linear polarizer; 4 = qwp; 5 = circular polarizer; 6 = real HWP calibration +-22.5° Volker@51: # --- Calibrator Location Volker@51: LocC = 3 #location of calibrator: 1 = behind laser; 2 = behind emitter; 3 = before receiver; 4 = before PBS Volker@51: # --- MC Calibrator parameters Volker@51: if TypeC == 1: #mechanical rotator Volker@51: DiC, dDiC, nDiC = 0., 0., 0 # Diattenuation Volker@51: TiC = 1. Volker@51: RetC, dRetC, nRetC = 0., 0., 0 # Retardance in degrees Volker@51: RotC, dRotC, nRotC = 0., 1.0, 1 #constant calibrator rotation offset epsilon Volker@51: # Rotation error without calibrator: if False, then epsilon = 0 for normal measurements Volker@51: RotationErrorEpsilonForNormalMeasurements = True # is in general True for TypeC == 1 calibrator Volker@51: elif TypeC == 2: # HWP rotator without retardance! Volker@51: DiC, dDiC, nDiC = 0., 0., 0 # Diattenuation; ideal 0.0 Volker@51: TiC = 1. Volker@51: RetC, dRetC, nRetC = 180., 0., 0 # Retardance in degrees Volker@51: #NOTE: use here twice the HWP-rotation-angle Volker@51: RotC, dRotC, nRotC = 0.0, 0.1, 1 #constant calibrator rotation offset epsilon Volker@51: RotationErrorEpsilonForNormalMeasurements = True # is in general True for TypeC == 2 calibrator Volker@51: elif TypeC == 3: # linear polarizer calibrator. Diattenuation DiC = (1-ERC)/(1+ERC); ERC = extinction ratio of calibrator Volker@51: DiC, dDiC, nDiC = 0.99928, 0.00021, 1 # Diattenuation; ideal 1.0 Volker@51: TiC = 0.4 # ideal 0.5 Volker@51: RetC, dRetC, nRetC = 0., 0., 0 # Retardance in degrees Volker@51: RotC, dRotC, nRotC = 0.0, 0.1, 0 #constant calibrator rotation offset epsilon Volker@51: RotationErrorEpsilonForNormalMeasurements = False # is in general False for TypeC == 3 calibrator Volker@51: elif TypeC == 4: # QWP calibrator Volker@51: DiC, dDiC, nDiC = 0.0, 0., 0 # Diattenuation; ideal 0.0 Volker@51: TiC = 1.0 # ideal 0.5 Volker@51: RetC, dRetC, nRetC = 90., 0., 0 # Retardance in degrees Volker@51: RotC, dRotC, nRotC = 0.0, 0.1, 1 #constant calibrator rotation offset epsilon Volker@51: RotationErrorEpsilonForNormalMeasurements = False # is False for TypeC == 4 calibrator Volker@51: elif TypeC == 6: # real half-wave plate rotator calibration at +-22.5° => rotated_diattenuator_X22x5deg.odt Volker@51: DiC, dDiC, nDiC = 0., 0., 0 # Diattenuation; ideal 0.0 Volker@51: TiC = 1. Volker@51: RetC, dRetC, nRetC = 180., 0., 0 # Retardance in degrees Volker@51: #Note: use real HWP angles here Volker@51: RotC, dRotC, nRotC = 0.0, 0.1, 1 #constant calibrator rotation offset epsilon Volker@51: RotationErrorEpsilonForNormalMeasurements = True # is in general True for TypeC == 6 calibrator Volker@51: else: Volker@51: print ('calibrator not implemented yet') Volker@51: sys.exit() Volker@51: Volker@51: # --- LDRCal uncertainty: atmospheric linear depolarization ratio in the range used for the polarisation calibration during the calibration measurements Volker@51: LDRCal,dLDRCal,nLDRCal= 0.11, 0.1, 1 # spans the atmopsheric variability Volker@51: # --- example: LDRCal uncertainty with almost clean air Volker@51: # LDRCal,dLDRCal,nLDRCal= 0.009, 0.005, 1 # spans the interference filter influence between Cabannes and Rayleigh scattering Volker@51: Volker@51: # ==================================================== Volker@51: # NOTE: there is no need to change anything below. Volker@51: # ==================================================== Volker@51: # !!! don't change anything in this section !!! Volker@51: bPlotEtax = False # plot error histogramms for Etax Volker@51: # NEW *** Only for signal noise errors *** Volker@51: nNCal = 0 # error nNCal, calibration signals: one-sigma (fixed) in nNCal steps to left and right Volker@51: nNI = 0 # error nNI, 0° signals: one-sigma (fixed) in nNI steps to left and right; NI signals are calculated from NCalT and NCalR in main programm, but noise is assumed to be independent. Volker@51: Volker@51: # --- number of photon counts in the signal summed up in the calibration range during the calibration measurements Volker@51: NCalT = 40000 # default 1e6, assumed the same in +45° and -45° signals; counts with ND-filter TCalT Volker@51: NCalR = 40000 # default 1e6, assumed the same in +45° and -45° signals; counts with ND-filter TCalR Volker@51: NILfac = 1 # (relative duration (laser shots) of standard (0°) measurement to calibration measurements) * (range of std. meas. smoothing / calibration range); example: 100000#/5000# * 100/1000 = 2 Volker@51: # LDRmeas below will be used to calculate IR and IT of 0° signals. Volker@51: # calculate signal counts only from parallel 0° signal assuming the same electronic amplification in both channels; overwrites above values Volker@51: CalcFrom0deg = True Volker@51: NI = 100000000 #number of photon counts in the parallel 0°-signal 40000 Volker@51: Volker@51: if(CalcFrom0deg): Volker@51: # either eFactT or eFacR is = 1 => rel. amplification Volker@51: eFacT = 1 # rel. amplification of transmitted channel, approximate values are sufficient; def. = 1 Volker@51: eFacR = 1 # rel. amplification of reflected channel, approximate values are sufficient; def. = 1 Volker@51: NILfac = 1 # (relative duration (laser shots) of standard (0°) measurement to calibration measurements) * (range of std. meas. smoothing / calibration range); example: 100000#/5000# * 100/1000 = 2 Volker@51: Volker@51: NCalT = NI / NILfac * TCalT * eFacT # photon counts in transmitted signal during calibration Volker@51: NCalR = NI / NILfac * TCalR * eFacR # photon counts in reflected signal during calibration Volker@51: # LDRmeas below will be used to calculate IR and IT of 0° signals. Volker@51: # NEW *** End of signal noise error parameters *** Volker@51: Volker@51: # --- LDRtrue for simulation of measurement => LDRsim Volker@51: LDRtrue = 0.004 Volker@51: LDRtrue2 = 0.004 Volker@51: Volker@51: # --- measured LDRm will be corrected with calculated parameters GHK Volker@51: LDRmeas = 0.3 Volker@51: Volker@51: # --- this is just for correct transfer of the variables to the main file Volker@51: Qin0, dQin, nQin = Qin, dQin, nQin Volker@51: Vin0, dVin, nVin = Vin, dVin, nVin Volker@51: RotL0, dRotL, nRotL = RotL, dRotL, nRotL Volker@51: # Emitter Volker@51: DiE0, dDiE, nDiE = DiE, dDiE, nDiE Volker@51: RetE0, dRetE, nRetE = RetE, dRetE, nRetE Volker@51: RotE0, dRotE, nRotE = RotE, dRotE, nRotE Volker@51: # Receiver Volker@51: DiO0, dDiO, nDiO = DiO, dDiO, nDiO Volker@51: RetO0, dRetO, nRetO = RetO, dRetO, nRetO Volker@51: RotO0, dRotO, nRotO = RotO, dRotO, nRotO Volker@51: # Calibrator Volker@51: DiC0, dDiC, nDiC = DiC, dDiC, nDiC Volker@51: RetC0, dRetC, nRetC = RetC, dRetC, nRetC Volker@51: RotC0, dRotC, nRotC = RotC, dRotC, nRotC Volker@51: # PBS Volker@51: TP0, dTP, nTP = TP, dTP, nTP Volker@51: TS0, dTS, nTS = TS, dTS, nTS Volker@51: RetT0, dRetT, nRetT = RetT, dRetT, nRetT Volker@51: Volker@51: ERaT0, dERaT, nERaT = ERaT, dERaT, nERaT Volker@51: RotaT0,dRotaT,nRotaT= RotaT,dRotaT,nRotaT Volker@51: Volker@51: RP0, dRP, nRP = RP, dRP, nRP Volker@51: RS0, dRS, nRS = RS, dRS, nRS Volker@51: RetR0, dRetR, nRetR = RetR, dRetR, nRetR Volker@51: Volker@51: ERaR0, dERaR, nERaR = ERaR, dERaR, nERaR Volker@51: RotaR0,dRotaR,nRotaR= RotaR,dRotaR,nRotaR Volker@51: Volker@51: LDRCal0,dLDRCal,nLDRCal=LDRCal,dLDRCal,nLDRCal