|
8 | 8 | from .. import EddyParser
|
9 | 9 | from ..observations.network import Network, NetworkObservations
|
10 | 10 | from ..observations.tracking import TrackEddiesObservations
|
| 11 | +from numpy import in1d, zeros |
11 | 12 |
|
12 | 13 | logger = logging.getLogger("pet")
|
13 | 14 |
|
@@ -128,3 +129,135 @@ def subset_network():
|
128 | 129 | if args.period is not None:
|
129 | 130 | n = n.extract_with_period(args.period)
|
130 | 131 | n.write_file(filename=args.out)
|
| 132 | + |
| 133 | + |
| 134 | +def quick_compare(): |
| 135 | + parser = EddyParser( |
| 136 | + """Tool to have a quick comparison between several network: |
| 137 | + - N : network |
| 138 | + - S : segment |
| 139 | + - Obs : observations |
| 140 | + """ |
| 141 | + |
| 142 | + ) |
| 143 | + parser.add_argument("ref", help="Identification file of reference") |
| 144 | + parser.add_argument("others", nargs="+", help="Identifications files to compare") |
| 145 | + parser.add_argument( |
| 146 | + "--path_out", default=None, help="Save each group in separate file" |
| 147 | + ) |
| 148 | + args = parser.parse_args() |
| 149 | + |
| 150 | + kw = dict( |
| 151 | + include_vars=['longitude', 'latitude', 'time', 'track', 'segment', 'next_obs', 'previous_obs'] |
| 152 | + ) |
| 153 | + |
| 154 | + if args.path_out is not None: |
| 155 | + kw = dict() |
| 156 | + |
| 157 | + ref = NetworkObservations.load_file(args.ref, **kw) |
| 158 | + print( |
| 159 | + f"[ref] {args.ref} -> {ref.nb_network} network / {ref.nb_segment} segment / {len(ref)} obs " |
| 160 | + f"-> {ref.network_size(0)} trash obs, " |
| 161 | + f"{len(ref.merging_event())} merging, {len(ref.splitting_event())} spliting" |
| 162 | + ) |
| 163 | + others = {other: NetworkObservations.load_file(other, **kw) for other in args.others} |
| 164 | + |
| 165 | + if args.path_out is not None: |
| 166 | + groups_ref, groups_other = run_compare(ref, others, **kwargs) |
| 167 | + if not exists(args.path_out): |
| 168 | + mkdir(args.path_out) |
| 169 | + for i, other_ in enumerate(args.others): |
| 170 | + dirname_ = f"{args.path_out}/{other_.replace('/', '_')}/" |
| 171 | + if not exists(dirname_): |
| 172 | + mkdir(dirname_) |
| 173 | + for k, v in groups_other[other_].items(): |
| 174 | + basename_ = f"other_{k}.nc" |
| 175 | + others[other_].index(v).write_file(filename=f"{dirname_}/{basename_}") |
| 176 | + for k, v in groups_ref[other_].items(): |
| 177 | + basename_ = f"ref_{k}.nc" |
| 178 | + ref.index(v).write_file(filename=f"{dirname_}/{basename_}") |
| 179 | + return |
| 180 | + display_compare(ref, others) |
| 181 | + |
| 182 | + |
| 183 | +def run_compare(ref, others): |
| 184 | + outs = dict() |
| 185 | + for i, (k, other) in enumerate(others.items()): |
| 186 | + out = dict() |
| 187 | + print( |
| 188 | + f"[{i}] {k} -> {other.nb_network} network / {other.nb_segment} segment / {len(other)} obs " |
| 189 | + f"-> {other.network_size(0)} trash obs, " |
| 190 | + f"{len(other.merging_event())} merging, {len(other.splitting_event())} spliting" |
| 191 | + ) |
| 192 | + ref_id, other_id = ref.identify_in(other, size_min=2) |
| 193 | + m = other_id != -1 |
| 194 | + ref_id, other_id = ref_id[m], other_id[m] |
| 195 | + out['same N(N)'] = m.sum() |
| 196 | + out['same N(Obs)'] = ref.network_size(ref_id).sum() |
| 197 | + |
| 198 | + # For network which have same obs |
| 199 | + ref_, other_ = ref.networks(ref_id), other.networks(other_id) |
| 200 | + ref_segu, other_segu = ref_.identify_in(other_, segment=True) |
| 201 | + m = other_segu==-1 |
| 202 | + ref_track_no_match, _ = ref_.unique_segment_to_id(ref_segu[m]) |
| 203 | + ref_segu, other_segu = ref_segu[~m], other_segu[~m] |
| 204 | + m = ~in1d(ref_id, ref_track_no_match) |
| 205 | + out['same NS(N)'] = m.sum() |
| 206 | + out['same NS(Obs)'] = ref.network_size(ref_id[m]).sum() |
| 207 | + |
| 208 | + # Check merge/split |
| 209 | + def follow_obs(d, i_follow): |
| 210 | + m = i_follow != -1 |
| 211 | + i_follow = i_follow[m] |
| 212 | + t, x, y = zeros(m.size, d.time.dtype), zeros(m.size, d.longitude.dtype), zeros(m.size, d.latitude.dtype) |
| 213 | + t[m], x[m], y[m] = d.time[i_follow], d.longitude[i_follow], d.latitude[i_follow] |
| 214 | + return t, x, y |
| 215 | + def next_obs(d, i_seg): |
| 216 | + last_i = d.index_segment_track[1][i_seg] - 1 |
| 217 | + return follow_obs(d, d.next_obs[last_i]) |
| 218 | + def previous_obs(d, i_seg): |
| 219 | + first_i = d.index_segment_track[0][i_seg] |
| 220 | + return follow_obs(d, d.previous_obs[first_i]) |
| 221 | + |
| 222 | + tref, xref, yref = next_obs(ref_, ref_segu) |
| 223 | + tother, xother, yother = next_obs(other_, other_segu) |
| 224 | + |
| 225 | + m = (tref == tother) & (xref == xother) & (yref == yother) |
| 226 | + print(m.sum(), m.size, ref_segu.size, ref_track_no_match.size) |
| 227 | + |
| 228 | + tref, xref, yref = previous_obs(ref_, ref_segu) |
| 229 | + tother, xother, yother = previous_obs(other_, other_segu) |
| 230 | + |
| 231 | + m = (tref == tother) & (xref == xother) & (yref == yother) |
| 232 | + print(m.sum(), m.size, ref_segu.size, ref_track_no_match.size) |
| 233 | + |
| 234 | + |
| 235 | + |
| 236 | + ref_segu, other_segu = ref.identify_in(other, segment=True) |
| 237 | + m = other_segu != -1 |
| 238 | + out['same S(S)'] = m.sum() |
| 239 | + out['same S(Obs)'] = ref.segment_size()[ref_segu[m]].sum() |
| 240 | + |
| 241 | + outs[k] = out |
| 242 | + return outs |
| 243 | + |
| 244 | +def display_compare(ref, others): |
| 245 | + def display(value, ref=None): |
| 246 | + if ref: |
| 247 | + outs = [f"{v/ref[k] * 100:.1f}% ({v})" for k, v in value.items()] |
| 248 | + else: |
| 249 | + outs = value |
| 250 | + return "".join([f"{v:^18}" for v in outs]) |
| 251 | + |
| 252 | + datas = run_compare(ref, others) |
| 253 | + ref_ = { |
| 254 | + 'same N(N)' : ref.nb_network, |
| 255 | + "same N(Obs)": len(ref), |
| 256 | + 'same NS(N)' : ref.nb_network, |
| 257 | + 'same NS(Obs)' : len(ref), |
| 258 | + 'same S(S)' : ref.nb_segment, |
| 259 | + 'same S(Obs)' : len(ref), |
| 260 | + } |
| 261 | + print(" ", display(ref_.keys())) |
| 262 | + for i, (_, v) in enumerate(datas.items()): |
| 263 | + print(f"[{i:2}] ", display(v, ref=ref_)) |
0 commit comments