100
100
101
101
# estimate the common mode, either with a visualization of the result or not
102
102
# (same underlying function)
103
- # net.graphical_cme(ts_in="raw_filt_res", ts_out="common", method="ica")
103
+ # net.graphical_cme(ts_in="raw_filt_res", ts_out="common",
104
+ # method="ica", rng=np.random.default_rng(0))
104
105
# calculate common mode
105
- net .call_netwide_func ("decompose" , ts_in = "raw_filt_res" , ts_out = "common" , method = "ica" )
106
+ net .call_netwide_func ("decompose" , ts_in = "raw_filt_res" , ts_out = "common" ,
107
+ method = "ica" , rng = np .random .default_rng (0 ))
106
108
# now remove the common mode, call it the "intermed" timeseries,
107
109
for station in net :
108
110
station .add_timeseries ("intermed" , station ["raw_clean" ] - station ["common" ],
@@ -552,8 +554,21 @@ def R(angle):
552
554
lvc_data_transient_main = {name : (lvc_data_transient [name ][:, :2 ] @ R (rots [name ]))[:, 0 ]
553
555
for name in lvc_names }
554
556
557
+ # calculate optimal offsets between lines
558
+ uniq_t = np .unique ([i for name in rots_sort_dist .keys () for i in lvc_data [name ].index ]
559
+ ).astype (np .datetime64 )
560
+ full_by_dist = np .full ((len (rots_sort_dist ), uniq_t .size ), np .NaN )
561
+ for i , name in enumerate (rots_sort_dist .keys ()):
562
+ full_by_dist [i , np .isin (uniq_t , lvc_data [name ].index .values )] = \
563
+ lvc_data_transient_main [name ] - lvc_data_transient_main [name ][0 ]
564
+ temp = full_by_dist [0 , :].copy ()
565
+ offsets = [0 ]
566
+ for i in range (1 , len (rots_sort_dist )):
567
+ o = - np .nanmin (full_by_dist [i , :] - temp ) + 20
568
+ offsets .append (o )
569
+ temp = np .fmax (full_by_dist [i - 1 , :], full_by_dist [i , :] + o )
570
+
555
571
# start transient plot by distance
556
- offsets = [0 , 30 , 80 , 125 , 155 , 205 , 245 , 285 , 345 , 330 , 430 , 465 , 500 , 540 ]
557
572
fig , ax = plt .subplots (figsize = (5 , 8 ))
558
573
for i , name in enumerate (rots_sort_dist .keys ()):
559
574
ax .plot (lvc_data [name ].index ,
@@ -562,27 +577,11 @@ def R(angle):
562
577
ax .plot (lvc_data [name ].index ,
563
578
lvc_transient_main [name ] - lvc_data_transient_main [name ][0 ] + offsets [i ])
564
579
if name == "CASA" :
565
- ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (100 , "D" ),
566
- offsets [i ] + 30 ), ha = "left" , va = "bottom" )
567
- elif name == "CA99" :
568
- ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (50 , "D" ),
569
- offsets [i ] - 30 ), ha = "center" , va = "bottom" )
570
- elif name == "KRAC" :
571
- ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (100 , "D" ),
572
- offsets [i ] + 10 ), ha = "right" , va = "center" )
573
- elif name == "DDMN" :
574
- ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (100 , "D" ),
575
- offsets [i ] - 10 ), ha = "right" , va = "center" )
576
- elif name == "BALD" :
577
- ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (100 , "D" ),
578
- offsets [i ] - 10 ), ha = "right" , va = "center" )
579
- elif name == "WATC" :
580
- ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (100 , "D" ),
581
- offsets [i ] + 10 ), ha = "right" , va = "center" )
580
+ ax .annotate (name , (lvc_data [name ].index [0 ],
581
+ offsets [i ] + 20 ), ha = "left" , va = "bottom" )
582
582
else :
583
583
ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (100 , "D" ),
584
584
offsets [i ]), ha = "right" , va = "center" )
585
- if name != "CASA" :
586
585
ax .annotate (f"{ rots [name ]:.0f} °" ,
587
586
(lvc_data [name ].index [- 1 ] + pd .Timedelta (100 , "D" ),
588
587
lvc_transient_main [name ][- 1 ] - lvc_data_transient_main [name ][0 ]
@@ -598,8 +597,19 @@ def R(angle):
598
597
fig .savefig (plot_dir / f"example_1g_expansion_dist.{ fmt } " , dpi = 300 )
599
598
plt .close (fig )
600
599
600
+ # calculate optimal indices by azimuth
601
+ full_by_azim = np .full ((len (rots_sort_azim ), uniq_t .size ), np .NaN )
602
+ for i , name in enumerate (rots_sort_azim .keys ()):
603
+ full_by_azim [i , np .isin (uniq_t , lvc_data [name ].index .values )] = \
604
+ lvc_data_transient_main [name ] - lvc_data_transient_main [name ][0 ]
605
+ temp = full_by_azim [0 , :].copy ()
606
+ offsets = [0 ]
607
+ for i in range (1 , len (rots_sort_azim )):
608
+ o = - np .nanmin (full_by_azim [i , :] - temp ) + 20
609
+ offsets .append (o )
610
+ temp = np .fmax (full_by_azim [i - 1 , :], full_by_azim [i , :] + o )
611
+
601
612
# start transient plot by azimuth
602
- offsets = [0 , 50 , 70 , 90 , 145 , 165 , 210 , 250 , 280 , 310 , 360 , 405 , 445 , 485 ]
603
613
fig , ax = plt .subplots (figsize = (5 , 8 ))
604
614
for i , name in enumerate (rots_sort_azim .keys ()):
605
615
ax .plot (lvc_data [name ].index ,
@@ -608,18 +618,11 @@ def R(angle):
608
618
ax .plot (lvc_data [name ].index ,
609
619
lvc_transient_main [name ] - lvc_data_transient_main [name ][0 ] + offsets [i ])
610
620
if name == "CASA" :
611
- ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (50 , "D" ), offsets [i ] + 30 ),
612
- ha = "left" , va = "bottom" )
613
- elif name == "CA99" :
614
- ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (50 , "D" ), offsets [i ] + 10 ),
615
- ha = "center" , va = "bottom" )
616
- elif name == "TILC" :
617
- ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (100 , "D" ), offsets [i ] + 10 ),
618
- ha = "right" , va = "center" )
621
+ ax .annotate (name , (lvc_data [name ].index [0 ],
622
+ offsets [i ] + 30 ), ha = "left" , va = "bottom" )
619
623
else :
620
- ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (100 , "D" ), offsets [i ]),
621
- ha = "right" , va = "center" )
622
- if name != "CASA" :
624
+ ax .annotate (name , (lvc_data [name ].index [0 ] - pd .Timedelta (100 , "D" ),
625
+ offsets [i ]), ha = "right" , va = "center" )
623
626
ax .annotate (f"{ rots [name ]:.0f} °" ,
624
627
(lvc_data [name ].index [- 1 ] + pd .Timedelta (100 , "D" ),
625
628
lvc_transient_main [name ][- 1 ] - lvc_data_transient_main [name ][0 ]
0 commit comments