Skip to content
Snippets Groups Projects
EICTrack.h 1.55 KiB
Newer Older
  • Learn to ignore specific revisions
  • David Blyth's avatar
    David Blyth committed
    #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