agp_read.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: agp_read.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 19:46:12  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: agp_read.cpp,v 1000.1 2004/06/01 19:46:12 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors: Josh Cherry
  35.  *
  36.  * File Description:  Read agp file
  37.  */
  38. #include <ncbi_pch.hpp>
  39. #include <objtools/readers/agp_read.hpp>
  40. #include <objtools/readers/reader_exception.hpp>
  41. #include <objects/seqloc/Seq_interval.hpp>
  42. #include <objects/seqloc/Seq_loc.hpp>
  43. #include <objects/seqset/Seq_entry.hpp>
  44. #include <objects/seq/Delta_seq.hpp>
  45. #include <objects/seq/Seq_inst.hpp>
  46. #include <objects/seq/Seq_literal.hpp>
  47. #include <objects/seq/Seq_ext.hpp>
  48. #include <objects/seq/Delta_ext.hpp>
  49. BEGIN_NCBI_SCOPE
  50. USING_SCOPE(objects);
  51. CRef<CBioseq_set> AgpRead(CNcbiIstream& is)
  52. {
  53.     vector<CRef<CSeq_entry> > entries;
  54.     AgpRead(is, entries);
  55.     CRef<CBioseq_set> bioseq_set(new CBioseq_set);
  56.     ITERATE (vector<CRef<CSeq_entry> >, iter, entries) {
  57.         bioseq_set->SetSeq_set().push_back(*iter);
  58.     }
  59.     return bioseq_set;
  60. }
  61. void AgpRead(CNcbiIstream& is, vector<CRef<CSeq_entry> >& entries)
  62. {
  63.     vector<CRef<CBioseq> > bioseqs;
  64.     AgpRead(is, bioseqs);
  65.     NON_CONST_ITERATE (vector<CRef<CBioseq> >, bioseq, bioseqs) {
  66.         CRef<CSeq_entry> entry(new CSeq_entry);
  67.         entry->SetSeq(**bioseq);
  68.         entries.push_back(entry);
  69.     }
  70. }
  71. void AgpRead(CNcbiIstream& is, vector<CRef<CBioseq> >& bioseqs)
  72. {
  73.     string line;
  74.     vector<string> fields;
  75.     string current_object;
  76.     CRef<CBioseq> bioseq;
  77.     CRef<CSeq_inst> seq_inst;
  78.     int last_to;
  79.     int part_num, last_part_num;
  80.     TSeqPos length;
  81.     int line_num = 0;
  82.     while (NcbiGetlineEOL(is, line)) {
  83.         line_num++;
  84.         if (line[0] == '#') {
  85.             // comment line; skip
  86.             continue;
  87.         }
  88.         if (line.find_first_not_of(" tnr") == string::npos) {
  89.             // skip lines containing only white space
  90.             continue;
  91.         }
  92.         fields.clear();
  93.         NStr::Tokenize(line, "t", fields);
  94.         // Number of fields can be 9 or 8, but 8 is valid
  95.         // only if field[4] == "N".
  96.         if (fields.size() != 9) {
  97.             if (fields.size() >= 5 && fields[4] != "N") {
  98.                 NCBI_THROW2(CObjReaderParseException, eFormat,
  99.                             string("error at line ") + 
  100.                             NStr::IntToString(line_num) + ": found " +
  101.                             NStr::IntToString(fields.size()) +
  102.                             " columns; there should be 9",
  103.                             is.tellg() - CT_POS_TYPE(0));
  104.             } else if (fields.size() != 8) {
  105.                 NCBI_THROW2(CObjReaderParseException, eFormat,
  106.                             string("error at line ") + 
  107.                             NStr::IntToString(line_num) + ": found " +
  108.                             NStr::IntToString(fields.size()) +
  109.                             " columns; there should be 8 or 9",
  110.                             is.tellg() - CT_POS_TYPE(0));
  111.             }
  112.         }
  113.         if (fields[0] != current_object || !bioseq) {
  114.             // close out old one, start a new one
  115.             if (bioseq) {
  116.                 seq_inst->SetLength(length);
  117.                 bioseq->SetInst(*seq_inst);
  118.                 bioseqs.push_back(bioseq);
  119.             }
  120.             current_object = fields[0];
  121.             seq_inst.Reset(new CSeq_inst);
  122.             seq_inst->SetRepr(CSeq_inst::eRepr_delta);
  123.             seq_inst->SetMol(CSeq_inst::eMol_dna);
  124.             bioseq.Reset(new CBioseq);
  125.             CRef<CSeq_id> id(new CSeq_id(CSeq_id::e_Local,
  126.                                          current_object, current_object));
  127.             bioseq->SetId().push_back(id);
  128.             last_to = 0;
  129.             last_part_num = 0;
  130.             length = 0;
  131.         }
  132.         // validity checks
  133.         part_num = NStr::StringToInt(fields[3]);
  134.         if (part_num != last_part_num + 1) {
  135.             NCBI_THROW2(CObjReaderParseException, eFormat,
  136.                         string("error at line ") + 
  137.                         NStr::IntToString(line_num) +
  138.                         ": part number out of order",
  139.                         is.tellg() - CT_POS_TYPE(0));
  140.         }
  141.         last_part_num = part_num;
  142.         if (NStr::StringToInt(fields[1]) != last_to + 1) {
  143.             NCBI_THROW2(CObjReaderParseException, eFormat,
  144.                         string("error at line ") + 
  145.                          NStr::IntToString(line_num) +
  146.                          ": begining not equal to previous end + 1",
  147.                          is.tellg() - CT_POS_TYPE(0));
  148.         }
  149.         last_to = NStr::StringToInt(fields[2]);
  150.         // build a Delta-seq, either a Seq-literal (for a gap) or a Seq-loc 
  151.         CRef<CDelta_seq> delta_seq(new CDelta_seq);
  152.         if (fields[4] == "N") {
  153.             // a gap
  154.             TSeqPos gap_len = NStr::StringToInt(fields[5]);
  155.             delta_seq->SetLiteral().SetLength(gap_len);
  156.             length += gap_len;
  157.         } else if (fields[4].size() == 1 && 
  158.                    fields[4].find_first_of("ADFGPOW") == 0) {
  159.             CSeq_loc& loc = delta_seq->SetLoc();
  160.             CRef<CSeq_id> comp_id(new CSeq_id(fields[5]));
  161.             loc.SetInt().SetId(*comp_id);
  162.             loc.SetInt().SetFrom(NStr::StringToInt(fields[6]) - 1);
  163.             loc.SetInt().SetTo  (NStr::StringToInt(fields[7]) - 1);
  164.             length += loc.GetInt().GetTo() - loc.GetInt().GetFrom() + 1;
  165.             if (fields[8] == "+") {
  166.                 loc.SetInt().SetStrand(eNa_strand_plus);
  167.             } else if (fields[8] == "-") {
  168.                 loc.SetInt().SetStrand(eNa_strand_minus);
  169.             } else if (fields[8] == "0") {
  170.                 loc.SetInt().SetStrand(eNa_strand_unknown);
  171.             } else if (fields[8] == "na") {
  172.                 loc.SetInt().SetStrand(eNa_strand_other);
  173.             } else {
  174.                 NCBI_THROW2(CObjReaderParseException, eFormat,
  175.                             string("error at line ") + 
  176.                             NStr::IntToString(line_num) + ": invalid "
  177.                             "orientation " + fields[8],
  178.                             is.tellg() - CT_POS_TYPE(0));
  179.             }
  180.         } else {
  181.             NCBI_THROW2(CObjReaderParseException, eFormat,
  182.                         string("error at line ") + 
  183.                         NStr::IntToString(line_num) + ": invalid "
  184.                         "component type " + fields[4],
  185.                         is.tellg() - CT_POS_TYPE(0));
  186.         }
  187.         seq_inst->SetExt().SetDelta().Set().push_back(delta_seq);
  188.     }
  189.     // deal with the last one
  190.     if (bioseq) {
  191.         seq_inst->SetLength(length);
  192.         bioseq->SetInst(*seq_inst);
  193.         bioseqs.push_back(bioseq);
  194.     }
  195. }
  196. END_NCBI_SCOPE
  197. /*
  198.  * =====================================================================
  199.  * $Log: agp_read.cpp,v $
  200.  * Revision 1000.1  2004/06/01 19:46:12  gouriano
  201.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.6
  202.  *
  203.  * Revision 1.6  2004/05/25 20:49:58  jcherry
  204.  * Let the last column of an "N" line be missing, not just empty
  205.  *
  206.  * Revision 1.5  2004/05/21 21:42:55  gorelenk
  207.  * Added PCH ncbi_pch.hpp
  208.  *
  209.  * Revision 1.4  2004/02/19 22:57:52  ucko
  210.  * Accommodate stricter implementations of CT_POS_TYPE.
  211.  *
  212.  * Revision 1.3  2004/01/05 23:01:37  jcherry
  213.  * Support unknown ("0") or irrelevant ("na") strand designation
  214.  *
  215.  * Revision 1.2  2003/12/08 23:39:20  jcherry
  216.  * Set length of Seq-inst
  217.  *
  218.  * Revision 1.1  2003/12/08 15:49:32  jcherry
  219.  * Initial version
  220.  *
  221.  * =====================================================================
  222.  */