@@ -499,11 +499,11 @@ def test_process_l3a_partial_densities(self, mock_calculate_partial_densities):
499499 self .assertEqual (fe_hiq_partial_density , result_data .fe_hiq_partial_density ),
500500
501501 @patch ('imap_l3_processing.codice.l3.lo.codice_lo_processor.SpinAngleLookup' )
502- @patch ('imap_l3_processing.codice.l3.lo.codice_lo_processor.rebin_direct_events_for_normalization ' )
502+ @patch ('imap_l3_processing.codice.l3.lo.codice_lo_processor.calculate_normalization_factor ' )
503503 @patch ('imap_l3_processing.codice.l3.lo.codice_lo_processor.calculate_mass_per_charge' )
504504 @patch ('imap_l3_processing.codice.l3.lo.codice_lo_processor.calculate_mass' )
505505 def test_process_l3a_direct_events (self , mock_calculate_mass , mock_calculate_mass_per_charge ,
506- mock_rebin_direct_events_for_normalization ,
506+ mock_calculate_normalization_factor ,
507507 mock_spin_angle_lookup_class ):
508508 rng = np .random .default_rng ()
509509
@@ -517,42 +517,39 @@ def test_process_l3a_direct_events(self, mock_calculate_mass, mock_calculate_mas
517517 mock_spin_angle_lookup_class .return_value = mock_spin_angle_lookup
518518
519519 epochs = np .array ([datetime .now (), datetime .now () + timedelta (hours = 1 )])
520+ num_epochs = len (epochs )
520521
521- priority_counts_variable_shape = (len ( epochs ) , num_energy_bins , num_spin_angle_bins // 2 )
522+ priority_counts_variable_shape = (num_epochs , num_energy_bins , num_spin_angle_bins // 2 )
522523 sw_priority_rates = create_dataclass_mock (CodiceLoL1aSWPriorityRates )
523524 sw_priority_rates .epoch = epochs
524525 sw_priority_rates .p0_tcrs = rng .random (priority_counts_variable_shape )
525526 sw_priority_rates .p1_hplus = rng .random (priority_counts_variable_shape )
526527 sw_priority_rates .p2_heplusplus = rng .random (priority_counts_variable_shape )
527528 sw_priority_rates .p3_heavies = rng .random (priority_counts_variable_shape )
528529 sw_priority_rates .p4_dcrs = rng .random (priority_counts_variable_shape )
529- sw_priority_rates .half_spin_per_esa_step = rng .random ((len ( epochs ) , num_energy_bins ))
530- sw_priority_rates .rgfo_spin_sector = rng .random (len ( epochs ) )
531- sw_priority_rates .rgfo_esa_step = rng .random (len ( epochs ) )
532- sw_priority_rates .nso_spin_sector = rng .random (len ( epochs ) )
533- sw_priority_rates .nso_esa_step = rng .random (len ( epochs ) )
530+ sw_priority_rates .half_spin_per_esa_step = rng .random ((num_epochs , num_energy_bins ))
531+ sw_priority_rates .rgfo_spin_sector = rng .random (num_epochs )
532+ sw_priority_rates .rgfo_esa_step = rng .random (num_epochs )
533+ sw_priority_rates .nso_spin_sector = rng .random (num_epochs )
534+ sw_priority_rates .nso_esa_step = rng .random (num_epochs )
534535
535536 nsw_priority_rates = create_dataclass_mock (CodiceLoL1aNSWPriorityRates )
536537 nsw_priority_rates .epoch = epochs
537538 nsw_priority_rates .p5_heavies = rng .random (priority_counts_variable_shape )
538539 nsw_priority_rates .p6_hplus_heplusplus = rng .random (priority_counts_variable_shape )
539540
540- counts_rebinned_by_energy_and_spin = rng .random (
541- (len (epochs ), CODICE_LO_L2_NUM_PRIORITIES , num_energy_bins , num_spin_angle_bins ))
542- mock_rebin_direct_events_for_normalization .return_value = counts_rebinned_by_energy_and_spin
543-
544- mass_per_charge = rng .random ((len (epochs ), CODICE_LO_L2_NUM_PRIORITIES , event_buffer_size ))
541+ mass_per_charge = rng .random ((num_epochs , CODICE_LO_L2_NUM_PRIORITIES , event_buffer_size ))
545542 mock_calculate_mass_per_charge .return_value = mass_per_charge
546- mass = rng .random ((len ( epochs ) , CODICE_LO_L2_NUM_PRIORITIES , event_buffer_size ))
543+ mass = rng .random ((num_epochs , CODICE_LO_L2_NUM_PRIORITIES , event_buffer_size ))
547544 mock_calculate_mass .return_value = mass
548545
549- codice_l2_variables = {f .name : rng .random ((len ( epochs ) , CODICE_LO_L2_NUM_PRIORITIES , event_buffer_size )) for f
546+ codice_l2_variables = {f .name : rng .random ((num_epochs , CODICE_LO_L2_NUM_PRIORITIES , event_buffer_size )) for f
550547 in fields (CodiceLoL2DirectEventData )}
551548
552549 codice_l2_variables ["epoch" ] = epochs
553550 codice_l2_variables ["spin_angle" ] *= 360
554- codice_l2_variables ["data_quality" ] = rng .random ((len ( epochs ) ))
555- codice_l2_variables ["num_events" ] = rng .random ((len ( epochs ) ))
551+ codice_l2_variables ["data_quality" ] = rng .random ((num_epochs ))
552+ codice_l2_variables ["num_events" ] = rng .random ((num_epochs ))
556553
557554 expected_energy_per_charge = codice_l2_variables ["energy_per_charge" ]
558555 expected_apd_energy = codice_l2_variables ["apd_energy" ]
@@ -578,6 +575,9 @@ def test_process_l3a_direct_events(self, mock_calculate_mass, mock_calculate_mas
578575 mock_energy_lookup .bin_centers = np .geomspace (14100 , 88.082825 , 128 )
579576 mock_energy_lookup .num_bins = num_energy_bins
580577
578+ expected_normalization = rng .random ((num_epochs , num_priorities , num_energy_bins , num_spin_angle_bins ))
579+ mock_calculate_normalization_factor .return_value = expected_normalization
580+
581581 dependencies = CodiceLoL3aDirectEventsDependencies (sw_priority_rates , nsw_priority_rates , direct_events , Mock (),
582582 mock_energy_lookup )
583583
@@ -595,12 +595,21 @@ def test_process_l3a_direct_events(self, mock_calculate_mass, mock_calculate_mas
595595 np .testing .assert_equal (mock_calculate_mass_per_charge .call_args .args [0 ], expected_energy_per_charge )
596596 np .testing .assert_equal (mock_calculate_mass_per_charge .call_args .args [1 ], expected_tof )
597597
598- self .assertEqual (1 , mock_rebin_direct_events_for_normalization .call_count )
599- np .testing .assert_equal (mock_rebin_direct_events_for_normalization .call_args .args [0 ], expected_num_events )
600- np .testing .assert_equal (mock_rebin_direct_events_for_normalization .call_args .args [1 ], expected_spin_sector )
601- np .testing .assert_equal (mock_rebin_direct_events_for_normalization .call_args .args [2 ], expected_energy_step )
602- np .testing .assert_equal (mock_rebin_direct_events_for_normalization .call_args .args [3 ], num_spin_angle_bins )
603- np .testing .assert_equal (mock_rebin_direct_events_for_normalization .call_args .args [4 ], num_energy_bins )
598+ self .assertEqual (1 , mock_calculate_normalization_factor .call_count )
599+ actual_stacked_priorities = mock_calculate_normalization_factor .call_args .args [0 ]
600+
601+ np .testing .assert_equal (actual_stacked_priorities [:, 0 ], sw_priority_rates .p0_tcrs )
602+ np .testing .assert_equal (actual_stacked_priorities [:, 1 ], sw_priority_rates .p1_hplus )
603+ np .testing .assert_equal (actual_stacked_priorities [:, 2 ], sw_priority_rates .p2_heplusplus )
604+ np .testing .assert_equal (actual_stacked_priorities [:, 3 ], sw_priority_rates .p3_heavies )
605+ np .testing .assert_equal (actual_stacked_priorities [:, 4 ], sw_priority_rates .p4_dcrs )
606+ np .testing .assert_equal (actual_stacked_priorities [:, 5 ], nsw_priority_rates .p5_heavies )
607+ np .testing .assert_equal (actual_stacked_priorities [:, 6 ], nsw_priority_rates .p6_hplus_heplusplus )
608+
609+ np .testing .assert_equal (mock_calculate_normalization_factor .call_args .args [1 ], expected_num_events )
610+ np .testing .assert_equal (mock_calculate_normalization_factor .call_args .args [2 ], expected_spin_sector )
611+ np .testing .assert_equal (mock_calculate_normalization_factor .call_args .args [3 ], expected_energy_step )
612+
604613
605614 self .assertIsInstance (l3a_direct_event_data_product , CodiceLoL3aDirectEventDataProduct )
606615 self .assertEqual (input_metadata , l3a_direct_event_data_product .input_metadata )
@@ -613,20 +622,6 @@ def test_process_l3a_direct_events(self, mock_calculate_mass, mock_calculate_mas
613622 np .testing .assert_array_equal (expected_mass_per_charge , l3a_direct_event_data_product .mass_per_charge )
614623 np .testing .assert_array_equal (expected_mass , l3a_direct_event_data_product .mass )
615624
616- priority_rates = np .stack ([
617- sw_priority_rates .p0_tcrs ,
618- sw_priority_rates .p1_hplus ,
619- sw_priority_rates .p2_heplusplus ,
620- sw_priority_rates .p3_heavies ,
621- sw_priority_rates .p4_dcrs ,
622- nsw_priority_rates .p5_heavies ,
623- nsw_priority_rates .p6_hplus_heplusplus ,
624- ], axis = 1 )
625- expected_numerator = np .zeros ((len (epochs ), num_priorities , num_energy_bins , num_spin_angle_bins ))
626- expected_numerator [:,:,:,:12 ] = priority_rates
627- expected_numerator [:,:,:,12 :] = priority_rates
628- expected_normalization = expected_numerator / counts_rebinned_by_energy_and_spin
629-
630625 np .testing .assert_array_equal (l3a_direct_event_data_product .normalization ,
631626 np .flip (expected_normalization , axis = 2 ))
632627
0 commit comments