38#include "GaudiKernel/IPartPropSvc.h"
45 const float FPGATrackSim_PT_TRUTHMIN = 400.;
46 const float FPGATrackSim_Z_TRUTHMIN = 2300.;
50 base_class(algname, name, ifc)
61 SmartIF<IPartPropSvc> partPropSvc{service(
"PartPropSvc")};
83 return StatusCode::SUCCESS;
88 return StatusCode::SUCCESS;
102 event_info.
setLB(eventInfo->lumiBlock());
103 event_info.
setBCID(eventInfo->bcid());
118 std::vector <FPGATrackSimCluster> clusters;
125 std::vector <FPGATrackSimTruthTrack> truth;
130 std::vector <FPGATrackSimOfflineTrack>
offline;
139 return StatusCode::SUCCESS;
146 ATH_MSG_DEBUG(
"read Offline tracks, size= " << offlineTracksHandle->size());
152 tmpOfflineTrack.
setQOverPt(trackParticle->pt() > 0 ? trackParticle->charge() / trackParticle->pt() : 0);
153 tmpOfflineTrack.
setEta(trackParticle->eta());
154 tmpOfflineTrack.
setPhi(trackParticle->phi());
155 tmpOfflineTrack.
setD0(trackParticle->d0());
156 tmpOfflineTrack.
setZ0(trackParticle->z0());
158 const Trk::TrackStates* trackStates = trackParticle->track()->trackStateOnSurfaces();
159 if (trackStates ==
nullptr) {
161 return StatusCode::FAILURE;
164 if (tsos ==
nullptr)
continue;
167 if (tsos->trackParameters() !=
nullptr &&
168 tsos->trackParameters()->associatedSurface().associatedDetectorElement() !=
nullptr &&
169 tsos->trackParameters()->associatedSurface().associatedDetectorElement()->identify() != 0
185 else if (
m_sctId->is_sct(hitId)) {
193 tmpOfflineHit.
setLocY(-99999.9);
195 tmpOfflineTrack.
addHit(tmpOfflineHit);
199 offline.push_back(tmpOfflineTrack);
203 return StatusCode::SUCCESS;
213 const EventContext& eventContext)
const
216 unsigned int hitIndex = 0u;
221 return StatusCode::SUCCESS;
229 unsigned int& hitIndex,
230 const EventContext& eventContext)
const {
238 if (pixel_rdoCollection ==
nullptr) {
continue; }
251 hitIndexMap[rdoId] = hitIndex;
256 hitIndexMap[tmpId] = hitIndex;
262 InDetSimDataCollection::const_iterator iter(pixelSDOHandle->find(rdoId));
263 if (nCells > 1 && iter == pixelSDOHandle->end()) {
265 for (
int ii = 0; ii < nCells && iter == pixelSDOHandle->end(); ++ii) {
270 if (iter != pixelSDOHandle->end()) { bestTruthLink =
getTruthInformation(iter, parentMask); }
283 int barrel_ec =
m_pixelId->barrel_ec(rdoId);
286 else if (barrel_ec == 2)
288 else if (barrel_ec == -2)
303 tmpSGhit.
setToT(pixelRawData->getToT());
312 tmpSGhit.
setBarcode(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
313 tmpSGhit.
setUniqueID(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
316 tmpSGhit.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
327 eventHeader->
addHit(tmpSGhit);
331 return StatusCode::SUCCESS;
338 unsigned int& hitIndex,
339 const EventContext& eventContext)
const {
341 constexpr int MaxChannelinStripRow = 128;
347 if (SCT_Collection ==
nullptr) {
continue; }
349 std::map<int, bool> firedStrips;
350 std::map<int, const SCT_RDORawData*> firedStripsToRDO;
356 const Identifier rdoId = sctRawData->identify();
357 const int baseLineStrip{
m_sctId->strip(rdoId)};
358 for(
int i = 0; i < sctRawData->getGroupSize(); i++) {
359 firedStrips[baseLineStrip+ i] =
true;
360 firedStripsToRDO[baseLineStrip + i] = sctRawData;
366 std::map<int, int> stripEncodingForITK;
367 std::map<int, const SCT_RDORawData* > stripEncodingForITKToRDO;
368 for(
const auto& [stripID, fired]: firedStrips)
376 std::bitset<3> hitMap;
380 int currChipID = stripID / MaxChannelinStripRow;
382 int maxStripIDForCurrChip = (currChipID + 1) * MaxChannelinStripRow;
384 for(
int i = 0; i < 3; i++)
387 if((stripID + 1 + i) >= maxStripIDForCurrChip)
continue;
389 if(firedStrips.find(stripID + 1 + i) != firedStrips.end())
391 if(firedStrips.at(stripID + 1 + i))
394 firedStrips[stripID + 1 + i] =
false;
404 stripEncodingForITK[stripID] = (int)(hitMap.to_ulong());
405 stripEncodingForITKToRDO[stripID] = firedStripsToRDO[stripID];
409 for(
const auto& [stripID, fired]: firedStrips)
419 std::pair<Amg::Vector3D, Amg::Vector3D> endsOfStrip = sielement->
endsOfStrip(localPos);
421 hitIndexMap[rdoId] = hitIndex;
428 InDetSimDataCollection::const_iterator iter(stripSDOHandle->find(rdoId));
430 if (iter != stripSDOHandle->end()) { bestTruthLink =
getTruthInformation(iter, parentMask); }
442 int barrel_ec =
m_sctId->barrel_ec(rdoId);
445 else if (barrel_ec == 2)
447 else if (barrel_ec == -2)
467 tmpSGhit.
setBarcode(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
468 tmpSGhit.
setUniqueID(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
472 if(stripEncodingForITK.find(stripID) != stripEncodingForITK.end())
476 int chipID = stripID / MaxChannelinStripRow;
477 int ITkStripID = stripID % MaxChannelinStripRow;
483 int offset =
m_sctId->eta_module(rdoId) % 2;
484 if(
m_sctId->barrel_ec(rdoId) == 0) offset = (std::abs(
m_sctId->eta_module(rdoId)) - 1) % 2;
486 ITkStripID += offset * MaxChannelinStripRow;
494 tmpSGhit.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
496 tmpSGhit.
setX(0.5 * (endsOfStrip.first.x() + endsOfStrip.second.x()));
497 tmpSGhit.
setY(0.5 * (endsOfStrip.first.y() + endsOfStrip.second.y()));
498 tmpSGhit.
setZ(0.5 * (endsOfStrip.first.z() + endsOfStrip.second.z()));
508 eventHeader->
addHit(tmpSGhit);
513 return StatusCode::SUCCESS;
519 unsigned int pixelClusterIndex = 0;
523 for (
const InDet::SiClusterCollection* pixelClusterCollection : *pixelClusterContainerHandle) {
524 if (pixelClusterCollection ==
nullptr) {
534 for (
const Identifier& rdoId : cluster->rdoList()) {
540 InDetSimDataCollection::const_iterator iter(pixelSDOHandle->find(rdoId));
542 if (nCells > 1 && iter == pixelSDOHandle->end()) {
544 for (
int ii = 0; ii < nCells && iter == pixelSDOHandle->end(); ++ii) {
552 pixelClusterIndexMap[theId] = pixelClusterIndex;
557 return StatusCode::SUCCESS;
570 for (
const InDet::SiClusterCollection* pixelClusterCollection : *pixelClusterContainerHandler) {
571 if (pixelClusterCollection ==
nullptr) {
575 const int size = pixelClusterCollection->size();
576 ATH_MSG_DEBUG(
"PixelClusterCollection found with " << size <<
" clusters");
583 for (
const Identifier& rdoId : cluster->rdoList()) {
588 InDetSimDataCollection::const_iterator iter(pixelSDOHandle->find(rdoId));
590 if (nCells > 1 && iter == pixelSDOHandle->end()) {
592 for (
int ii = 0; ii < nCells && iter == pixelSDOHandle->end(); ++ii) {
597 if (iter != pixelSDOHandle->end()) { bestTruthLink =
getTruthInformation(iter, parentMask); }
613 clusterEquiv.
setX(globalPos.x());
614 clusterEquiv.
setY(globalPos.y());
615 clusterEquiv.
setZ(globalPos.z());
620 int barrel_ec =
m_pixelId->barrel_ec(theID);
623 else if (barrel_ec == 2)
625 else if (barrel_ec == -2)
636 clusterEquiv.
setPhiWidth(cluster->width().colRow()[1]);
637 clusterEquiv.
setEtaWidth(cluster->width().colRow()[0]);
645 clusterEquiv.
setEventIndex(std::numeric_limits<long>::max());
646 clusterEquiv.
setBarcode(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
647 clusterEquiv.
setUniqueID(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
650 clusterEquiv.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
653 clusters.push_back(clusterOut);
665 if (SCT_Collection ==
nullptr) {
continue; }
667 const Identifier rdoId = sctRawData->identify();
678 InDetSimDataCollection::const_iterator iter(stripSDOHandle->find(rdoId));
680 if (iter != stripSDOHandle->end()) { bestTruthLink =
getTruthInformation(iter, parentMask); }
695 int barrel_ec =
m_sctId->barrel_ec(rdoId);
698 else if (barrel_ec == 2)
700 else if (barrel_ec == -2)
712 clusterEquiv.
setPhiWidth(sctRawData->getGroupSize());
720 clusterEquiv.
setEventIndex(std::numeric_limits<long>::max());
721 clusterEquiv.
setBarcode(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
722 clusterEquiv.
setUniqueID(std::numeric_limits<HepMcParticleLink::barcode_type>::max());
725 clusterEquiv.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
728 clusters.push_back(clusterOut);
733 return StatusCode::SUCCESS;
740 ATH_MSG_DEBUG(
"Dump truth tracks, size " << simTracksHandle->size());
743 for (
unsigned int ievt = 0; ievt < simTracksHandle->size(); ++ievt) {
744 const HepMC::GenEvent* genEvent = simTracksHandle->at(ievt);
746 HepGeom::Point3D<double> primaryVtx(0., 0., 0.);
751 primaryVtx.set(spv->position().x(),
753 spv->position().z());
754 ATH_MSG_DEBUG(
"using signal process vertex for eventIndex " << ievt <<
":"
755 << primaryVtx.x() <<
"\t" << primaryVtx.y() <<
"\t" << primaryVtx.z());
757 for (
const auto& particle: *genEvent) {
758 const int pdgcode = particle->pdg_id();
760 if (particle->production_vertex() ==
nullptr) {
768 float charge = pd->charge();
769 if (pdgcode < 0)
charge *= -1.;
770 if (std::abs(
charge) < 0.5) {
777 const Amg::Vector3D momentum(particle->momentum().px(), particle->momentum().py(), particle->momentum().pz());
778 const Amg::Vector3D position(particle->production_vertex()->position().x(), particle->production_vertex()->position().y(), particle->production_vertex()->position().z());
790 const double track_truth_d0 = tP ? tP->parameters()[
Trk::d0] : 999.;
791 const double track_truth_phi = tP ? tP->parameters()[
Trk::phi] : 999.;
792 const double track_truth_p = (tP && fabs(tP->parameters()[
Trk::qOverP]) > 1.e-8) ?
793 tP->charge() / tP->parameters()[
Trk::qOverP] : 10E7;
794 const double track_truth_x0 = tP ? tP->position().x() : 999.;
795 const double track_truth_y0 = tP ? tP->position().y() : 999.;
796 const double track_truth_z0 = tP ? tP->parameters()[
Trk::z0] : 999.;
797 const double track_truth_q = tP ? tP->charge() : 0.;
798 const double track_truth_sinphi = tP ? std::sin(tP->parameters()[
Trk::phi]) : -1.;
799 const double track_truth_cosphi = tP ? std::cos(tP->parameters()[
Trk::phi]) : -1.;
800 const double track_truth_sintheta = tP ? std::sin(tP->parameters()[
Trk::theta]) : -1.;
801 const double track_truth_costheta = tP ? std::cos(tP->parameters()[
Trk::theta]) : -1.;
802 double truth_d0corr = track_truth_d0 - (primaryVtx.y() * cos(track_truth_phi) - primaryVtx.x() * sin(track_truth_phi));
803 double truth_zvertex = 0.;
804 const HepGeom::Point3D<double> startVertex(particle->production_vertex()->position().x(), particle->production_vertex()->position().y(), particle->production_vertex()->position().z());
806 bool isPrimary =
true;
807 if (std::abs(truth_d0corr) > 2.) { isPrimary =
false; }
811 if (isPrimary && particle->production_vertex()) {
812 const HepGeom::Point3D<double> startVertex(particle->production_vertex()->position().x(), particle->production_vertex()->position().y(), particle->production_vertex()->position().z());
813 if (std::abs(startVertex.z() - truth_zvertex) > 100.) { isPrimary =
false; }
814 if (particle->end_vertex()) {
815 HepGeom::Point3D<double> endVertex(particle->end_vertex()->position().x(), particle->end_vertex()->position().y(), particle->end_vertex()->position().z());
816 if (endVertex.perp() < FPGATrackSim_PT_TRUTHMIN && std::abs(endVertex.z()) < FPGATrackSim_Z_TRUTHMIN) { isPrimary =
false; }
826 tmpSGTrack.
setVtxX(track_truth_x0);
827 tmpSGTrack.
setVtxY(track_truth_y0);
828 tmpSGTrack.
setVtxZ(track_truth_z0);
829 tmpSGTrack.
setD0(track_truth_d0);
830 tmpSGTrack.
setZ0(track_truth_z0);
831 tmpSGTrack.
setVtxZ(primaryVtx.z());
832 tmpSGTrack.
setQ(track_truth_q);
833 tmpSGTrack.
setPX(track_truth_p * (track_truth_cosphi * track_truth_sintheta));
834 tmpSGTrack.
setPY(track_truth_p * (track_truth_sinphi * track_truth_sintheta));
835 tmpSGTrack.
setPZ(track_truth_p * track_truth_costheta);
837 tmpSGTrack.
setStatus(particle->status());
843 truth.push_back(tmpSGTrack);
848 return StatusCode::SUCCESS;
856 const std::vector<InDetSimData::Deposit>& deposits(sdo.
getdeposits());
857 float bestPt{-999.f};
862 if (!particleLink.
isValid()) {
continue; }
863 const float genEta = particleLink->momentum().pseudoRapidity();
864 const float genPt = particleLink->momentum().perp();
870 if (std::fabs(genEta) >
m_maxEta) {
continue; }
872 if (bestPt < genPt) {
874 bestTruthLink = &particleLink;
883 return bestTruthLink;
#define ATH_CHECK
Evaluate an expression and check for errors.
double charge(const T &p)
defines an "iterator" over instances of a given type in StoreGateSvc
: 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: