********> bugfix.6 Author: Bill Ross Date: 4/21/02 Programs: Leap Severity: Moderate Description: Missing charges in a prep.in file result in non-0 charges being assigned. Fix: Make the following changes to amber.c: ----------------------------------------------------------------------------- *** OLD amber.c --- NEW amber.c *************** *** 854,860 **** ATOM aMain0, aMain1; BOOL bFirstTime; double da[10]; ! int i, iLen, iErr, iCharge, iCharges = 0; double dCutoff; INPUTLINEt ilLine; int iaTreeStack[500]; --- 854,860 ---- ATOM aMain0, aMain1; BOOL bFirstTime; double da[10]; ! int i, iLen, iErr, iCharge, iCharges = 0, iChgWarn = 0, iAtoms = 0; double dCutoff; INPUTLINEt ilLine; int iaTreeStack[500]; *************** *** 1014,1019 **** --- 1014,1020 ---- continue; } MESSAGE(( "Read atom: %s\n", saStr[2] )); + iAtoms++; /* Create an entry in the vaCoor array */ *************** *** 1107,1116 **** /* Get the coordinates for the atom */ iBond = cPCoor->iBack; ! if ( iRead == 8 ) { bStringToDouble( saStr[5], &dX ); bStringToDouble( saStr[6], &dY ); bStringToDouble( saStr[7], &dZ ); bStringToDouble( saStr[8], &dCharge ); iCharges++; } else { --- 1108,1122 ---- /* Get the coordinates for the atom */ iBond = cPCoor->iBack; ! if ( iRead == 7 ) { bStringToDouble( saStr[5], &dX ); bStringToDouble( saStr[6], &dY ); bStringToDouble( saStr[7], &dZ ); + dCharge = 0.0; + } else if ( iRead == 8 ) { + bStringToDouble( saStr[5], &dX ); + bStringToDouble( saStr[6], &dY ); + bStringToDouble( saStr[7], &dZ ); bStringToDouble( saStr[8], &dCharge ); iCharges++; } else { *************** *** 1144,1150 **** dX = dVX(&vPos); dY = dVY(&vPos); dZ = dVZ(&vPos); ! bStringToDouble( saStr[11], &dCharge ); } if ( iIndex >= iVarArrayElementCount(vaCoor) ) { VarArraySetSize( vaCoor, iIndex+1 ); --- 1150,1163 ---- dX = dVX(&vPos); dY = dVY(&vPos); dZ = dVZ(&vPos); ! if (iRead < 11) ! dCharge = 0.0; ! else { ! bStringToDouble( saStr[11], &dCharge ); ! iCharges++; ! } ! /* printf("--- %f [%d]\n", dCharge, iRead);*/ ! /* %%% */ } if ( iIndex >= iVarArrayElementCount(vaCoor) ) { VarArraySetSize( vaCoor, iIndex+1 ); *************** *** 1180,1185 **** --- 1193,1211 ---- iIndex++; } + if ( iCharges == 0 ) { + VP0(("(no charges read on atoms lines in %s)\n", + sResidueDescription(rRes) )); + } else { + if ( iCharges != iAtoms ) + VP0(( + " WARNING - %d of %d atoms missing charges on atoms lines: %s\n", + iAtoms-iCharges, iAtoms, + sResidueDescription(rRes) )); + iChgWarn = 1; + iCharges = 0; + } + /* Get the last line read which is the first command */ strcpy( sLine, sSave ); *************** *** 1242,1251 **** goto ERROR; } } else if ( strcmp( saStr[1], "CHARGE" )==0 ) { ! if ( iCharges ) VP0(( ! "Warning: per-line charges being overridden by CHARGE block\n" ! )); iCharge = 3; while (1) { FGETS( sLine, fIn ); --- 1268,1277 ---- goto ERROR; } } else if ( strcmp( saStr[1], "CHARGE" )==0 ) { ! if ( iChgWarn ) VP0(( ! "Warning: per-line charges being overridden by CHARGE block in %s\n", ! sResidueDescription(rRes) )); iCharge = 3; while (1) { FGETS( sLine, fIn ); *************** *** 1269,1274 **** --- 1295,1306 ---- iCharge++; } } + if ( iCharge < iAtoms ) { + VP0(( " ERROR - incomplete CHARGE block in: %s: %d/%d\n", + sResidueDescription(rRes), + iCharge, iAtoms )); + goto ERROR; + } } else if ( strcmp( saStr[1], "IMPROPER" )==0 ) { int problem = 0; IMPROPERt Imp; -----------------------------------------------------------------------------