diff --git a/examples/asc_test/master.py b/examples/asc_test/master.py index af85fcabb992bfd89788bb6e18f30b86b02faa16..6f8ba3282c93f3dec5cb96a7ed8fd46cf7add1c4 100644 --- a/examples/asc_test/master.py +++ b/examples/asc_test/master.py @@ -1,3 +1,8 @@ +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + from pykat import finesse from pykat.commands import * import copy @@ -7,200 +12,202 @@ import scipy.optimize def main(): - print """ - -------------------------------------------------------------- - Example file for using PyKat to automate Finesse simulations - Finesse: http://www.gwoptics.org/finesse - PyKat: http://www.gwoptics.org/pykat - - The file runs through the various Finesse simulations - to generate the Finesse results reported in the document: - `Comparing Finesse simulations, analytical solutions and OSCAR - simulations of Fabry-Perot alignment signals', LIGO-T1300345, - freely available online: http://arxiv.org/abs/1401.5727 - - This file is part of a collection; it outputs the results - shown the document's sections 3 and 4 and saves temporary - data and a new Finesse input file to be read by master2.py. - - Andreas Freise 16.01.2014 - -------------------------------------------------------------- - """ - - # for debugging we might need to see the temporay file: - kat = finesse.kat(tempdir=".",tempname="test") - kat.verbose = False - kat.loadKatFile('asc_base.kat') - kat.maxtem=3 - Lambda=1064.0e-9 - result = {} - - # defining variables as global for debugging - #global kat - #global out - #global result - - print "--------------------------------------------------------" - print " 1. tunes ETM position to find resonance" - kat.ETM.phi=resonance(kat) - - print "--------------------------------------------------------" - print " 2. print sideband and carrier powers/amplitudes" - powers(kat) - - print "--------------------------------------------------------" - print " 3. determine the optimal phase for the PDH signal" - (result['p_phase'], result['q_phase']) = pd_phase(kat) - - # setting demodulation phase - code_det = """ - pd1 PDrefl_p 9M 0 nWFS1 - scale 2 PDrefl_p - pd1 PDrefl_q 9M 90 nWFS1 - scale 2 PDrefl_q - """ - kat.parseKatCode(code_det) - kat.PDrefl_p.phi1=result['p_phase'] - kat.PDrefl_q.phi1=result['q_phase'] - - print "--------------------------------------------------------" - print " 4. adding a 0.1nm offset to ETM and compute PDH signal" - result['phi_tuned']=float(kat.ETM.phi) - result['phi_detuned'] = result['phi_tuned'] + 0.1/1064.0*360 - - kat.ETM.phi=result['phi_detuned'] - print " new ETM phi tuning = %g " % kat.ETM.phi - - (result['pd_p'], result['pd_q']) = pd_signal(kat) - print " PDH inphase = %e " % result['pd_p'] - print " PDH quadrtature = %e " % result['pd_q'] - - print "--------------------------------------------------------" - print " Saving results in temp. files to be read by master2.py" - tmpkatfile = "asc_base2.kat" - tmpresultfile = "myshelf1.dat" - print " kat object saved in: {0}".format(tmpkatfile) - print " current results saved in: {0}".format(tmpresultfile) - # first the current kat file - kat.saveScript(tmpkatfile) - # now the result variables: - tmpfile = shelve.open(tmpresultfile) - tmpfile['result']=result - tmpfile.close() - + print(""" + -------------------------------------------------------------- + Example file for using PyKat to automate Finesse simulations + Finesse: http://www.gwoptics.org/finesse + PyKat: http://www.gwoptics.org/pykat + + The file runs through the various Finesse simulations + to generate the Finesse results reported in the document: + `Comparing Finesse simulations, analytical solutions and OSCAR + simulations of Fabry-Perot alignment signals', LIGO-T1300345, + freely available online: http://arxiv.org/abs/1401.5727 + + This file is part of a collection; it outputs the results + shown the document's sections 3 and 4 and saves temporary + data and a new Finesse input file to be read by master2.py. + + Andreas Freise 16.01.2014 + -------------------------------------------------------------- + """) + + # for debugging we might need to see the temporay file: + kat = finesse.kat(tempdir=".",tempname="test") + kat.verbose = False + kat.loadKatFile('asc_base.kat') + kat.maxtem=3 + Lambda=1064.0e-9 + result = {} + + # defining variables as global for debugging + #global kat + #global out + #global result + + print("--------------------------------------------------------") + print(" 1. tunes ETM position to find resonance") + kat.ETM.phi=resonance(kat) + + print("--------------------------------------------------------") + print(" 2. print sideband and carrier powers/amplitudes") + powers(kat) + + print("--------------------------------------------------------") + print(" 3. determine the optimal phase for the PDH signal") + (result['p_phase'], result['q_phase']) = pd_phase(kat) + + # setting demodulation phase + code_det = """ + pd1 PDrefl_p 9M 0 nWFS1 + scale 2 PDrefl_p + pd1 PDrefl_q 9M 90 nWFS1 + scale 2 PDrefl_q + """ + kat.parseKatCode(code_det) + kat.PDrefl_p.phi1=result['p_phase'] + kat.PDrefl_q.phi1=result['q_phase'] + + print("--------------------------------------------------------") + print(" 4. adding a 0.1nm offset to ETM and compute PDH signal") + result['phi_tuned']=float(kat.ETM.phi) + result['phi_detuned'] = result['phi_tuned'] + 0.1/1064.0*360 + + kat.ETM.phi=result['phi_detuned'] + print(" new ETM phi tuning = %g " % kat.ETM.phi) + + (result['pd_p'], result['pd_q']) = pd_signal(kat) + print(" PDH inphase = %e " % result['pd_p']) + print(" PDH quadrtature = %e " % result['pd_q']) + + print("--------------------------------------------------------") + print(" Saving results in temp. files to be read by master2.py") + tmpkatfile = "asc_base2.kat" + tmpresultfile = "myshelf1.dat" + print(" kat object saved in: {0}".format(tmpkatfile)) + print(" current results saved in: {0}".format(tmpresultfile)) + # first the current kat file + kat.saveScript(tmpkatfile) + # now the result variables: + tmpfile = shelve.open(tmpresultfile) + tmpfile['result']=result + tmpfile.close() + #--------------------------------------------------------------------------- def pd_signal(tmpkat): - kat = copy.deepcopy(tmpkat) - - code1=""" - pd cav nITM2 - yaxis abs - """ - kat.parseKatCode(code1) - kat.noxaxis = True - out = kat.run() - print " Cavity power: {0:.6f}W".format(out.y[2]) - return (out.y[0], out.y[1]) - + kat = copy.deepcopy(tmpkat) + + code1=""" + pd cav nITM2 + yaxis abs + """ + kat.parseKatCode(code1) + kat.noxaxis = True + global out + out = kat.run() + print(" Cavity power: {0:.6f}W".format(out.y[2])) + return (out.y[0,0], out.y[0,11]) + def pd_phase(tmpkat): - kat = copy.deepcopy(tmpkat) - - code_det = """ - pd1 PDrefl_q 9M 90 nWFS1 - """ - - kat.parseKatCode(code_det) - kat.noxaxis= True - - # function for root finding - def PD_q_test(x): - kat.PDrefl_q.phi1=x - out = kat.run() - print '\r root finding: function value %g ' % out.y, - sys.stdout.flush() - return out.y - - # do root finding - xtol=1e-8 - (result, info)=scipy.optimize.bisect(PD_q_test,80.0,100.0, xtol=xtol, maxiter=500, full_output=True) - - print "" - if info.converged: - p_phase=result-90.0 - q_phase=result - print " Root has been found:" - print " p_phase %8f" % (p_phase) - print " q_phase %8f" % (q_phase) - print " (%d iterations, %g tolerance)" % (info.iterations, xtol) - return (p_phase, q_phase) - else: - raise Exception("Root has not been found") - + kat = copy.deepcopy(tmpkat) + + code_det = """ + pd1 PDrefl_q 9M 90 nWFS1 + """ + + kat.parseKatCode(code_det) + kat.noxaxis= True + + # function for root finding + def PD_q_test(x): + kat.PDrefl_q.phi1=x + out = kat.run() + print('\r root finding: function value %g ' % out.y, end=' ') + sys.stdout.flush() + return out.y + + # do root finding + xtol=1e-8 + (result, info)=scipy.optimize.bisect(PD_q_test,80.0,100.0, xtol=xtol, maxiter=500, full_output=True) + + print("") + if info.converged: + p_phase=result-90.0 + q_phase=result + print(" Root has been found:") + print(" p_phase %8f" % (p_phase)) + print(" q_phase %8f" % (q_phase)) + print(" (%d iterations, %g tolerance)" % (info.iterations, xtol)) + return (p_phase, q_phase) + else: + raise Exception("Root has not been found") + def powers(tmpkat): - kat = copy.deepcopy(tmpkat) - - code1 = """ - ad EOM_up 9M nEOM1 - ad EOM_low -9M nEOM1 - pd cav_pow nITM2 - ad cav_c 0 nITM2 - ad WFS1_u 9M nWFS1 - ad WFS1_l -9M nWFS1 - ad WFS1_c 0 nWFS1 - ad WFS2_u 9M nWFS2 - ad WFS2_l -9M nWFS2 - ad WFS2_c 0 nWFS2 - noxaxis - """ - - kat.parseKatCode(code1) - - out = kat.run() - - code1 = code1.split("\n") - for i in range(len(out.y)): - print " %8s: %.4e" % (out.ylabels[i], out.y[i]) + kat = copy.deepcopy(tmpkat) + + code1 = """ + ad EOM_up 9M nEOM1 + ad EOM_low -9M nEOM1 + pd cav_pow nITM2 + ad cav_c 0 nITM2 + ad WFS1_u 9M nWFS1 + ad WFS1_l -9M nWFS1 + ad WFS1_c 0 nWFS1 + ad WFS2_u 9M nWFS2 + ad WFS2_l -9M nWFS2 + ad WFS2_c 0 nWFS2 + noxaxis + """ + + kat.parseKatCode(code1) + + out = kat.run() + + code1 = code1.split("\n") + for i in range(len(out.y)): + print(" %8s: %.4e" % (out.ylabels[i], out.y[0,i])) def resonance(tmpkat): - kat = copy.deepcopy(tmpkat) - - code1 = """ - ad carr2 0 nITM1* - ad carr3 0 nITM2 - yaxis deg - """ - kat.parseKatCode(code1) - kat.noxaxis = True - - # function for root finding - def carrier_resonance(x): - kat.ETM.phi=x - out = kat.run() - phase = (out.y[0]-out.y[1]-90)%360-180 - print '\r root finding: function value %g ' % phase , - sys.stdout.flush() - return phase - - # do root finding - xtol=1e-8 - (result, info)=scipy.optimize.bisect(carrier_resonance,0.0,40.0, xtol=xtol, maxiter=500, full_output=True) - - print "" - if info.converged: - print " Root has been found:" - print " ETM phi %8f" % (result) - print " (%d iterations, %g tolerance)" % (info.iterations, xtol) - return result - else: - raise Exception(" Root has not been found") - + kat = copy.deepcopy(tmpkat) + + code1 = """ + ad carr2 0 nITM1* + ad carr3 0 nITM2 + yaxis deg + """ + kat.parseKatCode(code1) + kat.noxaxis = True + + # function for root finding + def carrier_resonance(x): + kat.ETM.phi=x + global out + out = kat.run() + phase = (out.y[0,0]-out.y[0,1]-90)%360-180 + print('\r root finding: function value %g ' % phase, end=' ') + sys.stdout.flush() + return phase + + # do root finding + xtol=1e-8 + (result, info)=scipy.optimize.bisect(carrier_resonance,0.0,40.0, xtol=xtol, maxiter=500, full_output=True) + + print("") + if info.converged: + print(" Root has been found:") + print(" ETM phi %8f" % (result)) + print(" (%d iterations, %g tolerance)" % (info.iterations, xtol)) + return result + else: + raise Exception(" Root has not been found") + if __name__ == '__main__': - main() + main()