36#include "GaudiKernel/IPartPropSvc.h"
43 const float FPGATrackSim_PT_TRUTHMIN = 400.;
44 const float FPGATrackSim_Z_TRUTHMIN = 2300.;
48 base_class(algname, name, ifc)
59 SmartIF<IPartPropSvc> partPropSvc{service(
"PartPropSvc")};
81 return StatusCode::SUCCESS;
86 return StatusCode::SUCCESS;
100 event_info.
setLB(eventInfo->lumiBlock());
101 event_info.
setBCID(eventInfo->bcid());
116 std::vector <FPGATrackSimCluster> clusters;
123 std::vector <FPGATrackSimTruthTrack> truth;
128 std::vector <FPGATrackSimOfflineTrack>
offline;
137 return StatusCode::SUCCESS;
144 ATH_MSG_DEBUG(
"read Offline tracks, size= " << offlineTracksHandle->size());
150 tmpOfflineTrack.
setQOverPt(trackParticle->pt() > 0 ? trackParticle->charge() / trackParticle->pt() : 0);
151 tmpOfflineTrack.
setEta(trackParticle->eta());
152 tmpOfflineTrack.
setPhi(trackParticle->phi());
153 tmpOfflineTrack.
setD0(trackParticle->d0());
154 tmpOfflineTrack.
setZ0(trackParticle->z0());
156 const Trk::TrackStates* trackStates = trackParticle->track()->trackStateOnSurfaces();
157 if (trackStates ==
nullptr) {
159 return StatusCode::FAILURE;
162 if (tsos ==
nullptr)
continue;
165 if (tsos->trackParameters() !=
nullptr &&
166 tsos->trackParameters()->associatedSurface().associatedDetectorElement() !=
nullptr &&
167 tsos->trackParameters()->associatedSurface().associatedDetectorElement()->identify() != 0
183 else if (
m_sctId->is_sct(hitId)) {
191 tmpOfflineHit.
setLocY(-99999.9);
193 tmpOfflineTrack.
addHit(tmpOfflineHit);
197 offline.push_back(tmpOfflineTrack);
201 return StatusCode::SUCCESS;
211 const EventContext& eventContext)
const
214 unsigned int hitIndex = 0u;
219 return StatusCode::SUCCESS;
227 unsigned int& hitIndex,
228 const EventContext& eventContext)
const {
236 if (pixel_rdoCollection ==
nullptr) {
continue; }
249 hitIndexMap[rdoId] = hitIndex;
254 hitIndexMap[tmpId] = hitIndex;
260 InDetSimDataCollection::const_iterator iter(pixelSDOHandle->find(rdoId));
261 if (nCells > 1 && iter == pixelSDOHandle->end()) {
263 for (
int ii = 0; ii < nCells && iter == pixelSDOHandle->end(); ++ii) {
268 if (iter != pixelSDOHandle->end()) { bestTruthLink =
getTruthInformation(iter, parentMask); }
281 int barrel_ec =
m_pixelId->barrel_ec(rdoId);
284 else if (barrel_ec == 2)
286 else if (barrel_ec == -2)
301 tmpSGhit.
setToT(pixelRawData->getToT());
310 tmpSGhit.
setBarcode(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
311 tmpSGhit.
setUniqueID(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
314 tmpSGhit.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
325 eventHeader->
addHit(tmpSGhit);
329 return StatusCode::SUCCESS;
336 unsigned int& hitIndex,
337 const EventContext& eventContext)
const {
339 constexpr int MaxChannelinStripRow = 128;
345 if (SCT_Collection ==
nullptr) {
continue; }
347 std::map<int, bool> firedStrips;
348 std::map<int, const SCT_RDORawData*> firedStripsToRDO;
354 const Identifier rdoId = sctRawData->identify();
355 const int baseLineStrip{
m_sctId->strip(rdoId)};
356 for(
int i = 0; i < sctRawData->getGroupSize(); i++) {
357 firedStrips[baseLineStrip+ i] =
true;
358 firedStripsToRDO[baseLineStrip + i] = sctRawData;
364 std::map<int, int> stripEncodingForITK;
365 std::map<int, const SCT_RDORawData* > stripEncodingForITKToRDO;
366 for(
const auto& [stripID, fired]: firedStrips)
374 std::bitset<3> hitMap;
378 int currChipID = stripID / MaxChannelinStripRow;
380 int maxStripIDForCurrChip = (currChipID + 1) * MaxChannelinStripRow;
382 for(
int i = 0; i < 3; i++)
385 if((stripID + 1 + i) >= maxStripIDForCurrChip)
continue;
387 if(firedStrips.find(stripID + 1 + i) != firedStrips.end())
389 if(firedStrips.at(stripID + 1 + i))
392 firedStrips[stripID + 1 + i] =
false;
402 stripEncodingForITK[stripID] = (int)(hitMap.to_ulong());
403 stripEncodingForITKToRDO[stripID] = firedStripsToRDO[stripID];
407 for(
const auto& [stripID, fired]: firedStrips)
417 std::pair<Amg::Vector3D, Amg::Vector3D> endsOfStrip = sielement->
endsOfStrip(localPos);
419 hitIndexMap[rdoId] = hitIndex;
426 InDetSimDataCollection::const_iterator iter(stripSDOHandle->find(rdoId));
428 if (iter != stripSDOHandle->end()) { bestTruthLink =
getTruthInformation(iter, parentMask); }
440 int barrel_ec =
m_sctId->barrel_ec(rdoId);
443 else if (barrel_ec == 2)
445 else if (barrel_ec == -2)
465 tmpSGhit.
setBarcode(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
466 tmpSGhit.
setUniqueID(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
470 if(stripEncodingForITK.find(stripID) != stripEncodingForITK.end())
474 int chipID = stripID / MaxChannelinStripRow;
475 int ITkStripID = stripID % MaxChannelinStripRow;
481 int offset =
m_sctId->eta_module(rdoId) % 2;
482 if(
m_sctId->barrel_ec(rdoId) == 0) offset = (std::abs(
m_sctId->eta_module(rdoId)) - 1) % 2;
484 ITkStripID += offset * MaxChannelinStripRow;
492 tmpSGhit.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
494 tmpSGhit.
setX(0.5 * (endsOfStrip.first.x() + endsOfStrip.second.x()));
495 tmpSGhit.
setY(0.5 * (endsOfStrip.first.y() + endsOfStrip.second.y()));
496 tmpSGhit.
setZ(0.5 * (endsOfStrip.first.z() + endsOfStrip.second.z()));
506 eventHeader->
addHit(tmpSGhit);
511 return StatusCode::SUCCESS;
517 unsigned int pixelClusterIndex = 0;
521 for (
const InDet::SiClusterCollection* pixelClusterCollection : *pixelClusterContainerHandle) {
522 if (pixelClusterCollection ==
nullptr) {
532 for (
const Identifier& rdoId : cluster->rdoList()) {
538 InDetSimDataCollection::const_iterator iter(pixelSDOHandle->find(rdoId));
540 if (nCells > 1 && iter == pixelSDOHandle->end()) {
542 for (
int ii = 0; ii < nCells && iter == pixelSDOHandle->end(); ++ii) {
550 pixelClusterIndexMap[theId] = pixelClusterIndex;
555 return StatusCode::SUCCESS;
568 for (
const InDet::SiClusterCollection* pixelClusterCollection : *pixelClusterContainerHandler) {
569 if (pixelClusterCollection ==
nullptr) {
573 const int size = pixelClusterCollection->size();
574 ATH_MSG_DEBUG(
"PixelClusterCollection found with " << size <<
" clusters");
581 for (
const Identifier& rdoId : cluster->rdoList()) {
586 InDetSimDataCollection::const_iterator iter(pixelSDOHandle->find(rdoId));
588 if (nCells > 1 && iter == pixelSDOHandle->end()) {
590 for (
int ii = 0; ii < nCells && iter == pixelSDOHandle->end(); ++ii) {
595 if (iter != pixelSDOHandle->end()) { bestTruthLink =
getTruthInformation(iter, parentMask); }
611 clusterEquiv.
setX(globalPos.x());
612 clusterEquiv.
setY(globalPos.y());
613 clusterEquiv.
setZ(globalPos.z());
618 int barrel_ec =
m_pixelId->barrel_ec(theID);
621 else if (barrel_ec == 2)
623 else if (barrel_ec == -2)
634 clusterEquiv.
setPhiWidth(cluster->width().colRow()[1]);
635 clusterEquiv.
setEtaWidth(cluster->width().colRow()[0]);
643 clusterEquiv.
setEventIndex(std::numeric_limits<long>::max());
644 clusterEquiv.
setBarcode(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
645 clusterEquiv.
setUniqueID(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
648 clusterEquiv.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
651 clusters.push_back(clusterOut);
663 if (SCT_Collection ==
nullptr) {
continue; }
665 const Identifier rdoId = sctRawData->identify();
676 InDetSimDataCollection::const_iterator iter(stripSDOHandle->find(rdoId));
678 if (iter != stripSDOHandle->end()) { bestTruthLink =
getTruthInformation(iter, parentMask); }
693 int barrel_ec =
m_sctId->barrel_ec(rdoId);
696 else if (barrel_ec == 2)
698 else if (barrel_ec == -2)
710 clusterEquiv.
setPhiWidth(sctRawData->getGroupSize());
718 clusterEquiv.
setEventIndex(std::numeric_limits<long>::max());
719 clusterEquiv.
setBarcode(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
720 clusterEquiv.
setUniqueID(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
723 clusterEquiv.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
726 clusters.push_back(clusterOut);
731 return StatusCode::SUCCESS;
738 ATH_MSG_DEBUG(
"Dump truth tracks, size " << simTracksHandle->size());
741 for (
unsigned int ievt = 0; ievt < simTracksHandle->size(); ++ievt) {
742 const HepMC::GenEvent* genEvent = simTracksHandle->at(ievt);
744 HepGeom::Point3D<double> primaryVtx(0., 0., 0.);
749 primaryVtx.set(spv->position().x(),
751 spv->position().z());
752 ATH_MSG_DEBUG(
"using signal process vertex for eventIndex " << ievt <<
":"
753 << primaryVtx.x() <<
"\t" << primaryVtx.y() <<
"\t" << primaryVtx.z());
755 for (
const auto& particle: *genEvent) {
756 const int pdgcode = particle->pdg_id();
758 if (particle->production_vertex() ==
nullptr) {
766 float charge = pd->charge();
767 if (pdgcode < 0)
charge *= -1.;
768 if (std::abs(
charge) < 0.5) {
775 const Amg::Vector3D momentum(particle->momentum().px(), particle->momentum().py(), particle->momentum().pz());
776 const Amg::Vector3D position(particle->production_vertex()->position().x(), particle->production_vertex()->position().y(), particle->production_vertex()->position().z());
788 const double track_truth_d0 = tP ? tP->parameters()[
Trk::d0] : 999.;
789 const double track_truth_phi = tP ? tP->parameters()[
Trk::phi] : 999.;
790 const double track_truth_p = (tP && fabs(tP->parameters()[
Trk::qOverP]) > 1.e-8) ?
791 tP->charge() / tP->parameters()[
Trk::qOverP] : 10E7;
792 const double track_truth_x0 = tP ? tP->position().x() : 999.;
793 const double track_truth_y0 = tP ? tP->position().y() : 999.;
794 const double track_truth_z0 = tP ? tP->parameters()[
Trk::z0] : 999.;
795 const double track_truth_q = tP ? tP->charge() : 0.;
796 const double track_truth_sinphi = tP ? std::sin(tP->parameters()[
Trk::phi]) : -1.;
797 const double track_truth_cosphi = tP ? std::cos(tP->parameters()[
Trk::phi]) : -1.;
798 const double track_truth_sintheta = tP ? std::sin(tP->parameters()[
Trk::theta]) : -1.;
799 const double track_truth_costheta = tP ? std::cos(tP->parameters()[
Trk::theta]) : -1.;
800 double truth_d0corr = track_truth_d0 - (primaryVtx.y() * cos(track_truth_phi) - primaryVtx.x() * sin(track_truth_phi));
801 double truth_zvertex = 0.;
802 const HepGeom::Point3D<double> startVertex(particle->production_vertex()->position().x(), particle->production_vertex()->position().y(), particle->production_vertex()->position().z());
804 bool isPrimary =
true;
805 if (std::abs(truth_d0corr) > 2.) { isPrimary =
false; }
809 if (isPrimary && particle->production_vertex()) {
810 const HepGeom::Point3D<double> startVertex(particle->production_vertex()->position().x(), particle->production_vertex()->position().y(), particle->production_vertex()->position().z());
811 if (std::abs(startVertex.z() - truth_zvertex) > 100.) { isPrimary =
false; }
812 if (particle->end_vertex()) {
813 HepGeom::Point3D<double> endVertex(particle->end_vertex()->position().x(), particle->end_vertex()->position().y(), particle->end_vertex()->position().z());
814 if (endVertex.perp() < FPGATrackSim_PT_TRUTHMIN && std::abs(endVertex.z()) < FPGATrackSim_Z_TRUTHMIN) { isPrimary =
false; }
824 tmpSGTrack.
setVtxX(track_truth_x0);
825 tmpSGTrack.
setVtxY(track_truth_y0);
826 tmpSGTrack.
setVtxZ(track_truth_z0);
827 tmpSGTrack.
setD0(track_truth_d0);
828 tmpSGTrack.
setZ0(track_truth_z0);
829 tmpSGTrack.
setVtxZ(primaryVtx.z());
830 tmpSGTrack.
setQ(track_truth_q);
831 tmpSGTrack.
setPX(track_truth_p * (track_truth_cosphi * track_truth_sintheta));
832 tmpSGTrack.
setPY(track_truth_p * (track_truth_sinphi * track_truth_sintheta));
833 tmpSGTrack.
setPZ(track_truth_p * track_truth_costheta);
835 tmpSGTrack.
setStatus(particle->status());
841 truth.push_back(tmpSGTrack);
846 return StatusCode::SUCCESS;
854 const std::vector<InDetSimData::Deposit>& deposits(sdo.
getdeposits());
855 float bestPt{-999.f};
860 if (!particleLink.
isValid()) {
continue; }
861 const float genEta = particleLink->momentum().pseudoRapidity();
862 const float genPt = particleLink->momentum().perp();
868 if (std::fabs(genEta) >
m_maxEta) {
continue; }
870 if (bestPt < genPt) {
872 bestTruthLink = &particleLink;
881 return bestTruthLink;
#define ATH_CHECK
Evaluate an expression and check for errors.
double charge(const T &p)
: FPGATrackSim-specific class to represent an hit in the detector.
ATLAS-specific HepMC functions.
void setClusterEquiv(const FPGATrackSimHit &input)
void setaverageInteractionsPerCrossing(const int &val)
void setBCID(const int &val)
void setLB(const int &val)
void setRunNumber(const unsigned long &val)
void setlevel1TriggerType(const unsigned int &val)
void setactualInteractionsPerCrossing(const int &val)
void setEventNumber(const unsigned long &val)
void setextendedLevel1ID(const unsigned int &val)
void setPhiModule(unsigned v)
void setIdentifierHash(unsigned v)
void setEtaIndex(unsigned v)
void setEventIndex(long v)
void setPhiIndex(unsigned v)
void setStripChipIDForITk(int v)
long getEventIndex() const
void setHitType(HitType type)
float getBarcodePt() const
void setPhiCoord(float v)
void setIdentifier(unsigned int v)
void setBarcode(const HepMcParticleLink::barcode_type &v)
void setisValidForITkHit(bool v)
void setRdoIdentifier(Identifier::value_type v)
void setParentageMask(unsigned long v)
void setBarcodePt(float v)
HepMcParticleLink::barcode_type getBarcode() const
void setLayerDisk(unsigned v)
void setStripHitMapForITk(int v)
void setStripRowIDForITk(int v)
void setEtaCoord(float v)
void setTruth(const FPGATrackSimMultiTruth &v)
void setEtaWidth(unsigned v)
void setPhiWidth(unsigned v)
void setUniqueID(const HepMcParticleLink::barcode_type &v)
void setDetectorZone(DetectorZone detZone)
void setDetType(SiliconTech detType)
void maximize(const FPGATrackSimMultiTruth::Barcode &code, const FPGATrackSimMultiTruth::Weight &weight)
std::pair< unsigned long, unsigned long > Barcode
void setClusterID(int clus)
void setIsBarrel(bool is)
void setTrackNumber(int track)
void setQOverPt(double v)
void addHit(const FPGATrackSimOfflineHit &s)
void addOfflineCluster(const FPGATrackSimCluster &c) const
size_t nTruthTracks() const
size_t nOfflineClusters() const
void addOfflineTrack(const FPGATrackSimOfflineTrack &t) const
void addTruthTrack(const FPGATrackSimTruthTrack &t) const
size_t nOfflineTracks() const
void setUniqueID(const HepMcParticleLink::barcode_type &v)
void setBarcode(const HepMcParticleLink::barcode_type &v)
void setEventIndex(int v)
a link optimized in size for a GenParticle in a McEventCollection
int id() const
Return the id of the target particle.
bool isValid() const
Validity check.
HepMC::ConstGenParticlePtr cptr() const
Dereference.
index_type eventIndex() const
Return the event number of the referenced GenEvent.
int barcode() const
Return the barcode of the target particle.
value_type get_compact() const
Get the compact id.
value_type get_compact() const
Get the compact id.
Identifier32 get_identifier32() const
Get the 32-bit version Identifier, will be invalid if >32 bits needed.
virtual SiCellId connectedCell(const SiReadoutCellId &readoutId, int number) const =0
readout id -> id of connected diodes.
virtual SiLocalPosition localPositionOfCell(const SiCellId &cellId) const =0
readout or diode id -> position.
Identifier for the strip or pixel cell.
Base class for the detector design classes for Pixel and SCT.
Class to hold geometrical description of a silicon detector element.
virtual SiCellId cellIdFromIdentifier(const Identifier &identifier) const override final
SiCellId from Identifier.
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
std::pair< Amg::Vector3D, Amg::Vector3D > endsOfStrip(const Amg::Vector2D &position) const
Special method for SCT to retrieve the two ends of a "strip" Returned coordinates are in global frame...
virtual Identifier identifierFromCellId(const SiCellId &cellId) const override final
Identifier <-> SiCellId (ie strip number or pixel eta_index,phi_index) Identifier from SiCellId (ie s...
Class to represent a position in the natural frame of a silicon sensor, for Pixel and SCT For Pixel: ...
double xPhi() const
position along phi direction:
double xEta() const
position along eta direction:
Identifier for the strip or pixel readout cell.
SiCellId connectedCell(const SiCellId cellId, int number) const
Get the cell ids sharing the readout for this cell.
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
int numberOfConnectedCells(const SiCellId cellId) const
Test if readout cell has more than one diode associated with it.
HepGeom::Point3D< double > globalPosition(const HepGeom::Point3D< double > &localPos) const
transform a reconstruction local position into a global position (inline):
virtual Identifier identify() const override final
identifier of this detector element (inline)
Amg::Vector2D rawLocalPositionOfCell(const SiCellId &cellId) const
Returns position (center) of cell.
virtual Identifier identify() const override final
std::pair< HepMcParticleLink, float > Deposit
const std::vector< Deposit > & getdeposits() const
This class is the pure abstract base class for all fittable tracking measurements.
const LocalParameters & localParameters() const
Interface method to get the LocalParameters.
Class describing the Line to which the Perigee refers to.
Class to handle RIO On Tracks ROT) for InDet and Muons, it inherits from the common MeasurementBase.
Identifier identify() const
return the identifier -extends MeasurementBase
represents the track state (measurement, material, fit parameters and quality) at a surface.
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
bool is_simulation_particle(const T &p)
Method to establish if a particle (or barcode) was created during the simulation (TODO update to be s...
const GenParticle * ConstGenParticlePtr
GenVertex * signal_process_vertex(const GenEvent *e)
const HepMC::GenVertex * ConstGenVertexPtr
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
DataVector< const Trk::TrackStateOnSurface > TrackStates
CurvilinearParametersT< TrackParametersDim, Charged, PlaneSurface > CurvilinearParameters
TrackParticle_v1 TrackParticle
Reference the current persistent version: