38 #include "GaudiKernel/IPartPropSvc.h"
46 const float FPGATrackSim_PT_TRUTHMIN = 400.;
47 const float FPGATrackSim_Z_TRUTHMIN = 2300.;
62 SmartIF<IPartPropSvc> partPropSvc{service(
"PartPropSvc")};
84 return StatusCode::SUCCESS;
89 return StatusCode::SUCCESS;
103 event_info.
setLB(eventInfo->lumiBlock());
104 event_info.
setBCID(eventInfo->bcid());
119 std::vector <FPGATrackSimCluster>
clusters;
126 std::vector <FPGATrackSimTruthTrack> truth;
131 std::vector <FPGATrackSimOfflineTrack>
offline;
140 return StatusCode::SUCCESS;
147 ATH_MSG_DEBUG(
"read Offline tracks, size= " << offlineTracksHandle->size());
153 tmpOfflineTrack.
setQOverPt(trackParticle->pt() > 0 ? trackParticle->charge() / trackParticle->pt() : 0);
154 tmpOfflineTrack.
setEta(trackParticle->eta());
155 tmpOfflineTrack.
setPhi(trackParticle->phi());
156 tmpOfflineTrack.
setD0(trackParticle->d0());
157 tmpOfflineTrack.
setZ0(trackParticle->z0());
159 const Trk::TrackStates* trackStates = trackParticle->track()->trackStateOnSurfaces();
160 if (trackStates ==
nullptr) {
162 return StatusCode::FAILURE;
165 if (tsos ==
nullptr)
continue;
168 if (tsos->trackParameters() !=
nullptr &&
169 tsos->trackParameters()->associatedSurface().associatedDetectorElement() !=
nullptr &&
170 tsos->trackParameters()->associatedSurface().associatedDetectorElement()->identify() != 0
194 tmpOfflineHit.
setLocY(-99999.9);
196 tmpOfflineTrack.
addHit(tmpOfflineHit);
200 offline.push_back(tmpOfflineTrack);
204 return StatusCode::SUCCESS;
214 unsigned int hitIndex = 0
u;
219 return StatusCode::SUCCESS;
232 if (pixel_rdoCollection ==
nullptr) {
continue; }
245 hitIndexMap[rdoId] = hitIndex;
250 hitIndexMap[tmpId] = hitIndex;
256 InDetSimDataCollection::const_iterator
iter(pixelSDOHandle->find(rdoId));
257 if (
nCells > 1 &&
iter == pixelSDOHandle->end()) {
259 for (
int ii = 0; ii <
nCells &&
iter == pixelSDOHandle->end(); ++ii) {
279 else if (barrel_ec == 2)
281 else if (barrel_ec == -2)
296 tmpSGhit.
setToT(pixelRawData->getToT());
300 tmpSGhit.
setBarcode(bestTruthLink->barcode());
309 tmpSGhit.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
324 return StatusCode::SUCCESS;
330 constexpr
int MaxChannelinStripRow = 128;
336 if (SCT_Collection ==
nullptr) {
continue; }
338 std::map<int, bool> firedStrips;
339 std::map<int, const SCT_RDORawData*> firedStripsToRDO;
345 const Identifier rdoId = sctRawData->identify();
347 for(
int i = 0;
i < sctRawData->getGroupSize();
i++) {
348 firedStrips[baseLineStrip+
i] =
true;
349 firedStripsToRDO[baseLineStrip +
i] = sctRawData;
355 std::map<int, int> stripEncodingForITK;
356 std::map<int, const SCT_RDORawData* > stripEncodingForITKToRDO;
357 for(
const auto& [stripID, fired]: firedStrips)
365 std::bitset<3> hitMap;
369 int currChipID = stripID / MaxChannelinStripRow;
371 int maxStripIDForCurrChip = (currChipID + 1) * MaxChannelinStripRow;
373 for(
int i = 0;
i < 3;
i++)
376 if((stripID + 1 +
i) >= maxStripIDForCurrChip)
continue;
378 if(firedStrips.find(stripID + 1 +
i) != firedStrips.end())
380 if(firedStrips.at(stripID + 1 +
i))
383 firedStrips[stripID + 1 +
i] =
false;
393 stripEncodingForITK[stripID] = (
int)(hitMap.to_ulong());
394 stripEncodingForITKToRDO[stripID] = firedStripsToRDO[stripID];
398 for(
const auto& [stripID, fired]: firedStrips)
408 std::pair<Amg::Vector3D, Amg::Vector3D> endsOfStrip = sielement->
endsOfStrip(localPos);
410 hitIndexMap[rdoId] = hitIndex;
417 InDetSimDataCollection::const_iterator
iter(stripSDOHandle->find(rdoId));
433 else if (barrel_ec == 2)
435 else if (barrel_ec == -2)
450 tmpSGhit.
setBarcode(bestTruthLink->barcode());
460 if(stripEncodingForITK.find(stripID) != stripEncodingForITK.end())
464 int chipID = stripID / MaxChannelinStripRow;
465 int ITkStripID = stripID % MaxChannelinStripRow;
474 ITkStripID +=
offset * MaxChannelinStripRow;
482 tmpSGhit.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
484 tmpSGhit.
setX(0.5 * (endsOfStrip.first.x() + endsOfStrip.second.x()));
485 tmpSGhit.
setY(0.5 * (endsOfStrip.first.y() + endsOfStrip.second.y()));
486 tmpSGhit.
setZ(0.5 * (endsOfStrip.first.z() + endsOfStrip.second.z()));
501 return StatusCode::SUCCESS;
507 unsigned int pixelClusterIndex = 0;
512 if (pixelClusterCollection ==
nullptr) {
522 for (
const Identifier& rdoId : cluster->rdoList()) {
528 InDetSimDataCollection::const_iterator
iter(pixelSDOHandle->find(rdoId));
530 if (
nCells > 1 &&
iter == pixelSDOHandle->end()) {
532 for (
int ii = 0; ii <
nCells &&
iter == pixelSDOHandle->end(); ++ii) {
540 pixelClusterIndexMap[theId] = pixelClusterIndex;
545 return StatusCode::SUCCESS;
558 if (pixelClusterCollection ==
nullptr) {
562 const int size = pixelClusterCollection->size();
570 for (
const Identifier& rdoId : cluster->rdoList()) {
575 InDetSimDataCollection::const_iterator
iter(pixelSDOHandle->find(rdoId));
577 if (
nCells > 1 &&
iter == pixelSDOHandle->end()) {
579 for (
int ii = 0; ii <
nCells &&
iter == pixelSDOHandle->end(); ++ii) {
600 clusterEquiv.
setX(globalPos.x());
601 clusterEquiv.
setY(globalPos.y());
602 clusterEquiv.
setZ(globalPos.z());
610 else if (barrel_ec == 2)
612 else if (barrel_ec == -2)
623 clusterEquiv.
setPhiWidth(cluster->width().colRow()[1]);
624 clusterEquiv.
setEtaWidth(cluster->width().colRow()[0]);
628 clusterEquiv.
setBarcode(bestTruthLink->barcode());
637 clusterEquiv.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
652 if (SCT_Collection ==
nullptr) {
continue; }
654 const Identifier rdoId = sctRawData->identify();
665 InDetSimDataCollection::const_iterator
iter(stripSDOHandle->find(rdoId));
685 else if (barrel_ec == 2)
687 else if (barrel_ec == -2)
699 clusterEquiv.
setPhiWidth(sctRawData->getGroupSize());
703 clusterEquiv.
setBarcode(bestTruthLink->barcode());
712 clusterEquiv.
setBarcodePt(
static_cast<unsigned long>(std::ceil(bestParent ? bestParent->momentum().perp() : 0.)));
720 return StatusCode::SUCCESS;
727 ATH_MSG_DEBUG(
"Dump truth tracks, size " << simTracksHandle->size());
730 for (
unsigned int ievt = 0; ievt < simTracksHandle->size(); ++ievt) {
731 const HepMC::GenEvent* genEvent = simTracksHandle->at(ievt);
733 HepGeom::Point3D<double> primaryVtx(0., 0., 0.);
738 primaryVtx.set(spv->position().x(),
740 spv->position().z());
741 ATH_MSG_DEBUG(
"using signal process vertex for eventIndex " << ievt <<
":"
742 << primaryVtx.x() <<
"\t" << primaryVtx.y() <<
"\t" << primaryVtx.z());
744 for (
const auto&
particle: *genEvent) {
745 const int pdgcode =
particle->pdg_id();
747 if (
particle->production_vertex() ==
nullptr) {
756 if (pdgcode < 0)
charge *= -1.;
757 if (std::abs(
charge) < 0.5) {
777 const double track_truth_d0 = tP ? tP->parameters()[
Trk::d0] : 999.;
778 const double track_truth_phi = tP ? tP->parameters()[
Trk::phi] : 999.;
779 const double track_truth_p = (tP && fabs(tP->parameters()[
Trk::qOverP]) > 1.e-8) ?
781 const double track_truth_x0 = tP ? tP->
position().x() : 999.;
782 const double track_truth_y0 = tP ? tP->
position().y() : 999.;
783 const double track_truth_z0 = tP ? tP->parameters()[
Trk::z0] : 999.;
784 const double track_truth_q = tP ? tP->
charge() : 0.;
785 const double track_truth_sinphi = tP ?
std::sin(tP->parameters()[
Trk::phi]) : -1.;
786 const double track_truth_cosphi = tP ?
std::cos(tP->parameters()[
Trk::phi]) : -1.;
787 const double track_truth_sintheta = tP ?
std::sin(tP->parameters()[
Trk::theta]) : -1.;
788 const double track_truth_costheta = tP ?
std::cos(tP->parameters()[
Trk::theta]) : -1.;
789 double truth_d0corr = track_truth_d0 - (primaryVtx.y() *
cos(track_truth_phi) - primaryVtx.x() *
sin(track_truth_phi));
790 double truth_zvertex = 0.;
791 const HepGeom::Point3D<double> startVertex(
particle->production_vertex()->position().x(),
particle->production_vertex()->position().y(),
particle->production_vertex()->position().z());
794 if (std::abs(truth_d0corr) > 2.) {
isPrimary =
false; }
799 const HepGeom::Point3D<double> startVertex(
particle->production_vertex()->position().x(),
particle->production_vertex()->position().y(),
particle->production_vertex()->position().z());
800 if (std::abs(startVertex.z() - truth_zvertex) > 100.) {
isPrimary =
false; }
802 HepGeom::Point3D<double> endVertex(
particle->end_vertex()->position().x(),
particle->end_vertex()->position().y(),
particle->end_vertex()->position().z());
803 if (endVertex.perp() < FPGATrackSim_PT_TRUTHMIN && std::abs(endVertex.z()) < FPGATrackSim_Z_TRUTHMIN) {
isPrimary =
false; }
813 tmpSGTrack.
setVtxX(track_truth_x0);
814 tmpSGTrack.
setVtxY(track_truth_y0);
815 tmpSGTrack.
setVtxZ(track_truth_z0);
816 tmpSGTrack.
setD0(track_truth_d0);
817 tmpSGTrack.
setZ0(track_truth_z0);
818 tmpSGTrack.
setVtxZ(primaryVtx.z());
819 tmpSGTrack.
setQ(track_truth_q);
820 tmpSGTrack.
setPX(track_truth_p * (track_truth_cosphi * track_truth_sintheta));
821 tmpSGTrack.
setPY(track_truth_p * (track_truth_sinphi * track_truth_sintheta));
822 tmpSGTrack.
setPZ(track_truth_p * track_truth_costheta);
830 truth.push_back(tmpSGTrack);
835 return StatusCode::SUCCESS;
843 const std::vector<InDetSimData::Deposit>& deposits(sdo.
getdeposits());
844 float bestPt{-999.f};
849 if (!particleLink.
isValid()) {
continue; }
850 const float genEta = particleLink->momentum().pseudoRapidity();
851 const float genPt = particleLink->momentum().perp();
857 if (std::fabs(genEta) >
m_maxEta) {
continue; }
859 if (bestPt < genPt) {
861 bestTruthLink = &particleLink;
870 return bestTruthLink;