2026-03-24T10:17:40 tedana.tedana_workflow INFO Using output directory: /nox1/data/WELL22/ImagingData/BIDS/UCLABMC/ImagingData/SubjectsRESTSBREF_tedana_24.0.1_ILIAD_derivatives/sub-OPT0047/ses-01/func/sub-OPT0047_ses-01_task-REST_dir-AP 2026-03-24T10:17:40 tedana.tedana_workflow INFO Initializing and validating component selection tree 2026-03-24T10:17:40 component_selector.validate_tree WARNING Decision tree includes fields that are not used or logged {'_comment'} 2026-03-24T10:17:40 component_selector.__init__ INFO Performing component selection with tedana_orig_decision_tree 2026-03-24T10:17:40 component_selector.__init__ INFO Very similar to the decision tree designed by Prantik Kundu 2026-03-24T10:17:40 tedana.tedana_workflow INFO Loading input data: ['/nox1/data/WELL22/ImagingData/BIDS/UCLABMC/ImagingData/SubjectsRESTSBREF_tedana_24.0.1_ILIAD_derivatives/reduced_files/sub-OPT0047_ses-01_task-REST_dir-AP_echo-1_desc-preproc_bold.nii.gz', '/nox1/data/WELL22/ImagingData/BIDS/UCLABMC/ImagingData/SubjectsRESTSBREF_tedana_24.0.1_ILIAD_derivatives/reduced_files/sub-OPT0047_ses-01_task-REST_dir-AP_echo-2_desc-preproc_bold.nii.gz', '/nox1/data/WELL22/ImagingData/BIDS/UCLABMC/ImagingData/SubjectsRESTSBREF_tedana_24.0.1_ILIAD_derivatives/reduced_files/sub-OPT0047_ses-01_task-REST_dir-AP_echo-3_desc-preproc_bold.nii.gz', '/nox1/data/WELL22/ImagingData/BIDS/UCLABMC/ImagingData/SubjectsRESTSBREF_tedana_24.0.1_ILIAD_derivatives/reduced_files/sub-OPT0047_ses-01_task-REST_dir-AP_echo-4_desc-preproc_bold.nii.gz'] 2026-03-24T10:18:14 io.__init__ INFO Generating figures directory: /nox1/data/WELL22/ImagingData/BIDS/UCLABMC/ImagingData/SubjectsRESTSBREF_tedana_24.0.1_ILIAD_derivatives/sub-OPT0047/ses-01/func/sub-OPT0047_ses-01_task-REST_dir-AP/figures 2026-03-24T10:18:14 tedana.tedana_workflow INFO Using user-defined mask 2026-03-24T10:18:15 utils.make_adaptive_mask INFO Echo-wise intensity thresholds for adaptive mask: [1757.16170601 1076.44362175 586.64342649 325.51931487] 2026-03-24T10:18:15 utils.make_adaptive_mask WARNING 1524 voxels in user-defined mask do not have good signal. Removing voxels from mask. 2026-03-24T10:18:15 tedana.tedana_workflow INFO Computing T2* map 2026-03-24T10:20:22 combine.make_optcom INFO Optimally combining data with voxel-wise T2* estimates 2026-03-24T10:20:29 tedana.tedana_workflow INFO Writing optimally combined data set: /nox1/data/WELL22/ImagingData/BIDS/UCLABMC/ImagingData/SubjectsRESTSBREF_tedana_24.0.1_ILIAD_derivatives/sub-OPT0047/ses-01/func/sub-OPT0047_ses-01_task-REST_dir-AP/sub-OPT0047_ses-01_task-REST_dir-AP_desc-optcom_bold.nii.gz 2026-03-24T10:20:29 pca.tedpca INFO Computing PCA of optimally combined multi-echo data with selection criteria: aic 2026-03-24T10:20:37 pca.tedpca INFO Optimal number of components based on different criteria: 2026-03-24T10:20:37 pca.tedpca INFO AIC: 52 | KIC: 45 | MDL: 34 | 90% varexp: 191 | 95% varexp: 241 2026-03-24T10:20:37 pca.tedpca INFO Explained variance based on different criteria: 2026-03-24T10:20:37 pca.tedpca INFO AIC: 0.727% | KIC: 0.714% | MDL: 0.688% | 90% varexp: 0.901% | 95% varexp: 0.95% 2026-03-24T10:20:37 pca.tedpca INFO Plotting maPCA optimization curves 2026-03-24T10:20:37 collect.generate_metrics INFO Calculating weight maps 2026-03-24T10:20:38 collect.generate_metrics INFO Calculating parameter estimate maps for optimally combined data 2026-03-24T10:20:39 collect.generate_metrics INFO Calculating z-statistic maps 2026-03-24T10:20:39 collect.generate_metrics INFO Calculating F-statistic maps 2026-03-24T10:20:44 collect.generate_metrics INFO Thresholding z-statistic maps 2026-03-24T10:20:45 collect.generate_metrics INFO Calculating T2* F-statistic maps 2026-03-24T10:20:47 collect.generate_metrics INFO Calculating S0 F-statistic maps 2026-03-24T10:20:48 collect.generate_metrics INFO Counting significant voxels in T2* F-statistic maps 2026-03-24T10:20:48 collect.generate_metrics INFO Counting significant voxels in S0 F-statistic maps 2026-03-24T10:20:48 collect.generate_metrics INFO Thresholding optimal combination beta maps to match T2* F-statistic maps 2026-03-24T10:21:01 collect.generate_metrics INFO Thresholding optimal combination beta maps to match S0 F-statistic maps 2026-03-24T10:21:14 collect.generate_metrics INFO Calculating kappa and rho 2026-03-24T10:21:14 collect.generate_metrics INFO Calculating variance explained 2026-03-24T10:21:14 collect.generate_metrics INFO Calculating normalized variance explained 2026-03-24T10:21:14 collect.generate_metrics INFO Calculating DSI between thresholded T2* F-statistic and optimal combination beta maps 2026-03-24T10:21:14 collect.generate_metrics INFO Calculating DSI between thresholded S0 F-statistic and optimal combination beta maps 2026-03-24T10:21:14 collect.generate_metrics INFO Calculating signal-noise t-statistics 2026-03-24T10:21:14 collect.generate_metrics INFO Counting significant noise voxels from z-statistic maps 2026-03-24T10:21:14 collect.generate_metrics INFO Calculating decision table score 2026-03-24T10:21:16 pca.tedpca INFO Selected 52 components with 72.71% normalized variance explained using aic dimensionality estimate 2026-03-24T10:21:21 ica.tedica INFO ICA with random seed 42 converged in 72 iterations 2026-03-24T10:21:21 collect.generate_metrics INFO Calculating weight maps 2026-03-24T10:21:23 collect.generate_metrics INFO Calculating parameter estimate maps for optimally combined data 2026-03-24T10:21:23 collect.generate_metrics INFO Calculating z-statistic maps 2026-03-24T10:21:23 collect.generate_metrics INFO Calculating F-statistic maps 2026-03-24T10:21:29 collect.generate_metrics INFO Thresholding z-statistic maps 2026-03-24T10:21:31 collect.generate_metrics INFO Calculating T2* F-statistic maps 2026-03-24T10:21:32 collect.generate_metrics INFO Calculating S0 F-statistic maps 2026-03-24T10:21:33 collect.generate_metrics INFO Counting significant voxels in T2* F-statistic maps 2026-03-24T10:21:33 collect.generate_metrics INFO Counting significant voxels in S0 F-statistic maps 2026-03-24T10:21:33 collect.generate_metrics INFO Thresholding optimal combination beta maps to match T2* F-statistic maps 2026-03-24T10:21:44 collect.generate_metrics INFO Thresholding optimal combination beta maps to match S0 F-statistic maps 2026-03-24T10:21:56 collect.generate_metrics INFO Calculating kappa and rho 2026-03-24T10:21:56 collect.generate_metrics INFO Calculating variance explained 2026-03-24T10:21:56 collect.generate_metrics INFO Calculating normalized variance explained 2026-03-24T10:21:56 collect.generate_metrics INFO Calculating DSI between thresholded T2* F-statistic and optimal combination beta maps 2026-03-24T10:21:56 collect.generate_metrics INFO Calculating DSI between thresholded S0 F-statistic and optimal combination beta maps 2026-03-24T10:21:56 collect.generate_metrics INFO Calculating signal-noise t-statistics 2026-03-24T10:21:56 collect.generate_metrics INFO Counting significant noise voxels from z-statistic maps 2026-03-24T10:21:56 collect.generate_metrics INFO Calculating decision table score 2026-03-24T10:21:56 tedana.tedana_workflow INFO Selecting components from ICA results 2026-03-24T10:21:56 tedica.automatic_selection INFO Performing ICA component selection 2026-03-24T10:21:56 selection_nodes.manual_classify INFO Step 0: manual_classify: Set all to unclassified 2026-03-24T10:21:56 selection_utils.log_decision_tree_step INFO Step 0: manual_classify applied to 52 components. 52 True -> unclassified. 0 False -> nochange. 2026-03-24T10:21:56 selection_nodes.manual_classify INFO Step 0: manual_classify component classification tags are cleared 2026-03-24T10:21:56 selection_utils.log_classification_counts INFO Step 0: Total component classifications: 52 unclassified 2026-03-24T10:21:56 selection_nodes.dec_left_op_right INFO Step 1: left_op_right: rejected if rho>kappa, else nochange 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 1: left_op_right applied to 52 components. 13 True -> rejected. 39 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 1: Total component classifications: 13 rejected, 39 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 2: left_op_right: rejected if ['countsigFS0>countsigFT2 & countsigFT2>0'], else nochange 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 2: left_op_right applied to 52 components. 15 True -> rejected. 37 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 2: Total component classifications: 18 rejected, 34 unclassified 2026-03-24T10:21:57 selection_nodes.calc_median INFO Step 3: calc_median: Median(median_varex) 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 3: calc_median calculated: median_varex=0.6143125841230797 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 3: Total component classifications: 18 rejected, 34 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 4: left_op_right: rejected if ['dice_FS0>dice_FT2 & variance explained>0.61'], else nochange 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 4: left_op_right applied to 52 components. 1 True -> rejected. 51 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 4: Total component classifications: 18 rejected, 34 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 5: left_op_right: rejected if ['0>signal-noise_t & variance explained>0.61'], else nochange 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 5: left_op_right applied to 52 components. 8 True -> rejected. 44 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 5: Total component classifications: 21 rejected, 31 unclassified 2026-03-24T10:21:57 selection_nodes.calc_kappa_elbow INFO Step 6: calc_kappa_elbow: Calc Kappa Elbow 2026-03-24T10:21:57 selection_utils.kappa_elbow_kundu INFO Calculating kappa elbow based on min of all and nonsig components. 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 6: calc_kappa_elbow calculated: kappa_elbow_kundu=21.499644837775808, kappa_allcomps_elbow=47.46713810122217, kappa_nonsig_elbow=21.499644837775808, varex_upper_p=0.49483350417742067 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 6: Total component classifications: 21 rejected, 31 unclassified 2026-03-24T10:21:57 selection_nodes.dec_reclassify_high_var_comps INFO Step 7: reclassify_high_var_comps: Change unclassified to unclass_highvar for the top couple of components with the highest jumps in variance 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 7: reclassify_high_var_comps applied to 31 components. 4 True -> unclass_highvar. 27 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 7: Total component classifications: 21 rejected, 4 unclass_highvar, 27 unclassified 2026-03-24T10:21:57 selection_nodes.calc_rho_elbow INFO Step 8: calc_rho_elbow: Calc Rho Elbow 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 8: calc_rho_elbow calculated: rho_elbow_kundu=15.292500408335833, rho_allcomps_elbow=20.967094794758808, rho_unclassified_elbow=14.78244194423477, elbow_f05=10.127964486013925 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 8: Total component classifications: 21 rejected, 4 unclass_highvar, 27 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 9: left_op_right: provisionalaccept if kappa>=21.5, else nochange 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 9: left_op_right applied to 27 components. 20 True -> provisionalaccept. 7 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 9: Total component classifications: 20 provisionalaccept, 21 rejected, 4 unclass_highvar, 7 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 10: left_op_right: unclassified if rho>15.29, else nochange 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 10: left_op_right applied to 20 components. 7 True -> unclassified. 13 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 10: Total component classifications: 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 14 unclassified 2026-03-24T10:21:57 selection_nodes.dec_classification_doesnt_exist INFO Step 11: classification_doesnt_exist: Change ['provisionalaccept', 'unclassified', 'unclass_highvar'] to accepted if less than 2 components with provisionalaccept exist 2026-03-24T10:21:57 selection_nodes.dec_classification_doesnt_exist INFO Step 11: classification_doesnt_exist If nothing is provisionally accepted by this point, then rerun ICA & selection. If max iterations of rerunning done, then accept everything not already rejected 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 11: classification_doesnt_exist applied to 31 components. None True -> 0. None False -> 31. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 11: Total component classifications: 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 14 unclassified 2026-03-24T10:21:57 selection_nodes.calc_varex_thresh INFO Step 12: calc_varex_thresh: Calc varex_upper_thresh, 90th percentile threshold 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 12: calc_varex_thresh calculated: varex_upper_thresh=1.3424585233384667, upper_perc=90 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 12: Total component classifications: 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 14 unclassified 2026-03-24T10:21:57 selection_nodes.calc_varex_thresh INFO Step 13: calc_varex_thresh: Calc varex_lower_thresh, 25th percentile threshold 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 13: calc_varex_thresh calculated: varex_lower_thresh=0.34061682866596205, lower_perc=25 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 13: Total component classifications: 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 14 unclassified 2026-03-24T10:21:57 selection_utils.get_extend_factor INFO extend_factor=2.0, based on number of fMRI volumes 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 14: calc_extend_factor calculated: extend_factor=2.0 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 14: Total component classifications: 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 14 unclassified 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 15: calc_max_good_meanmetricrank calculated: max_good_meanmetricrank=26.0 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 15: Total component classifications: 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 14 unclassified 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 16: calc_varex_kappa_ratio calculated: kappa_rate=63.44355542022591 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 16: Total component classifications: 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 14 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 17: left_op_right: rejected if ['d_table_score>26.0 & variance explained>2.0*1.34'], else nochange 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 17: left_op_right If variance and d_table_scores are high, then reject 2026-03-24T10:21:57 selection_utils.comptable_classification_changer INFO Step 17: No components fit criterion True to change classification 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 17: left_op_right applied to 31 components. 0 True -> rejected. 31 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 17: Total component classifications: 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 14 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 18: left_op_right: accepted if ['d_table_score>26.0 & variance explained<=0.34 & kappa<=21.5'], else nochange 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 18: left_op_right If low variance, accept even if bad kappa & d_table_scores 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 18: left_op_right applied to 31 components. 4 True -> accepted. 27 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 18: Total component classifications: 4 accepted, 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 10 unclassified 2026-03-24T10:21:57 selection_nodes.dec_classification_doesnt_exist INFO Step 19: classification_doesnt_exist: Change ['provisionalaccept', 'unclassified', 'unclass_highvar'] to accepted if ['unclassified', 'unclass_highvar'] doesn't exist 2026-03-24T10:21:57 selection_nodes.dec_classification_doesnt_exist INFO Step 19: classification_doesnt_exist If nothing left is unclassified, then accept all 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 19: classification_doesnt_exist applied to 27 components. None True -> 0. None False -> 27. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 19: Total component classifications: 4 accepted, 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 10 unclassified 2026-03-24T10:21:57 selection_nodes.calc_revised_meanmetricrank_guesses INFO Step 20: calc_revised_meanmetricrank_guesses: Calc revised d_table_score & num accepted component guesses 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 20: calc_revised_meanmetricrank_guesses calculated: num_acc_guess=18, conservative_guess=9.0, restrict_factor=2 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 20: Total component classifications: 4 accepted, 13 provisionalaccept, 21 rejected, 4 unclass_highvar, 10 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 21: left_op_right: rejected if ['d_table_score_node20>9.0 & varex kappa ratio>2*2.0 & variance explained>2.0*1.34'], else nochange 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 21: left_op_right Reject if a combination of kappa, variance, and other factors are ranked worse than others 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 21: left_op_right applied to 27 components. 3 True -> rejected. 24 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 21: Total component classifications: 4 accepted, 13 provisionalaccept, 24 rejected, 1 unclass_highvar, 10 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 22: left_op_right: rejected if ['d_table_score_node20>0.9*18 & variance explained>2.0*0.34'], else nochange 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 22: left_op_right Reject if a combination of variance and ranks of other metrics are worse than others 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 22: left_op_right applied to 24 components. 8 True -> rejected. 16 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 22: Total component classifications: 4 accepted, 10 provisionalaccept, 32 rejected, 1 unclass_highvar, 5 unclassified 2026-03-24T10:21:57 selection_nodes.calc_varex_thresh INFO Step 23: calc_varex_thresh: Calc varex_new_lower_thresh, 25th percentile threshold 2026-03-24T10:21:57 selection_nodes.calc_varex_thresh INFO Step 23: calc_varex_thresh: num_highest_var_comps (18) > len(comps2use) (16). Setting to equal len(comps2use) since selection should not use more components than exist 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 23: calc_varex_thresh calculated: varex_new_lower_thresh=0.38200551966832574, new_lower_perc=25 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 23: Total component classifications: 4 accepted, 10 provisionalaccept, 32 rejected, 1 unclass_highvar, 5 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 24: left_op_right: accepted if ['d_table_score_node20>18 & variance explained>0.38'], else nochange 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 24: left_op_right Accept components with a bad d_table_score, but are at the higher end of the remaining variance so more cautious to not remove 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 24: left_op_right applied to 16 components. 2 True -> accepted. 14 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 24: Total component classifications: 6 accepted, 10 provisionalaccept, 32 rejected, 1 unclass_highvar, 3 unclassified 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 25: left_op_right: accepted if ['kappa<=21.5 & variance explained>0.38'], else nochange 2026-03-24T10:21:57 selection_nodes.dec_left_op_right INFO Step 25: left_op_right For not already rejected components, accept ones below the kappa elbow, but at the higher end of the remaining variance so more cautious to not remove 2026-03-24T10:21:57 selection_utils.comptable_classification_changer INFO Step 25: No components fit criterion True to change classification 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 25: left_op_right applied to 14 components. 0 True -> accepted. 14 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 25: Total component classifications: 6 accepted, 10 provisionalaccept, 32 rejected, 1 unclass_highvar, 3 unclassified 2026-03-24T10:21:57 selection_nodes.manual_classify INFO Step 26: manual_classify: Set ['provisionalaccept', 'unclassified', 'unclass_highvar'] to accepted 2026-03-24T10:21:57 selection_nodes.manual_classify INFO Step 26: manual_classify Anything still provisional (accepted or rejected) or unclassified should be accepted 2026-03-24T10:21:57 selection_utils.log_decision_tree_step INFO Step 26: manual_classify applied to 14 components. 14 True -> accepted. 0 False -> nochange. 2026-03-24T10:21:57 selection_utils.log_classification_counts INFO Step 26: Total component classifications: 20 accepted, 32 rejected