|
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
|