1

I'm using swig to wrap around this C++ project and after having imported all the header files into my python code, I'm now working on re-creating the main class in python, but I'm having trouble looking for the corresponding data structures and data types. Following is the main method under main.cpp

int main( int argc, char *argv[] )
{
string exe_name = argv[ 0 ];

string usage = "Usage: " + exe_name + " unigene.fasta [options]\n\
Options:\n\
-g <GC content> \tminimum GC content in percentage (Default 45).\n\
-G <GC content> \tmaximum GC content in percentage (Default 55).\n\
-m <temperature> \tlowest melting temperature in degrees of celsius (Default 0).\n\
-M <temperature> \thighest melting temperature in degrees of celsius (Default 100).\n\
-r <repeat.fasta> \tfasta file containing repeat DNA sequences.\n\
-t <top number> \tnumber of top oligos selected for each unigene (Default 1).\n\n";

string unigene_file;
// options only, each must have an associated value
int min_gc = 45;
int max_gc = 55;
int min_tm = 0;
int max_tm = 100; 
int top_num = 1;
string repeat_file;
vector< string > m_argument;
for ( int i = 0; i < argc; i ++ ) {
    string new_arg = argv[ i ];
    m_argument.push_back( new_arg );
}

parse_argument( m_argument, usage, unigene_file, 
                min_gc, max_gc, min_tm, max_tm, top_num, repeat_file );

// initialize filtration parameters
float norm_min_gc = (float)min_gc / 100.0;
float norm_max_gc = (float)max_gc / 100.0;
string splice_file; // empty splice file
filt_param m_filtparam( norm_min_gc, norm_max_gc, min_tm, max_tm, 
                        repeat_file, splice_file );

// screen unigenes for unique oligos
seqs m_unigene;
m_unigene.init( unigene_file );

// map from unigene names to oligo sequences
map< string, vector< string > > uniq_oligo;
get_unique_oligo( m_unigene, m_filtparam, top_num, uniq_oligo );

// output oligos
if ( uniq_oligo.empty() ) {
  cout << "No valid oligo has been found. " << endl <<
    "It could be due to one of the following reasons: " << endl <<
    "1. input sequences are not unique, or " << endl << 
    "2. they are repetitive DNAs, or " << endl << 
    "3. GC% range is too restricted, etc. " << endl;
}
map< string, vector< string > > :: const_iterator m_itr;
for ( m_itr = uniq_oligo.begin(); m_itr != uniq_oligo.end(); m_itr ++ ) {
    for ( int o_idx = 0; o_idx < (int)m_itr->second.size(); o_idx ++ ) {
        cout << ">unique-oligo-" << o_idx+1 << "-of-unigene-" << 
                m_itr->first << endl;
        cout << m_itr->second[ o_idx ] << endl;
    }
}

//system("PAUSE");
return 1;
}

For instance when I try passing an empty string (repeat_file) into filtparam() as done above, in python, I get the error

in method 'new_filt_param', argument 5 of type 'string const &'

How does one declare a 'string const &' type in python?

Also is there a structure like 'map' in python?

Raina
  • 99
  • 1
  • 2
  • 13
  • you can go through http://stackoverflow.com/questions/2682745/creating-constant-in-python & http://code.activestate.com/recipes/65207-constants-in-python/?in=user-97991 – avasal Oct 04 '12 at 08:46

1 Answers1

2

What you're looking for is the dict, which essentially works similar to C++'s map. More information can be found in the documentation.

Different question: Is there any reason you're recreating main() in Python rather than simply wrapping that one with SWIG? While SWIG is able to handle things like std::string in a limited way, I'd try to use a more simple interface using pointers/arrays only, rather than trying to pass any C++ objects or constructs.

Mario
  • 35,726
  • 5
  • 62
  • 78
  • Pardon me for my ignorance but I didn't know you could wrap around the main class as well, the swig documentation states that it should not be used on raw C++ source files, but header files only. I'm actually trying to create an interface for this project using wxpython, so thought I'd be able to tweak the parameters directly from the GUI if I could re-create the main somehow. Would you please guide me with wrapping around the main class? – Raina Oct 04 '12 at 09:10
  • It's a little bit "hacky": Just write a header with a forward declaration for `main()` and you're done. Use that one as it's explained in tutorials, etc. Pass the parameter `-cpp` to swig and it should accept C++ code just fine. Things like calling convention, etc. is all handled by SWIG. – Mario Oct 04 '12 at 11:12
  • One last quickie! I could call the main method through python and it displays the result in the IDE terminal. Is there a way I can store the result that's being generated so I can visualize it in a better way through the GUI? or should I just modify the original main to do this? – Raina Oct 06 '12 at 11:16
  • Replace `main()` with a real wrapper function that takes an additional parameter for you to store values/results to, e.g. an array. – Mario Oct 06 '12 at 12:14