PageRenderTime 62ms CodeModel.GetById 34ms RepoModel.GetById 0ms app.codeStats 0ms

/mpqc-2.3.1/src/bin/molrender/main.cc

#
C++ | 152 lines | 132 code | 16 blank | 4 comment | 29 complexity | 0645fd54e7f7c4ad5d6b495571b70ab5 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0
  1. #include <stdio.h>
  2. #include <util/keyval/keyval.h>
  3. #include <util/render/render.h>
  4. #include <util/render/oogl.h>
  5. #include <util/render/object.h>
  6. #include <math/isosurf/surf.h>
  7. #include <chemistry/molecule/molecule.h>
  8. #include <chemistry/molecule/molrender.h>
  9. #include <chemistry/molecule/molshape.h>
  10. #include <util/state/linkage.h>
  11. using namespace sc;
  12. int
  13. main(int argc, char** argv)
  14. {
  15. int i;
  16. const char* model = "stick";
  17. const char* keyword = "molecule";
  18. const char* inputfile = "molrender.in";
  19. int level = 3;
  20. enum InputType { PDB, KEYVAL } input = KEYVAL;
  21. const char* render = 0;
  22. int quiet = 0;
  23. for (i=1; i<argc; i++) {
  24. if (!strcmp(argv[i], "-model")) {
  25. i++;
  26. model = argv[i];
  27. }
  28. else if (!strcmp(argv[i], "-quiet")) {
  29. quiet = 1;
  30. }
  31. else if (!strcmp(argv[i], "-render")) {
  32. i++;
  33. render = argv[i];
  34. }
  35. else if (!strcmp(argv[i], "-keyword")) {
  36. i++;
  37. keyword = argv[i];
  38. }
  39. else if (!strcmp(argv[i], "-pdb")) {
  40. i++;
  41. input = PDB;
  42. inputfile = argv[i];
  43. }
  44. else if (!strcmp(argv[i], "-keyval")) {
  45. i++;
  46. input = KEYVAL;
  47. inputfile = argv[i];
  48. }
  49. else if (!strcmp(argv[i], "-level")) {
  50. i++;
  51. level = atoi(argv[i]);
  52. }
  53. else {
  54. fprintf(stderr,"%s: unknown option: \"%s\"\n", argv[0], argv[i]);
  55. abort();
  56. }
  57. }
  58. // Find the molecule.
  59. Ref<Molecule> mol;
  60. if (input == PDB) {
  61. Ref<AssignedKeyVal> keyval = new AssignedKeyVal();
  62. keyval->assign("pdb_file", inputfile);
  63. mol = new Molecule(keyval.pointer());
  64. }
  65. else {
  66. Ref<KeyVal> keyval = new ParsedKeyVal(inputfile);
  67. mol = new Molecule(new PrefixKeyVal(keyval, keyword));
  68. }
  69. // Set up the rendered molecule object.
  70. Ref<AssignedKeyVal> tmpkv = new AssignedKeyVal();
  71. Ref<AssignedKeyVal> keyval = new AssignedKeyVal();
  72. keyval->assign("molecule", mol.pointer());
  73. keyval->assign("model", model);
  74. Ref<DescribedClass> atominfo = new AtomInfo(tmpkv.pointer());
  75. keyval->assign("atominfo", atominfo);
  76. tmpkv->clear();
  77. Ref<RenderedObject> molobject;
  78. if (!strcmp(model,"stick")) {
  79. molobject = new RenderedStickMolecule(keyval.pointer());
  80. }
  81. else if (!strcmp(model,"ball")) {
  82. molobject = new RenderedBallMolecule(keyval.pointer());
  83. }
  84. else if (!strcmp(model,"connolly")) {
  85. tmpkv->assign("molecule", mol.pointer());
  86. tmpkv->assign("atominfo", atominfo);
  87. Ref<DescribedClass> volume = new ConnollyShape(tmpkv.pointer());
  88. tmpkv->clear();
  89. tmpkv->assignboolean("verbose", !quiet);
  90. Ref<DescribedClass> trisurf = new TriangulatedSurface(tmpkv.pointer());
  91. tmpkv->clear();
  92. tmpkv->assign("surface", trisurf);
  93. tmpkv->assign("volume", volume);
  94. tmpkv->assign("resolution", 1.0);
  95. tmpkv->assignboolean("remove_short_edges", 0);
  96. tmpkv->assignboolean("remove_slender_edges", 0);
  97. Ref<DescribedClass> surface
  98. = new TriangulatedImplicitSurface(tmpkv.pointer());
  99. tmpkv->clear();
  100. keyval->assign("surface", surface);
  101. molobject = new RenderedMolecularSurface(keyval.pointer());
  102. }
  103. else {
  104. fprintf(stderr,"%s: unknown model \"%s\"\n", argv[0], model);
  105. abort();
  106. }
  107. Ref<RenderedObjectSet> object;
  108. if (render) {
  109. object = new RenderedObjectSet;
  110. object->add(molobject);
  111. Ref<Appearance> appearance = new Appearance;
  112. appearance->level().set(level);
  113. object->appearance(appearance);
  114. if (object.null()) {
  115. fprintf(stderr,"%s: got a null object to render\n",argv[0]);
  116. abort();
  117. }
  118. // Set up the renderer.
  119. Ref<Render> renderer;
  120. if (!strcmp("oogl", render)) {
  121. renderer = new OOGLRender;
  122. }
  123. else {
  124. fprintf(stderr,"%s: unknown renderer: \"%s\"\n", argv[0], render);
  125. }
  126. // Render the object.
  127. renderer->render(object.pointer());
  128. }
  129. if (!quiet) {
  130. ConnollyShape::print_counts();
  131. CS2Sphere::print_counts();
  132. }
  133. fflush(stdout);
  134. fflush(stderr);
  135. return 0;
  136. }