~ubuntu-branches/ubuntu/wily/aegean/wily

« back to all changes in this revision

Viewing changes to src/core/AgnInferExonsVisitor.c

  • Committer: Package Import Robot
  • Author(s): Sascha Steinbiss
  • Date: 2015-07-28 08:50:09 UTC
  • mfrom: (1.1.1)
  • Revision ID: package-import@ubuntu.com-20150728085009-01xdgqvm3bgt00fy
Tags: 0.13.0+dfsg-1
New upstream release. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
  GtArray *exons;
31
31
  GtArray *introns;
32
32
  GtLogger *logger;
 
33
  GtStr *source;
33
34
};
34
35
 
35
36
 
43
44
static const GtNodeVisitorClass* infer_exons_visitor_class();
44
45
 
45
46
/**
 
47
 * @function Destructor.
 
48
 */
 
49
static void infer_exons_visitor_free(GtNodeVisitor *nv);
 
50
 
 
51
/**
46
52
 * @function Generate data for unit testing.
47
53
 */
48
54
static void infer_exons_visitor_test_data(GtQueue *queue);
83
89
// Method implementations
84
90
//----------------------------------------------------------------------------//
85
91
 
86
 
GtNodeStream* agn_infer_exons_stream_new(GtNodeStream *in, GtLogger *logger)
 
92
GtNodeStream* agn_infer_exons_stream_new(GtNodeStream *in, GtStr *source,
 
93
                                         GtLogger *logger)
87
94
{
88
95
  GtNodeVisitor *nv = agn_infer_exons_visitor_new(logger);
 
96
  if(source != NULL)
 
97
    agn_infer_exons_visitor_set_source((AgnInferExonsVisitor *)nv, source);
89
98
  GtNodeStream *ns = gt_visitor_stream_new(in, nv);
90
99
  return ns;
91
100
}
96
105
  nv = gt_node_visitor_create(infer_exons_visitor_class());
97
106
  AgnInferExonsVisitor *v = infer_exons_visitor_cast(nv);
98
107
  v->logger = logger;
 
108
  v->source = NULL;
99
109
  return nv;
100
110
}
101
111
 
 
112
void agn_infer_exons_visitor_set_source(AgnInferExonsVisitor *v, GtStr *source)
 
113
{
 
114
  agn_assert(v && source);
 
115
  if(v->source != NULL)
 
116
    gt_str_delete(v->source);
 
117
  v->source = gt_str_ref(source);
 
118
}
 
119
 
102
120
bool agn_infer_exons_visitor_unit_test(AgnUnitTest *test)
103
121
{
104
122
  GtQueue *queue = gt_queue_new();
173
191
  static const GtNodeVisitorClass *nvc = NULL;
174
192
  if(!nvc)
175
193
  {
176
 
    nvc = gt_node_visitor_class_new(sizeof (AgnInferExonsVisitor), NULL, NULL,
 
194
    nvc = gt_node_visitor_class_new(sizeof (AgnInferExonsVisitor),
 
195
                                    infer_exons_visitor_free, NULL,
177
196
                                    infer_exons_visitor_visit_feature_node,
178
197
                                    NULL, NULL, NULL);
179
198
  }
180
199
  return nvc;
181
200
}
182
201
 
 
202
static void infer_exons_visitor_free(GtNodeVisitor *nv)
 
203
{
 
204
  AgnInferExonsVisitor *v = infer_exons_visitor_cast(nv);
 
205
  if(v->source != NULL)
 
206
    gt_str_delete(v->source);
 
207
}
183
208
 
184
209
static void infer_exons_visitor_test_data(GtQueue *queue)
185
210
{
189
214
  gt_gff3_in_stream_check_id_attributes((GtGFF3InStream *)gff3in);
190
215
  gt_gff3_in_stream_enable_tidy_mode((GtGFF3InStream *)gff3in);
191
216
  GtLogger *logger = gt_logger_new(true, "", stderr);
192
 
  GtNodeStream *iev_stream = agn_infer_exons_stream_new(gff3in, logger);
 
217
  GtNodeStream *iev_stream = agn_infer_exons_stream_new(gff3in, NULL, logger);
193
218
  GtArray *feats = gt_array_new( sizeof(GtFeatureNode *) );
194
219
  GtNodeStream *arraystream = gt_array_out_stream_new(iev_stream, feats, error);
195
220
  int pullresult = gt_node_stream_pull(arraystream, error);
228
253
  {
229
254
    if(!agn_typecheck_gene(current) && !agn_typecheck_transcript(current))
230
255
      continue;
231
 
    
 
256
 
232
257
    GtUword i;
233
258
    v->gene = current;
234
259
 
389
414
        gt_feature_node_get_strand(*(GtFeatureNode **)firstcds)
390
415
      );
391
416
      GtFeatureNode *fn_exon = (GtFeatureNode *)exon;
 
417
      if(v->source)
 
418
        gt_feature_node_set_source(fn_exon, v->source);
392
419
      gt_feature_node_add_child(fn, fn_exon);
393
420
      if(mrnaid)
394
421
        gt_feature_node_add_attribute(fn_exon, "Parent", mrnaid);
440
467
      GtGenomeNode **exon2 = gt_array_get(exons, i);
441
468
      GtRange first_range  = gt_genome_node_get_range(*exon1);
442
469
      GtRange second_range = gt_genome_node_get_range(*exon2);
443
 
      
 
470
 
444
471
      if(first_range.end == second_range.start - 1)
445
472
      {
446
473
        gt_logger_log(v->logger, "mRNA '%s' (line %u) has directly adjacent "
453
480
        gt_array_add(introns_to_add, irange);
454
481
      }
455
482
    }
456
 
    
 
483
 
457
484
    for(i = 0; i < gt_array_size(introns_to_add); i++)
458
485
    {
459
486
      GtRange *irange = gt_array_get(introns_to_add, i);
470
497
        irange->end, gt_feature_node_get_strand(*(GtFeatureNode **)firstexon)
471
498
      );
472
499
      GtFeatureNode *fn_intron = (GtFeatureNode *)intron;
 
500
      if(v->source)
 
501
        gt_feature_node_set_source(fn_intron, v->source);
473
502
      gt_feature_node_add_child(fn, fn_intron);
474
503
      if(mrnaid)
475
504
        gt_feature_node_add_attribute(fn_intron, "Parent", mrnaid);