/* Copyright 2008-2010, Technische Universitaet Muenchen,
Authors: Christian Hoeppner & Sebastian Neubert & Johannes Rauch
This file is part of GENFIT.
GENFIT is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
by the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
GENFIT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with GENFIT. If not, see .
*/
/** @addtogroup genfit
* @{
*/
#ifndef genfit_FieldManager_h
#define genfit_FieldManager_h
#include "AbsBField.h"
#include
#include
#include
#define CACHE
namespace genfit {
#ifdef CACHE
/**
* @brief Cache B field at a position. Used by FieldManager.
*/
struct fieldCache {
double posX; double posY; double posZ;
double Bx; double By; double Bz;
};
#endif
/** @brief Singleton which provides access to magnetic field maps.
*
* @author Christian Höppner (Technische Universität München, original author)
* @author Sebastian Neubert (Technische Universität München, original author)
*/
class FieldManager {
public:
AbsBField* getField(){
checkInitialized();
return field_;
}
//! This does NOT use the cache!
TVector3 getFieldVal(const TVector3& position){
checkInitialized();
return field_->get(position);
}
#ifdef CACHE
void getFieldVal(const double& posX, const double& posY, const double& posZ, double& Bx, double& By, double& Bz);
#else
inline void getFieldVal(const double& posX, const double& posY, const double& posZ, double& Bx, double& By, double& Bz) {
checkInitialized();
return field_->get(posX, posY, posZ, Bx, By, Bz);
}
#endif
//! set the magnetic field here. Magnetic field classes must be derived from AbsBField.
void init(AbsBField* b) {
field_=b;
}
bool isInitialized() { return field_ != NULL; }
void checkInitialized() {
if(! isInitialized()){
std::cerr << "FieldManager hasn't been initialized with a correct AbsBField pointer!" << std::endl;
std::string msg("FieldManager hasn't been initialized with a correct AbsBField pointer!");
std::runtime_error err(msg);
throw err;
}
}
static void checkInstanciated() {
if(instance_==NULL){
std::cerr << "FieldManager hasn't been instantiated yet, call getInstance() and init() before getFieldVal()!" << std::endl;
std::string msg("FieldManager hasn't been instantiated yet, call getInstance() and init() before getFieldVal()!");
std::runtime_error err(msg);
throw err;
}
}
#ifdef CACHE
//! Cache last lookup positions, and use stored field values if a lookup at (almost) the same position is done.
void useCache(bool opt = true, unsigned int nBuckets = 8);
#else
void useCache(bool opt = true, unsigned int nBuckets = 8) {
std::cerr << "genfit::FieldManager::useCache() - FieldManager is compiled w/o CACHE, no caching will be done!" << std::endl;
}
#endif
//! Get singleton instance.
static FieldManager* getInstance(){
if(instance_ == NULL) {
instance_ = new FieldManager();
}
return instance_;
}
private:
FieldManager() {}
#ifdef CACHE
~FieldManager() { delete cache_; }
#else
~FieldManager() { }
#endif
static FieldManager* instance_;
static AbsBField* field_;
#ifdef CACHE
static bool useCache_;
static unsigned int n_buckets_;
static fieldCache* cache_;
#endif
};
} /* End of namespace genfit */
/** @} */
#endif // genfit_FieldManager_h