-
David Blyth authoredDavid Blyth authored
EICTrack.h 1.55 KiB
#ifndef CTRACK_GLOBALS_HH
#define CTRACK_GLOBALS_HH
#include <map>
#include <string>
#include <AbsBField.h>
namespace eictrack {
class BFieldFactory {
public:
virtual genfit::AbsBField *Create(double *params) = 0;
};
class BField {
public:
static void RegisterType(const std::string &name, BFieldFactory *factory) { factories[name] = factory; }
static genfit::AbsBField *Create(std::string name, double *params) {
if (factories.count(name))
return factories[name]->Create(params);
else
return NULL;
}
static std::vector<std::string> AvailableTypes() {
std::vector<std::string> types;
for (auto nameFactPair : factories) {
types.push_back(nameFactPair.first);
}
return types;
}
private:
static std::map<std::string, BFieldFactory *> factories;
};
} // namespace eictrack
#define BFIELD_TYPE(klass) \
namespace eictrack { \
class klass##Factory : public BFieldFactory { \
public: \
klass##Factory() { BField::RegisterType(#klass, this); } \
genfit::AbsBField *Create(double *params) { return new klass(params); } \
}; \
static klass##Factory global_##klass##Factory; \
}
#endif // CTRACK_GLOBALS_HH