ATLAS Offline Software
Loading...
Searching...
No Matches
FPGATrackSimFitConstantBank Class Reference

#include <FPGATrackSimFitConstantBank.h>

Inheritance diagram for FPGATrackSimFitConstantBank:
Collaboration diagram for FPGATrackSimFitConstantBank:

Public Member Functions

 FPGATrackSimFitConstantBank (FPGATrackSimPlaneMap const *pmap, int ncoords, std::string const &fname, bool isFirstStage, float phishift, int missingPlane=-1)
int getBankID () const
int getNConstr () const
int getNCoords () const
int getNPars () const
int getNSectors () const
int getMissingPlane () const
bool getIsGood (sector_t sector) const
float getFitConst (int isec, int ipar) const
float getFitPar (int isec, int ipar, int icoord) const
float getKaverage (int isec, int iconstr) const
float getKernel (int isec, int iconstr, int icoord) const
bool linfit (sector_t sector, FPGATrackSimTrack &track, bool isSecondStage) const
void linfit_chisq (sector_t sector, FPGATrackSimTrack &trk) const
void linfit_pars_eval (sector_t sector, FPGATrackSimTrack &trk) const
int missing_point_guess (sector_t sector, FPGATrackSimTrack &track, bool isFirstStage, bool doExtrapolation) const
void invlinfit (sector_t sector, FPGATrackSimTrack &track, double const *constr) const
 This method uses the track parameters and additional constraints to use the constants to calculate the corresponding hits.
void setIdealCoordFit (bool v)
void setPhiShift (float v)
bool msgLvl (const MSG::Level lvl) const
 Test the output level.
MsgStream & msg () const
 The standard message stream.
MsgStream & msg (const MSG::Level lvl) const
 The standard message stream.
void setLevel (MSG::Level lvl)
 Change the current logging level.

Private Member Functions

void readHeader (std::ifstream &geocfile)
void readSectorInfo (std::ifstream &geocfile)
void calculateMajority ()
void prepareInvFitConstants ()
void initMessaging () const
 Initialize our message level and MessageSvc.

Private Attributes

FPGATrackSimPlaneMap const * m_pmap = nullptr
int m_bankID
int m_nsectors
int m_npars = 0
int m_ncoords
int m_nconstr
int m_npixcy
float m_phiShift
int m_missingPlane
bool m_isIdealCoordFit
std::vector< int > m_missid
std::vector< bool > m_sector_good
vector3D< float > m_fit_pars
vector2D< float > m_fit_const
vector3D< float > m_kernel
vector2D< float > m_kaverage
vector2D< float > m_maj_a
vector3D< float > m_maj_kk
vector3D< float > m_maj_invkk
std::vector< Eigen::MatrixXf, Eigen::aligned_allocator< Eigen::MatrixXf > > m_invfit_consts
vector2D< int > m_WCs
std::string m_nm
 Message source name.
boost::thread_specific_ptr< MsgStream > m_msg_tls
 MsgStream instance (a std::cout like with print-out levels)
std::atomic< IMessageSvc * > m_imsg { nullptr }
 MessageSvc pointer.
std::atomic< MSG::Level > m_lvl { MSG::NIL }
 Current logging level.
std::atomic_flag m_initialized ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
 Messaging initialized (initMessaging)

Detailed Description

Definition at line 23 of file FPGATrackSimFitConstantBank.h.

Constructor & Destructor Documentation

◆ FPGATrackSimFitConstantBank()

FPGATrackSimFitConstantBank::FPGATrackSimFitConstantBank ( FPGATrackSimPlaneMap const * pmap,
int ncoords,
std::string const & fname,
bool isFirstStage,
float phishift,
int missingPlane = -1 )

Definition at line 22 of file FPGATrackSimFitConstantBank.cxx.

22 :
23 AthMessaging ("FPGATrackSimFitConstantBank"),
24 m_pmap(pmap),
25 m_bankID(0),
26 m_nsectors(0),
27 m_ncoords(ncoords),
28 m_nconstr(0),
29 m_npixcy(0),
30 m_phiShift(phishift),
31 m_missingPlane(missingPlane),
32// m_isFirstStage(isFirstStage),
34{
35 std::ifstream geocfile(fname);
36 if (not geocfile.is_open()) {
37 ATH_MSG_WARNING("FitConstants file: " << fname << " cannot be opened");
38 }
39 else {
40 ATH_MSG_INFO("Reading " << fname);
41 // Read the file header
42 readHeader(geocfile);
43 ATH_MSG_INFO("Settings: m_ncoords="<<m_ncoords<<" m_npars="<<m_npars);
44 // Read the sector constants
45 readSectorInfo(geocfile);
46 // Pre-calculate the majority logic elements
47 if (m_missingPlane == -1)
49
50 if (sizeof(float) * CHAR_BIT != 32)
51 ATH_MSG_WARNING("Floating points on this computer are not 32 bit. This may cause a problem for the hardware agreement. Be careful!");
52
53 setIdealCoordFit(true);
55 }
56}
#define ATH_MSG_INFO(x)
#define ATH_MSG_WARNING(x)
AthMessaging()
Default constructor:
void readHeader(std::ifstream &geocfile)
void readSectorInfo(std::ifstream &geocfile)
FPGATrackSimPlaneMap const * m_pmap

Member Function Documentation

◆ calculateMajority()

void FPGATrackSimFitConstantBank::calculateMajority ( )
private

Definition at line 169 of file FPGATrackSimFitConstantBank.cxx.

170{
171
172 for (int isec=0;isec!=m_nsectors;++isec)
173 {
174 // Fill m_maj_a and m_maj_kk
175 for (int ix=0;ix!=m_ncoords;++ix)
176 {
177 for (int row=0;row!=m_nconstr;++row)
178 m_maj_a(isec, ix) += m_kaverage(isec, row) * m_kernel(isec, row, ix);
179 for (int jx=0;jx!=m_ncoords;++jx)
180 {
181 for (int row=0;row!=m_nconstr;++row)
182 m_maj_kk(isec, ix, jx) += m_kernel(isec, row, ix) * m_kernel(isec, row, jx);
183 }
184 }
185
186 // Fill m_maj_invkk
187
188 // Pixel layers (2 coordinates each), assume these come first!
189 for (int ix=0;ix!=m_npixcy;ix+=2)
190 {
191 float det = m_maj_kk(isec, ix, ix) * m_maj_kk(isec, ix+1, ix+1)
192 - m_maj_kk(isec, ix+1, ix) * m_maj_kk(isec, ix, ix+1);
193 if (det == 0) continue;
194
195 m_maj_invkk(isec, ix, ix) = m_maj_kk(isec, ix+1, ix+1)/det;
196 m_maj_invkk(isec, ix, ix+1) = -m_maj_kk(isec, ix+1, ix)/det;
197 m_maj_invkk(isec, ix+1, ix) = -m_maj_kk(isec, ix, ix+1)/det;
198 m_maj_invkk(isec, ix+1, ix+1) = m_maj_kk(isec, ix, ix)/det;
199 }
200
201 // Strip layers (1 coordinate)
202 for (int ix=m_npixcy;ix!=m_ncoords;++ix) {
203 if (m_maj_kk(isec, ix, ix) == 0) continue;
204 m_maj_invkk(isec, ix, ix) = 1./m_maj_kk(isec, ix, ix);
205 }
206 }
207}
row
Appending html table to final .html summary file.

◆ getBankID()

int FPGATrackSimFitConstantBank::getBankID ( ) const
inline

Definition at line 33 of file FPGATrackSimFitConstantBank.h.

33{ return m_bankID; }

◆ getFitConst()

float FPGATrackSimFitConstantBank::getFitConst ( int isec,
int ipar ) const
inline

Definition at line 42 of file FPGATrackSimFitConstantBank.h.

42{ return m_fit_const(isec, ipar); }

◆ getFitPar()

float FPGATrackSimFitConstantBank::getFitPar ( int isec,
int ipar,
int icoord ) const
inline

Definition at line 43 of file FPGATrackSimFitConstantBank.h.

43{ return m_fit_pars(isec, ipar, icoord); }

◆ getIsGood()

bool FPGATrackSimFitConstantBank::getIsGood ( sector_t sector) const
inline

Definition at line 41 of file FPGATrackSimFitConstantBank.h.

41{ return m_sector_good[sector]; }

◆ getKaverage()

float FPGATrackSimFitConstantBank::getKaverage ( int isec,
int iconstr ) const
inline

Definition at line 44 of file FPGATrackSimFitConstantBank.h.

44{ return m_kaverage(isec, iconstr); }

◆ getKernel()

float FPGATrackSimFitConstantBank::getKernel ( int isec,
int iconstr,
int icoord ) const
inline

Definition at line 45 of file FPGATrackSimFitConstantBank.h.

45{ return m_kernel(isec, iconstr, icoord); }

◆ getMissingPlane()

int FPGATrackSimFitConstantBank::getMissingPlane ( ) const
inline

Definition at line 38 of file FPGATrackSimFitConstantBank.h.

38{ return m_missingPlane; }

◆ getNConstr()

int FPGATrackSimFitConstantBank::getNConstr ( ) const
inline

Definition at line 34 of file FPGATrackSimFitConstantBank.h.

34{ return m_nconstr; }

◆ getNCoords()

int FPGATrackSimFitConstantBank::getNCoords ( ) const
inline

Definition at line 35 of file FPGATrackSimFitConstantBank.h.

35{ return m_ncoords; }

◆ getNPars()

int FPGATrackSimFitConstantBank::getNPars ( ) const
inline

Definition at line 36 of file FPGATrackSimFitConstantBank.h.

36{ return m_npars; }

◆ getNSectors()

int FPGATrackSimFitConstantBank::getNSectors ( ) const
inline

Definition at line 37 of file FPGATrackSimFitConstantBank.h.

37{ return m_nsectors; }

◆ initMessaging()

void AthMessaging::initMessaging ( ) const
privateinherited

Initialize our message level and MessageSvc.

This method should only be called once.

Definition at line 39 of file AthMessaging.cxx.

40{
42 // If user did not set an explicit level, set a default
43 if (m_lvl == MSG::NIL) {
44 m_lvl = m_imsg ?
45 static_cast<MSG::Level>( m_imsg.load()->outputLevel(m_nm) ) :
46 MSG::INFO;
47 }
48}
std::string m_nm
Message source name.
std::atomic< IMessageSvc * > m_imsg
MessageSvc pointer.
std::atomic< MSG::Level > m_lvl
Current logging level.
IMessageSvc * getMessageSvc(bool quiet=false)

◆ invlinfit()

void FPGATrackSimFitConstantBank::invlinfit ( sector_t sector,
FPGATrackSimTrack & track,
double const * constr ) const

This method uses the track parameters and additional constraints to use the constants to calculate the corresponding hits.

This method is the base of the patt-from-constant generation.

Definition at line 552 of file FPGATrackSimFitConstantBank.cxx.

553{
554 // vector of the acutal parameters, it is zeroed
555 Eigen::VectorXf pars(m_ncoords);
556
557 for (int ip = 0; ip < m_npars; ++ip)
558 {
559 // The first elements are the track parameters. The track are shifted using the sector constants
560 pars(ip) = track.getParameter(ip) - m_fit_const(sector, ip);
561 if (ip == 2) pars(ip) = remainder(pars(ip), 2.*M_PI);
562 }
563 for (int ic = 0; ic < m_nconstr; ++ic)
564 {
565 // The rest of the paramaters are the external constraints.
566 // The external constraint is also shifted by the kAverage value
567 if (!constr)
568 pars(m_npars+ic) = -m_kaverage(sector, ic);
569 else
570 pars(m_npars+ic) = constr[ic] - m_kaverage(sector, ic);
571 }
572
573 // The raw hits are obtained multiplying the parameters to the inverted constants
574 Eigen::VectorXf rawhits = (m_invfit_consts[sector]) * pars;
575
576 // The hits are assigned to the original track
577 for (int j = 0; j < m_ncoords ; ++j) {
578 int plane = m_pmap->getCoordLayer(j);
579 SiliconTech Tech = m_pmap->getDetType(plane);
580 FPGATrackSimHit hit;
582 hit.setDetType(Tech);
583 hit.setLayer(plane);
584 if (m_WCs(sector,j))
585 hit.setPhiIndex(-1); // to keep track later on, set hit position negative
586 else
587 hit.setPhiIndex(rawhits(j));
588
589 if (Tech == SiliconTech::pixel) {
590 if (m_WCs(sector,j))
591 hit.setEtaIndex(-1); // to keep track later on, set hit position negative
592 else
593 hit.setEtaIndex(rawhits(j+1));
594
595 ++j; // skip a coordinate if doing two at once
596 }
597 track.setFPGATrackSimHit(plane, std::make_shared<FPGATrackSimHit>(std::move(hit)));
598 }
599}
#define M_PI
SiliconTech
std::vector< Eigen::MatrixXf, Eigen::aligned_allocator< Eigen::MatrixXf > > m_invfit_consts
void setLayer(unsigned v)
void setEtaIndex(unsigned v)
void setPhiIndex(unsigned v)
void setHitType(HitType type)
void setDetType(SiliconTech detType)
std::vector< std::string > remainder(const std::vector< std::string > &v1, const std::vector< std::string > &v2)
float j(const xAOD::IParticle &, const xAOD::TrackMeasurementValidation &hit, const Eigen::Matrix3d &jab_inv)
int ic
Definition grepfile.py:33

◆ linfit()

bool FPGATrackSimFitConstantBank::linfit ( sector_t sector,
FPGATrackSimTrack & track,
bool isSecondStage ) const

Definition at line 304 of file FPGATrackSimFitConstantBank.cxx.

305{
306 // Do majority guess if it's needed
307 if (m_missingPlane == -1 && !m_isIdealCoordFit)
308 {
309 int nmissing = track.getNMissing();
310 if (nmissing > 0)
311 {
312 int guess_res = missing_point_guess(sector, track, !isSecondStage, false);
313 if (nmissing != guess_res) return false; // majority failed
314 }
315 }
316
317 // evaluate the chi2
318 linfit_chisq(sector, track);
319
320 // Do the fit
321 linfit_pars_eval(sector, track);
322
323 return true;
324}
void linfit_pars_eval(sector_t sector, FPGATrackSimTrack &trk) const
void linfit_chisq(sector_t sector, FPGATrackSimTrack &trk) const
int missing_point_guess(sector_t sector, FPGATrackSimTrack &track, bool isFirstStage, bool doExtrapolation) const

◆ linfit_chisq()

void FPGATrackSimFitConstantBank::linfit_chisq ( sector_t sector,
FPGATrackSimTrack & trk ) const

we don't want to shift phi for the outer hits in a SP, so check that!

Definition at line 471 of file FPGATrackSimFitConstantBank.cxx.

472{
473 float chi2 = 0;
474
475 for (int i = 0; i < m_nconstr; i++)
476 {
477 float chi_component = m_kaverage(sector, i);
478
479 for (int coord = 0; coord < m_ncoords; coord++) {
480 unsigned layer = m_pmap->getCoordLayer(coord);
481
482 if (m_pmap->getDim(m_pmap->getCoordLayer(coord)) == 2) { // do two at a time if 2d, then skip ahead
483 chi_component += m_kernel(sector, i, coord) * (m_phiShift+trk.getPhiCoord(layer));
484 chi_component += m_kernel(sector, i, coord+1) * trk.getEtaCoord(layer);
485 ++coord;
486 }
487 else { // strip coords
489 float phishift = m_phiShift;
490 auto hitPtr = trk.getFPGATrackSimHitPtrs()[layer];
491 if (!hitPtr) throw std::runtime_error("Null hit pointer in getAccumulatorTerm: tracks should not have unassigned layers");
492 if (((hitPtr->getPhysLayer() %2) == 1) && hitPtr->getHitType() == HitType::spacepoint) phishift = 0.0;
493 chi_component += m_kernel(sector, i, coord) * (phishift+trk.getPhiCoord(layer));
494 }
495 }
496 chi2 += chi_component * chi_component;
497
498 }
499 trk.setChi2(chi2);
500}
double coord
Type of coordination system.
float getEtaCoord(int ilayer) const
const std::vector< std::shared_ptr< const FPGATrackSimHit > > & getFPGATrackSimHitPtrs() const
float getPhiCoord(int ilayer) const
double chi2(TH1 *h0, TH1 *h1)
@ layer
Definition HitInfo.h:79

◆ linfit_pars_eval()

void FPGATrackSimFitConstantBank::linfit_pars_eval ( sector_t sector,
FPGATrackSimTrack & trk ) const

we don't want to shift phi for the outer hits in a SP, so check that!

Definition at line 510 of file FPGATrackSimFitConstantBank.cxx.

511{
512 std::vector<float> pars(m_npars);
513
514 for (int ip = 0; ip < m_npars; ip++)
515 {
516 pars[ip] = m_fit_const(sector, ip);
517
518 for (int coord = 0; coord < m_ncoords; coord++) {
519
521 float phishift = m_phiShift;
522 int layer = m_pmap->getCoordLayer(coord);
523 auto hitPtr = trk.getFPGATrackSimHitPtrs()[layer];
524 if (!hitPtr) throw std::runtime_error("Null hit pointer in getTrackPars: tracks should not have unassigned layers");
525 if (((hitPtr->getPhysLayer() %2) == 1) && hitPtr->getHitType() == HitType::spacepoint) phishift = 0.0;
526
527 pars[ip] += m_fit_pars(sector, ip, coord) * (phishift+trk.getPhiCoord(layer));
528 if (m_pmap->getDim(m_pmap->getCoordLayer(coord)) == 2) { // do two at a time if 2d, then skip ahead
529 pars[ip] += m_fit_pars(sector, ip, coord+1) * trk.getEtaCoord(layer);
530 ++coord;
531 }
532 }
533 }
534
535 trk.setQOverPt(pars[0]);
536 trk.setD0(pars[1]);
537 trk.setPhi(pars[2]-m_phiShift); // angle is moved within -pi to +pi, and shift phi back to the range we want
538 trk.setZ0(pars[3]);
539 trk.setEta(pars[4]);
540 if (trk.getDoDeltaGPhis()) {
541 trk.setQOverPt(trk.getHoughY()/1000.0 - trk.getQOverPt()); // final q/pT = q/pT from HT + delta q/pT
542 trk.setPhi(trk.getHoughX() - trk.getPhi()); // final phi_0 = phi_0 from HT + delta phi_0
543 }
544
545}
float getQOverPt() const
float getHoughX() const
void setQOverPt(float v)
void setPhi(float v, bool ForceRange=true)
bool getDoDeltaGPhis() const
float getHoughY() const

◆ missing_point_guess()

int FPGATrackSimFitConstantBank::missing_point_guess ( sector_t sector,
FPGATrackSimTrack & track,
bool isFirstStage,
bool doExtrapolation ) const

we don't want to shift phi for the outer hits in a SP, so check that!

Definition at line 327 of file FPGATrackSimFitConstantBank.cxx.

328{
329
330 std::vector<int> coordsmask(m_ncoords);
331 std::vector<int> missid;
332
333 // Keep track of which hits are missing
334 int nmissing = 0;
335 std::vector<int> missing_planes;
336 for (int j = 0; j < m_ncoords ; ++j)
337 {
338 coordsmask[j] = (track.getHitMap()>>j) & 1;
339 if (!coordsmask[j]) {
340 int plane = m_pmap->getCoordLayer(j);
341 if(missing_planes.size() == 0) {
342 missing_planes.push_back(plane);
343 }
344 else {
345 for (unsigned k = 0; k < missing_planes.size(); k++) {
346 if(plane == missing_planes[k]) break;
347 if(k == missing_planes.size() - 1) missing_planes.push_back(plane);
348 }
349 }
350 missid.push_back(j);
351 nmissing++;
352 }
353 }
354
355 if(!doExtrapolation){
356 if(isFirstStage){
357 if(missing_planes.size() > 1){
358 ATH_MSG_WARNING("missing_point_guess() Can only guess 1 layer in the first stage");
359 return 0;
360 }
361 if (nmissing > 2){
362 ATH_MSG_WARNING("missing_point_guess() Cannot guess more than two coordinates in the first stage");
363 return 0;
364 }
365 }
366 else{
367 if(missing_planes.size() > 2){
368 ATH_MSG_WARNING("missing_point_guess() Can only guess 2 layers in the second stage");
369 return 0;
370 }
371 if (nmissing > 4){
372 ATH_MSG_WARNING("missing_point_guess() Cannot guess more than four coordinates in the second stage");
373 return 0;
374 }
375 }
376 }
377
378 Eigen::MatrixXd coef(nmissing,nmissing);
379 Eigen::VectorXd a(nmissing);
380
381 for (int i=0; i<nmissing; ++i)
382 {
383 a[i] = -m_maj_a(sector, missid[i]);
384 // complete the calculation with the terms that depend on the known hits
385 for (int col=0; col<m_ncoords; ++col)
386 {
387 if (!coordsmask[col]) continue;
388
390 float phishift = m_phiShift;
391 int layer = m_pmap->getCoordLayer(col);
392 auto hit_ptr = track.getFPGATrackSimHitPtrs()[layer];
393 if (!hit_ptr) throw std::runtime_error("Null hit pointer in FPGATrackSimFitConstantBank: tracks should not have unassigned layers");
394 FPGATrackSimHit hit = *hit_ptr;
395 if (((hit.getPhysLayer() %2) == 1) && hit.getHitType() == HitType::spacepoint) phishift = 0.0;
396
397 a[i] -= m_maj_kk(sector, col, missid[i])*(phishift+track.getPhiCoord(m_pmap->getCoordLayer(col)));
398
399 if (m_pmap->getDim(m_pmap->getCoordLayer(col)) == 2) { // do two at a time if 2d, then skip ahead
400 a[i] -= m_maj_kk(sector, col+1, missid[i])*track.getEtaCoord(m_pmap->getCoordLayer(col));
401 ++col;
402 }
403 }
404
405 for (int j=0; j<nmissing; ++j)
406 {
407 // here for missing pieces need to know the coordinate and sector number only
408 coef(i,j) = m_maj_kk(sector, missid[i], missid[j]);
409 }
410 }
411
412 if (coef.determinant()==0) return -1;
413 Eigen::VectorXd missing_hits = coef.inverse()*a; // our missing hits!
414
415 for(int m=0; m<nmissing; m++){
416
417 int missedplane = m_pmap->getCoordLayer(missid[m]);
418
419 if(m_pmap->getDim(m_pmap->getCoordLayer(missid[m])) == 1){
420
421 FPGATrackSimHit newhit;
422 if(!doExtrapolation)
424 else
427 newhit.setLayer(missedplane);
428 newhit.setSection(0);
429 if (m_isIdealCoordFit) {
430 // TODO: all the missing hit logic will eventually need spacepoint updates.
431 double target_r = track.getIdealRadius(missedplane);
432 newhit.setX(target_r*TMath::Cos(missing_hits[m]));
433 newhit.setY(target_r*TMath::Sin(missing_hits[m]));
434 }
435 else{
436 newhit.setPhiIndex(missing_hits[m]);
437 }
438
439 track.setFPGATrackSimHit(missedplane, std::make_shared<FPGATrackSimHit>(newhit));
440 }
441 else if (m_pmap->getDim(m_pmap->getCoordLayer(missid[m])) == 2){
442
443 FPGATrackSimHit newhit;
444 if(!doExtrapolation)
446 else
449 newhit.setLayer(missedplane);
450 newhit.setSection(0);
451 if (m_isIdealCoordFit) {
452 // TODO This will also eventually ned spacepoint updates.
453 double target_r = track.getIdealRadius(missedplane);
454 newhit.setX(target_r*TMath::Cos(missing_hits[m]));
455 newhit.setY(target_r*TMath::Sin(missing_hits[m]));
456 newhit.setZ(missing_hits[m+1]);
457 }
458 else {
459 newhit.setPhiIndex(missing_hits[m]);
460 newhit.setEtaIndex(missing_hits[m+1]);
461 }
462 m++; //skip ahead
463
464 track.setFPGATrackSimHit(missedplane, std::make_shared<FPGATrackSimHit>(newhit));
465 }
466 }
467
468 return nmissing;
469}
static Double_t a
void setZ(float v)
unsigned getPhysLayer(bool old=false) const
void setX(float v)
void setY(float v)
void setSection(unsigned v)
HitType getHitType() const

◆ msg() [1/2]

MsgStream & AthMessaging::msg ( ) const
inlineinherited

The standard message stream.

Returns a reference to the default message stream May not be invoked before sysInitialize() has been invoked.

Definition at line 167 of file AthMessaging.h.

168{
169 MsgStream* ms = m_msg_tls.get();
170 if (!ms) {
171 if (!m_initialized.test_and_set()) initMessaging();
172 ms = new MsgStream(m_imsg,m_nm);
173 m_msg_tls.reset( ms );
174 }
175
176 ms->setLevel (m_lvl);
177 return *ms;
178}
boost::thread_specific_ptr< MsgStream > m_msg_tls
MsgStream instance (a std::cout like with print-out levels)
void initMessaging() const
Initialize our message level and MessageSvc.

◆ msg() [2/2]

MsgStream & AthMessaging::msg ( const MSG::Level lvl) const
inlineinherited

The standard message stream.

Returns a reference to the default message stream May not be invoked before sysInitialize() has been invoked.

Definition at line 182 of file AthMessaging.h.

183{ return msg() << lvl; }
MsgStream & msg() const
The standard message stream.

◆ msgLvl()

bool AthMessaging::msgLvl ( const MSG::Level lvl) const
inlineinherited

Test the output level.

Parameters
lvlThe message level to test against
Returns
boolean Indicating if messages at given level will be printed
Return values
trueMessages at level "lvl" will be printed

Definition at line 151 of file AthMessaging.h.

152{
153 // If user did not set explicit message level we have to initialize
154 // the messaging and retrieve the default via the MessageSvc.
155 if (m_lvl==MSG::NIL && !m_initialized.test_and_set()) initMessaging();
156
157 if (m_lvl <= lvl) {
158 msg() << lvl;
159 return true;
160 } else {
161 return false;
162 }
163}

◆ prepareInvFitConstants()

void FPGATrackSimFitConstantBank::prepareInvFitConstants ( )
private

Definition at line 211 of file FPGATrackSimFitConstantBank.cxx.

212{
214
215 for (int isec=0;isec!=m_nsectors;++isec)
216 {
217 Eigen::MatrixXf thisMatrix(m_ncoords, m_ncoords);
218
219 // Parameters, by row
220 for (int ip=0;ip!=m_npars;++ip)
221 for (int ix=0;ix!=m_ncoords;++ix)
222 thisMatrix(ip,ix)= (m_fit_pars(isec, ip, ix));
223
224 // Constraints, by row
225 for (int ic=0;ic!=m_nconstr;++ic)
226 for (int ix=0;ix!=m_ncoords;++ix)
227 thisMatrix(ic+m_npars,ix) = m_kernel(isec, ic, ix);
228
229 // reset usable coordinate
230 for (int ix = 0; ix != m_ncoords; ++ix)
231 m_WCs(isec,ix) = 1; // start with all WCs
232
233 // now let's check if we have any "null" row or column, and if so, we will get rid of them temporarily
234 // we don't have access to module/WC information at this stage should just look for non-zero values
235 for (int ix=0;ix!=m_ncoords;++ix) {
236 bool foundrow = false;
237 bool foundcolumn = false;
238 for (int iy=0;iy!=m_ncoords;++iy) {
239 if (abs(thisMatrix(ix,iy)) > MTX_TOLERANCE) foundrow = true;
240 if (abs(thisMatrix(iy,ix)) > MTX_TOLERANCE) foundcolumn = true;
241 }
242 if (foundrow && foundcolumn) m_WCs(isec,ix) = 0;
243 }
244
245 // now count the number of usable entries
246 size_t nDimToUse = 0; for (int ix=0;ix!=m_ncoords;++ix) if(!m_WCs(isec,ix)) ++nDimToUse;
247
248 Eigen::MatrixXf tempMatrix(nDimToUse, nDimToUse); // this is the matrix we will invert
249
250 size_t counteri = 0, counterj = 0;
251 for (int i = 0; i < m_ncoords; i++) {
252 counterj = 0;
253 if (!m_WCs(isec,i)) {
254 for (int j = 0; j < m_ncoords; j++) {
255 if (!m_WCs(isec,j)) {
256 tempMatrix(counteri,counterj) = thisMatrix(i,j); // if we use this coordinate, copy it over
257 counterj++; // iterate counter
258 }
259 }
260 counteri++;
261 }
262 }
263 /* commenting this out for now because it screws up the new 'non-safeguarded' maps
264 // Invert the matrix
265 Eigen::MatrixXf inverted = tempMatrix.inverse();
266
267 // this is the full matrix that includes inverted coordinates plus the padded zeros
268 Eigen::MatrixXf fullInverted(m_ncoords, m_ncoords);
269
270 // now we put things back into the full matrix, adding back the padded zeros
271 counteri = 0; counterj = 0;
272 for (int i = 0; i < m_ncoords; i++) {
273 counterj = 0;
274 if (!m_WCs(isec,i)) {
275 for (int j = 0; j < m_ncoords; j++) {
276 if (!m_WCs(isec,j)) {
277 fullInverted(i,j) = inverted(counteri,counterj); // if we use this coordinate, copy it over
278 counterj++; // iterate counter
279 }
280 else {
281 fullInverted(i,j) = 0;
282 }
283 }
284 counteri++;
285 }
286 else {
287 for (int j = 0; j < m_ncoords; j++) {
288 fullInverted(i,j) = 0;
289 }
290 }
291 }
292 m_invfit_consts[isec]= fullInverted;
293 */
294 }
295}
#define MTX_TOLERANCE

◆ readHeader()

void FPGATrackSimFitConstantBank::readHeader ( std::ifstream & geocfile)
private

Definition at line 60 of file FPGATrackSimFitConstantBank.cxx.

61{
62 std::string key;
63 int ival;
64 int nplanes;
65
66 for (int i = 0; i < 5; ++i) getline(geocfile, key); // skip 5 lines
67
68 geocfile >> key;
69 if (key != "NPLANES") ATH_MSG_ERROR("Invalid file format");
70 geocfile >> nplanes;
71
72 geocfile >> key;
73 if (key!="NSECTORS") ATH_MSG_ERROR("Invalid file format");
74 geocfile >> m_nsectors;
75
76 geocfile >> key;
77 if (key!="NDIM") ATH_MSG_ERROR("Invalid file format");
78 geocfile >> ival;
79
80 // Set derived configuration variables
81 if (ival==1) m_npars = 3;
82 else if (ival==2) m_npars = 5;
83 else ATH_MSG_ERROR("Number of dimensions invalid");
84
85 m_npixcy = 2*(m_ncoords - nplanes); // difference between number of coordinates and planes is number of 2d measurements
87
88 // Allocate the block of pointer per sector
91 m_fit_const.resize(m_nsectors, 5);
94
95 m_WCs.resize(m_nsectors, m_ncoords);
96
97 m_maj_a.resize(m_nsectors, m_ncoords, 0);
100}
#define ATH_MSG_ERROR(x)

◆ readSectorInfo()

void FPGATrackSimFitConstantBank::readSectorInfo ( std::ifstream & geocfile)
private

Definition at line 104 of file FPGATrackSimFitConstantBank.cxx.

105{
106 std::string key;
107 int ival;
108 double dval; // temp value used to conver from double to float
109
110 for (int isec = 0; isec < m_nsectors; ++isec)
111 {
112 // Read sector number
113 geocfile >> key >> ival;
114 if (ival != isec) ATH_MSG_WARNING("Reached sector " << ival << " but expected sector " << isec);
115
116 // Read fit parameters
117 for (int ipar = 0; ipar < m_npars; ++ipar)
118 {
119 geocfile >> key;
120 // no check on key?
121 for (int icoord = 0; icoord < m_ncoords; ++icoord)
122 {
123 geocfile >> dval;
124 if (geocfile.fail())
125 ATH_MSG_WARNING("par loop (1) key=\"" << key << "\" ipar,icoord=" << ipar << "," << icoord);
126
127 if (dval != 0) m_sector_good[isec] = true;
128 m_fit_pars(isec, ipar, icoord) = dval;
129 }
130 }
131
132 // Read k averages
133 geocfile >> key;
134 assert(key=="kaverages");
135 for (int ik=0;ik<m_nconstr;++ik)
136 {
137 geocfile >> dval;
138 if (dval != 0) m_sector_good[isec] = true;
139 m_kaverage(isec,ik) = dval;
140 }
141
142 // Read kernel
143 geocfile >> key;
144 assert(key=="kernel");
145 for (int ik=0;ik<m_nconstr;++ik)
146 {
147 for (int ik2=0;ik2<m_ncoords;++ik2)
148 {
149 geocfile >> dval;
150 if (dval != 0) m_sector_good[isec] = true;
151 m_kernel(isec, ik, ik2) = dval;
152 }
153 }
154
155 // Read fit const
156 for (int ipar=0;ipar<m_npars;++ipar)
157 {
158 geocfile >> key;
159 geocfile >> dval;
160 if (dval != 0) m_sector_good[isec] = true;
161 m_fit_const(isec, ipar) = dval;
162 }
163
164 }
165}

◆ setIdealCoordFit()

void FPGATrackSimFitConstantBank::setIdealCoordFit ( bool v)
inline

Definition at line 56 of file FPGATrackSimFitConstantBank.h.

◆ setLevel()

void AthMessaging::setLevel ( MSG::Level lvl)
inherited

Change the current logging level.

Use this rather than msg().setLevel() for proper operation with MT.

Definition at line 28 of file AthMessaging.cxx.

29{
30 m_lvl = lvl;
31}

◆ setPhiShift()

void FPGATrackSimFitConstantBank::setPhiShift ( float v)
inline

Definition at line 57 of file FPGATrackSimFitConstantBank.h.

57{m_phiShift = v;}

Member Data Documentation

◆ ATLAS_THREAD_SAFE

std::atomic_flag m_initialized AthMessaging::ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT
mutableprivateinherited

Messaging initialized (initMessaging)

Definition at line 141 of file AthMessaging.h.

◆ m_bankID

int FPGATrackSimFitConstantBank::m_bankID
private

Definition at line 66 of file FPGATrackSimFitConstantBank.h.

◆ m_fit_const

vector2D<float> FPGATrackSimFitConstantBank::m_fit_const
private

Definition at line 86 of file FPGATrackSimFitConstantBank.h.

◆ m_fit_pars

vector3D<float> FPGATrackSimFitConstantBank::m_fit_pars
private

Definition at line 85 of file FPGATrackSimFitConstantBank.h.

◆ m_imsg

std::atomic<IMessageSvc*> AthMessaging::m_imsg { nullptr }
mutableprivateinherited

MessageSvc pointer.

Definition at line 135 of file AthMessaging.h.

135{ nullptr };

◆ m_invfit_consts

std::vector<Eigen::MatrixXf, Eigen::aligned_allocator<Eigen::MatrixXf> > FPGATrackSimFitConstantBank::m_invfit_consts
private

Definition at line 94 of file FPGATrackSimFitConstantBank.h.

◆ m_isIdealCoordFit

bool FPGATrackSimFitConstantBank::m_isIdealCoordFit
private

Definition at line 75 of file FPGATrackSimFitConstantBank.h.

◆ m_kaverage

vector2D<float> FPGATrackSimFitConstantBank::m_kaverage
private

Definition at line 88 of file FPGATrackSimFitConstantBank.h.

◆ m_kernel

vector3D<float> FPGATrackSimFitConstantBank::m_kernel
private

Definition at line 87 of file FPGATrackSimFitConstantBank.h.

◆ m_lvl

std::atomic<MSG::Level> AthMessaging::m_lvl { MSG::NIL }
mutableprivateinherited

Current logging level.

Definition at line 138 of file AthMessaging.h.

138{ MSG::NIL };

◆ m_maj_a

vector2D<float> FPGATrackSimFitConstantBank::m_maj_a
private

Definition at line 90 of file FPGATrackSimFitConstantBank.h.

◆ m_maj_invkk

vector3D<float> FPGATrackSimFitConstantBank::m_maj_invkk
private

Definition at line 92 of file FPGATrackSimFitConstantBank.h.

◆ m_maj_kk

vector3D<float> FPGATrackSimFitConstantBank::m_maj_kk
private

Definition at line 91 of file FPGATrackSimFitConstantBank.h.

◆ m_missid

std::vector<int> FPGATrackSimFitConstantBank::m_missid
private

Definition at line 80 of file FPGATrackSimFitConstantBank.h.

◆ m_missingPlane

int FPGATrackSimFitConstantBank::m_missingPlane
private

Definition at line 73 of file FPGATrackSimFitConstantBank.h.

◆ m_msg_tls

boost::thread_specific_ptr<MsgStream> AthMessaging::m_msg_tls
mutableprivateinherited

MsgStream instance (a std::cout like with print-out levels)

Definition at line 132 of file AthMessaging.h.

◆ m_nconstr

int FPGATrackSimFitConstantBank::m_nconstr
private

Definition at line 70 of file FPGATrackSimFitConstantBank.h.

◆ m_ncoords

int FPGATrackSimFitConstantBank::m_ncoords
private

Definition at line 69 of file FPGATrackSimFitConstantBank.h.

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.

◆ m_npars

int FPGATrackSimFitConstantBank::m_npars = 0
private

Definition at line 68 of file FPGATrackSimFitConstantBank.h.

◆ m_npixcy

int FPGATrackSimFitConstantBank::m_npixcy
private

Definition at line 71 of file FPGATrackSimFitConstantBank.h.

◆ m_nsectors

int FPGATrackSimFitConstantBank::m_nsectors
private

Definition at line 67 of file FPGATrackSimFitConstantBank.h.

◆ m_phiShift

float FPGATrackSimFitConstantBank::m_phiShift
private

Definition at line 72 of file FPGATrackSimFitConstantBank.h.

◆ m_pmap

FPGATrackSimPlaneMap const* FPGATrackSimFitConstantBank::m_pmap = nullptr
private

Definition at line 61 of file FPGATrackSimFitConstantBank.h.

◆ m_sector_good

std::vector<bool> FPGATrackSimFitConstantBank::m_sector_good
private

Definition at line 84 of file FPGATrackSimFitConstantBank.h.

◆ m_WCs

vector2D<int> FPGATrackSimFitConstantBank::m_WCs
private

Definition at line 96 of file FPGATrackSimFitConstantBank.h.


The documentation for this class was generated from the following files: