#!/usr/bin/env python

import sys
from ezca import Ezca
import time 
import cdsutils

sys.path.append('/ligo/cdscfg')
import stdenv as cds;

cds.INIT_ENV()

Ezca().export()


# prepare ITMX

#don't let signal go up to higher stages 
ezca.get_LIGOFilter('SUS-ITMX_L2_LOCK_L').switch_off('INPUT')
#set up ESD filters
ezca['SUS-ITMX_L3_DRIVEALIGN_L2L_GAIN']=0
ezca['SUS-ITMX_L3_DRIVEALIGN_L2L_TRAMP']=10
ezca['SUS-ETMX_L3_DRIVEALIGN_L2L_TRAMP']=10
ezca.get_LIGOFilter('SUS-ITMX_L3_DRIVEALIGN_L2L').only_on('INPUT', 'FM4', 'FM5','OUTPUT', 'DECIMATION') #check this is right with TVo
ezca['SUS-ITMX_L3_LOCK_OUTSW_L']=1

time.sleep(1)
ezca['LSC-ARM_OUTPUT_MTRX_3_1']=-1
time.sleep(1)
  #is everything set up right?
ezca.get_LIGOFilter('SUS-ITMX_L3_ISCINF_L').only_on('INPUT', 'FM5', 'FM8', 'FM9', 'FM10', 'DECIMATION', 'OUTPUT')

#stuff copied from lownoise ESDETMY guardian
ym0lock = ezca.get_LIGOFilter('SUS-ETMY_M0_LOCK_L') 
yl1lock = ezca.get_LIGOFilter('SUS-ETMY_L1_LOCK_L') 
xl1lock = ezca.get_LIGOFilter('SUS-ETMX_L1_LOCK_L') 
yl2lock = ezca.get_LIGOFilter('SUS-ETMY_L2_LOCK_L') 

yl3lock = ezca.get_LIGOFilter('SUS-ETMY_L3_LOCK_L') 
xl3lock = ezca.get_LIGOFilter('SUS-ETMX_L3_LOCK_L') 
yl3inf = ezca.get_LIGOFilter('SUS-ETMY_L3_ISCINF_L')
yl2da = ezca.get_LIGOFilter('SUS-ETMY_L2_DRIVEALIGN_L2L') 
yl3da = ezca.get_LIGOFilter('SUS-ETMY_L3_DRIVEALIGN_L2L') 
ixl3da = ezca.get_LIGOFilter('SUS-ITMX_L3_DRIVEALIGN_L2L')

yl3lock.TRAMP.put(0)
time.sleep(0.1)

ym0lock.turn_off('INPUT')
ezca['SUS-ETMY_L1_LOCK_OUTSW_L'] = 1
ezca['SUS-ETMY_L2_LOCK_OUTSW_L'] = 1

yl1lock.GAIN.put(0.60)
yl2lock.GAIN.put(15)
yl3lock.GAIN.put(0)
yl3inf.switch_off(*['FM{}'.format(ii+1) for ii in range(10)])
yl3inf.switch_on('INPUT', 'OUTPUT')
yl2da.GAIN.put(1)

yl1lock.only_on('INPUT', 'FM1', 'FM2', 'FM3', 'FM5', 'FM6', 'FM7', 'FM8',
                        'OUTPUT', 'DECIMATION')
yl2lock.only_on('INPUT', 'FM7', 'OUTPUT', 'DECIMATION') #changed from FM6 to FM8 7/21/2015 SED RA; removed FM7 8/19/2015 DH 
yl3lock.only_on('INPUT', 'FM5', 'FM8', 'FM9', 'FM10','OUTPUT', 'DECIMATION')
yl2da.only_on('INPUT', 'FM6', 'FM7', 'OUTPUT', 'DECIMATION')
yl3da.switch_off('INPUT')
yl3da.GAIN.put(0)
 
## Prepare for ETMX/ETMY acutation swap
ezca['LSC-ARM_OUTPUT_MTRX_2_1'] = -1
xl3lock.TRAMP.put(10)
yl3lock.TRAMP.put(10)
ixl3da.TRAMP.put(10)

## Perform the swap
print('Performing the EX/EY swap.')   
yl3lock.GAIN.put(1.25)
xl3lock.GAIN.put(0)
ixl3da.GAIN.put(150.6)

#prepare ETMX to transition control back to it
ezca.get_LIGOFilter('SUS-ETMX_L3_LOCK_BIAS').TRAMP.put(60)
ezca.get_LIGOFilter('SUS-ETMX_L2_LOCK_L').TRAMP.put(10)
time.sleep(0.1)
ezca.get_LIGOFilter('SUS-ETMX_L3_LOCK_BIAS').GAIN.put(0)
time.sleep(60)

#turn off linearization 
ezca['SUS-ETMX_L3_ESDOUTF_LIN_BYPASS_SW'] = 0
for quad in ['UR', 'UL', 'LR', 'LL']:
    ezca['SUS-ETMX_BIO_L3_{}_VOLTAGE_SW'.format(quad)] = 0
    time.sleep(0.5)
    ezca['SUS-ETMX_BIO_L3_{}_HVDISCONNECT_SW'.format(quad)] = 0
    time.sleep(0.5)
    ezca['SUS-ETMX_BIO_L3_{}_STATEREQ'.format(quad)] = 2
    time.sleep(0.5)
#make sure the resulting bias is the one that reduces power lines in DARM
if ezca['SUS-ETMX_L3_LOCK_INBIAS']>0:
    ezca['SUS-ETMX_L3_LOCK_BIAS_GAIN'] = -1
else:
    ezca['SUS-ETMX_L3_LOCK_BIAS_GAIN'] = 1
time.sleep(60)


#clear histories of filters that are off, not sure this is needed
ezca['SUS-ETMX_L1_LOCK_L_RSET']=2
ezca['SUS-ETMX_L2_LOCK_L_RSET']=2
ezca['SUS-ETMX_L3_LOCK_L_RSET']=2
#set up stuff for going back to ETMX
ezca.get_LIGOFilter('SUS-ETMX_L3_LOCK_L').only_on('INPUT', 'FM5', 'FM9', 'FM10','OUTPUT', 'DECIMATION') #on ETMY we also notch vStop8+9
ezca.get_LIGOFilter('SUS-ETMX_L3_DRIVEALIGN_L2L').only_on('INPUT', 'FM4', 'FM5','OUTPUT', 'DECIMATION') 
ezca['SUS-ETMX_L3_DRIVEALIGN_L2L_GAIN']=-26 #increased from 30 to 36 to compensate for measured gain difference between ETMX and ETMY measured half transitioned
ezca.get_LIGOFilter('SUS-ETMX_L2_LOCK_L').only_on('INPUT', 'FM7','OUTPUT', 'DECIMATION') 
ezca['SUS-ETMX_L2_LOCK_L_GAIN']=15

ezca['SUS-ETMX_L2_LOCK_OUTSW_L']=1
ezca.get_LIGOFilter('SUS-ETMX_L2_DRIVEALIGN_L2L').only_on('INPUT', 'FM6', 'FM7','OUTPUT', 'DECIMATION') 
ezca.get_LIGOFilter('SUS-ETMX_L1_LOCK_L').only_on('INPUT', 'FM1', 'FM3','FM4', 'FM6', 'FM7', 'FM9', 'FM10','OUTPUT', 'DECIMATION')
ezca['SUS-ETMX_L1_LOCK_L_GAIN']=0.6
ezca['SUS-ETMX_L2_LOCK_L_GAIN']=0

ezca['SUS-ETMX_L3_LOCK_L_TRAMP']=10
time.sleep(10)
#double check stuff before you make the swap
#ACTUALLY MAKE THE SWAP

ezca['SUS-ITMX_L3_LOCK_L_GAIN']=0
ezca['SUS-ETMX_L3_LOCK_L_GAIN']=1.74
time.sleep(10)

#now make things OK for turning on LSC FF

ezca['LSC-ARM_OUTPUT_MTRX_3_1'] = 0
time.sleep(1)
ezca.get_LIGOFilter('SUS-ITMX_L2_LOCK_L').switch_on('INPUT')
ezca.get_LIGOFilter('SUS-ITMX_L3_DRIVEALIGN_L2L').switch_off('FM4', 'FM5')
ezca.get_LIGOFilter('SUS-ITMX_L3_DRIVEALIGN_L2L').GAIN.put(1)
ezca.get_LIGOFilter('SUS-ITMX_L3_DRIVEALIGN_L2L').TRAMP.put(2)
ezca.get_LIGOFilter('SUS-ITMX_L3_ISCINF_L').switch_off('FM5', 'FM8', 'FM9', 'FM10')

ezca['SUS-ITMX_L23_LOCK_OUTSW_L'] = 0
