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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: test_validator.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:48:09  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.27
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: test_validator.cpp,v 1000.2 2004/06/01 19:48:09 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.  * Author:  Jonathan Kans, Clifford Clausen, Aaron Ucko
  35.  *
  36.  * File Description:
  37.  *   Test Program for validator
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbistd.hpp>
  42. #include <corelib/ncbistre.hpp>
  43. #include <corelib/ncbiapp.hpp>
  44. #include <corelib/ncbienv.hpp>
  45. #include <corelib/ncbiargs.hpp>
  46. #include <serial/serial.hpp>
  47. #include <serial/objistr.hpp>
  48. #include <serial/objectio.hpp>
  49. #include <connect/ncbi_core_cxx.hpp>
  50. #include <connect/ncbi_util.h>
  51. // Objects includes
  52. #include <objects/seq/Bioseq.hpp>
  53. #include <objects/seqloc/Seq_id.hpp>
  54. #include <objects/seqloc/Seq_loc.hpp>
  55. #include <objects/seqloc/Seq_interval.hpp>
  56. #include <objects/seq/Seq_inst.hpp>
  57. #include <objects/submit/Seq_submit.hpp>
  58. #include <objects/seqset/Seq_entry.hpp>
  59. #include <objtools/validator/validator.hpp>
  60. #include <objects/seqset/Bioseq_set.hpp>
  61. // Object Manager includes
  62. #include <objmgr/object_manager.hpp>
  63. #include <objmgr/scope.hpp>
  64. #include <objmgr/seq_vector.hpp>
  65. #include <objmgr/seq_descr_ci.hpp>
  66. #include <objmgr/feat_ci.hpp>
  67. #include <objmgr/align_ci.hpp>
  68. #include <objmgr/graph_ci.hpp>
  69. #include <objtools/data_loaders/genbank/gbloader.hpp>
  70. using namespace ncbi;
  71. using namespace objects;
  72. using namespace validator;
  73. /////////////////////////////////////////////////////////////////////////////
  74. //
  75. //  Demo application
  76. //
  77. class CTest_validatorApplication : public CNcbiApplication, CReadClassMemberHook
  78. {
  79. public:
  80.     CTest_validatorApplication(void);
  81.     virtual void Init(void);
  82.     virtual int  Run (void);
  83.     void ReadClassMember(CObjectIStream& in,
  84.         const CObjectInfo::CMemberIterator& member);
  85. private:
  86.     void Setup(const CArgs& args);
  87.     void SetupValidatorOptions(const CArgs& args);
  88.     CObjectIStream* OpenFile(const CArgs& args);
  89.     CConstRef<CValidError> ProcessSeqEntry(void);
  90.     CConstRef<CValidError> ProcessSeqSubmit(void);
  91.     CConstRef<CValidError> ProcessSeqAnnot(void);
  92.     void ProcessReleaseFile(const CArgs& args);
  93.     CRef<CSeq_entry> ReadSeqEntry(void);
  94.     SIZE_TYPE PrintValidError(CConstRef<CValidError> errors, 
  95.         const CArgs& args);
  96.     SIZE_TYPE PrintBatchErrors(CConstRef<CValidError> errors,
  97.         const CArgs& args);
  98.     void PrintValidErrItem(const CValidErrItem& item, CNcbiOstream& os);
  99.     void PrintBatchItem(const CValidErrItem& item, CNcbiOstream& os);
  100.     CRef<CObjectManager> m_ObjMgr;
  101.     auto_ptr<CObjectIStream> m_In;
  102.     unsigned int m_Options;
  103.     bool m_Continue;
  104.     size_t m_Level;
  105.     size_t m_Reported;
  106. };
  107. CTest_validatorApplication::CTest_validatorApplication(void) :
  108.     m_ObjMgr(0), m_In(0), m_Options(0), m_Continue(false), m_Level(0),
  109.     m_Reported(0)
  110. {
  111. }
  112. void CTest_validatorApplication::Init(void)
  113. {
  114.     // Prepare command line descriptions
  115.     // Create
  116.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  117.     arg_desc->AddDefaultKey
  118.         ("i", "ASNFile", "Seq-entry/Seq_submit ASN.1 text file",
  119.         CArgDescriptions::eInputFile, "current.prt");
  120.     arg_desc->AddFlag("s", "Input is Seq-submit");
  121.     arg_desc->AddFlag("t", "Input is Seq-set (NCBI Release file)");
  122.     arg_desc->AddFlag("b", "Input is in binary format");
  123.     arg_desc->AddFlag("c", "Continue on ASN.1 error");
  124.     arg_desc->AddFlag("g", "Registers ID loader");
  125.     arg_desc->AddFlag("nonascii", "Report Non Ascii Error");
  126.     arg_desc->AddFlag("context", "Suppress context in error msgs");
  127.     arg_desc->AddFlag("align", "Validate Alignments");
  128.     arg_desc->AddFlag("exon", "Validate exons");
  129.     arg_desc->AddFlag("splice", "Report splice error as error");
  130.     arg_desc->AddFlag("ovlpep", "Report overlapping peptide as error");
  131.     arg_desc->AddFlag("taxid", "Requires taxid");
  132.     arg_desc->AddFlag("isojta", "Requires ISO-JTA");
  133.     arg_desc->AddOptionalKey(
  134.         "x", "OutFile", "Output file for error messages",
  135.         CArgDescriptions::eOutputFile);
  136.     arg_desc->AddDefaultKey(
  137.         "q", "SevLevel", "Lowest severity error to show",
  138.         CArgDescriptions::eInteger, "1");
  139.     arg_desc->AddDefaultKey(
  140.         "r", "SevCount", "Severity error to count in return code",
  141.         CArgDescriptions::eInteger, "2");
  142.     CArgAllow* constraint = new CArgAllow_Integers(eDiagSevMin, eDiagSevMax);
  143.     arg_desc->SetConstraint("q", constraint);
  144.     arg_desc->SetConstraint("r", constraint);
  145.     // !!!
  146.     // { DEBUG
  147.     // This flag should be removed once testing is done. It is intended for
  148.     // performance testing.
  149.     arg_desc->AddFlag("debug", "Disable suspected performance bottlenecks");
  150.     // }
  151.     // Program description
  152.     string prog_description = "Test driver for Validate()n";
  153.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  154.         prog_description, false);
  155.     // Pass argument descriptions to the application
  156.     SetupArgDescriptions(arg_desc.release());
  157. }
  158. int CTest_validatorApplication::Run(void)
  159. {
  160.     const CArgs& args = GetArgs();
  161.     Setup(args);
  162.     // Open File 
  163.     m_In.reset(OpenFile(args));
  164.     // Process file based on its content
  165.     // Unless otherwise specifien we assume the file in hand is
  166.     // a Seq-entry ASN.1 file, other option are a Seq-submit or NCBI
  167.     // Release file (batch processing) where we process each Seq-entry
  168.     // at a time.
  169.     CConstRef<CValidError> eval;
  170.     if ( args["t"] ) {          // Release file
  171.         ProcessReleaseFile(args);
  172.         return 0;
  173.     } else {
  174.         string header = m_In->ReadFileHeader();
  175.         if ( args["s"]  &&  header != "Seq-submit" ) {
  176.             NCBI_THROW(CException, eUnknown,
  177.                 "Conflict: '-s' flag is specified but file is not Seq-submit");
  178.         } 
  179.         if ( args["s"]  ||  header == "Seq-submit" ) {  // Seq-submit
  180.             eval = ProcessSeqSubmit();
  181.         } else if ( header == "Seq-entry" ) {           // Seq-entry
  182.             eval = ProcessSeqEntry();
  183.         } else if ( header == "Seq-annot" ) {           // Seq-annot
  184.             eval = ProcessSeqAnnot();
  185.         } else {
  186.             NCBI_THROW(CException, eUnknown, "Unhandaled type " + header);
  187.         }
  188.     }
  189.     unsigned int result = 0;
  190.     if ( eval ) {
  191.         result = PrintValidError(eval, args);
  192.     }
  193.     return result;
  194. }
  195. void CTest_validatorApplication::ReadClassMember
  196. (CObjectIStream& in,
  197.  const CObjectInfo::CMemberIterator& member)
  198. {
  199.     m_Level++;
  200.     if ( m_Level == 1 ) {
  201.         // Read each element separately to a local TSeqEntry,
  202.         // process it somehow, and... not store it in the container.
  203.         for ( CIStreamContainerIterator i(in, member); i; ++i ) {
  204.             try {
  205.                 // Get seq-entry to validate
  206.                 CRef<CSeq_entry> se(new CSeq_entry);
  207.                 i >> *se;
  208.                 // Validate Seq-entry
  209.                 CValidator validator(*m_ObjMgr);
  210.                 CConstRef<CValidError> eval = validator.Validate(*se, 0, m_Options);
  211.                 if ( eval ) {
  212.                     m_Reported += PrintBatchErrors(eval, GetArgs());
  213.                 }
  214.             } catch (exception e) {
  215.                 if ( !m_Continue ) {
  216.                     throw;
  217.                 }
  218.                 // should we issue some sort of warning?
  219.             }
  220.         }
  221.     } else {
  222.         in.ReadClassMember(member);
  223.     }
  224.     m_Level--;
  225. }
  226. void CTest_validatorApplication::ProcessReleaseFile
  227. (const CArgs& args)
  228. {
  229.     CRef<CBioseq_set> seqset(new CBioseq_set);
  230.     // Register the Seq-entry hook
  231.     CObjectTypeInfo set_type = CType<CBioseq_set>();
  232.     set_type.FindMember("seq-set").SetLocalReadHook(*m_In, this);
  233.     m_Continue = args["c"];
  234.     // Read the CBioseq_set, it will call the hook object each time we 
  235.     // encounter a Seq-entry
  236.     *m_In >> *seqset;
  237.     NcbiCerr << m_Reported << " messages reported" << endl;
  238. }
  239. SIZE_TYPE CTest_validatorApplication::PrintBatchErrors
  240. (CConstRef<CValidError> errors,
  241.  const CArgs& args)
  242. {
  243.     if ( !errors  ||  errors->TotalSize() == 0 ) {
  244.         return 0;
  245.     }
  246.     EDiagSev show  = static_cast<EDiagSev>(args["q"].AsInteger());
  247.     CNcbiOstream* os = args["x"] ? &(args["x"].AsOutputFile()) : &NcbiCout;
  248.     SIZE_TYPE reported = 0;
  249.     for ( CValidError_CI vit(*errors); vit; ++vit ) {
  250.         if ( vit->GetSeverity() < show ) {
  251.             continue;
  252.         }
  253.         PrintBatchItem(*vit, *os);
  254.         ++reported;
  255.     }
  256.     return reported;
  257. }
  258. CRef<CSeq_entry> CTest_validatorApplication::ReadSeqEntry(void)
  259. {
  260.     CRef<CSeq_entry> se(new CSeq_entry);
  261.     m_In->Read(ObjectInfo(*se), CObjectIStream::eNoFileHeader);
  262.     return se;
  263. }
  264. CConstRef<CValidError> CTest_validatorApplication::ProcessSeqEntry(void)
  265. {
  266.     // Get seq-entry to validate
  267.     CRef<CSeq_entry> se(ReadSeqEntry());
  268.     // Validate Seq-entry
  269.     CValidator validator(*m_ObjMgr);
  270.     return validator.Validate(*se, 0, m_Options);
  271. }
  272. CConstRef<CValidError> CTest_validatorApplication::ProcessSeqSubmit(void)
  273. {
  274.     CRef<CSeq_submit> ss(new CSeq_submit);
  275.     // Get seq-submit to validate
  276.     m_In->Read(ObjectInfo(*ss), CObjectIStream::eNoFileHeader);
  277.     // Validae Seq-submit
  278.     CValidator validator(*m_ObjMgr);
  279.     return validator.Validate(*ss, 0, m_Options);
  280. }
  281. CConstRef<CValidError> CTest_validatorApplication::ProcessSeqAnnot(void)
  282. {
  283.     CRef<CSeq_annot> sa(new CSeq_annot);
  284.     // Get seq-annot to validate
  285.     m_In->Read(ObjectInfo(*sa), CObjectIStream::eNoFileHeader);
  286.     // Validae Seq-annot
  287.     CValidator validator(*m_ObjMgr);
  288.     return validator.Validate(*sa, 0, m_Options);
  289. }
  290. void CTest_validatorApplication::Setup(const CArgs& args)
  291. {
  292.     // Setup application registry and logs for CONNECT library
  293.     CORE_SetLOG(LOG_cxx2c());
  294.     CORE_SetREG(REG_cxx2c(&GetConfig(), false));
  295.     // Setup MT-safety for CONNECT library
  296.     // CORE_SetLOCK(MT_LOCK_cxx2c());
  297.     // Create object manager
  298.     m_ObjMgr.Reset(new CObjectManager);
  299.     if ( args["g"] ) {
  300.         // Create GenBank data loader and register it with the OM.
  301.         // The last argument "eDefault" informs the OM that the loader must
  302.         // be included in scopes during the CScope::AddDefaults() call.
  303.         m_ObjMgr->RegisterDataLoader(*new CGBDataLoader("ID"),
  304.             CObjectManager::eDefault);
  305.     }
  306.     SetupValidatorOptions(args);
  307. }
  308. void CTest_validatorApplication::SetupValidatorOptions(const CArgs& args)
  309. {
  310.     // Set validator options
  311.     m_Options = 0;
  312.     m_Options |= args["nonascii"] ? CValidator::eVal_non_ascii    : 0;
  313.     m_Options |= args["context"]  ? CValidator::eVal_no_context   : 0;
  314.     m_Options |= args["align"]    ? CValidator::eVal_val_align    : 0;
  315.     m_Options |= args["exon"]     ? CValidator::eVal_val_exons    : 0;
  316.     m_Options |= args["splice"]   ? CValidator::eVal_splice_err   : 0;
  317.     m_Options |= args["ovlpep"]   ? CValidator::eVal_ovl_pep_err  : 0;
  318.     m_Options |= args["taxid"]    ? CValidator::eVal_need_taxid   : 0;
  319.     m_Options |= args["isojta"]   ? CValidator::eVal_need_isojta  : 0;
  320.     m_Options |= args["g"]        ? CValidator::eVal_remote_fetch : 0;
  321.     // !!!  DEBUG {
  322.     // For testing only. Should be removed in the future
  323.     m_Options |= args["debug"].HasValue() ? CValidator::eVal_perf_bottlenecks : 0;
  324.     // }
  325. }
  326. CObjectIStream* CTest_validatorApplication::OpenFile
  327. (const CArgs& args)
  328. {
  329.     // file name
  330.     string fname = args["i"].AsString();
  331.     // file format 
  332.     ESerialDataFormat format = eSerial_AsnText;
  333.     if ( args["b"] ) {
  334.         format = eSerial_AsnBinary;
  335.     }
  336.     return CObjectIStream::Open(fname, format);
  337. }
  338. SIZE_TYPE CTest_validatorApplication::PrintValidError
  339. (CConstRef<CValidError> errors, 
  340.  const CArgs& args)
  341. {
  342.     EDiagSev show = static_cast<EDiagSev>(args["q"].AsInteger());
  343.     EDiagSev count = static_cast<EDiagSev>(args["r"].AsInteger());
  344.     CNcbiOstream* os = args["x"] ? &(args["x"].AsOutputFile()) : &NcbiCout;
  345.     if ( errors->TotalSize() == 0 ) {
  346.         *os << "All entries are OK!" << endl;
  347.         os->flush();
  348.         return 0;
  349.     }
  350.     SIZE_TYPE result = 0;
  351.     SIZE_TYPE reported = 0;
  352.     for ( CValidError_CI vit(*errors); vit; ++vit) {
  353.         if ( vit->GetSeverity() >= count ) {
  354.             ++result;
  355.         }
  356.         if ( vit->GetSeverity() < show ) {
  357.             continue;
  358.         }
  359.         PrintValidErrItem(*vit, *os);
  360.         ++reported;
  361.     }
  362.     *os << reported << " messages reported" << endl;
  363.     os->flush();
  364.     *os << "Total number of errors: " << errors->TotalSize() << endl
  365.         << "Info: "     << errors->InfoSize()     << endl
  366.         << "Warning: "  << errors->WarningSize()  << endl
  367.         << "Error: "    << errors->ErrorSize()    << endl
  368.         << "Critical: " << errors->CriticalSize() << endl
  369.         << "Fatal: "    << errors->FatalSize()    << endl;
  370.     return result;
  371. }
  372. void CTest_validatorApplication::PrintValidErrItem
  373. (const CValidErrItem& item,
  374.  CNcbiOstream& os)
  375. {
  376.     os << item.GetSevAsStr() << ":       " << item.GetErrCode() << endl << endl
  377.        << "Message: " << item.GetMsg() << endl << endl;
  378.      //<< "Verbose: " << item.GetVerbose() << endl << endl;
  379. }
  380. void CTest_validatorApplication::PrintBatchItem
  381. (const CValidErrItem& item,
  382.  CNcbiOstream&os)
  383. {
  384.     os << item.GetSevAsStr() << ": [" << item.GetErrCode() <<"] ["
  385.        << item.GetMsg() << "]" << endl;
  386. }
  387. /////////////////////////////////////////////////////////////////////////////
  388. //  MAIN
  389. int main(int argc, const char* argv[])
  390. {
  391.     return CTest_validatorApplication().AppMain(argc, argv, 0, eDS_Default, 0);
  392. }
  393. /*
  394.  * ===========================================================================
  395.  *
  396.  * $Log: test_validator.cpp,v $
  397.  * Revision 1000.2  2004/06/01 19:48:09  gouriano
  398.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.27
  399.  *
  400.  * Revision 1.27  2004/05/21 21:42:56  gorelenk
  401.  * Added PCH ncbi_pch.hpp
  402.  *
  403.  * Revision 1.26  2004/02/09 19:18:58  grichenk
  404.  * Renamed CDesc_CI to CSeq_descr_CI. Redesigned CSeq_descr_CI
  405.  * and CSeqdesc_CI to avoid using data directly.
  406.  *
  407.  * Revision 1.25  2004/01/07 17:37:39  vasilche
  408.  * Fixed include path to genbank loader.
  409.  * Moved split_cache application.
  410.  *
  411.  * Revision 1.24  2003/08/06 15:07:22  shomrat
  412.  * Added fix for batch processing
  413.  *
  414.  * Revision 1.23  2003/06/02 16:06:43  dicuccio
  415.  * Rearranged src/objects/ subtree.  This includes the following shifts:
  416.  *     - src/objects/asn2asn --> arc/app/asn2asn
  417.  *     - src/objects/testmedline --> src/objects/ncbimime/test
  418.  *     - src/objects/objmgr --> src/objmgr
  419.  *     - src/objects/util --> src/objmgr/util
  420.  *     - src/objects/alnmgr --> src/objtools/alnmgr
  421.  *     - src/objects/flat --> src/objtools/flat
  422.  *     - src/objects/validator --> src/objtools/validator
  423.  *     - src/objects/cddalignview --> src/objtools/cddalignview
  424.  * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  425.  * replaces the three libmmdb? libs.
  426.  *
  427.  * Revision 1.22  2003/05/28 16:39:19  shomrat
  428.  * Indentation corrections
  429.  *
  430.  * Revision 1.21  2003/05/15 02:10:05  ucko
  431.  * Be consistent about SIZE_TYPE vs. unsigned int in PrintValidError.
  432.  *
  433.  * Revision 1.20  2003/05/14 21:16:48  shomrat
  434.  * Using CRef instead of auto_ptr; changed to output format
  435.  *
  436.  * Revision 1.19  2003/04/24 16:16:00  vasilche
  437.  * Added missing includes and forward class declarations.
  438.  *
  439.  * Revision 1.18  2003/04/15 14:56:52  shomrat
  440.  * cout -> NcbiCout; test before derefernce
  441.  *
  442.  * Revision 1.17  2003/04/15 14:22:42  vasilche
  443.  * Added missing includes.
  444.  *
  445.  * Revision 1.16  2003/04/04 18:44:42  shomrat
  446.  * Added remote fetch flag
  447.  *
  448.  * Revision 1.15  2003/03/20 18:58:22  shomrat
  449.  * Added support for validation of standalone Seq-annot files
  450.  *
  451.  * Revision 1.14  2003/03/10 18:13:14  shomrat
  452.  * Print extended statistics
  453.  *
  454.  * Revision 1.13  2003/03/06 19:41:15  shomrat
  455.  * Changed eval from auto_ptr to CRef
  456.  *
  457.  * Revision 1.12  2003/02/24 20:36:15  shomrat
  458.  * Added several application flags, including batch processing
  459.  *
  460.  * Revision 1.11  2003/02/14 21:55:13  shomrat
  461.  * Output the severity of an error
  462.  *
  463.  * Revision 1.10  2003/02/07 21:26:01  shomrat
  464.  * More detailed error report
  465.  *
  466.  * Revision 1.9  2003/02/05 00:28:07  ucko
  467.  * +<serial/objistr.hpp> (formerly pulled in via reader_id1.hpp)
  468.  *
  469.  * Revision 1.8  2003/02/03 20:22:25  shomrat
  470.  * Added flag to supress performance bottlenecks
  471.  *
  472.  * Revision 1.7  2003/02/03 17:51:06  shomrat
  473.  * Bug fix - Trailing comma in a parameter list
  474.  *
  475.  * Revision 1.6  2003/02/03 17:06:48  shomrat
  476.  * Changed parameters to CGBDataLoader
  477.  *
  478.  * Revision 1.5  2003/01/28 16:01:22  shomrat
  479.  * Bug fixes
  480.  *
  481.  * Revision 1.4  2003/01/24 22:04:33  shomrat
  482.  * Added flags to specify input format (Seq-entry or Seq-submit)
  483.  *
  484.  * Revision 1.3  2003/01/07 20:04:26  shomrat
  485.  * GetMessage changed to GetMsg
  486.  *
  487.  * Revision 1.2  2003/01/07 17:57:05  ucko
  488.  * Use the new path to the validator's public header.
  489.  *
  490.  * Revision 1.1  2002/12/23 21:11:59  shomrat
  491.  * Moved from objects/objmgr/test
  492.  *
  493.  * Revision 1.3  2002/11/04 21:29:14  grichenk
  494.  * Fixed usage of const CRef<> and CRef<> constructor
  495.  *
  496.  * Revision 1.2  2002/10/08 13:40:38  clausen
  497.  * Changed current.asn to current.prt
  498.  *
  499.  * Revision 1.1  2002/10/03 18:34:13  clausen
  500.  * Initial version
  501.  *
  502.  *
  503.  * ===========================================================================
  504.  */