--- trunk/src/selection/SelectionEvaluator.cpp 2005/02/04 22:39:26 288 +++ trunk/src/selection/SelectionEvaluator.cpp 2005/03/11 15:00:20 432 @@ -49,8 +49,10 @@ namespace oopse { namespace oopse { -SelectionEvaluator::SelectionEvaluator(SimInfo* si) : info(si), finder(info), isLoaded_(false){ - +SelectionEvaluator::SelectionEvaluator(SimInfo* si) + : info(si), nameFinder(info), distanceFinder(info), indexFinder(info), isLoaded_(false){ + + nStuntDouble = info->getNGlobalAtoms() + info->getNRigidBodies(); } bool SelectionEvaluator::loadScript(const std::string& filename, const std::string& script) { @@ -84,9 +86,6 @@ void SelectionEvaluator::clearState() { } void SelectionEvaluator::clearState() { - //for (int i = scriptLevelMax; --i >= 0; ) - // stack[i].clear(); - //scriptLevel = 0; error = false; errorMessage = ""; } @@ -102,7 +101,7 @@ bool SelectionEvaluator::loadScriptFileInternal(const } bool SelectionEvaluator::loadScriptFileInternal(const std::string & filename) { - ifstream ifs(filename.c_str()); + std::ifstream ifs(filename.c_str()); if (!ifs.is_open()) { return false; } @@ -181,6 +180,8 @@ void SelectionEvaluator::instructionDispatchLoop(BitSe case Token::name: stack.push(nameInstruction(boost::any_cast(instruction.value))); break; + case Token::index: + stack.push(indexInstruction(instruction.value)); break; case Token::identifier: stack.push(lookupValue(boost::any_cast(instruction.value))); @@ -211,6 +212,7 @@ BitSet SelectionEvaluator::comparatorInstruction(const float comparisonValue = boost::any_cast(instruction.value); float propertyValue; BitSet bs(nStuntDouble); + bs.clearAll(); SimInfo::MoleculeIterator mi; Molecule* mol; @@ -225,7 +227,6 @@ BitSet SelectionEvaluator::comparatorInstruction(const compareProperty(atom, bs, property, comparator, comparisonValue); } - //change the positions of atoms which belong to the rigidbodies for (rb = mol->beginRigidBody(rbIter); rb != NULL; rb = mol->nextRigidBody(rbIter)) { compareProperty(rb, bs, property, comparator, comparisonValue); } @@ -235,17 +236,24 @@ void SelectionEvaluator::compareProperty(StuntDouble* } void SelectionEvaluator::compareProperty(StuntDouble* sd, BitSet& bs, int property, int comparator, float comparisonValue) { - double propertyValue; + double propertyValue = 0.0; switch (property) { case Token::mass: propertyValue = sd->getMass(); break; case Token::charge: - return; - //break; - case Token::dipole: - return; - //break; + if (sd->isAtom()){ + Atom* atom = static_cast(sd); + propertyValue = getCharge(atom); + } else if (sd->isRigidBody()) { + RigidBody* rb = static_cast(sd); + RigidBody::AtomIterator ai; + Atom* atom; + for (atom = rb->beginAtom(ai); atom != NULL; atom = rb->nextAtom(ai)) { + propertyValue+= getCharge(atom); + } + } + break; default: unrecognizedAtomProperty(property); } @@ -277,14 +285,19 @@ void SelectionEvaluator::withinInstruction(const Token } void SelectionEvaluator::withinInstruction(const Token& instruction, BitSet& bs){ - + boost::any withinSpec = instruction.value; + float distance; if (withinSpec.type() == typeid(float)){ - // - return; + distance = boost::any_cast(withinSpec); + } else if (withinSpec.type() == typeid(int)) { + distance = boost::any_cast(withinSpec); + } else { + evalError("casting error in withinInstruction"); + bs.clearAll(); } - evalError("Unrecognized within parameter"); + bs = distanceFinder.find(bs, distance); } void SelectionEvaluator::define() { @@ -292,7 +305,7 @@ void SelectionEvaluator::define() { std::string variable = boost::any_cast(statement[1].value); - variables.insert(std::make_pair(variable, expression(statement, 2))); + variables.insert(VariablesType::value_type(variable, expression(statement, 2))); } @@ -311,7 +324,7 @@ void SelectionEvaluator::predefine(const std::string& int tok = statement[1].tok; if (tok == Token::identifier || (tok & Token::predefinedset) == Token::predefinedset) { std::string variable = boost::any_cast(statement[1].value); - variables.insert(std::make_pair(variable, statement)); + variables.insert(VariablesType::value_type(variable, statement)); } else { evalError("invalid variable name:" + script); @@ -334,24 +347,27 @@ BitSet SelectionEvaluator::lookupValue(const std::stri BitSet SelectionEvaluator::lookupValue(const std::string& variable){ + BitSet bs(nStuntDouble); std::map::iterator i = variables.find(variable); - + if (i != variables.end()) { if (i->second.type() == typeid(BitSet)) { return boost::any_cast(i->second); } else if (i->second.type() == typeid(std::vector)){ - BitSet bs = expression(boost::any_cast >(i->second), 2); + bs = expression(boost::any_cast >(i->second), 2); i->second = bs; /**@todo fixme */ return bs; } } else { unrecognizedIdentifier(variable); } + + return bs; } BitSet SelectionEvaluator::nameInstruction(const std::string& name){ - return finder.match(name); + return nameFinder.match(name); } @@ -375,14 +391,59 @@ BitSet SelectionEvaluator::evaluate() { BitSet SelectionEvaluator::evaluate() { BitSet bs(nStuntDouble); if (isLoaded_) { + pc = 0; instructionDispatchLoop(bs); } return bs; } - -//BitSet SelectionEvaluator::evaluate(int frameNo) { -// -//} +BitSet SelectionEvaluator::indexInstruction(const boost::any& value) { + BitSet bs(nStuntDouble); + + if (value.type() == typeid(int)) { + int index = boost::any_cast(value); + if (index < 0 || index >= bs.size()) { + invalidIndex(index); + } else { + bs = indexFinder.find(index); + } + } else if (value.type() == typeid(std::pair)) { + std::pair indexRange= boost::any_cast >(value); + assert(indexRange.first <= indexRange.second); + if (indexRange.first < 0 || indexRange.second >= bs.size()) { + invalidIndexRange(indexRange); + }else { + bs = indexFinder.find(indexRange.first, indexRange.second); + } + } + + return bs; } + + +double SelectionEvaluator::getCharge(Atom* atom) { + double charge =0.0; + AtomType* atomType = atom->getAtomType(); + if (atomType->isCharge()) { + GenericData* data = atomType->getPropertyByName("Charge"); + if (data != NULL) { + DoubleGenericData* doubleData= dynamic_cast(data); + + if (doubleData != NULL) { + charge = doubleData->getData(); + + } else { + sprintf( painCave.errMsg, + "Can not cast GenericData to DoubleGenericData\n"); + painCave.severity = OOPSE_ERROR; + painCave.isFatal = 1; + simError(); + } + } + } + + return charge; +} + +}