-
Notifications
You must be signed in to change notification settings - Fork 1
/
module_ORF.c
350 lines (208 loc) · 11.2 KB
/
module_ORF.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
#include "utils.h"
#include "module_ORF.h"
/* Le module ORF a pour objectif de trouver la séquence codante la plus longue
dans un fichier fasta que l'urilsateur aura choisi. En sortie, sera afficher
la taille de la séquence codante, sa position dans le fichier, ainsi le brin sur
lequel elle a été trouvé*/
void orf() {
printf("\nVous avez sélectionné : Rechercher la séquence codante la plus longue \n");
printf("Bienvenue dans le module de recherche de cadre ouvert de lecture.\n"
"Veuillez préciser un chemin d'accès vers un fichier au format fasta.\n"
"Y sera recherché le plus grand cadre ouvert de lecture depuis un codon\n"
"ATG vers un des trois codons STOP, dans les 6 cadres possibles offerts\n"
"par la séquence fournie.\n\n");
//on demande en entré le nom du fichier de l'utilisateur
char path_input[PATH_INPUT_MAX_SIZE];
int taille_sequence = 0;
get_path_user(path_input);
printf("\n");
//on détermine la taille du fichier fournis
taille(path_input, &taille_sequence);
char sequence[taille_sequence];
//on extrait les données du fichier dans une séquence
extract_sequence(path_input, sequence);
printf("Taille sequence input : %ld\n",strlen(sequence));
int i, k; // Compteurs
int boolean_stop;
// On stocke dans cette structure les informations
// de chaque ORF trouvé
typedef struct OpenReadingFrame {
int start;
int stop;
int length;
} OpenReadingFrame;
// On déclare un tableau de cette structure pour conserver les positions de tous les ORF trouvés
OpenReadingFrame ORF_trouves[1000] = {0};
// Garde en mémoire si l'ORF le plus long est sur le brin sens ou antisens
// A la fin du code, 0 voudra dire brin sens, 1 brin antisens
int sens_antisens = -1;
// Compteur permettant de parcourir ORF_trouves[]
int number_ORF = 0;
// Commpteur permettant de garder en mémoire l'indice de l'ORF le plus long
int longest_ORF;
// Recherche de l'ORF le plus long dans le brin sens
for ( i = 0; i < strlen(sequence); i++) { // On cherche de 1 en 1 dans sequence[]
if ( sequence[i] == 'A' && sequence[i+1] == 'T' && sequence[i+2] == 'G' ) { // La présence d'un codon START
ORF_trouves[number_ORF].start = i; // Si START, on indique sa position
boolean_stop = 0; // Permet de maintenir la boucle do while
k = i+3; // k représente ici la position du codon juste après START
do { // Recherche du codon stop dans le cadre de lecture du codon START trouvé
if ( sequence[k+2]) { // Si la séquence continue jusqu'à l'indice k+2 on continue de chercher, on évite les lectures hors bornes
if ( sequence[k] == 'T' && sequence[k+1] == 'G' && sequence[k+2] == 'A') { // Si un des codons STOP est trouvé
ORF_trouves[number_ORF].stop = k; // Si STOP on indique sa position
ORF_trouves[number_ORF].length = (ORF_trouves[number_ORF].stop) - ORF_trouves[number_ORF].start+3; // On caclule la longueur de l'ORF
// Si la longueur de l'ORF présentement trouvé est plus grande que la longueur du précédent
// On affecte à longest_ORF l'indice courant de number_ORF, pour garder sa position en mémoire
if ( ORF_trouves[number_ORF].length > ORF_trouves[number_ORF-1].length) {
longest_ORF = number_ORF;
sens_antisens = 0; // On indique également si il se situe sur le brin sens ou antisens
}
number_ORF += 1; // Si un STOP est trouvé, on passe au ORF_trouves[] suivant
boolean_stop = 1; // Puis on sort de la boucle WHILE en se servant du booleen
}
else if ( sequence[k] == 'T' && sequence[k+1] == 'A' && sequence[k+2] == 'G') { // Meme chose avec le second codon STOP
ORF_trouves[number_ORF].stop = k;
ORF_trouves[number_ORF].length = (ORF_trouves[number_ORF].stop) - ORF_trouves[number_ORF].start+3;
if ( ORF_trouves[number_ORF].length > ORF_trouves[number_ORF-1].length) {
longest_ORF = number_ORF;
sens_antisens = 0;
}
number_ORF += 1;
boolean_stop = 1;
}
else if ( sequence[k] == 'T' && sequence[k+1] == 'A' && sequence[k+2] == 'A') { // Meme chose avec le troisieme codon STOP
ORF_trouves[number_ORF].stop = k;
ORF_trouves[number_ORF].length = (ORF_trouves[number_ORF].stop) - ORF_trouves[number_ORF].start+3;
if ( ORF_trouves[number_ORF].length > ORF_trouves[number_ORF-1].length) {
longest_ORF = number_ORF;
sens_antisens = 0;
}
number_ORF += 1;
boolean_stop = 1;
}
k += 3; // k est incrémenté de 3 pour rester sur le cadre de lecture en cours
}
else {
// Si sequence[k+2] n'existe pas, on sort de la boucle while en laissant
// ORF_trouves[number_ORF].stop et ORF_trouves[number_ORF].length = 0
break;
}
} while ( boolean_stop == 0 ); // Tant qu'un codon n'a pas été trouvé, on parcourt sequence[]
}
}
if ( number_ORF == 0 ) {
sens_antisens = 1; // Si aucun ORF n'a été trouvé dans le brin sens, on passe la mémoire à 1
}
// Bloc de code où on complémente puis inverse la séquence pour 6 cadres lecture au total
// Brin complément
char complement[SIZE_MAX];
int complement_compteur = 0;
for ( i = 0; i < strlen(sequence); i++) {
if ( sequence[i] == 'A') {
complement[complement_compteur] = 'T';
complement_compteur++;
}
else if ( sequence[i] == 'T') {
complement[complement_compteur] = 'A';
complement_compteur++;
}
else if ( sequence[i] == 'G') {
complement[complement_compteur] = 'C';
complement_compteur++;
}
else if ( sequence[i] == 'C') {
complement[complement_compteur] = 'G';
complement_compteur++;
}
}
// Inversion du complément pour chercher l'ORF dans le bon
// sens de lecture du brin d'ADN complémentaire
int m;
int n = strlen(complement);
char currentChar;
for (m = 0; m<n/2; m++) {
currentChar = complement[m];
complement[m] = complement[n-m-1]; // -1 Car on ne veut pas bouger le \O
complement[n-m-1] = currentChar;
}
// Recherche de l'ORF la plus longue dans le reverse complement ( complement[] )
for ( i = 0; i < strlen(complement); i++) {
if ( complement[i] == 'A' && complement[i+1] == 'T' && complement[i+2] == 'G' ) {
ORF_trouves[number_ORF].start = i;
boolean_stop = 0;
k = i+3;
do { // Recherche du codon stop dans le cadre de lecture du codon START trouvé
if ( complement[k+2]) {
if ( complement[k] == 'T' && complement[k+1] == 'G' && complement[k+2] == 'A') {
ORF_trouves[number_ORF].stop = k;
ORF_trouves[number_ORF].length = (ORF_trouves[number_ORF].stop) - ORF_trouves[number_ORF].start+3;
if ( ORF_trouves[number_ORF].length > ORF_trouves[number_ORF-1].length) {
longest_ORF = number_ORF;
sens_antisens = 1;
}
number_ORF += 1;
boolean_stop = 1;
}
else if ( complement[k] == 'T' && complement[k+1] == 'A' && complement[k+2] == 'G') {
ORF_trouves[number_ORF].stop = k;
ORF_trouves[number_ORF].length = (ORF_trouves[number_ORF].stop) - ORF_trouves[number_ORF].start+3;
if ( ORF_trouves[number_ORF].length > ORF_trouves[number_ORF-1].length) {
longest_ORF = number_ORF;
sens_antisens = 1;
}
number_ORF += 1;
boolean_stop = 1;
}
else if ( complement[k] == 'T' && complement[k+1] == 'A' && complement[k+2] == 'A') {
ORF_trouves[number_ORF].stop = k;
ORF_trouves[number_ORF].length = (ORF_trouves[number_ORF].stop) - ORF_trouves[number_ORF].start+3;
if ( ORF_trouves[number_ORF].length > ORF_trouves[number_ORF-1].length) {
longest_ORF = number_ORF;
sens_antisens = 1;
}
number_ORF += 1;
boolean_stop = 1;
}
k += 3;
}
else {
break;
}
} while ( boolean_stop == 0 ); // Tant qu'un codon n'a pas été trouvé, on parcourt complement[]
}
}
if ( number_ORF == 0 ) {
sens_antisens = -1; // Si là encore aucun ORF n'a été trouvé, on repasse la mémoire à son état neutre de départ.
}
// Dernier bloc de code où on charge l'ORF la plus longue
// Dans une séquence qui sera utilisée pour obtenir le
// résultat sous forme de fichier
char orf_final[SIZE_MAX]; // On entre dans un CHAR l'ORF de plus longue taille
int compteur_final = 0;
char path_output[PATH_INPUT_MAX_SIZE];
if ( sens_antisens == 0 ) { // Si l'ORF est sur le brin sens on cherche dans sequence[]
for ( i = ORF_trouves[longest_ORF].start; i < ORF_trouves[longest_ORF].stop+3; i++) {
orf_final[compteur_final] = sequence[i];
compteur_final++;
}
printf("La longueur de l'ORF finale est : %ld\n",strlen(orf_final));
printf("\nL'ORF le plus long a été trouvé sur le brin sens, sa séquence va maintenant etre sauvegardee dans un fichier de sortie");
printf("\nVeuillez entrer le nom du fichier dans lequel s'écrira votre ORF trouvee\n");
scanf("%s",path_output);
save_sequence(path_output,orf_final);
}
else if ( sens_antisens == 1 ) { // Si l'ORF est sur le brin antisens on cherche dans complement[]
for ( i = ORF_trouves[longest_ORF].start; i < ORF_trouves[longest_ORF].stop+3; i++) {
orf_final[compteur_final] = complement[i];
compteur_final++;
}
printf("La longueur de l'ORF finale est : %ld\n",strlen(orf_final));
printf("\nL'ORF le plus long a été trouvé sur le brin antisens, sa séquence va maintenant etre sauvegardee dans un fichier de sortie");
printf("\nVeuillez entrer le nom du fichier dans lequel s'écrira votre ORF trouvee\n");
scanf("%s",path_output);
save_sequence(path_output,orf_final);
}
else if ( sens_antisens == -1) {
printf("\nAucun ORF n'a ete trouve, le programme va désormais s'arrêter.\n\n");
}
}