/*
 * FillWithMoleculeAction.def
 *
 *  Created on: Aug 26, 2010
 *      Author: heber
 */

// all includes and forward declarations necessary for non-integral types below
#include <boost/assign.hpp>
#include <boost/filesystem/path.hpp>
#include <vector>
#include "LinearAlgebra/Vector.hpp"

#include "Parameters/Validators/DiscreteValidator.hpp"
#include "Parameters/Validators/DummyValidator.hpp"
#include "Parameters/Validators/Ops_Validator.hpp"
#include "Parameters/Validators/Specific/BoxLengthValidator.hpp"
#include "Parameters/Validators/Specific/BoxVectorValidator.hpp"
#include "Parameters/Validators/Specific/FilePresentValidator.hpp"
#include "Parameters/Validators/Specific/ParserFileValidator.hpp"

// i.e. there is an integer with variable name Z that can be found in
// ValueStorage by the token "Z" -> first column: int, Z, "Z"
// "undefine" if no parameters are required, use (NOPARAM_DEFAULT) for each (undefined) default value
#define paramtypes (boost::filesystem::path)(Vector)(double)(double)(double)(double)(bool)
#define paramtokens ("fill-molecule")("distances")("distance-to-molecule")("random-atom-displacement")("random-molecule-displacement")("MaxDistance")("DoRotate")
#define paramdescriptions ("name of xyz file of filler molecule")("list of three of distances in space, one for each axis direction")("minimum distance to present molecules")("magnitude of random atom displacement")("magnitude of random molecule displacement")("maximum spatial distance")("whether to rotate or not")
#define paramdefaults (NOPARAM_DEFAULT)(NOPARAM_DEFAULT)(PARAM_DEFAULT(0.))(PARAM_DEFAULT(0.))(PARAM_DEFAULT(0.))(PARAM_DEFAULT(0.))(PARAM_DEFAULT(false))
#define paramreferences (fillername)(distances)(boundary)(RandAtomDisplacement)(RandMoleculeDisplacement)(MaxDistance)(DoRotate)
#define paramvalids \
(FilePresentValidator() && ParserFileValidator()) \
(BoxVectorValidator()) \
(BoxLengthValidator()) \
(BoxLengthValidator()) \
(BoxLengthValidator()) \
(BoxLengthValidator() || DiscreteValidator<double>(std::vector<double>(1,-1.))) \
(DummyValidator< bool >())

#define statetypes (std::vector<molecule *>)
#define statereferences (fillermolecules)

// some defines for all the names, you may use ACTION, STATE and PARAMS
#define CATEGORY Molecule
#define MENUNAME "molecule"
#define MENUPOSITION 4
#define ACTIONNAME FillWithMolecule
#define TOKEN "fill-molecule"


// finally the information stored in the ActionTrait specialization
#define DESCRIPTION "fill around molecules' surface with a filler molecule"
#define SHORTFORM "F"

