diff --git a/pykat/gw_detectors/ifo.py b/pykat/gw_detectors/ifo.py index 859d40d4886441c1b3463a55f17c5ce2791d38a4..edfc9040ff300155a110fa0073599de7b00cac36 100644 --- a/pykat/gw_detectors/ifo.py +++ b/pykat/gw_detectors/ifo.py @@ -59,9 +59,12 @@ class aLIGO(object): self.kat.loadKatFile(katfile) self.rawBlocks.read(katfile) else: + """ if _name not in names: # TODO different files not yet implemented printf("aLIGO name `{}' not recognised, must be 'default', 'LLO' or 'LHO'",_name) - #print(data_path) + """ + if _name != "default": + printf("aLIGO name `{}' not recognised, using 'default'",_name) self.kat.loadKatFile(self._data_path+"aLIGO.kat") self.rawBlocks.read(self._data_path+"aLIGO.kat") @@ -89,11 +92,11 @@ class aLIGO(object): if (5 * self.f1 != self.f2): print(" ** Warning: modulation frequencies do not match: 5*f1!=f2") - # defining a dicotionary for the main mirror positions (tunings) - self.tunings = {} - self.tunings = self.get_tunings(self.kat) + # defining a dicotionary for the main mirror positions (tunings), + # keys should include maxtem, phase and all main optics names + self.tunings = dict.fromkeys(["maxtem", "phase", "PRM", "ITMX", "ETMX", "ITMY", "ETMY", "BS", "SRM"]) + self.tunings = get_tunings(self.kat, self.tunings) self.compute_derived_lengths(self.kat) - # ---------------------------------------------------------------------- # define ports and signals @@ -129,7 +132,6 @@ class aLIGO(object): self.lockNames = None - @property def DOFs(self): return copy.copy(self.__DOFs) @@ -180,7 +182,6 @@ put f1m f $mx1 ax.legend() plt.tight_layout() plt.show(block=0) - def compute_derived_lengths(self, kat, verbose=False): """ @@ -226,30 +227,9 @@ put f1m f $mx1 print("| f1_PRC = {:11.8} |".format(self.f1_PRC)) print("| f1 = {:11.8}, f2 = {:11.9} |".format(self.f1, self.f2)) print(" `--------------------------------------------------'") - - def get_tunings(self, kat): - self.tunings["maxtem"] = kat.maxtem - self.tunings["PRM"] = kat.PRM.phi - self.tunings["ITMX"] = kat.ITMX.phi - self.tunings["ETMX"] = kat.ETMX.phi - self.tunings["ITMY"] = kat.ITMY.phi - self.tunings["ETMY"] = kat.ETMY.phi - self.tunings["BS"] = kat.BS.phi - self.tunings["SRM"] = kat.SRM.phi - return self.tunings - - def set_tunings(self, kat, tunings): - kat.maxtem = tunings["maxtem"] - kat.PRM.phi = tunings["PRM"] - kat.ITMX.phi = tunings["ITMX"] - kat.ETMX.phi = tunings["ETMX"] - kat.ITMY.phi = tunings["ITMY"] - kat.ETMY.phi = tunings["ETMY"] - kat.BS.phi = tunings["BS"] - kat.SRM.phi = tunings["SRM"] - + def apply_lock_feedback(self, kat, out): - tuning = self.get_tunings(kat) + tuning = get_tunings(kat, self.tunings) if "ETMX_lock" in out.ylabels: tuning["ETMX"] += float(out["ETMX_lock"]) else: @@ -271,7 +251,7 @@ put f1m f $mx1 tuning["SRM"] += float(out["SRCL_lock"]) else: print(" ** Warning: could not find SRCL lock") - self.set_tunings(kat, tuning) + set_tunings(kat, tuning) def pretune(self, _kat, pretune_precision=1.0e-4, verbose=False): @@ -348,7 +328,7 @@ put f1m f $mx1 out = kat.run() Pin = float(kat.L0.P) - tunings = self.get_tunings(kat) + tunings = get_tunings(kat, self.tunings) _maxtemStr = "{:3}".format(tunings["maxtem"]) if tunings["maxtem"] == -1: _maxtemStr="off" @@ -436,7 +416,7 @@ put f1m f $mx1 Displays error signals for a given kat file. Can also be used to plot multiple DOF's error signals against each other for visualising any cross coupling. - _kat: LIGO based kat object. + _kat: LIGO-like kat object. xlimits: Range of DOF to plot in degrees DOFs: list, DOF names to compute. Default: DARM, CARM, PRCL, SRCL, MICH plotDOFs: list, DOF names to plot against each DOF. If None the same DOF as in DOFs is plotted. @@ -538,10 +518,10 @@ put f1m f $mx1 if DCoffset: self.DCoffset=DCoffset print("-- applying user-defined DC offset:") - pretuning = self.get_tunings(_kat) + pretuning = get_tunings(_kat, self.tunings) pretuning["ETMY"] += self.DCoffset pretuning["ETMX"] -= self.DCoffset - self.set_tunings(_kat, pretuning) + set_tunings(_kat, pretuning) kat = _kat.deepcopy() sigStr = self.AS_DC.signal(kat) signame = self.AS_DC.signal_name(kat) @@ -562,10 +542,10 @@ put f1m f $mx1 print(" waste light in AS port of {:2} W".format(waste_light)) kat_lock = _kat.deepcopy() self.find_DC_offset(kat_lock, 2*waste_light) - pretuning = self.get_tunings(kat_lock) + pretuning = get_tunings(kat_lock, self.tunings) pretuning["ETMY"] += self.DC_offset pretuning["ETMX"] -= self.DC_offset - self.set_tunings(_kat, pretuning) + set_tunings(_kat, pretuning) self.DCoffset_meter = self.DCoffset / 360.0 * _kat.lambda0 vprint(verbose, " DCoffset = {:6.4} deg ({:6.4}m)".format(self.DCoffset, self.DCoffset_meter)) vprint(verbose, " at dark port power: {:6.4}W".format(self.DCoffsetW)) @@ -913,7 +893,42 @@ class port(object): else: return "pd2 {} {} {} {} {} {}".format(name, self.f, phase, fsig, phase2, self.nodeName) - +#-------------------------------------------------------------------------------------------------- +#-------------------------------------------------------------------------------------------------- +#-------------------------------------------------------------------------------------------------- +#-------------------------------------------------------------------------------------------------- + +def get_tunings(kat, tunings): + """ + returns the tunings of optical components and the corresponding values + for maxtem and phase + """ + keys = list(tunings.keys()) + if "maxtem" in keys: + tunings["maxtem"] = kat.maxtem + keys.remove("maxtem") + if "phase" in keys: + tunings["phase"] = kat.phase + keys.remove("phase") + for comp in keys: + tunings[comp] = kat.components[comp].phi + return tunings + +def set_tunings(kat, tunings): + """ + sets the tunings of optical components and the corresponding values + for maxtem and phase + """ + keys = list(tunings.keys()) + if "maxtem" in keys: + kat.maxtem = tunings["maxtem"] + keys.remove("maxtem") + if "phase" in keys: + kat.phase = tunings["phase"] + keys.remove("phase") + for comp in keys: + kat.components[comp].phi = tunings[comp] + def scan_optics_string(_optics, _factors, _varName, linlog="lin", xlimits=[-100, 100], steps=200, axis=1,relative=False): optics=make_list_copy(_optics) factors=make_list_copy(_factors)