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

// all includes and forward declarations necessary for non-integral types below
#include <boost/assign.hpp> 
#include <string>
#include <vector>

#include "Parameters/Validators/DummyValidator.hpp"
#include "Parameters/Validators/GenericValidators.hpp"
#include "Parameters/Validators/RangeValidator.hpp"
#include "Parameters/Validators/STLVectorValidator.hpp"
#include "Parameters/Validators/Specific/BoxLengthValidator.hpp"
#include "Parameters/Validators/Specific/ParserTypeValidator.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 (std::string)(double)(int)(bool)(bool)(std::vector<std::string>)(unsigned int)(unsigned int)(bool)
#define paramtokens ("fragment-molecule")("distance")("order")("DoSaturate")("ExcludeHydrogen")("output-types")("grid-level")("inter-order")("DoCyclesFull")
#define paramdescriptions ("prefix of each fragment file")("distance in space up to which fragments are combined")("order of a discretization, dissection, ...")("do saturate dangling bonds with hydrogen")("whether to exclude hydrogen in the bond graph dissection or not")("type(s) of parsers that output fragment config files")("resolution of density sampling multigrid")("up to which order distinct fragments are combined")("always calculate (aromatic) rings fully, even beyond desired order")
#define paramdefaults (PARAM_DEFAULT("BondFragment"))(PARAM_DEFAULT(3.))(PARAM_DEFAULT(3))(PARAM_DEFAULT(true))(PARAM_DEFAULT(true))(NOPARAM_DEFAULT)(PARAM_DEFAULT(5))(PARAM_DEFAULT(0))(PARAM_DEFAULT(false))
#define paramreferences (prefix)(distance)(order)(DoSaturation)(HowtoTreatHydrogen)(types)(level)(InterOrder)(DoCyclesFull)
#define paramvalids \
(DummyValidator< std::string >()) \
(BoxLengthValidator()) \
(DummyValidator< int >()) \
(DummyValidator< bool >()) \
(DummyValidator< bool >()) \
(STLVectorValidator< std::vector<std::string> >(0, 10, ParserTypeValidator())) \
(RangeValidator< unsigned int >(1, 10)) \
(DummyValidator< unsigned int >()) \
(DummyValidator< bool >())

#undef statetypes
#undef statereferences

// some defines for all the names, you may use ACTION, STATE and PARAMS
#define CATEGORY Fragmentation
#define MENUNAME "fragmentation"
#define MENUPOSITION 3
#define ACTIONNAME Fragmentation
#define TOKEN "fragment-molecule"

// finally the information stored in the ActionTrait specialization
#define DESCRIPTION "create for a given molecule into fragments up to given order"
#define SHORTFORM "f"
