Пример #1
0
void CAgpCompSpanSplitter::SaveRow(const string& s, CRef<CAgpRow> row, TRangeColl* runs_of_Ns)
{
  if( row ) {
    comp_or_gap_printed=true;
    if(object_name != row->GetObject() ) {
      object_name = row->GetObject();
      part_number = 1; // row->GetPartNumber();
    }
    CRef<CAgpRow> tmp_row( row->Clone() );

    if(runs_of_Ns && runs_of_Ns->size()) {

      if( row->GetVersion() == eAgpVersion_auto ) {
        cerr << "FATAL: need AGP version (for adding gap lines). Please use -v 1.1 or -v 2.0\n";
        exit(1);
      }
      /*
      CAgpRow tmp_gap_row = *row; // to retain the object name
      tmp_gap_row.GetComponentType() = "N";
      tmp_gap_row.is_gap   = true;
      tmp_gap_row.linkage  = true;
      tmp_gap_row.gap_type = row->GetVersion() == eAgpVersion_1_1 ? CAgpRow::eGapFragment : CAgpRow::eGapScaffold;
      tmp_gap_row.linkage_evidence_flags = CAgpRow::fLinkageEvidence_unspecified;'
      */
      CRef<CAgpRow> tmp_gap_row( CAgpRow::New(NULL, row->GetVersion(), NULL) );
      tmp_gap_row->FromString(
        row->GetObject()+
        "\t1\t100\t1\tN\t100\t"+
        string(row->GetVersion() == eAgpVersion_1_1 ? "fragment\tyes\t" : "scaffold\tyes\tunspecified")
      );

      int comp2obj_ofs = row->object_beg - row->component_beg;

      for(TRangeColl::const_iterator it = runs_of_Ns->begin(); it != runs_of_Ns->end(); ++it) {
        if( (TSeqPos) tmp_row->component_beg < it->GetFrom() ) {
          // component line
          tmp_row->component_end = it->GetFrom()-1;
          tmp_row->object_end    = comp2obj_ofs + tmp_row->component_end;

          tmp_row->part_number = part_number;
          (*m_out) << tmp_row->ToString() << endl;
          part_number++;
        }

        // gap line
        tmp_gap_row->object_beg = comp2obj_ofs + it->GetFrom();
        tmp_gap_row->object_end = comp2obj_ofs + it->GetTo();
        tmp_gap_row->gap_length = it->GetTo() - it->GetFrom() + 1;

        tmp_gap_row->part_number = part_number;
        (*m_out) << tmp_gap_row->ToString(true) << endl; // true: use linkage_evidence_flags
        part_number++;

        tmp_row->component_beg = it->GetTo() + 1;
        tmp_row->object_beg    = comp2obj_ofs + tmp_row->component_beg;
      }

      if(tmp_row->component_beg <= row->component_end) {
        // this component does not end with Ns => need to print the final component span
        tmp_row->component_end = row->component_end;
        tmp_row->object_end    = row->object_end;
      }
      else return; // ends with Ns => skip printing the component row below
    }

    tmp_row->part_number = part_number;
    (*m_out) << tmp_row->ToString() << endl;
    part_number++;
  }
  else if(!comp_or_gap_printed){
    // comment line (only at the head of file, to comply with AGP 2.0)
    (*m_out) << s << endl;
  }
}