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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: struct_util_demo.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 18:15:11  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: struct_util_demo.cpp,v 1000.0 2004/06/01 18:15:11 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:  Paul Thiessen
  35. *
  36. * File Description:
  37. *      Test/demo for utility alignment algorithms
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/ncbistd.hpp>
  43. #include <ctools/ctools.h>
  44. #include <algo/structure/struct_util/struct_util.hpp>
  45. #include <objects/cdd/Cdd.hpp>
  46. #include "struct_util_demo.hpp"
  47. // borrow Cn3D's asn i/o functions
  48. #include "../src/app/cn3d/asn_reader.hpp"
  49. USING_NCBI_SCOPE;
  50. USING_SCOPE(objects);
  51. BEGIN_SCOPE(struct_util)
  52. #define ERROR_MESSAGE(s) ERR_POST(Error << "struct_util_demo: " << s << '!')
  53. #define WARNING_MESSAGE(s) ERR_POST(Warning << "struct_util_demo: " << s)
  54. #define INFO_MESSAGE(s) ERR_POST(Info << "struct_util_demo: " << s)
  55. #define TRACE_MESSAGE(s) ERR_POST(Trace << "struct_util_demo: " << s)
  56. void SUApp::Init(void)
  57. {
  58.     // create command-line argument descriptions
  59.     CArgDescriptions *argDescr = new CArgDescriptions();
  60.     // input/output CD
  61.     argDescr->AddKey("i", "filename", "name of input CD", argDescr->eString);
  62.     argDescr->AddKey("o", "filename", "name of output CD", argDescr->eString);
  63.     // output binary
  64.     argDescr->AddFlag("ob", "output binary data");
  65.     // do IBM
  66.     argDescr->AddFlag("IBM", "do only IBM");
  67.     // leave-one-out args
  68.     argDescr->AddFlag("LOO", "do leave-one-out");
  69.     argDescr->AddOptionalKey("r", "integer", "row to realign (>=2, master=1)", argDescr->eInteger);
  70.     argDescr->SetConstraint("r", new CArgAllow_Integers(2, kMax_Int));
  71.     argDescr->AddOptionalKey("f", "integer", "first block to realign (post-IBM, from 1)", argDescr->eInteger);
  72.     argDescr->SetConstraint("f", new CArgAllow_Integers(1, kMax_Int));
  73.     argDescr->AddOptionalKey("l", "integer", "last block to realign (post-IBM, from 1)", argDescr->eInteger);
  74.     argDescr->SetConstraint("l", new CArgAllow_Integers(1, kMax_Int));
  75.     SetupArgDescriptions(argDescr);
  76. }
  77. static bool ReadCD(const string& filename, CCdd *cdd)
  78. {
  79.     // try to decide if it's binary or ascii
  80.     auto_ptr<CNcbiIstream> inStream(new CNcbiIfstream(filename.c_str(), IOS_BASE::in | IOS_BASE::binary));
  81.     if (!(*inStream)) {
  82.         ERROR_MESSAGE("Cannot open file '" << filename << "' for reading");
  83.         return false;
  84.     }
  85.     string firstWord;
  86.     *inStream >> firstWord;
  87.     bool isBinary = !(firstWord == "Cdd");
  88.     inStream->seekg(0);     // rewind file
  89.     firstWord.erase();
  90.     string err;
  91.     SetDiagPostLevel(eDiag_Fatal); // ignore all but Fatal errors while reading data
  92.     bool readOK = Cn3D::ReadASNFromFile(filename.c_str(), cdd, isBinary, &err);
  93.     SetDiagPostLevel(eDiag_Info);
  94.     if (!readOK)
  95.         ERROR_MESSAGE("can't read input file: " << err);
  96.     return readOK;
  97. }
  98. int SUApp::Run(void)
  99. {
  100.     // process arguments
  101.     CArgs args = GetArgs();
  102.     // arg interactions
  103.     if (args["LOO"].HasValue() && !args["IBM"].HasValue()) {
  104.         if (!args["r"].HasValue() || !args["f"].HasValue() || !args["l"].HasValue()) {
  105.             ERROR_MESSAGE("-LOO requires -r, -f, and -l");
  106.             return 5;
  107.         }
  108.     } else if (args["IBM"].HasValue() && !args["LOO"].HasValue()) {
  109.         if (args["r"].HasValue() || args["f"].HasValue() || args["l"].HasValue())
  110.             WARNING_MESSAGE("-IBM specified; ignoring -r, -f, and -l");
  111.     } else {
  112.         ERROR_MESSAGE("must specify either -IBM or -LOO");
  113.         return 7;
  114.     }
  115.     // read input file
  116.     CCdd cdd;
  117.     if (!ReadCD(args["i"].AsString(), &cdd)) {
  118.         ERROR_MESSAGE("error reading input file " << args["i"].AsString());
  119.         return 1;
  120.     }
  121.     // create AlignmentUtility class object
  122.     AlignmentUtility au(cdd.GetSequences(), cdd.GetSeqannot());
  123.     if (!au.Okay())
  124.         return 2;
  125.     // perform IBM on this alignment
  126.     if (args["IBM"].HasValue()) {
  127.         if (!au.DoIBM()) {
  128.             ERROR_MESSAGE("IBM failed");
  129.             return 3;
  130.         }
  131.     }
  132.     // perform leave-one-out
  133.     else if (args["LOO"].HasValue()) {
  134.         vector < unsigned int > blocksToRealign;
  135.         for (int i=args["f"].AsInteger(); i<=args["l"].AsInteger(); ++i)
  136.             blocksToRealign.push_back(i - 1);               // convert to zero-numbering
  137.         if (!au.DoLeaveOneOut(
  138.                 args["r"].AsInteger() - 1, blocksToRealign, // what to realign
  139.                 0.6, 10, 0))                                // max loop length calculation parameters
  140.         {
  141.             ERROR_MESSAGE("LOO failed");
  142.             return 8;
  143.         }
  144.     }
  145.     // replace Seq-annots in cdd with new data
  146.     cdd.SetSeqannot() = au.GetSeqAnnots();
  147.     // write out processed data
  148.     string err;
  149.     if (!Cn3D::WriteASNToFile(args["o"].AsString().c_str(), cdd, args["ob"].HasValue(), &err)) {
  150.         ERROR_MESSAGE("error writing output file " << args["o"].AsString());
  151.         return 4;
  152.     }
  153.     return 0;
  154. }
  155. END_SCOPE(struct_util)
  156. USING_NCBI_SCOPE;
  157. USING_SCOPE(struct_util);
  158. int main(int argc, const char* argv[])
  159. {
  160.     SetDiagStream(&NcbiCerr);       // send all diagnostic messages to cerr
  161.     SetDiagPostLevel(eDiag_Info);   // show all messages
  162.     SetupCToolkitErrPost();         // reroute C-toolkit err messages to C++ err streams
  163.     SetDiagTrace(eDT_Default);      // trace messages only when DIAG_TRACE env. var. is set
  164. #ifdef _DEBUG
  165.     SetDiagPostFlag(eDPF_File);
  166.     SetDiagPostFlag(eDPF_Line);
  167. #else
  168.     UnsetDiagTraceFlag(eDPF_File);
  169.     UnsetDiagTraceFlag(eDPF_Line);
  170. #endif
  171.     // C++ object verification
  172.     CSerialObject::SetVerifyDataGlobal(eSerialVerifyData_Always);
  173.     CObjectIStream::SetVerifyDataGlobal(eSerialVerifyData_Always);
  174.     CObjectOStream::SetVerifyDataGlobal(eSerialVerifyData_Always);
  175.     SUApp app;
  176.     return app.AppMain(argc, argv, NULL, eDS_Default, NULL);    // don't use config file
  177. }
  178. /*
  179. * ---------------------------------------------------------------------------
  180. * $Log: struct_util_demo.cpp,v $
  181. * Revision 1000.0  2004/06/01 18:15:11  gouriano
  182. * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.4
  183. *
  184. * Revision 1.4  2004/05/27 22:22:12  thiessen
  185. * add ctools/C-Toolkit stuff
  186. *
  187. * Revision 1.3  2004/05/26 02:40:24  thiessen
  188. * progress towards LOO - all but PSSM and row ordering
  189. *
  190. * Revision 1.2  2004/05/25 15:52:18  thiessen
  191. * add BlockMultipleAlignment, IBM algorithm
  192. *
  193. * Revision 1.1  2004/05/24 23:04:05  thiessen
  194. * initial checkin
  195. *
  196. */