| 
0
 | 
     1 function x_tr_mz2=mz_6_rescan_mz2(x_tr_mz,thresh)
 | 
| 
 | 
     2     
 | 
| 
 | 
     3     // 12juin19: cette fonction marche très bien!!
 | 
| 
 | 
     4     // mais on essaie de l'améliorer avec mz_6_rescan3
 | 
| 
 | 
     5     
 | 
| 
 | 
     6     // cette fonction réalise des boucles sur la matrice EIC, en regroupant les EIC qui se rapprochent
 | 
| 
 | 
     7     // stop quand sur 3 boucles successives on n'a pas regroupé plus de 5 EICs chaque fois 
 | 
| 
 | 
     8     // stop aussi quand on ne regroupe aucune EIC dans une boucle 
 | 
| 
 | 
     9 
 | 
| 
 | 
    10     // thresh: des valeurs testées, pour chercher la valeur optimale 
 | 
| 
 | 
    11     // ex: thresh=0.001
 | 
| 
 | 
    12     
 | 
| 
 | 
    13     // normalement, cette fonction tourne rapidement, ~5 minutes 30jan20
 | 
| 
 | 
    14         
 | 
| 
 | 
    15     if argn(2)<3 then
 | 
| 
 | 
    16         coeff_thresh=1;
 | 
| 
 | 
    17     end;
 | 
| 
 | 
    18     
 | 
| 
 | 
    19     flag=0;
 | 
| 
 | 
    20 
 | 
| 
 | 
    21     // verif qu'on a bien un div
 | 
| 
 | 
    22     if size(x_tr_mz.d,1)~=size(x_tr_mz.i,1) | size(x_tr_mz.d,2)~=size(x_tr_mz.v,1) then 
 | 
| 
 | 
    23         error('not a  div, mz_6_rescan_mz2')
 | 
| 
 | 
    24     end;
 | 
| 
 | 
    25 
 | 
| 
 | 
    26 
 | 
| 
 | 
    27     n_tr=size(x_tr_mz.i,1);
 | 
| 
 | 
    28     
 | 
| 
 | 
    29     // verif. que les m/z de x_tr_mz sont ordonnes 
 | 
| 
 | 
    30     x_tr_mz_v=strtod(x_tr_mz.v); 
 | 
| 
 | 
    31     diff_i=x_tr_mz_v(2:$)-x_tr_mz_v(1:$-1); // verif. que les m/z sont en ordre croissant
 | 
| 
 | 
    32     index=find(diff_i<0);
 | 
| 
 | 
    33     if max(size(index))>0 then              // pas ordonné -> il faut le faire 
 | 
| 
 | 
    34         [nul,tri0]=gsort(x_tr_mz_v,'g','i');
 | 
| 
 | 
    35         x_tr_mz=x_tr_mz(:,tri0);
 | 
| 
 | 
    36         x_tr_mz_v=x_tr_mz_v(tri0);
 | 
| 
 | 
    37     end;
 | 
| 
 | 
    38 
 | 
| 
 | 
    39 
 | 
| 
 | 
    40      while flag<2;    // enleve inferieur 31jan20
 | 
| 
 | 
    41         
 | 
| 
 | 
    42 
 | 
| 
 | 
    43         clear x_tr_mz2;
 | 
| 
 | 
    44 
 | 
| 
 | 
    45         flag=2*flag;
 | 
| 
 | 
    46         
 | 
| 
 | 
    47         x_tr_mz_v=strtod(x_tr_mz.v);                    
 | 
| 
 | 
    48         x_sum=sum(x_tr_mz.d,'r')';
 | 
| 
 | 
    49         n1=max(size(x_tr_mz.d,2));        
 | 
| 
 | 
    50 
 | 
| 
 | 
    51 //disp('index2')
 | 
| 
 | 
    52 
 | 
| 
 | 
    53         for i=2:n1;
 | 
| 
 | 
    54             if x_tr_mz_v(i)-x_tr_mz_v(i-1)<thresh then                                                    // avant le 27mai 17h30: <=1.01
 | 
| 
 | 
    55                 x_tr_mz_v(i-1)=x_tr_mz_v(i-1:i)'*x_sum(i-1:i) / (x_sum(i-1:i)'*ones(2,1));     // on repositionne la 1° valeur de m/z
 | 
| 
 | 
    56                 x_tr_mz_v(i)=0;                                                                // et on annule la 2° valeur de m/z
 | 
| 
 | 
    57                 x_tr_mz.d(:,i-1)=x_tr_mz.d(:,i-1)+x_tr_mz.d(:,i);                              // somme des signaux
 | 
| 
 | 
    58             end; 
 | 
| 
 | 
    59         end;
 | 
| 
 | 
    60         
 | 
| 
 | 
    61         x_tr_mz.v=string(x_tr_mz_v);           // on remet les nlles valeurs de m/z dans x_tr_mz 
 | 
| 
 | 
    62 
 | 
| 
 | 
    63 
 | 
| 
 | 
    64 //disp('index3')
 | 
| 
 | 
    65 
 | 
| 
 | 
    66         // tri
 | 
| 
 | 
    67         tri=find(x_tr_mz_v~=0);
 | 
| 
 | 
    68 
 | 
| 
 | 
    69         // ligne suivante gardée: car elle ne prend que qq secondes avec x_tr_mz=3000x140000 30jan20
 | 
| 
 | 
    70         x_tr_mz2=x_tr_mz(:,tri);
 | 
| 
 | 
    71 
 | 
| 
 | 
    72   
 | 
| 
 | 
    73 //disp('index4')
 | 
| 
 | 
    74 
 | 
| 
 | 
    75    
 | 
| 
 | 
    76         // verification des dimensions div 
 | 
| 
 | 
    77         if size(x_tr_mz2.d,1)~=size(x_tr_mz2.i,1) | size(x_tr_mz2.d,2)~=size(x_tr_mz2.v,1) then
 | 
| 
 | 
    78              disp('error in dimensions, mz_6_rescan_mz2')
 | 
| 
 | 
    79         end;
 | 
| 
 | 
    80 
 | 
| 
 | 
    81 //disp('index5')
 | 
| 
 | 
    82 
 | 
| 
 | 
    83 
 | 
| 
 | 
    84         n2=size(x_tr_mz2.d,2);
 | 
| 
 | 
    85         
 | 
| 
 | 
    86         x_tr_mz=x_tr_mz2;
 | 
| 
 | 
    87         
 | 
| 
 | 
    88         if flag <= 2 then                                                       // la boucle peut continuer
 | 
| 
 | 
    89             if abs(n1-n2)<=5 then
 | 
| 
 | 
    90                 if n1==n2 then   
 | 
| 
 | 
    91                     flag=2;                                                    // stop immédiat -> sortie de la fonction
 | 
| 
 | 
    92                 else
 | 
| 
 | 
    93                     flag=1;                                                    // pour bloquer à la boucle suivante
 | 
| 
 | 
    94                 end
 | 
| 
 | 
    95             end
 | 
| 
 | 
    96         end
 | 
| 
 | 
    97        
 | 
| 
 | 
    98     end
 | 
| 
 | 
    99 
 | 
| 
 | 
   100     
 | 
| 
 | 
   101     
 | 
| 
 | 
   102 endfunction
 |