| 13 |  | n_bonds = 0; | 
| 14 |  | n_bends = 0; | 
| 15 |  | n_torsions = 0; | 
| 16 | + | n_rigidbodies = 0; | 
| 17 |  |  | 
| 18 |  | unhandled = NULL; | 
| 19 |  | atoms = NULL; | 
| 20 |  | bonds = NULL; | 
| 21 |  | bends = NULL; | 
| 22 |  | torsions = NULL; | 
| 23 | + | rigidBodies = NULL; | 
| 24 |  |  | 
| 25 |  | have_name = 0; | 
| 26 |  | have_atoms = 0; | 
| 27 |  | have_bonds = 0; | 
| 28 |  | have_bends = 0; | 
| 29 |  | have_torsions = 0; | 
| 30 | + | have_rigidbodies = 0; | 
| 31 |  |  | 
| 32 |  | } | 
| 33 |  |  | 
| 35 |  | int i; | 
| 36 |  |  | 
| 37 |  | if( unhandled != NULL) delete unhandled; | 
| 38 | < |  | 
| 38 | > |  | 
| 39 | > | if( rigidBodies != NULL ) { | 
| 40 | > | for( i=0; i<n_rigidbodies; i++ ) delete rigidBodies[i]; | 
| 41 | > | } | 
| 42 | > |  | 
| 43 |  | if( atoms != NULL ){ | 
| 44 |  | for( i=0; i<n_atoms; i++ ) delete atoms[i]; | 
| 45 |  | } | 
| 134 |  | torsions = new TorsionStamp*[n_torsions]; | 
| 135 |  | for( i=0; i<n_torsions; i++ ) torsions[i] = NULL; | 
| 136 |  | } | 
| 137 | + |  | 
| 138 | + | else if( !strcmp( lhs, "nRigidBodies" ) ){ | 
| 139 | + | n_rigidbodies = (int)rhs; | 
| 140 | + |  | 
| 141 | + | if( have_rigidbodies ){ | 
| 142 | + | sprintf( errMsg, | 
| 143 | + | "MoleculeStamp error, n_rigidbodies already declared for" | 
| 144 | + | " molecule: %s\n", | 
| 145 | + | name ); | 
| 146 | + | return strdup( errMsg ); | 
| 147 | + | } | 
| 148 | + | have_rigidbodies = 1; | 
| 149 | + | rigidBodies = new RigidBodyStamp*[n_rigidbodies]; | 
| 150 | + | for( i=0; i<n_rigidbodies; i++ ) rigidBodies[i] = NULL; | 
| 151 | + | } | 
| 152 | + |  | 
| 153 |  | else{ | 
| 154 |  | if( unhandled == NULL ) unhandled = new LinkedAssign( lhs, rhs ); | 
| 155 |  | else unhandled->add( lhs, rhs ); | 
| 220 |  | torsions = new TorsionStamp*[n_torsions]; | 
| 221 |  | for( i=0; i<n_torsions; i++ ) torsions[i] = NULL; | 
| 222 |  | } | 
| 223 | + |  | 
| 224 | + | else if( !strcmp( lhs, "nRigidBodies" ) ){ | 
| 225 | + | n_rigidbodies = rhs; | 
| 226 | + |  | 
| 227 | + | if( have_rigidbodies ){ | 
| 228 | + | sprintf( errMsg, | 
| 229 | + | "RigidBodyStamp error, n_rigidbodies already declared for" | 
| 230 | + | " molecule: %s\n", | 
| 231 | + | name); | 
| 232 | + | return strdup( errMsg ); | 
| 233 | + | } | 
| 234 | + | have_rigidbodies = 1; | 
| 235 | + | rigidBodies = new RigidBodyStamp*[n_rigidbodies]; | 
| 236 | + | for( i=0; i<n_rigidbodies; i++ ) rigidBodies[i] = NULL; | 
| 237 | + | } | 
| 238 |  | else{ | 
| 239 |  | if( unhandled == NULL ) unhandled = new LinkedAssign( lhs, rhs ); | 
| 240 |  | else unhandled->add( lhs, rhs ); | 
| 256 |  | "first atom declaration." ); | 
| 257 |  | } | 
| 258 |  |  | 
| 259 | + | return NULL; | 
| 260 | + | } | 
| 261 | + |  | 
| 262 | + | char* MoleculeStamp::addRigidBody( RigidBodyStamp* the_rigidbody, | 
| 263 | + | int rigidBodyIndex ){ | 
| 264 | + |  | 
| 265 | + | if( have_rigidbodies && rigidBodyIndex < n_rigidbodies ) | 
| 266 | + | rigidBodies[rigidBodyIndex] = the_rigidbody; | 
| 267 | + | else{ | 
| 268 | + | if( have_rigidbodies ){ | 
| 269 | + | sprintf( errMsg, "MoleculeStamp error, %d out of nRigidBodies range", | 
| 270 | + | rigidBodyIndex ); | 
| 271 | + | return strdup( errMsg ); | 
| 272 | + | } | 
| 273 | + | else return strdup("MoleculeStamp error, nRigidBodies not given before" | 
| 274 | + | "first rigidBody declaration." ); | 
| 275 | + | } | 
| 276 | + |  | 
| 277 |  | return NULL; | 
| 278 |  | } | 
| 279 |  |  | 
| 332 |  | char* MoleculeStamp::checkMe( void ){ | 
| 333 |  |  | 
| 334 |  | int i; | 
| 335 | < | short int no_atom; | 
| 335 | > | short int no_atom, no_rigidbody; | 
| 336 | > |  | 
| 337 | > | // Fix for Rigid Bodies!!!  Molecules may not have any atoms that | 
| 338 | > | // they know about.  They might have only rigid bodies (which then | 
| 339 | > | // know about the atoms! | 
| 340 |  |  | 
| 341 | < | if( !have_name || !have_atoms ){ | 
| 342 | < | if( !have_name ) return strdup( "MoleculeStamp error. Molecule's name" | 
| 343 | < | " was not given.\n" ); | 
| 344 | < | else return strdup( "MoleculeStamp error. Molecule contains no atoms." ); | 
| 341 | > |  | 
| 342 | > | if( !have_name ) return strdup( "MoleculeStamp error. Molecule's name" | 
| 343 | > | " was not given.\n" ); | 
| 344 | > |  | 
| 345 | > | if( !have_rigidbodies && !have_atoms ){ | 
| 346 | > | return strdup( "MoleculeStamp error. Molecule contains no atoms or RigidBodies." ); | 
| 347 |  | } | 
| 348 |  |  | 
| 349 | + | no_rigidbody = 0; | 
| 350 | + | for( i=0; i<n_rigidbodies; i++ ){ | 
| 351 | + | if( rigidBodies[i] == NULL ) no_rigidbody = 1; | 
| 352 | + | } | 
| 353 | + |  | 
| 354 | + | if( no_rigidbody ){ | 
| 355 | + | sprintf( errMsg, | 
| 356 | + | "MoleculeStamp error. Not all of the RigidBodies were" | 
| 357 | + | " declared in molecule \"%s\".\n", name ); | 
| 358 | + | return strdup( errMsg ); | 
| 359 | + | } | 
| 360 | + |  | 
| 361 |  | no_atom = 0; | 
| 362 |  | for( i=0; i<n_atoms; i++ ){ | 
| 363 |  | if( atoms[i] == NULL ) no_atom = 1; | 
| 372 |  |  | 
| 373 |  | return NULL; | 
| 374 |  | } | 
| 375 | + |  | 
| 376 | + |  | 
| 377 | + | int MoleculeStamp::getTotAtoms() { | 
| 378 | + | int total_atoms; | 
| 379 | + | int i; | 
| 380 | + |  | 
| 381 | + | total_atoms = n_atoms; | 
| 382 | + |  | 
| 383 | + | if( rigidBodies != NULL ) { | 
| 384 | + | for( i=0; i<n_rigidbodies; i++ ) | 
| 385 | + | total_atoms += rigidBodies[i]->getNAtoms(); | 
| 386 | + | } | 
| 387 | + |  | 
| 388 | + | return total_atoms; | 
| 389 | + | } | 
| 390 | + |  |