void ReferenceArguments::readArgumentsFromPDB( const PDB& pdb ) { ReferenceAtoms* aref=dynamic_cast<ReferenceAtoms*>( this ); arg_names.resize( pdb.getArgumentNames().size() ); for(unsigned i=0; i<arg_names.size(); ++i) arg_names[i]=pdb.getArgumentNames()[i]; if( !aref && arg_names.size()==0 ) error("no arguments in input PDB file"); reference_args.resize( arg_names.size() ); arg_der_index.resize( arg_names.size() ); for(unsigned i=0; i<arg_names.size(); ++i) { if( !pdb.getArgumentValue(arg_names[i], reference_args[i]) ) error("argument " + arg_names[i] + " was not set in pdb input"); arg_der_index[i]=i; } if( hasweights ) { plumed_massert( !hasmetric, "should not have weights if we are using metric"); weights.resize( arg_names.size() ); sqrtweight.resize( arg_names.size() ); for(unsigned i=0; i<reference_args.size(); ++i) { if( !pdb.getArgumentValue("sigma_" + arg_names[i], weights[i]) ) error("value sigma_" + arg_names[i] + " was not set in pdb input"); sqrtweight[i] = sqrt( weights[i] ); } } else if( hasmetric ) { plumed_massert( !hasweights, "should not have weights if we are using metric"); double thissig; metric.resize( arg_names.size(), arg_names.size() ); for(unsigned i=0; i<reference_args.size(); ++i) { for(unsigned j=i; j<reference_args.size(); ++j) { if( !pdb.getArgumentValue("sigma_" + arg_names[i] + "_" + arg_names[j], thissig) ) { error("value sigma_" + arg_names[i] + "_" + arg_names[j] + " was not set in pdb input"); } metric(i,j)=metric(j,i)=thissig; } } } else { weights.resize( arg_names.size() ); sqrtweight.resize( arg_names.size() ); for(unsigned i=0; i<weights.size(); ++i) sqrtweight[i]=weights[i]=1.0; } }
void MultiDomainRMSD::read( const PDB& pdb ) { unsigned nblocks = pdb.getNumberOfAtomBlocks(); if( nblocks<2 ) error("multidomain RMSD only has one block of atoms"); std::vector<Vector> positions; std::vector<double> align, displace; std::string num; blocks.resize( nblocks+1 ); blocks[0]=0; for(unsigned i=0; i<nblocks; ++i) blocks[i+1]=pdb.getAtomBlockEnds()[i]; double tmp, lower=0.0, upper=std::numeric_limits<double>::max( ); if( pdb.getArgumentValue("LOWER_CUTOFF",tmp) ) lower=tmp; if( pdb.getArgumentValue("UPPER_CUTOFF",tmp) ) upper=tmp; bool nopbc=pdb.hasFlag("NOPBC"); domains.resize(0); weights.resize(0); for(unsigned i=1; i<=nblocks; ++i) { Tools::convert(i,num); if( ftype=="RMSD" ) { // parse("TYPE"+num, ftype ); lower=0.0; upper=std::numeric_limits<double>::max( ); if( pdb.getArgumentValue("LOWER_CUTOFF"+num,tmp) ) lower=tmp; if( pdb.getArgumentValue("UPPER_CUTOFF"+num,tmp) ) upper=tmp; nopbc=pdb.hasFlag("NOPBC"); } domains.emplace_back( metricRegister().create<SingleDomainRMSD>( ftype ) ); positions.resize( blocks[i] - blocks[i-1] ); align.resize( blocks[i] - blocks[i-1] ); displace.resize( blocks[i] - blocks[i-1] ); unsigned n=0; for(unsigned j=blocks[i-1]; j<blocks[i]; ++j) { positions[n]=pdb.getPositions()[j]; align[n]=pdb.getOccupancy()[j]; displace[n]=pdb.getBeta()[j]; n++; } domains[i-1]->setBoundsOnDistances( !nopbc, lower, upper ); domains[i-1]->setReferenceAtoms( positions, align, displace ); domains[i-1]->setupRMSDObject(); double ww=0; if( !pdb.getArgumentValue("WEIGHT"+num,ww) ) weights.push_back( 1.0 ); else weights.push_back( ww ); } // And set the atom numbers for this object indices.resize(0); atom_der_index.resize(0); for(unsigned i=0; i<pdb.size(); ++i) { indices.push_back( pdb.getAtomNumbers()[i] ); atom_der_index.push_back(i); } // setAtomNumbers( pdb.getAtomNumbers() ); }