On Mar 19, 2015, at 12:36 AM, Alex Tek <alex.tek.fr@gmail.com> wrote:

As I understand your code, you first create a wrapper struct whose members look like the ParameterReader members.  Then you have functions to copy from the ParameterReader to the wrapper and back, all in c++.  Then in params.py  you have a python version of the wrapper, which I think is perhaps hard coded to directly access the wrapper.  

The wrappers add a bit of risk of bugs since changes have to be made in multiple places.  Is there any way this could be avoided?  Is it possible to use SWIG? 
Yes SWIG is probably a good solution. 

It seems to me that you are doing more than just translating c++ headers to c.  the updateParameterReader_wrapper method has no equilivalent in ParameterReader.cpp, for instance. So SWIG might involve doing things very differently, compared to what we are doing currently.

In the meantime, update share and check genCtypesStructs.py. I fixed it to make it generate proper wrappers, but only for ParameterReader.

So you made an automated wrapper generator! very impressive.

It’s spitting out a bunch of errors though, appended below.  Or are these just warnings?  It seemed to compile fine anyway.  either way I think we’re done with the mmb.pdb issue.  Thanks for your help.





Usage: python share/genCtypesStructs.py include/ParameterReader.h include/ParameterReader_wrapper.h share/pyMMB/params.py 
(you have to be at the root of the project).
In the past, I used this script for the classes and structs in utils.h. But it doesn't produce ready to use wrappers. This is probably broken now anyway.

Alternatively, would it not be better, if the params.py were linked hard to ParameterReader rather than its wrapper?  I don’t see that there is any validation happening, which would be one reason to have ParameterReader_wrapper.h.  Is this possible? Bear in mind I’m a python amateur.
No, unfortunately you can't do that. Python can execute C functions, but not C++. Indeed, once compiled, C++ method names are modified (see C++ name mangling for more info), making it unreliable to be wrapped. 
This is why we have these wrappers. Notice that the code of python_wrapper.cpp is wrapped inside an extern "C" declaration, marking it as C code for programs using the library. Note that only the signature of the functions has to follow the C rules. Their guts can totally use c++, and this is what we do here.

And actually, python_wrapper.cpp is quite ill named as it is really a C wrapper. The python wrappers are in wrappers.py.
SWIG is doing the same thing, except that it's automatized.




samuel-floress-macbook-pro-3:trunk Sam$ python share/genCtypesStructs.py include/ParameterReader.h include/ParameterReader_wrapper.h share/pyMMB/params.py 
Unknown type: // ParameterReader & operator = (const ParameterReader in ParameterReader
Unknown type: ErrorManager & in ParameterReader
Unknown type: // in ParameterReader
Unknown type: vector<CovalentBondClass> in ParameterReader
Unknown type: vector<IncludeIntraChainInterface> in ParameterReader
Unknown type: BasePairContainer in ParameterReader
Unknown type: map<const ChainResidueIndex, BasePairPartner,twoIndexCmp> in ParameterReader
Unknown type: // variables previously declared and initialized in in ParameterReader
Unknown type: //bool in ParameterReader
Unknown type: //bool in ParameterReader
Unknown type: //String in ParameterReader
Unknown type: //bool in ParameterReader
Unknown type: //int in ParameterReader
Unknown type: //int in ParameterReader
Unknown type: BondMobility::Mobility in ParameterReader
Unknown type: BondMobility::Mobility in ParameterReader
Unknown type: BondMobility::Mobility in ParameterReader
Unknown type: BondMobility::Mobility in ParameterReader
Unknown type: Vector in ParameterReader
Unknown type: LeontisWesthofClass in ParameterReader
Unknown type: // end of variables improted from in ParameterReader
Unknown type: //int in ParameterReader
Unknown type: //int in ParameterReader
Unknown type: //vector<Biopolymer> in ParameterReader
Unknown type: //vector<String> in ParameterReader
Unknown type: vector<int> in ParameterReader
Unknown type: map<const ChainResidueIndex, int,twoIndexCmp> in ParameterReader
Unknown type: //vector<double> in ParameterReader
Unknown type: //vector<int> in ParameterReader
Unknown type: //vector<double> in ParameterReader
Unknown type: //vector<int> in ParameterReader
Unknown type: /*vector<double> in ParameterReader
Unknown type: vector<int> in ParameterReader
Unknown type: vector<double> in ParameterReader
Unknown type: vector<int> in ParameterReader
Unknown type: LeontisWesthofClass in ParameterReader
Unknown type: mutable map<const String,double> in ParameterReader
Unknown type: DensityMap in ParameterReader
Unknown type: DensityMap in ParameterReader
Unknown type: MobilizerContainer in ParameterReader
Unknown type: PhysicsContainer in ParameterReader
Unknown type: ConstraintToGroundContainer in ParameterReader
Unknown type: DisplacementContainer in ParameterReader
Unknown type: AtomSpringContainer in ParameterReader
Unknown type: BiopolymerClassContainer in ParameterReader
Unknown type: MoleculeClassContainer in ParameterReader
Unknown type: WaterDropletContainer in ParameterReader
Unknown type: map<const String,String> in ParameterReader
Unknown type: map<const String,String> in ParameterReader
Unknown type: map<const String, int> in ParameterReader
Unknown type: map<const String,int>::iterator in ParameterReader
Unknown type: // //void addRingClosingBond(const String chainID, ResidueID residueID1, String atomName1,String bondCenterName1, ResidueID residueID2, String atomName2,String in ParameterReader
Unknown type: // void addC1pSprings (LeontisWesthofClass in ParameterReader
Unknown type: // void applyAtomSprings (SimbodyMatterSubsystem & matter, GeneralForceSubsystem & in ParameterReader
Unknown type: // void configureDumm( DuMMForceFieldSubsystem & in ParameterReader
Unknown type: // static double myAtoF(map<const String,double> myUserVariables,const char* value in ParameterReader
Unknown type: // static bool aToBool( const String& name, const char* value in ParameterReader
Unknown type: // static bool compareUpper( const String& param, const char* symbol in ParameterReader
Unknown type: vector<BasePair> in ParameterReader
Unknown type: ContactContainer in ParameterReader
Unknown type: DensityContainer in ParameterReader
Unknown type: DensityContainer in ParameterReader
Unknown type: vector<SingleBondMobility> in ParameterReader
Unknown type: vector<BasePairPartner> in ParameterReader
Unknown type: //vector<IncludeAllNonBondAtomsInResidue> in ParameterReader
Unknown type: vector<AllResiduesWithin> in ParameterReader
Unknown type: vector<IncludeNonBondAtomInBiopolymerStruct> in ParameterReader
Unknown type: vector <WaterDropletAboutResidueStruct> in ParameterReader
Unknown type: vector<MobilizerDomainsInterface> in ParameterReader
Unknown type: // void removeBasePairsInRigidStretch in ParameterReader
Unknown type: // void printAllSettings ( ostream & myOstream = std::cout, String remarkString = in ParameterReader
Unknown type: // void removeNonPriorityBasePairs (int in ParameterReader
Unknown type: // //int getFirstResidueNumbers(const String myChainId) in ParameterReader
Unknown type: // // int getProteinFirstResidueNumbers(const String myProteinChainId) in ParameterReader
Unknown type: // //int getBasePriority(int baseResidueNumber,String baseChain, String basePairingEdge) in ParameterReader
Unknown type: // // int getNumBasePairs() in ParameterReader
Unknown type: // void addAllResiduesWithin(String chainID, int resID, double in ParameterReader
Unknown type: // void updateAllResiduesWithin(int index, String chainID, int resID, double in ParameterReader
Unknown type: // void deleteAllResiduesWithin(int in ParameterReader
Unknown type: // void updateIncludeAllNonBondAtomsInResidue(int index, String chainID, int in ParameterReader
Unknown type: // void deleteIncludeAllNonBondAtomsInResidue(int in ParameterReader
Unknown type: // //int in ParameterReader
Unknown type: // //int calcLowestBondingResidue(const String in ParameterReader
Unknown type: // //int calcHighestBondingResidue(const String in ParameterReader
Unknown type: // void in ParameterReader
Unknown type: // void parameterStringInterpreter(const String & in ParameterReader
Unknown type: // void initializeFromFileOnly(const char * parameterFileName = "./commands.dat" in ParameterReader
Unknown type: // void setFirstAndLastStage(const char * parameterFileName = "./commands.dat" in ParameterReader
Unknown type: // void loadSequencesFromPdb(const char * in ParameterReader
Unknown type: // //void in ParameterReader
Unknown type: // // void in ParameterReader
Unknown type: // // void in ParameterReader
Unknown type: // void in ParameterReader
Unknown type: // void in ParameterReader
Unknown type: // void in ParameterReader
Unknown type: // void in ParameterReader
Unknown type: // void in ParameterReader
Unknown type: // // void initializeDefaults in ParameterReader
Unknown type: // void initializeDefaults(const char * leontisWesthofInFileName = in ParameterReader
Unknown type: // void initialize(const char * parameterFileName = "./commands.dat" in ParameterReader
Unknown type: // //bool chainIsBiopolymer(String myChainId in ParameterReader
Unknown type: // //bool chainIsMonoAtoms(String in ParameterReader
Unknown type: // //int getChainIndex(String myChainId , vector<Biopolymer> & in ParameterReader
Unknown type: MonoAtomsContainer in ParameterReader
Unknown type: //dutyCycle = in ParameterReader
Unknown type: //priority = in ParameterReader
samuel-floress-macbook-pro-3:trunk Sam$