@@ -85,8 +85,8 @@ def add_psm(self, delta_score: float, is_decoy: bool) -> None:
8585
8686 def prep_arrays (self ) -> None :
8787 """Prepare arrays"""
88- self .pos = np .array (self .real_psms )
89- self .neg = np .array (self .decoy_psms )
88+ self .pos = np .array (sorted ( self .real_psms )) # Sort delta_scores for minorization
89+ self .neg = np .array (sorted ( self .decoy_psms )) # Sort delta_scores for minorization
9090 self .n_real = len (self .pos )
9191 self .n_decoy = len (self .neg )
9292
@@ -466,12 +466,24 @@ def perform_minorization(self) -> None:
466466 if n == 0 :
467467 continue
468468
469- # Fill data (vectorized )
469+ # Fill data and sort by delta_score (critical for minorization algorithm )
470470 pairs = [minor_map [i ] for i in range (n )]
471- x = np .array ([p [0 ] for p in pairs ]) # delta scores
472- f = np .array ([p [1 ] for p in pairs ]) # FDR values
471+
472+ # Sort pairs by delta_score (first element)
473+ pairs_sorted = sorted (pairs , key = lambda p : p [0 ])
474+
475+ x = np .array ([p [0 ] for p in pairs_sorted ]) # delta scores (now sorted)
476+ f = np .array ([p [1 ] for p in pairs_sorted ]) # FDR values
473477 is_minor_point = np .zeros (n , dtype = bool )
474478
479+ # Validate that data is sorted (should always be true now)
480+ is_sorted = all (x [i ] <= x [i + 1 ] for i in range (len (x )- 1 ))
481+ if not is_sorted :
482+ logger .info (f"[ERROR] { iter_type } FDR data is NOT sorted! Minorization will fail!" )
483+ logger .info (f"First 10 delta scores: { x [:10 ]} " )
484+ else :
485+ logger .info (f"[OK] { iter_type } FDR data is properly sorted" )
486+
475487 # Find minimum value and its index (vectorized)
476488 min_idx = np .argmin (f )
477489 min_val = f [min_idx ]
0 commit comments