import csv
out = list(csv.DictReader(open('master_distances.csv')))
for o in out:
    o['Lbol_RMS'] = int(o['Lbol_RMS']); o['Lbol_best'] = int(o['Lbol_best'])
    o['d_RMS'] = float(o['d_RMS']); o['d_best'] = float(o['d_best'])
    o['in_2kpc'] = o['in_2kpc'] == 'True'; o['in_3kpc'] = o['in_3kpc'] == 'True'

n2 = sum(o['in_2kpc'] for o in out); n3 = sum(o['in_3kpc'] for o in out)
par = sum(1 for o in out if 'parallax' in o['method'])
print(f'Master: {len(out)} candidates. distance method = maser/Gaia parallax for {par}')
print(f'REVISED  <2kpc & L>1e4: {n2}   |   <3kpc & L>1e4: {n3}   (RMS-assigned were 12 and 70)')

print('\nDROPPED below 1e4 with revised distance:')
for o in out:
    if o['Lbol_best'] < 1e4 and o['Lbol_RMS'] >= 1e4:
        print(f"  {o['Name']:22s} L {o['Lbol_RMS']:>7d}->{o['Lbol_best']:>6d}  d {o['d_RMS']}->{o['d_best']}  ({o['method']},{o['ref']})")

print('\nMoved OUT of <3kpc (confirmed far):')
for o in out:
    if (not o['in_3kpc']) and o['d_RMS'] < 3 and o['Lbol_RMS'] > 1e4:
        print(f"  {o['Name']:22s} d {o['d_RMS']}->{o['d_best']}  ({o['ref']})")

print('\nMoved INTO <3kpc (RMS had far/large d):')
for o in out:
    if o['in_3kpc'] and o['d_RMS'] >= 3:
        print(f"  {o['Name']:22s} d {o['d_RMS']}->{o['d_best']}  L={o['Lbol_best']}  ({o['ref']})")

print('\n=== REVISED <2 kpc & L>1e4 sample ===')
for o in sorted([o for o in out if o['in_2kpc']], key=lambda x: -x['Lbol_best']):
    print(f"  {o['Name']:22s} {o['Type']:11s} d={o['d_best']:.2f} L={o['Lbol_best']:>7d} {o['method']:15s} {o['ref']}")
