Skip to content
Snippets Groups Projects
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