22 #include "art_root_io/TFileService.h" 57 #include "CLHEP/Random/RandFlat.h" 58 #include "CLHEP/Random/RandGaussQ.h" 112 const double* xyz1 = h1->
XYZ();
113 const double* xyz2 = h2->
XYZ();
114 return xyz1[2] < xyz2[2];
127 ,
fPosErr{pset.get<std::vector<double>>(
"PosErr3")}
128 ,
fMomErr{pset.get<std::vector<double>>(
"MomErr3")}
129 ,
fMomStart{pset.get<std::vector<double>>(
"MomStart3")}
136 produces<std::vector<recob::Track>>();
137 produces<std::vector<recob::SpacePoint>>();
138 produces<art::Assns<recob::Track, recob::Cluster>>();
139 produces<art::Assns<recob::Track, recob::SpacePoint>>();
140 produces<art::Assns<recob::Track, recob::Hit>>();
148 stMCT =
new TMatrixT<Double_t>(5, 1);
149 covMCT =
new TMatrixT<Double_t>(5, 5);
150 stREC =
new TMatrixT<Double_t>(5, 1);
151 covREC =
new TMatrixT<Double_t>(5, 5);
153 fpMCT =
new Float_t[4];
154 fpREC =
new Float_t[4];
163 tree = tfs->make<TTree>(
"GENFITttree",
"GENFITttree");
166 tree->Branch(
"stMCT",
"TMatrixD", &
stMCT, 64000, 0);
168 tree->Branch(
"covMCT",
"TMatrixD", &covMCT, 64000, 0);
170 tree->Branch(
"stREC",
"TMatrixD", &stREC, 64000, 0);
172 tree->Branch(
"covREC",
"TMatrixD", &covREC, 64000, 0);
174 tree->Branch(
"chi2", &
chi2,
"chi2/F");
175 tree->Branch(
"nfail", &
nfail,
"nfail/I");
176 tree->Branch(
"ndf", &
ndf,
"ndf/I");
177 tree->Branch(
"evtNo", &
evtt,
"evtNo/I");
180 tree->Branch(
"trkNo", &
nTrks,
"trkNo/I");
182 tree->Branch(
"shx",
fshx,
"shx[ptsNo]/F");
183 tree->Branch(
"shy",
fshy,
"shy[ptsNo]/F");
184 tree->Branch(
"shz",
fshz,
"shz[ptsNo]/F");
186 tree->Branch(
"pMCT", fpMCT,
"pMCT[4]/F");
187 tree->Branch(
"pRECKalF",
fpREC,
"pRECKalF[4]/F");
188 tree->Branch(
"pRECKalL",
fpRECL,
"pRECKalL[4]/F");
207 CLHEP::RandGaussQ gauss(
fEngine);
213 std::unique_ptr<std::vector<recob::Track>> tcol(
new std::vector<recob::Track>);
214 std::unique_ptr<std::vector<recob::SpacePoint>> spcol(
new std::vector<recob::SpacePoint>);
215 std::unique_ptr<art::Assns<recob::Track, recob::SpacePoint>> tspassn(
217 std::unique_ptr<art::Assns<recob::Track, recob::Cluster>> tcassn(
219 std::unique_ptr<art::Assns<recob::Track, recob::Hit>> thassn(
235 for (
unsigned int ii = 0; ii < mctruthListHandle->size(); ++ii) {
242 std::vector<art::Ptr<recob::SpacePoint>> spacepoints;
246 <<
"There are " << trackListHandle->size()
247 <<
" Track3Dreco/SpacePt tracks/groups (whichever) in this event.";
253 for (
unsigned int ii = 0; ii < trackListHandle->size(); ++ii) {
271 for (
unsigned int ii = 0; ii < mclist.
size(); ++ii) {
274 for (
int jj = 0; jj < mc->
NParticles(); ++jj) {
277 <<
"FROM MC TRUTH, the particle's pdg code is: " <<
part.PdgCode()
278 <<
" with energy = " <<
part.E() <<
", with energy = " <<
part.E()
279 <<
" and vtx and momentum in Global (not volTPC) coords are ";
294 mf::LogInfo(
"Track3DKalman: ") <<
" repMC, covMC are ... ";
303 while (trackIter != trackIn.
end()) {
305 spacepoints = fmsp.at(
nTrks);
307 mf::LogInfo(
"Track3DKalman: ") <<
"found " << spacepoints.size() <<
" 3D spacepoint(s).";
310 if (spacepoints.size() > 0) {
312 const double resolution = 0.5;
319 momM.SetX(gauss.fire(momM.X(), momErr.X() ));
320 momM.SetY(gauss.fire(momM.Y(), momErr.Y() ));
321 momM.SetZ(gauss.fire(momM.Z(), momErr.Z() ));
324 std::sort(spacepoints.begin(), spacepoints.end(),
sp_sort_3dz);
334 (TVector3)(spacepoints[0]->XYZ()),
347 for (
unsigned int point = 0; point < spacepoints.size(); ++point) {
349 TVector3 spt3(spacepoints[point]->XYZ());
352 TVector3 magNew(spt3[0], spt3[1], spt3[2]);
353 TVector3 magLast(spacepoints.back()->XYZ()[0],
354 spacepoints.back()->XYZ()[1],
355 spacepoints.back()->XYZ()[2]);
356 if (!(magNew.Mag() >= magLast.Mag() + eps || magNew.Mag() <= magLast.Mag() - eps))
375 <<
"ihit xyz..." << spt3[0] <<
"," << spt3[1] <<
"," << spt3[2];
393 mf::LogError(
"Track3DKalman: ") <<
"just caught a GFException." << std::endl;
396 <<
"Exceptions won't be further handled ->exit(1) " << __LINE__;
403 MF_LOG_DEBUG(
"Track3DKalman: ") << __FILE__ <<
" " << __LINE__;
404 MF_LOG_DEBUG(
"Track3DKalman: ") <<
"Track3DKalman.cxx: Original plane:";
407 MF_LOG_DEBUG(
"Track3DKalman: ") <<
"Current (fit) reference Plane:";
410 MF_LOG_DEBUG(
"Track3DKalman: ") <<
"Track3DKalman.cxx: Last reference Plane:";
415 MF_LOG_DEBUG(
"Track3DKalman: ") <<
"Track3DKalman: Original hit plane (not " 416 "surprisingly) not current reference Plane!" 425 MF_LOG_DEBUG(
"Track3DKalman: ") <<
" Final State and Cov:";
433 TVector3 dircoss = (*trackIter)->VertexDirection<TVector3>();
435 for (
int ii = 0; ii < 3; ++ii) {
436 fpMCT[ii] = MCMomentum[ii] / MCMomentum.Mag();
441 fpMCT[3] = MCMomentum.Mag();
442 fpREC[3] = -1.0 / (*stREC)[0][0];
446 <<
"Track3DKalman about to do tree->Fill(). Chi2/ndf is " <<
chi2 /
ndf 447 <<
". All in volTPC coords .... pMCT[0-3] is " <<
fpMCT[0] <<
", " <<
fpMCT[1] <<
", " 449 <<
", " <<
fpREC[2] <<
", " <<
fpREC[3] <<
".";
454 std::vector<art::Ptr<recob::Cluster>> clusters = fmc.at(
nTrks);
455 std::vector<art::Ptr<recob::Hit>>
hits = fmh.at(
nTrks);
458 std::vector<TVector3> dircos(spacepoints.size());
459 dircos[0] = TVector3(fpREC);
460 dircos.back() = TVector3(
fpRECL);
463 std::vector<TVector3> xyz(spacepoints.size());
464 size_t spStart = spcol->size();
465 for (
size_t tv = 0; tv < spacepoints.size(); ++tv) {
466 xyz[tv] = TVector3(spacepoints[tv]->XYZ());
467 spcol->push_back(*(spacepoints[tv].
get()));
469 size_t spEnd = spcol->size();
495 if (trackIter != trackIn.
end()) trackIter++;
501 evt.
put(std::move(tcol));
502 evt.
put(std::move(spcol));
503 evt.
put(std::move(tcassn));
504 evt.
put(std::move(thassn));
505 evt.
put(std::move(tspassn));
std::string fG4ModuleLabel
unsigned int getNDF() const
base_engine_t & createEngine(seed_t seed)
std::string GetLArTPCVolumeName(TPCID const &tpcid=tpc_zero) const
Return the name of specified LAr TPC volume.
static bool sp_sort_3dz(const art::Ptr< recob::SpacePoint > &h1, const art::Ptr< recob::SpacePoint > &h2)
const GFDetPlane & getReferencePlane() const
GFDetPlane getLastPlane() const
MaybeLogger_< ELseverityLevel::ELsev_info, false > LogInfo
std::vector< Vector_t > convertCollToVector(std::vector< Vector > const &coll)
Declaration of signal hit object.
EDProducer(fhicl::ParameterSet const &pset)
std::vector< double > fMomStart
TrackTrajectory::Flags_t Flags_t
ROOT::Math::SMatrix< Double32_t, 5, 5, ROOT::Math::MatRepSym< Double32_t, 5 >> SMatrixSym55
void Print(std::ostream &out=std::cout) const
const TMatrixT< Double_t > & getState() const
MaybeLogger_< ELseverityLevel::ELsev_error, false > LogError
std::vector< double > fMomErr
genf::GFAbsTrackRep * rep
Base Class for genfit track representations. Defines interface for track parameterizations.
PutHandle< PROD > put(std::unique_ptr< PROD > &&edp, std::string const &instance={})
TVector3 getNormal() const
typename data_t::const_iterator const_iterator
#define DEFINE_ART_MODULE(klass)
void push_back(Ptr< U > const &p)
A trajectory in space reconstructed from hits.
void setNumIterations(Int_t i)
Set number of iterations for Kalman Filter.
int getFailedHits(int repId=-1)
return the number of failed Hits in track fit repId == -1 will use cardinal rep
void processTrack(GFTrack *)
Performs fit on a GFTrack.
Provides recob::Track data product.
static GFFieldManager * getInstance()
std::string fGenieGenModuleLabel
genf::GFAbsTrackRep * repMC
const Double32_t * XYZ() const
std::vector< Point_t > convertCollToPoint(std::vector< Point > const &coll)
Declaration of cluster object.
const TMatrixT< Double_t > & getCov() const
Track3DKalman(fhicl::ParameterSet const &pset)
An art service to assist in the distribution of guaranteed unique seeds to all engines within an art ...
const char * what() const noexcept override
standard error message handling for exceptions. use like "std::cerr << e.what();" ...
const simb::MCParticle & GetParticle(int i) const
bool CreateAssn(art::Event &evt, std::vector< T > const &a, art::Ptr< U > const &b, art::Assns< U, T > &assn, std::string a_instance, size_t index=UINT_MAX)
Creates a single one-to-one association.
bool getByLabel(std::string const &label, std::string const &instance, Handle< PROD > &result) const
Utility object to perform functions of association.
std::string fSpacePtsModuleLabel
Exception class for error handling in GENFIT (provides storage for diagnostic information) ...
TMatrixT< Double_t > * stMCT
void produce(art::Event &evt) override
TMatrixT< Double_t > * stREC
void init(GFAbsBField *b)
set the magntic field here. Magnetic field classes must be derived from GFAbsBField ...
EventNumber_t event() const
CLHEP::HepRandomEngine & fEngine
void addHit(GFAbsRecoHit *theHit)
deprecated!
std::vector< double > fPosErr
art framework interface to geometry description
Track from a non-cascading particle.A recob::Track consists of a recob::TrackTrajectory, plus additional members relevant for a "fitted" track:
TMatrixT< Double_t > * covMCT
TMatrixT< Double_t > * covREC