Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JobOutputterFactory.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file protocols/jd2/JobOutputterFactory.cc
11 /// @brief JobOutputterFactory
12 /// @author Steven Lewis smlewi@gmail.com, Brian Weitzner brian.weitzner@gmail.com
13 
17 
18 #include <basic/options/option.hh>
19 #include <basic/options/keys/out.OptionKeys.gen.hh>
20 #include <basic/options/keys/jd2.OptionKeys.gen.hh>
21 //#include <basic/options/keys/run.OptionKeys.gen.hh>
22 //#include <basic/options/keys/parser.OptionKeys.gen.hh>
23 //#include <basic/options/keys/enzdes.OptionKeys.gen.hh>
24 
25 // Utility headers
26 #include <utility/exit.hh> // runtime_assert, utility_exit_with_message
27 #include <basic/Tracer.hh>
28 
29 namespace protocols {
30 namespace jd2 {
31 
32 static basic::Tracer TR( "protocols.jd2.JobOutputterFactory" );
33 
34 JobOutputterFactory * JobOutputterFactory::instance_( 0 );
35 
37 {}
38 
40 
43  if ( ! instance_ ) {
44  JobOutputterFactory * instance_local = new JobOutputterFactory;
45  instance_ = instance_local;
46  }
47  return instance_;
48 }
49 
50 ///@brief add a JobOutputter prototype, using its default type name as the map key
51 void
53 {
54  runtime_assert( creator );
55  std::string const job_outputter_type( creator->keyname() );
56  if ( job_outputter_creator_map_.find( job_outputter_type ) != job_outputter_creator_map_.end() ) {
57  utility_exit_with_message("JobOutputterFactory::factory_register already has a mover creator with name \"" + job_outputter_type + "\". Conflicting JobOutputter names" );
58  }
59  job_outputter_creator_map_[ job_outputter_type ] = creator;
60 }
61 
62 ///@details return get_JobOutputter_from_string( "JobOutputter by key lookup in map
65 {
66  //get pointer to Creator
67  JobOutputterMap::const_iterator iter( job_outputter_creator_map_.find( job_outputter_type ) );
68  if ( iter != job_outputter_creator_map_.end() ) { //if Creator has an entry
69  if ( ! iter->second ) { //if Creator inexplicably fails to exist, crash
70  utility_exit_with_message( "Error: JobOutputterCreatorOP for " + job_outputter_type + " is NULL, you should never have been able to get here!" );
71  }
72 
73  //if creator exists, return a JobOutputter from it (this is good)
74  return iter->second->create_JobOutputter();
75  }
76  else { //else, a non-existent JobOutputter has been requested. Print existing ones and exit.
77  TR << "Available : ";
78  for( JobOutputterMap::const_iterator mover_it = job_outputter_creator_map_.begin(); mover_it != job_outputter_creator_map_.end(); ++mover_it ) {
79  TR << mover_it->first<<", ";
80  }
81  TR << std::endl;
82  utility_exit_with_message( job_outputter_type + " is not known to the JobOutputterFactory. Was it registered via a JobOutputterRegistrator in one of the init.cc files (devel/init.cc or protocols/init.cc)?" );
83  return NULL;
84  }
85 }
86 
87 ///@brief return new JobOutputter from logic of option system plus compilation options. All the logic for determining job output type lives here.
90 {
91  //initial copy of this code copied at XRW2 by SML+BDW from about SVN:46190 from JobDistributorFactory.cc
92  if ( basic::options::option[ basic::options::OptionKeys::out::file::silent ].user() ) {
93  return get_JobOutputter_from_string( "SilentFileJobOutputter" );
94  } else if ( basic::options::option[basic::options::OptionKeys::out::file::atom_tree_diff].user() ){
95  return get_JobOutputter_from_string( "AtomTreeDiffJobOutputter" );
96  } else if ( basic::options::option[basic::options::OptionKeys::out::file::score_only].user() ) {
97  return get_JobOutputter_from_string( "ScoreOnlyJobOutputter" );
98  } else if ( basic::options::option[ basic::options::OptionKeys::jd2::no_output ].value() || basic::options::option[ basic::options::OptionKeys::out::nooutput ] ){
99  return get_JobOutputter_from_string( "NoOutputJobOutputter" );
100  } else if ( basic::options::option[ basic::options::OptionKeys::jd2::enzdes_out].user() ){
101  return get_JobOutputter_from_string( "EnzdesJobOutputter" );
102  } else if ( basic::options::option[ basic::options::OptionKeys::out::use_database].user() ){
103  return get_JobOutputter_from_string( "DatabaseJobOutputter" );
104  } else { //currently default; may need an if in the future
105  return get_JobOutputter_from_string( "PDBJobOutputter" );
106  }
107  return get_JobOutputter_from_string( "PDBJobOutputter" ); //default case may change in the future
108 
109 }
110 
111  ///@brief return JobOutputter defined by output parameters (contained in option system and #defines for MPI, etc). The difference is that if the option system, etc, says nothing about output (which as of this writing defaults to PDBJobOutputter), this function leaves the input Outputter unchanged. This allows overriding the default outputter choice in your executable (without abusing the mutability of the options system)
114 
115  //it would be really nice to figure out how to combine the logic in these two versions of the function in to one - perhaps with default NULL pointer?
116 
117  if ( basic::options::option[ basic::options::OptionKeys::out::file::silent ].user() ) {
118  return get_JobOutputter_from_string( "SilentFileJobOutputter" );
119  } else if ( basic::options::option[basic::options::OptionKeys::out::pdb].user() ){
120  return get_JobOutputter_from_string( "PDBJobOutputter" );
121  } else if ( basic::options::option[basic::options::OptionKeys::out::file::atom_tree_diff].user() ){
122  return get_JobOutputter_from_string( "AtomTreeDiffJobOutputter" );
123  } else if ( basic::options::option[basic::options::OptionKeys::out::file::score_only].user() ) {
124  return get_JobOutputter_from_string( "ScoreOnlyJobOutputter" );
125  } else if ( basic::options::option[ basic::options::OptionKeys::jd2::no_output ].value() || basic::options::option[ basic::options::OptionKeys::out::nooutput ] ){
126  return get_JobOutputter_from_string( "NoOutputJobOutputter" );
127  } else if ( basic::options::option[ basic::options::OptionKeys::jd2::enzdes_out].user() ){
128  return get_JobOutputter_from_string( "EnzdesJobOutputter" );
129  } else if ( basic::options::option[ basic::options::OptionKeys::out::use_database].user() ){
130  return get_JobOutputter_from_string( "DatabaseJobOutputter" );
131  } else {
132  return default_jobout;
133  }
134  return default_jobout;
135 
136 }
137 
138 } //namespace jd2
139 } //namespace protocols