ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/gclib/gclib/GFastaFile.h
(Generate patch)
# Line 1 | Line 1
1   #ifndef GFASTAFILE_H
2   #define GFASTAFILE_H
3 < #include <stdio.h>
4 < #include "gdna.h"
3 >
4 > #include "GBase.h"
5 > //#include "gdna.h" -- for the reverseComplement() method
6  
7   #define CAPINC 64
8   #define SEQCAPINC 256
# Line 20 | Line 21
21       int   len; /* the actual string length of seq */
22       char* seq; /* the sequence buffer itself */
23       //----
24 <     FastaSeq(char* cname, char* cdescr=NULL, char* cseq=NULL) {
25 <       //ntCompTableInit();
24 >     void init(char* cname, char* cdescr=NULL,
25 >                char* cseq=NULL, int sbeg=-1, int send=-1) {
26 >                //Warning: sbeg and send are 0-based!
27 >       int l=0;
28         if (cname==NULL) {
29 <          FastaSeq();
30 <          return;
31 <          }
32 <       int l=strlen(cname);
33 <       GMALLOC(id, l+1);strcpy(id,cname);
34 <       id_cap=l+1;
35 <       namelen=l;
29 >         GMALLOC(id, CAPINC);
30 >         id_cap=CAPINC;
31 >         namelen=0;
32 >         id[0]='\0';
33 >         GMALLOC(descr, CAPINC);
34 >         }
35 >        else {
36 >         l=strlen(cname);
37 >         GMALLOC(id, l+1);strcpy(id,cname);
38 >         id_cap=l+1;
39 >         namelen=l;
40 >         }
41         if (cdescr==NULL) {
42             GMALLOC(descr, CAPINC);
43             descr[0]='\0';
# Line 49 | Line 57
57             len=0;
58             s_cap=SEQCAPINC;
59             }
60 <         else {
61 <           l=strlen(cseq);
62 <           GMALLOC(seq, l+1);
63 <           strcpy(seq,cseq);
64 <           len=l;
65 <           s_cap=l+1;
60 >         else { //sequence given
61 >           if (sbeg>=0) { //sequence range given
62 >              if (send<0) send=strlen(cseq)-1;
63 >              len=send-sbeg+1;
64 >              if (len>0) {
65 >                  s_cap=len+1;
66 >                  GMALLOC(seq, s_cap);
67 >                  strncpy(seq, cseq+sbeg, len);
68 >                  seq[len]=0;
69 >                  }
70 >                 else { //null range
71 >                  GMALLOC(seq, SEQCAPINC);
72 >                  seq[0]='\0';
73 >                  len=0;
74 >                  s_cap=SEQCAPINC;
75 >                  }
76 >              }
77 >            else {// copy whole cseq
78 >              l=strlen(cseq);
79 >              GMALLOC(seq, l+1);
80 >              strcpy(seq,cseq);
81 >              len=l;
82 >              s_cap=l+1;
83 >              }
84             }
85 <       }
85 >      } //init(alldata, range)
86 >      
87       void init(int seqalloc=0) {
88         //ntCompTableInit();
89         GMALLOC(id, CAPINC);
# Line 78 | Line 105
105         seq[0]='\0';
106         len=0;
107         }
108 +     FastaSeq(char* cname, char* cdescr=NULL, char* cseq=NULL) {
109 +       init(cname, cdescr, cseq);
110 +       }
111       FastaSeq(int seqalloc=0) {
112         init(seqalloc);
113         }
114 +    
115 +     //copy constructor:
116 +     FastaSeq(const FastaSeq& fa,int sbeg=-1,int send=-1) {
117 +       if (sbeg<0) { sbeg=0; send=fa.len-1; }
118 +             else if (send<0) send=fa.len-1;
119 +       if (send>fa.len-1) send=fa.len-1;
120 +       init(fa.id, fa.descr, fa.seq, sbeg, send);
121 +       }
122 +      
123       void clear() {
124         GFREE(id);id_cap=0;namelen=0;id=NULL;
125         GFREE(descr);d_cap=0;descrlen=0;descr=NULL;
# Line 164 | Line 203
203         descrlen=0;descr[0]=0;
204         len=0;seq[0]=0;
205        }
206 +     /*
207       //reverse-complement a nucleotide sequence:
208 +     // -- requires gdna.h
209       void reverseComplement() {
210        if (len==0) return;
211        //ntCompTableInit();
212        reverseChars(seq,len);
213        for (int i=0;i<len;i++) seq[i]=ntComplement(seq[i]);
214       }
215 +     */
216    //printing fasta formatted sequence to a file stream
217    void fprint(FILE* fout, int line_len=60, bool defline=false) {
218         if (defline) {
# Line 188 | Line 230
230           }
231         }
232    //
233 <  static void write(FILE *fh, char* seqid, char* descr, char* seq,
234 <                                  const int linelen=60, const int seqlen=0) {
235 <      int i, idlen, ilen;
194 <      //char *s;
195 <      //s = (seqid == NULL) ? (char*)"ANONYMOUS" : seqid;
196 <      // write header line only if given!
197 <      idlen=(seqid==NULL)? 0 : strlen(seqid);
198 <      if (idlen>0) {
199 <        if (*seqid != '>') putc('>', fh);
200 <        fwrite(seqid, 1, idlen, fh);
201 <        i=(descr==NULL)? 0 : strlen(descr);
202 <        if (i>0) {
203 <          putc(' ',fh);
204 <          fwrite(descr, 1, i, fh);
205 <          }
206 <        putc('\n', fh);
207 <        }
208 <      if (linelen>0) { //fixed line length
209 <        int len = (seqlen>0) ? seqlen : strlen(seq);
210 <        ilen=0;
211 <        for (i=0; i < len; i++, ilen++) {
212 <                if (ilen == linelen) {
213 <                     putc('\n', fh);
214 <                     ilen = 0;
215 <                     }
216 <                putc(seq[i], fh);
217 <                } //for
218 <        putc('\n', fh);
219 <        }
220 <       else { //no line length limit
221 <         fprintf(fh, "\n%s\n", seq);
222 <         }
223 <      fflush(fh);
233 >  static void write(FILE *fh, const char* seqid, const char* descr, char* seq,
234 >                                  const int linelen=70, const int seqlen=0) {
235 >      writeFasta(fh, seqid, descr, seq, linelen, seqlen); //from GBase.cpp
236        }
237  
238  
# Line 298 | Line 310
310  
311     void reset() {
312      if (fh!=NULL && fh!=stdout && fh!=stdin) {
313 <       fseek(fh,0L, SEEK_SET);
313 >       fseeko(fh,0L, SEEK_SET);
314         cur_fpos=0;
315         rec_fpos=0;
316         }
# Line 307 | Line 319
319  
320     void seek(int pos) {
321      if (fh!=NULL && fh!=stdout && fh!=stdin) {
322 <      fseek(fh, pos, SEEK_SET);
322 >      fseeko(fh, pos, SEEK_SET);
323        cur_fpos=pos;
324        seqcoord=0; //seqcoord agnostic after a seek
325        }
# Line 565 | Line 577
577     void putFastaSeq(FastaSeq *fa, const int linelen=60) {
578        writeFasta(fh, fa->id, fa->descr, fa->seq, linelen);
579        }
580 <
580 > /*
581   static void writeFasta(FILE *fh, char* seqid, char* descr, char* seq, const int linelen=60, const int seqlen=0) {
582    FastaSeq::write(fh, seqid, descr, seq, linelen, seqlen);
583    }
584 <
584 > */
585   };
586  
587   // ------------- FASTA parser/handler ----

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines