File indexing completed on 2025-08-06 08:17:58
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "Fitter.h"
0010
0011 #include "Track.h"
0012
0013
0014 #include <RVersion.h> // for ROOT_VERSION, ROOT_VERSION...
0015 #include <TGeoManager.h>
0016
0017
0018 #include <GenFit/AbsKalmanFitter.h>
0019 #include <GenFit/DAF.h>
0020 #include <GenFit/EventDisplay.h>
0021 #include <GenFit/FieldManager.h>
0022 #include <GenFit/FitStatus.h>
0023 #include <GenFit/KalmanFitter.h>
0024 #include <GenFit/KalmanFitterRefTrack.h>
0025 #include <GenFit/MaterialEffects.h>
0026 #include <GenFit/TGeoMaterialInterface.h>
0027 #include <GenFit/Track.h>
0028
0029
0030 #include <genfitexp/Field.h>
0031
0032 #include <cassert>
0033 #include <cstddef>
0034 #include <iostream>
0035
0036 namespace genfit
0037 {
0038 class AbsTrackRep;
0039 }
0040
0041 #define LogDEBUG(exp) std::cout << "DEBUG: " << __FILE__ << ": " << __LINE__ << ": " << (exp) << std::endl
0042 #define LogERROR(exp) std::cout << "ERROR: " << __FILE__ << ": " << __LINE__ << ": " << (exp) << std::endl
0043 #define LogWARNING(exp) std::cout << "WARNING: " << __FILE__ << ": " << __LINE__ << ": " << (exp) << std::endl
0044
0045 namespace PHGenFit
0046 {
0047 Fitter::Fitter(
0048 const std::string& tgeo_file_name,
0049 const PHField* field,
0050 const std::string& fitter_choice,
0051 const std::string& ,
0052 const bool doEventDisplay)
0053 : verbosity(1000)
0054 , _doEventDisplay(doEventDisplay)
0055 {
0056 _tgeo_manager = new TGeoManager("Default", "Geane geometry");
0057 TGeoManager::Import(tgeo_file_name.data());
0058
0059 assert(field);
0060 genfit::Field* fieldMap = new genfit::Field(field);
0061
0062 genfit::FieldManager::getInstance()->init(fieldMap);
0063 genfit::MaterialEffects::getInstance()->init(new genfit::TGeoMaterialInterface());
0064
0065
0066 if (_doEventDisplay)
0067 {
0068 _display = genfit::EventDisplay::getInstance();
0069 }
0070 else
0071 {
0072 _display = nullptr;
0073 }
0074
0075
0076 if (fitter_choice.compare("KalmanFitterRefTrack") == 0)
0077 {
0078 _fitter = new genfit::KalmanFitterRefTrack();
0079 }
0080 else if (fitter_choice.compare("KalmanFitter") == 0)
0081
0082 {
0083 _fitter = new genfit::KalmanFitter();
0084 }
0085 else if (fitter_choice.compare("DafSimple") == 0)
0086 {
0087 _fitter = new genfit::DAF(false);
0088 }
0089 else if (fitter_choice.compare("DafRef") == 0)
0090 {
0091 _fitter = new genfit::DAF(true);
0092 }
0093 else
0094
0095 {
0096 _fitter = new genfit::KalmanFitter();
0097 }
0098
0099 genfit::Exception::quiet(true);
0100 }
0101
0102 Fitter::~Fitter()
0103 {
0104 delete _fitter;
0105
0106
0107 delete _display;
0108 }
0109
0110 int Fitter::processTrack(PHGenFit::Track* track, const bool save_to_evt_disp)
0111 {
0112 genfit::Track* fitTrack = track->getGenFitTrack();
0113
0114 #if ROOT_VERSION_CODE >= ROOT_VERSION(6, 00, 0)
0115 try
0116 {
0117 fitTrack->checkConsistency();
0118 }
0119 catch (genfit::Exception& e)
0120 {
0121 if (verbosity >= 2)
0122 {
0123 std::cerr << "genfit::Track::checkConsistency() failed!" << std::endl;
0124 std::cerr << e.what();
0125 }
0126 return -1;
0127 }
0128 #else
0129 if (!fitTrack->checkConsistency())
0130 {
0131 if (verbosity >= 2) LogWARNING("genfit::Track::checkConsistency() failed!");
0132 return -1;
0133 }
0134 #endif
0135 try
0136 {
0137 _fitter->processTrack(fitTrack);
0138 }
0139 catch (genfit::Exception& e)
0140 {
0141 if (verbosity >= 1)
0142 {
0143 std::cerr << "PHGenFit::Fitter::processTrack::Exception: \n";
0144 std::cerr << e.what();
0145 std::cerr << "Exception, next track" << std::endl;
0146 }
0147 return -1;
0148 }
0149 #if ROOT_VERSION_CODE >= ROOT_VERSION(6, 00, 0)
0150 try
0151 {
0152 fitTrack->checkConsistency();
0153 }
0154 catch (genfit::Exception& e)
0155 {
0156 if (verbosity >= 2)
0157 {
0158 std::cerr << "genfit::Track::checkConsistency() failed!" << std::endl;
0159 std::cerr << e.what();
0160 }
0161 return -1;
0162 }
0163 #else
0164
0165 if (!fitTrack->checkConsistency())
0166 {
0167 if (verbosity >= 2) LogWARNING("genfit::Track::checkConsistency() failed!");
0168 return -1;
0169 }
0170 #endif
0171 genfit::AbsTrackRep* rep = fitTrack->getCardinalRep();
0172 if (!fitTrack->getFitStatus(rep)->isFitConverged())
0173 {
0174 if (verbosity >= 2)
0175 {
0176 LogWARNING("Track could not be fitted successfully! Fit is not converged!");
0177 }
0178 return -1;
0179 }
0180
0181 if (_display and save_to_evt_disp)
0182 {
0183 _display->addEvent(track->getGenFitTrack());
0184 }
0185
0186 return 0;
0187 }
0188
0189 Fitter* Fitter::getInstance(const std::string& tgeo_file_name,
0190 const PHField* field,
0191 const std::string& fitter_choice, const std::string& track_rep_choice,
0192 const bool doEventDisplay)
0193 {
0194 TGeoManager* tgeo_manager = TGeoManager::Import(tgeo_file_name.data(), "Default");
0195 if (!tgeo_manager)
0196 {
0197 LogERROR("No TGeoManager found!");
0198 return nullptr;
0199 }
0200
0201 assert(field);
0202 genfit::Field* fieldMap = new genfit::Field(field);
0203 return new Fitter(tgeo_manager, fieldMap, fitter_choice, track_rep_choice, doEventDisplay);
0204 }
0205
0206 Fitter::Fitter(TGeoManager* tgeo_manager, genfit::AbsBField* fieldMap,
0207 const PHGenFit::Fitter::FitterType& fitter_choice,
0208 const PHGenFit::Fitter::TrackRepType& ,
0209 const bool doEventDisplay)
0210 : verbosity(0)
0211 , _tgeo_manager(tgeo_manager)
0212 , _doEventDisplay(doEventDisplay)
0213 {
0214 genfit::FieldManager::getInstance()->init(
0215 fieldMap);
0216 genfit::MaterialEffects::getInstance()->init(
0217 new genfit::TGeoMaterialInterface());
0218
0219
0220 if (_doEventDisplay)
0221 {
0222 _display = genfit::EventDisplay::getInstance();
0223 }
0224 else
0225 {
0226 _display = nullptr;
0227 }
0228
0229
0230 if (fitter_choice == PHGenFit::Fitter::KalmanFitter)
0231 {
0232 _fitter = new genfit::KalmanFitter();
0233 }
0234 else if (fitter_choice == PHGenFit::Fitter::KalmanFitterRefTrack)
0235 {
0236 _fitter = new genfit::KalmanFitterRefTrack();
0237 }
0238 if (fitter_choice == PHGenFit::Fitter::DafSimple)
0239 {
0240 _fitter = new genfit::DAF(false);
0241 }
0242 else if (fitter_choice == PHGenFit::Fitter::DafRef)
0243 {
0244 _fitter = new genfit::DAF(true);
0245 }
0246 else
0247 {
0248 _fitter = nullptr;
0249 LogERROR("This fitter not implemented!");
0250 }
0251 }
0252
0253 Fitter* Fitter::getInstance(TGeoManager* tgeo_manager,
0254 const PHField* field,
0255 const std::string& fitter_choice, const std::string& track_rep_choice,
0256 const bool doEventDisplay)
0257 {
0258 if (!tgeo_manager)
0259 {
0260 LogERROR("No TGeoManager found!");
0261 return nullptr;
0262 }
0263
0264 assert(field);
0265 genfit::Field* fieldMap = new genfit::Field(field);
0266 return new Fitter(tgeo_manager, fieldMap, fitter_choice, track_rep_choice, doEventDisplay);
0267 }
0268
0269 Fitter::Fitter(TGeoManager* tgeo_manager, genfit::AbsBField* fieldMap,
0270 const std::string& fitter_choice, const std::string& ,
0271 const bool doEventDisplay)
0272 : verbosity(0)
0273 , _tgeo_manager(tgeo_manager)
0274 , _doEventDisplay(doEventDisplay)
0275 {
0276 genfit::FieldManager::getInstance()->init(
0277 fieldMap);
0278 genfit::MaterialEffects::getInstance()->init(
0279 new genfit::TGeoMaterialInterface());
0280
0281
0282 if (_doEventDisplay)
0283 {
0284 _display = genfit::EventDisplay::getInstance();
0285 }
0286 else
0287 {
0288 _display = nullptr;
0289 }
0290
0291
0292 if (fitter_choice.compare("KalmanFitterRefTrack") == 0)
0293 {
0294 _fitter = new genfit::KalmanFitterRefTrack();
0295 }
0296 else if (fitter_choice.compare("KalmanFitter") == 0)
0297 {
0298 _fitter = new genfit::KalmanFitter();
0299 }
0300 else if (fitter_choice.compare("DafSimple") == 0)
0301 {
0302 _fitter = new genfit::DAF(false);
0303 }
0304 else if (fitter_choice.compare("DafRef") == 0)
0305 {
0306 _fitter = new genfit::DAF(true);
0307 }
0308 else
0309 {
0310 _fitter = nullptr;
0311 LogERROR("This fitter not implemented!");
0312 }
0313 }
0314
0315 int Fitter::displayEvent()
0316 {
0317 if (_display)
0318 {
0319 _display->open();
0320 }
0321 else if (verbosity >= 0)
0322 {
0323 LogERROR("No genfit::EventDisplay found!");
0324 }
0325
0326 return 0;
0327 }
0328
0329 Fitter* Fitter::getInstance(TGeoManager* tgeo_manager,
0330 const PHField* field,
0331 const PHGenFit::Fitter::FitterType& fitter_choice,
0332 const PHGenFit::Fitter::TrackRepType& track_rep_choice,
0333 const bool doEventDisplay)
0334 {
0335 if (!tgeo_manager)
0336 {
0337 LogERROR("No TGeoManager found!");
0338 return nullptr;
0339 }
0340
0341 assert(field);
0342 genfit::Field* fieldMap = new genfit::Field(field);
0343
0344 return new Fitter(tgeo_manager, fieldMap, fitter_choice, track_rep_choice, doEventDisplay);
0345 }
0346
0347 }