void SecondaryStructureRMSD::setSecondaryStructure( std::vector<Vector>& structure, double bondlength, double units ){ // If we are in natural units get conversion factor from nm into natural length units if( plumed.getAtoms().usingNaturalUnits() ){ error("cannot use this collective variable when using natural units"); } plumed_massert( !(align_strands && align_atom_1==0 && align_atom_2==0), "you must use setAtomsFromStrands with strands cutoff"); // Convert into correct units for(unsigned i=0;i<structure.size();++i){ structure[i][0]*=units; structure[i][1]*=units; structure[i][2]*=units; } if( references.size()==0 ){ finishTaskListUpdate(); readVesselKeywords(); if( getNumberOfVessels()==0 ){ double r0; parse("R_0",r0); double d0; parse("D_0",d0); int nn; parse("NN",nn); int mm; parse("MM",mm); std::ostringstream ostr; ostr<<"RATIONAL R_0="<<r0<<" D_0="<<d0<<" NN="<<nn<<" MM="<<mm; std::string input=ostr.str(); addVessel( "LESS_THAN", input, -1 ); // -1 here means that this value will be named getLabel() readVesselKeywords(); // This makes sure resizing is done } } // Set the reference structure references.push_back( metricRegister().create<SingleDomainRMSD>( alignType ) ); unsigned nn=references.size()-1; std::vector<double> align( structure.size(), 1.0 ), displace( structure.size(), 1.0 ); references[nn]->setBoundsOnDistances( true , bondlength ); // We always use pbc references[nn]->setReferenceAtoms( structure, align, displace ); // references[nn]->setNumberOfAtoms( structure.size() ); }
void MultiReferenceBase::readFrame( PDB& mypdb ) { wasSet=true; // If skipchecks are enabled metric types must be specified in the input file ReferenceConfiguration* mymsd=metricRegister().create<ReferenceConfiguration>( mtype, mypdb ); // Save everything frames.push_back( mymsd ); // Do reading in derived class readRestOfFrame(); // Check readin was succesfull mymsd->checkRead(); }
void MultiReferenceBase::copyFrame( ReferenceConfiguration* frameToCopy ) { // Create a reference configuration of the appropriate type ReferenceConfiguration* mymsd=metricRegister().create<ReferenceConfiguration>( frameToCopy->getName() ); // Copy names of arguments and and indexes mymsd->setNamesAndAtomNumbers( frameToCopy->getAbsoluteIndexes(), frameToCopy->getArgumentNames() ); // Copy reference positions, reference arguments and reference metric mymsd->setReferenceConfig( frameToCopy->getReferencePositions(), frameToCopy->getReferenceArguments(), frameToCopy->getReferenceMetric() ); // Copy weight mymsd->setWeight( frameToCopy->getWeight() ); // Easy bit - copy the frame frames.push_back( mymsd ); // This resizes the low dim array resizeRestOfFrame(); }
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() ); }
void MultiDomainRMSD::read( const PDB& pdb ){ unsigned nblocks = pdb.getNumberOfAtomBlocks(); if( nblocks<2 ) error("multidomain RMSD only has one block of atoms"); std::vector<AtomNumber> atomnumbers; 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 lower=0.0, upper=std::numeric_limits<double>::max( ); parse("LOWER_CUTOFF",lower,true); parse("UPPER_CUTOFF",upper,true); for(unsigned i=1;i<=nblocks;++i){ Tools::convert(i,num); if( ftype=="RMSD" ){ parse("TYPE"+num, ftype ); parse("LOWER_CUTOFF"+num,lower,true); parse("UPPER_CUTOFF"+num,upper,true); } domains.push_back( metricRegister().create<SingleDomainRMSD>( ftype ) ); positions.resize( blocks[i] - blocks[i-1] + 1 ); align.resize( blocks[i] - blocks[i-1] + 1 ); displace.resize( blocks[i] - blocks[i-1] + 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( true, lower, upper ); // Currently no option for nopbc domains[i-1]->setReferenceAtoms( positions, align, displace ); domains[i-1]->setNumberOfAtoms( positions.size() ); double ww=0; parse("WEIGHT"+num, ww, true ); if( ww==0 ) weights.push_back( 1.0 ); else weights.push_back( ww ); } // And set the atom numbers for this object setAtomNumbers( pdb.getAtomNumbers() ); }