def test_station_martime_mobile_flag(self): self.assertEqual(Station("DH1TW/MM").mm, True) self.assertEqual(Station("DH1TW/MM").valid, False) self.assertEqual(Station("DH1TW/MM").prefix, False) self.assertEqual(Station("VP2M/DH1TW/MM").mm, True) self.assertEqual(Station("VP2M/DH1TW/MM").valid, False) self.assertEqual(Station("VP2M/DH1TW").valid, True) self.assertEqual(Station("VP2M/DH1TW").mm, False) self.assertEqual(Station("R7GA/MM").valid, False) self.assertEqual(Station("R7GA/MM").prefix, False) self.assertEqual(Station("R7GA/MM").mm, True)
def test_station_beacon_flag(self): self.assertEqual(Station("DH1TW/BCN").beacon, True) self.assertEqual(Station("DH1TW/BCN").valid, True) self.assertEqual(Station("DH1TW/B").beacon, True) self.assertEqual(Station("DH1TW/B").valid, True) self.assertEqual(Station("VP2M/DH1TW/BCN").valid, True) self.assertEqual(Station("VP2M/DH1TW/BCN").beacon, True) self.assertEqual(Station("VP2M/DH1TW").beacon, False)
def test_station_aerotime_mobile_flag(self): self.assertEqual(Station("DH1TW/AM").am, True) self.assertEqual(Station("DH1TW/AM").valid, False) self.assertEqual(Station("VP2M/DH1TW/AM").am, True) self.assertEqual(Station("VP2M/DH1TW/AM").valid, False) self.assertEqual(Station("VP2M/DH1TW").valid, True) self.assertEqual(Station("VP2M/DH1TW").am, False)
def test_station_number_appendix(self): self.assertEqual(Station("DH1TW/EA3").prefix, "EA") self.assertEqual(Station("YB9IR/3").prefix, "YB3") self.assertEqual(Station("UA9MAT/1").prefix, "U") self.assertEqual(Station("W3LPL/5").prefix, "W5") self.assertEqual(Station("UA9KRM/3").prefix, "U") self.assertEqual(Station("UR900CC/4").prefix, "UR")
def test_station_invalid_calls_with_special_characters(self): self.assertEqual(Station("DK()DK").valid, False) self.assertEqual(Station("DK/DK").valid, False) self.assertEqual(Station("'!$&/()@").valid, False) self.assertEqual(Station("").valid, False)
def test_station_mobile(self): self.assertEqual(Station("VK3/DH1TW/M").valid, True) self.assertEqual(Station("VK3/DH1TW/M").prefix, "VK")
def test_station_lighthouse(self): self.assertEqual(Station("DH1TW/LH").valid, True) self.assertEqual(Station("DH1TW/LH").prefix, "DH") self.assertEqual(Station("UR7GO/P/LH").valid, True) self.assertEqual(Station("UR7GO/P/LH").prefix, "UR")
def test_station_portable(self): self.assertEqual(Station("MM/DH1TW/P").valid, True) self.assertEqual(Station("MM/DH1TW/P").prefix, "MM")
def test_station_with_invalid_calls(self): self.assertEqual(Station("DH").valid, False) self.assertEqual(Station("DH1").valid, False) self.assertEqual(Station("DH1TW/012").valid, False) self.assertEqual(Station("01A/DH1TW").valid, False) self.assertEqual(Station("01A/DH1TW/P").valid, False) self.assertEqual(Station("01A/DH1TW/MM").valid, False) self.assertEqual(Station("QSL").valid, False) self.assertEqual(Station("QRV").valid, False) self.assertEqual(Station("T0NTO").valid, False) self.assertEqual(Station("T0ALL").valid, False) self.assertEqual(Station("H1GHMUF").valid, False) self.assertEqual(Station("C1BBI").valid, False) self.assertEqual(Station("PU1MHZ/QAP").valid, False) self.assertEqual(Station("DU7/PA0").valid, False) self.assertEqual(Station("DIPLOMA").valid, False) self.assertEqual(Station("CQAS").valid, False) self.assertEqual(Station("IK2SAV/P1").valid, False) self.assertEqual(Station("IKOFTA").valid, False) self.assertEqual(Station("SP2/SP3").valid, False) self.assertEqual(Station("CQ").valid, False) self.assertEqual(Station("RADAR").valid, False) self.assertEqual(Station("MUF/INFO").valid, False) self.assertEqual(Station("RAVIDEO").valid, False) self.assertEqual(Station("PIRATE").valid, False) self.assertEqual(Station("XE1/H").valid, False) self.assertEqual(Station("Z125VZ").valid, False) self.assertEqual(Station("ZD6DYA").prefix, False) self.assertEqual(Station("ZD6DYA").valid, False) self.assertEqual(Station("F5BUU1").valid, False) self.assertEqual(Station("0").valid, False) self.assertEqual(Station("0123456789").valid, False) self.assertEqual(Station("CD43000").valid, False) self.assertEqual(Station("GN").valid, False) self.assertEqual(Station("GN").homecall, False) self.assertEqual(Station("ARABS").homecall, False) self.assertEqual(Station("2320900").valid, False) self.assertEqual(Station("ITT9APL").valid, False) # self.assertEqual(Station("EA5/G0K").valid, False) self.assertEqual(Station("MUF").valid, False)
def test_station_with_valid_calls(self): self.assertEqual(Station("DH1T").prefix, "DH") self.assertEqual(Station("DH1TW/P").prefix, "DH") self.assertEqual(Station("DH1TW/MM").prefix, False) self.assertEqual(Station("DH1TW/AM").prefix, False) self.assertEqual(Station("DH1TW/VP5").prefix, "VP5") self.assertEqual(Station("VP5/DH1TW").prefix, "VP5") self.assertEqual(Station("VP5/DH1TW/P").prefix, "VP5") self.assertEqual(Station("MM/DH1TW/P").prefix, "MM") self.assertEqual(Station("DH1TW/QRP").prefix, "DH") self.assertEqual(Station("DH1TW/QRPP").prefix, "DH") self.assertEqual(Station("MM/DH1TW/QRP").prefix, "MM") self.assertEqual(Station("MM/DH1TW/QRPP").prefix, "MM") self.assertEqual(Station("MM/DH1TW/B").prefix, "MM") self.assertEqual(Station("MM/DH1TW/BCN").prefix, "MM") self.assertEqual(Station("EA1/DH1TW").prefix, "EA") self.assertEqual(Station("EA1/DH1TW/P").prefix, "EA") self.assertEqual(Station("DH1TW/EA1").prefix, "EA") self.assertEqual(Station("DH1TW/EA").prefix, "EA") self.assertEqual(Station("VP2E/AL1O/P").prefix, "VP2E") self.assertEqual(Station("VP2E/DL2001IRTA/P").prefix, "VP2E") self.assertEqual(Station("CD4300").prefix, "CD") self.assertEqual(Station("CD4300").country, "Chile") self.assertEqual(Station("CD4300").homecall, "CD4300") self.assertEqual(Station("DH1TW/EA8/QRP").prefix, "EA8") self.assertEqual(Station("W0ERE/B").prefix, "W0") self.assertEqual(Station("W0ERE/B").valid, True) self.assertEqual(Station("ER/KL1A").prefix, "ER") self.assertEqual(Station("DL4SDW/HI3").prefix, "HI") self.assertEqual(Station("SV9/M1PAH/HH").prefix, 'SV9') self.assertEqual(Station("8J3XVIII").prefix, '8J') self.assertEqual(Station("DL4SDW/HI3").prefix, 'HI') self.assertEqual(Station("9A28HQ").prefix, '9A') self.assertEqual(Station("RU27TT").prefix, 'R') self.assertEqual(Station("UE90K").prefix, 'UE9') self.assertEqual(Station("DL2000ALMK").prefix, 'DL') self.assertEqual(Station("HF450NS").prefix, "HF") self.assertEqual(Station("GB558VUL").prefix, "G") self.assertEqual(Station("F/ON5OF").prefix, 'F') self.assertEqual(Station("OX1A/OZ1ABC").prefix, "OX") self.assertEqual(Station("OX1A/OZ").prefix, "OZ") self.assertEqual(Station("OZ5V").prefix, "OZ") self.assertEqual(Station("OV9DV").prefix, "OV") self.assertEqual(Station("CQ59HQ").prefix, "CQ") self.assertEqual(Station("RW3DQC/1/P").prefix, "R") self.assertEqual(Station("RW3DQC/1/P").homecall, "RW3DQC") self.assertEqual(Station("DB0SUE-10").prefix, "DB") self.assertEqual(Station("DK0WYC-2").prefix, "DK") self.assertEqual(Station("DK0WYC-2").valid, True) self.assertEqual(Station("G0KTD/P").prefix, "G")
def test_station_all_properties_with_a_valid_call(self): self.assertEqual(Station("HC2/DH1TW/P").prefix, "HC") self.assertEqual(Station("HC2/DH1TW/P").valid, True) self.assertEqual(Station("HC2/DH1TW/P").call, "HC2/DH1TW/P") self.assertEqual(Station("HC2/DH1TW/P").homecall, "DH1TW") self.assertEqual(Station("HC2/DH1TW/P").country, "Ecuador") self.assertEqual(Station("HC2/DH1TW/P").latitude, -1.4) self.assertEqual(Station("HC2/DH1TW/P").longitude, 78.4) self.assertEqual(Station("HC2/DH1TW/P").cqz, 10) self.assertEqual(Station("HC2/DH1TW/P").ituz, 12) self.assertEqual(Station("HC2/DH1TW/P").continent, "SA") self.assertEqual(Station("HC2/DH1TW/P").mm, False) self.assertEqual(Station("HC2/DH1TW/P").beacon, False) self.assertEqual(Station("HC2/DH1TW/P").am, False)
def get_deltasnr_bycall(callsign_sorted_byspots, data_bycallsign_dict, dist_dict, timestamp_start, timestamp_stop, antenna_rotation_time, reporter_list, common_ts_bycall, rx_offset, topn=-1, plot_flag=False, country=False): if plot_flag: ax = plt.figure(figsize=(26, 20)) deltasnr_bycall_dict = {} for call in callsign_sorted_byspots[:topn]: timeseries = common_ts_bycall[call] if len(timeseries) == 0: continue unixtime_list = [ get_unixtime( data_bycallsign_dict[call][reporter_list[0]][el[0]][0]) for el in timeseries ] snr_list_0 = [ data_bycallsign_dict[call][reporter_list[0]][el[0]][2] for el in timeseries ] snr_list_1 = [ data_bycallsign_dict[call][reporter_list[1]][el[1]][2] for el in timeseries ] unixtime_list, snr_list_0, snr_list_1 = (list(t) for t in zip( *sorted(zip(unixtime_list, snr_list_0, snr_list_1), key=lambda k: k[0], reverse=False))) datetime_list = [ datetime.datetime.fromtimestamp(ts) for ts in unixtime_list ] deltasnr_list = [ snr_1 - snr_0 - rx_offset for snr_0, snr_1 in zip(snr_list_0, snr_list_1) ] deltasnr_bycall_dict[call] = (unixtime_list, deltasnr_list) if plot_flag: cdist = dist_dict[call] plt.plot(datetime_list, deltasnr_list, "-o", label=call + " " + reporter_list[0], c=cdist, cmap=plt.cm.plasma) if not country: plt.text(datetime_list[0], deltasnr_list[0] + 0.5 * random.random(), "%s" % call) if len(unixtime_list) > 1: plt.text(datetime_list[-1], deltasnr_list[-1] + 0.5 * random.random(), "%s" % call) else: plt.text(datetime_list[0], deltasnr_list[0] + 0.5 * random.random(), Station(call).country) if plot_flag: #plt.axvline(timestamp_start, c="r") #plt.axvline(antenna_rotation_time, c="b") plt.grid() plt.title("Time evolution of difference in SNR between two antennas") plt.xlabel("Time") plt.ylabel("Delta SNR (dB)") plt.xlim(datetime.datetime.fromtimestamp(timestamp_start), datetime.datetime.fromtimestamp(timestamp_stop)) plt.ylim(-25, 25) #plt.gcf().fmt_xdata = mdates.DateFormatter('%H-%M') #plt.gcf().autofmt_xdate() #legend() return deltasnr_bycall_dict
def main(): bands = {} states = [] countries = [] dxcc = [] multiplier = 0 bandStates = {} bandDXCC = {} filename = input("Enter Cabrio filename: ") multiband = False multiplerCountry = False m = input( "Is the multiplier a multiband multiplier (for the same contact) [Y/N]: " ) m2 = input( "Is the DX multipler by contact (Select Y only if you get 1 multiplier for each DXCC)? [Y/N]: " ) if m.upper() == "Y": multiband = True if m2.upper() == "Y": multiplerCountry = True for line in open(filename): line = line.strip() if line.startswith("QSO: "): data = line.split() if len(data[1]) == 5: freq = data[1][:2] else: freq = data[1][:1] if freq not in bands: bands[freq] = [] bandStates[freq] = [] bandDXCC[freq] = [] if (data[8]) not in bands[freq]: bands[freq].append(data[8]) if not data[10].isnumeric() and not data[10] in states: states.append(data[10]) elif data[10].isnumeric() and data[8] not in dxcc: dxcc.append(data[8]) stn = Station(data[8]) if stn.country not in countries: countries.append(stn.country) if multiband: if not data[10].isnumeric( ) and not data[10] in bandStates[freq]: bandStates[freq].append(data[10]) elif data[10].isnumeric() and data[8] not in bandDXCC[freq]: bandDXCC[freq].append(data[8]) totalCalls = 0 for callPerBand in bands.values(): totalCalls += len(callPerBand) #print(totalCalls) if not multiband and not multiplerCountry: multiplier = len(states) + len(countries) elif not multiband and multiplerCountry: multiplier = len(states) + len(dxcc) else: for f in bandStates.values(): multiplier += len(f) for f in bandDXCC.values(): multiplier += len(f) dxcc.sort() states.sort() print("Total Score: " + str(totalCalls * multiplier) + " (" + str(totalCalls) + " * " + str(multiplier) + ")") print("Contacts: " + str(totalCalls)) print("Unique States: " + str(len(states))) print("Unique DXCC: " + str(len(dxcc))) print("Unique DX Countries: " + str(len(countries)))