@@ -165,19 +165,33 @@ def execute(
165165 # If not, assume no member_id is present
166166 member_ids .append (None )
167167
168+ logger .debug (
169+ "execute: Extracted member_ids=%s for keys=%s" , member_ids , list (ret .keys ())
170+ )
171+
168172 # get center years for each key for each warming level
169173 center_years = self .get_center_years (member_ids , ret .keys ())
174+ logger .debug (
175+ "execute: Received center_years dict with %d keys" ,
176+ len (center_years ),
177+ )
178+
170179 retkeys = list (ret .keys ())
171180
172181 for key in retkeys :
173182 if key not in center_years :
174183 del ret [key ]
175184
185+ # Build a mapping of simulation keys to their center years for proper coordinate assignment
186+ sim_centered_years = {}
187+
176188 for key , years in center_years .items ():
177189 if not years :
178190 continue
179191
180192 slices = []
193+ valid_wls = [] # Track which warming levels were successfully processed
194+ valid_center_years = [] # Track center years for valid warming levels
181195
182196 for year , wl in zip (years , self .warming_levels ):
183197 if year is None or pd .isna (year ):
@@ -227,13 +241,20 @@ def execute(
227241 # Expand dimensions to include warming_level as a new dimension
228242 da_slice = da_slice .expand_dims ({"warming_level" : [wl ]})
229243
230- # Add simulation and centered_year coordinates
231- da_slice = da_slice .assign_coords (
232- simulation = key ,
233- centered_year = (["warming_level" ], [center_year ]),
244+ # Add simulation coordinate (but NOT centered_year yet)
245+ da_slice = da_slice .assign_coords (simulation = key )
246+
247+ logger .debug (
248+ "execute: key=%s, wl=%s -> assigned coord simulation=%s" ,
249+ key ,
250+ wl ,
251+ key ,
234252 )
235253
236254 slices .append (da_slice )
255+ valid_wls .append (wl )
256+ valid_center_years .append (center_year )
257+
237258 # After processing all warming levels, check if we have any valid slices.
238259 if not slices :
239260 msg = f"No valid slices found for { key } . Ensure the warming level times table is correctly configured."
@@ -247,6 +268,18 @@ def execute(
247268 slices , dim = "warming_level" , join = "outer" , fill_value = np .nan
248269 )
249270
271+ # Store center years for this simulation key
272+ # DO NOT assign as coordinate here - it will be broadcast incorrectly
273+ # Store in sim_centered_years dict to be reconstructed in concatenate processor
274+ sim_centered_years [key ] = valid_center_years
275+
276+ # Store center years in context for reconstruction after concatenation
277+ context ["_sim_centered_years" ] = sim_centered_years
278+ logger .debug (
279+ "execute: Stored %d simulation center year mappings in context" ,
280+ len (sim_centered_years ),
281+ )
282+
250283 self .update_context (context )
251284 return ret
252285
@@ -351,9 +384,17 @@ def get_center_years(
351384 """
352385 center_years = {}
353386
387+ logger .debug (
388+ "get_center_years: Computing center years for %d keys" ,
389+ len (list (keys )),
390+ )
391+
354392 # cols are key.join("_"), values are warming levels, index is time
355393 for key , member_id in zip (keys , member_ids ):
356394 if member_id is None :
395+ logger .debug (
396+ "get_center_years: Skipping key=%s (member_id is None)" , key
397+ )
357398 continue # Skip if member_id is None
358399
359400 # build the key for the warming level table
@@ -363,24 +404,54 @@ def get_center_years(
363404 center_years [key ] = []
364405
365406 for wl in self .warming_levels :
407+ logger .debug (
408+ "get_center_years: Processing warming_level=%s for key=%s" ,
409+ wl ,
410+ key ,
411+ )
412+
366413 if str (wl ) not in self .warming_level_times .columns :
414+ logger .debug (
415+ "get_center_years: wl=%s not in warming_level_times.columns, using warming_level_times_idx" ,
416+ wl ,
417+ )
367418 # warming level is not an integer value, so we need to try to find
368419 # the first year that the simulation crosses the given warming level
369420 wl_table_key = f"{ key_list [2 ]} _{ member_id } _{ key_list [3 ]} "
421+ logger .debug (
422+ "get_center_years: Looking for wl_table_key=%s in warming_level_times_idx" ,
423+ wl_table_key ,
424+ )
425+
370426 if wl_table_key not in self .warming_level_times_idx .columns :
371427 logger .warning (
372- f"\n \n Warming level table does not contain data for { wl_table_key } . "
373- "\n Ensure the warming level times table is correctly configured."
428+ f"\n \n Warning: Warming level table does not contain data for { wl_table_key } . "
429+ "\n Ensure the warming level times table is correctly configured. "
430+ f"Available columns: { list (self .warming_level_times_idx .columns )[:5 ]} ..."
374431 )
375432 center_years [key ].append (np .nan )
376433 continue # exit warming levels loop
377434
378435 # get the FIRST index value for this key
379436 mask = (self .warming_level_times_idx [wl_table_key ] >= wl ).dropna ()
437+ logger .debug (
438+ "get_center_years: mask for %s >= %s has %d True values" ,
439+ wl_table_key ,
440+ wl ,
441+ mask .sum (),
442+ )
443+
380444 if mask .any ():
381- center_years [key ].append (
382- mask .idxmax () # Get the first occurrence of the warming level
445+ center_year = (
446+ mask .idxmax ()
447+ ) # Get the first occurrence of the warming level
448+ logger .debug (
449+ "get_center_years: Found center_year=%s for wl_table_key=%s, wl=%s" ,
450+ center_year ,
451+ wl_table_key ,
452+ wl ,
383453 )
454+ center_years [key ].append (center_year )
384455 else :
385456 max_valid_wl = (
386457 self .warming_level_times .loc [
@@ -395,11 +466,34 @@ def get_center_years(
395466 )
396467 center_years [key ].append (np .nan )
397468 else :
469+ logger .debug (
470+ "get_center_years: wl=%s found in warming_level_times.columns" ,
471+ wl ,
472+ )
398473 # this is a common warming level, so we can just get the year
399474 tuple_key = (key_list [2 ], member_id , key_list [3 ])
475+ logger .debug (
476+ "get_center_years: Looking up tuple_key=%s for wl=%s" ,
477+ tuple_key ,
478+ wl ,
479+ )
480+
400481 center_time = pd .to_datetime (
401482 self .warming_level_times .loc [tuple_key , str (wl )]
402483 )
403- center_years [key ].append (center_time .year )
484+ center_year = center_time .year
485+ logger .debug (
486+ "get_center_years: Found center_year=%s from warming_level_times for tuple_key=%s, wl=%s" ,
487+ center_year ,
488+ tuple_key ,
489+ wl ,
490+ )
491+ center_years [key ].append (center_year )
492+
493+ logger .debug (
494+ "get_center_years: Returning center_years with %d keys" , len (center_years )
495+ )
496+ for k , v in center_years .items ():
497+ logger .debug ("get_center_years: key=%s -> center_years=%s" , k , v )
404498
405499 return center_years
0 commit comments