```python import nds2utils as nu import numpy as np import gwpy, matplotlib.pyplot as pplt ``` ```python # What was done 1: # OMCR settings in Beckhoff(?) land: # Gain (H1:OMC-REFL_A_DC_GAINSETTING) 20db # DC offset (H1:OMC-REFL_A_LF_OFFSET) -0.0025V. # Responsivity (H1:OMC-REFL_A_DC_RESPONSIVITY) 0.160 # Transimpedance (H1:OMC-REFL_A_DC_TRANSIMPEDANCE) 2000 #  Reflectivity of pick off beamsplitter (H1:OMC-REFL_A_DC_SPLITTERR) 100 # Whitening gain (H1:OMC-REFL_A_WHITEN_GAIN) 0dB # No whitening filter. # OMCR settings in the frontend (H1:OMC-REFL_A_LF filter): # zero offset. FM4(cts2V), FM5(V2mA), FM6(W/A) and FM8(-20dB) were ON. # # # # We used Pcal integrating sphere (IS) unit PS3. Responsivity is -5.6014*1047/1064 V/W +- 0.035%. # (-5.6014 V/W +/- 0.035% @ 1047nm according to Dripta. # For 1064nm, since energy per photon is smaller, i.e. the number of photon per the same optical power # is a factor of 1064/1047 larger at 1064 than at 1047, and since the voltage is proportional to the # number of photons per unit time received, for the correct voltage per power, we need to scale the # responsivity by a factor of 1047/1064.) responsivityIS=-5.6014*1047/1064 # IS output -> pin1-pin6 of ASC-AS_A_RF72_I1/I2/Q1/Q2 whitening output cable (pin1-6 is I1). # The cable was of course disconnected from the whitening chassis, ASC-AS_A_RF72_I1 was used just as an ADC w/o whitening. # # ASC-AS_A_RF72_I1_INMON was calibrated later using a portable voltage calibrator (see 2022/10/26 22:28:50 UTC start, 280 sec). # In the lab, calibrator output was measured to be 0.99985V when nominally 1V, and 0.49982V when nominally 0.5V. # Error of the calibrator seems to be less than 0.1%, so I'll just ignore that. # When pin1/pin6 shorted, INMON = -1.93+-0.22 (60sec mean, sigma) cts. # When 0.25V, INMON = 406.32+-0.27 # When 0.5V, INMON = 816.42+-0.26 # When 1.0V, INMON = 1635.13+-0.22 # # Since I disabled during the measurementthe whitening/dewhitening filters so the I1 signal won't be LPF-ed, # (though this was done of course for all ASC-AS_A_RF72 segments), # if I want to use fast channel I can use ASC-AS_A_RF72_I_SUM_OUT_DQ etc. and calibrate that. # For now I'm only using IMON. calibrator_volts=[0.0, 0.25, 0.5, 1.0] adc_counts=[-1.93, 406.32, 816.42, 1635.13] # Linear regression to derive the slope of V-cts curve for this channel A = np.vstack([calibrator_volts, np.ones(len(calibrator_volts))]).T m, c = np.linalg.lstsq(A, adc_counts, rcond=None)[0] # m is the slope, c is the y-intercept. # m turns out to be 1637.38 according to linear regression, # nominally it's 2^16/40=1638.4 cts/V, so this is making sense. IS_CT2VOLT=1./m; #V/counts IS_V2W=1./responsivityIS; #W/V IS_CT2W=IS_CT2VOLT*IS_V2W ; # ~-1.108e-4 W/CT 'ADC slope for Integrating Sphere (nominally 1638.4 cts/V):', m ``` ('ADC slope for Integrating Sphere (nominally 1638.4 cts/V):', 1637.3874285714292) ```python # What was done 2: # We set up an aux 1064nm laser (butterfly module fiber coupled laser) in HAM6 with a couple of lenses, # (PLCX-25.4-206.0-UV-1064 and PLCC-25.4-257.7-UV-1064) for rough mode matching, then # a HWP, then a PBS so the transmission is P-pol. (IFO beam is in P-Pol in HAM6.) # The beam was aligned to two irises on HAM6 that was set up using squeezer beam prior to the measurement. # ~2022/09/22 2100 UTC: After the AUX laser beam was aligned to OMC # (the beam is centered on OMC QPDs, the OMCR beam is centered on the steering mirror as well as the 99:1 # and the OMCR DCPD). # We placed IS in OMCR path between the corner steering mirror (M9 in D1000342) and the new 99:1 splitter # to measure the power in OMCR path. # At first the OMC was flashing for a while, but later that was fixed at around ~21:35:00 UTC. # Period 1, Dark everything: 21:36:59-21:37:25 (~ -3m mark on ndscope.png) # The beam wass blocked upstream of OM1, so no beam on OMC QPDs, IS and OMCR. # This is for dark offset measurement. ISname='H1:ASC-AS_A_RF72_I1_INMON.mean' PD_Fast_name='H1:OMC-REFL_A_LF_OUTPUT.mean' # fast channel BeckhoffVolt_name='H1:OMC-REFL_A_DC_VOLTS.mean' #Beckhof Voltage readback QPDname='H1:ASC-OMC_A_SUM_OUT16.mean' channels = [ISname+',s-trend', PD_Fast_name+',s-trend', BeckhoffVolt_name+',s-trend', QPDname+',s-trend'] gps_start =gwpy.time.to_gps('Sep 22 2022 21:36:59 UTC').gpsSeconds; gps_stop =gwpy.time.to_gps('Sep 22 2022 21:37:25 UTC').gpsSeconds; dataDict = nu.acquire_data(channels, gps_start, gps_stop, allow_data_on_tape='True') IS_dk = dataDict[ISname]['data'] PD_Fast_dk=dataDict[PD_Fast_name]['data'] BeckhoffVolt_dk=dataDict[BeckhoffVolt_name]['data'] QPD_dk=dataDict[QPDname]['data'] # Period 2, bright QPD, bright IS, dark OMCR: 21:37:31-21:38:17 (~ -2.5m mark on ndscope.png) # The beam hit OMC QPDs and IS, OMCR was dark (because the beam was blocked by IS). # This is used to establish a ratio of the IS and QPDASUM gps_start =gwpy.time.to_gps('Sep 22 2022 21:37:31 UTC').gpsSeconds; gps_stop =gwpy.time.to_gps('Sep 22 2022 21:38:17 UTC').gpsSeconds; dataDict = nu.acquire_data(channels, gps_start, gps_stop, allow_data_on_tape='True') IS2 = dataDict[ISname]['data'] QPD2=dataDict[QPDname]['data'] # Period 3, bright QPD, bright OMCR, no IS: 21:38:49-21:39:31 (~ -1m mark on ndscope.png) # IS was removed, the beam was on OMC QPD as well as OMCR. # This is for bright measurement of OMCR and OMC QPD. gps_start =gwpy.time.to_gps('Sep 22 2022 21:38:49 UTC').gpsSeconds; gps_stop =gwpy.time.to_gps('Sep 22 2022 21:39:31 UTC').gpsSeconds; dataDict = nu.acquire_data(channels, gps_start, gps_stop, allow_data_on_tape='True') PD_Fast_br=dataDict[PD_Fast_name]['data'] BeckhoffVolt_br=dataDict[BeckhoffVolt_name]['data'] QPD_br=dataDict[QPDname]['data'] ``` Fetching data from nds.ligo-wa.caltech.edu:31200 with GPS times 1347917837 to 1347917863 from ['H1:ASC-AS_A_RF72_I1_INMON.mean,s-trend', 'H1:OMC-REFL_A_LF_OUTPUT.mean,s-trend', 'H1:OMC-REFL_A_DC_VOLTS.mean,s-trend', 'H1:ASC-OMC_A_SUM_OUT16.mean,s-trend'] Fetching data from nds.ligo-wa.caltech.edu:31200 with GPS times 1347917869 to 1347917915 from ['H1:ASC-AS_A_RF72_I1_INMON.mean,s-trend', 'H1:OMC-REFL_A_LF_OUTPUT.mean,s-trend', 'H1:OMC-REFL_A_DC_VOLTS.mean,s-trend', 'H1:ASC-OMC_A_SUM_OUT16.mean,s-trend'] Fetching data from nds.ligo-wa.caltech.edu:31200 with GPS times 1347917947 to 1347917989 from ['H1:ASC-AS_A_RF72_I1_INMON.mean,s-trend', 'H1:OMC-REFL_A_LF_OUTPUT.mean,s-trend', 'H1:OMC-REFL_A_DC_VOLTS.mean,s-trend', 'H1:ASC-OMC_A_SUM_OUT16.mean,s-trend'] ```python ## Calculate IS/QPDSUM in Watts/cts # power on IS in period 2 IS2_ISdk=IS2.mean()-IS_dk.mean() # bright - dark IS2_ISdk_relStd=np.sqrt(IS2.std()**2+IS_dk.std()**2)/np.abs(IS2_ISdk) IS2_W=IS2_ISdk*IS_CT2W # ~29.6mW according to IS at 21:37 ~ 21:38 UTC. # later at 22:17 UTC the power before 99:1 was measured to be 28.17mW using thorlabs meter. The number makes sense. # see power1.jpg and its EXIF data. # cts of QPDA SUM in period 2 QPD2_QPDdk=QPD2.mean()-QPD_dk.mean() QPD2_QPDdk_relStd=np.sqrt(QPD2.std()**2-QPD_dk.std()**2)/np.abs(QPD2_QPDdk) WperQPDSUM=IS2_W/QPD2_QPDdk WperQPDSUM_relStd=np.sqrt(IS2_ISdk_relStd**2+QPD2_QPDdk_relStd**2) ``` ```python ## Calculate the power in OMCR path upstream of 99:1 in period 3. # First, what was the power in OMCR path measured by the QPD? QPDbr_QPDdk=QPD_br.mean()-QPD_dk.mean() QPDbr_QPDdk_relStd=np.sqrt(QPD_br.std()**2+QPD_dk.std()**2)/np.abs(QPDbr_QPDdk) pOMCR = QPDbr_QPDdk*WperQPDSUM pOMCR_relStd=QPDbr_QPDdk_relStd # Convert PD Fast output (which was incorrectly calibrated) into mA. # Since responsivity of the PD was assumed to be 0.16A/W which was encoded in the initial definition of # "W/A" filter (FM6 in H1:OMC-REFL_A_LF) as the gain of 6.25 (by Daniel?), which is an inverse of 0.16A/W, # let's undo that to obtain mA. PD_Fast_br_PD_Fast_dk=PD_Fast_br.mean()-PD_Fast_dk.mean() # bright - dark PD_Fast_br_PD_Fast_dk_relStd=np.sqrt(PD_Fast_br.std()**2+PD_Fast_dk.std()**2)/np.abs(PD_Fast_br_PD_Fast_dk) PD_Fast_mA=PD_Fast_br_PD_Fast_dk/6.25 PD_Fast_mA_relStd=PD_Fast_br_PD_Fast_dk_relStd/6.25 # Transmission of 99:1 is 1%. Later this was measured to be 0.960+-0.006%. See one of the later cells below. tBS=0.00960 tBS_relStd=0.00006/tBS ## Calculate responsivity in mW/mA coefficient for PD_Fast_mA. # Ignore 20dB analog gain because it's already digitally compensated in H1:OMC-REFL_A_LF "-20dB" filter. # Likewise, assume that cts2V filter in H1:OMC-REFL_A_LF was correct # (it almost was, it was set to 0.0006105 while nominally it's 40/2**16~ 0.00061035). # Likewise, assume that the transimpedance of 2000 Ohm ("V2mA" filter, gain of 0.5) is correct. # mA= pOMCR*tBS*responsivity # # There was no compensation for tBS in the filter. # responsivity=mA/pOMCR/tBS in mA/W responsivity = PD_Fast_mA/pOMCR/tBS #this is mA/W responsivity = responsivity/1000 # in A/W responsivity_relStd=np.sqrt(PD_Fast_mA_relStd**2+pOMCR_relStd**2+tBS_relStd**2) responsivity_std=responsivity_relStd*responsivity ## Do similar things for Beckhoff voltage # BeckhoffVolt during period 3 BeckhoffVolt_br_BeckhoffVolt_dk=BeckhoffVolt_br.mean()-BeckhoffVolt_dk.mean() BeckhoffVolt_br_BeckhoffVolt_dk_relStd=np.sqrt(BeckhoffVolt_br.std()**2+BeckhoffVolt_dk.std()**2)/np.abs(BeckhoffVolt_br_BeckhoffVolt_dk) #BeckhoffV = pOMCR*tBS*responsivity*2000*10 (2000 for transimpedance, 10 for 20dB gain) # resp = BeckhoffV/pOMCR/tBS/2000/10 in A/W resp_Beckhoff= BeckhoffVolt_br_BeckhoffVolt_dk/pOMCR/tBS/2000/10 resp_Beckhoff_relStd=np.sqrt(BeckhoffVolt_br_BeckhoffVolt_dk_relStd**2+pOMCR_relStd**2+tBS_relStd**2) resp_Beckhoff_std=resp_Beckhoff_relStd*resp_Beckhoff ``` ```python responsivity, responsivity_std, resp_Beckhoff, resp_Beckhoff_std, 1/tBS ``` (0.05826266102510966, 0.0005888480902072988, 0.06019644766313129, 0.0015468843136251418, 104.16666666666667) ```python # At around 22:17 UTC (47~48min after period 3) I measured the trans/in of 99:1 using thorlabs. # see power1.jpg for pin bright, power1_dark.jpg for pin dark (look at Act value as well as Min), # power2.jpg for trans bright and power2_dark.jpg for trans dark (again look at Act and Min). # see EXIF for image timestamp. pin=28.17e-3-7e-6 pin_std=250.4e-6**2 # ignore std of dark data trans=270.9e-6-570e-9 trans_std= 1.605e-6 # ignore std of dark data trans_ratio=trans/pin #this was ~0.960% trans_ratio_std=trans_ratio*np.sqrt((pin_std/pin)**2+(trans_std/trans)**2) # ~+-0.006% ``` ```python trans_ratio, trans_ratio_std ``` (0.009598764336185778, 5.698967130064114e-05) ```python #sanity check. #Though OMCR power would have changed from pOMCR in period 3 (21:38:49-21:39:31 UTC) # to pin during tBS measurement (22:17 UTC), # they should be similar. Are they? pin/pOMCR # pin was ~95.4% of pOMCR. Pretty close, given the time difference and the power meter difference. ``` 0.9535643695066195