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

#include <PixelPrepDataToxAOD.h>

Inheritance diagram for PixelPrepDataToxAOD:

Public Member Functions

virtual StatusCode initialize ()
virtual StatusCode execute (const EventContext &ctx)
 Execute method.
virtual StatusCode finalize ()
 AthAlgorithm (const std::string &name, ISvcLocator *pSvcLocator)
 Constructor.
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
 Get filter decision:
virtual void setFilterPassed (bool state, const EventContext &ctx) const
 Set filter decision:
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Protected Member Functions

virtual bool isReEntrant () const override final
 Legacy algorithms are not thread-safe.
void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

std::vector< std::vector< int > > addSDOInformation (xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const InDetSimDataCollection &sdoCollection) const
void addSiHitInformation (xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const std::vector< SiHit > &matchingHits) const
std::vector< SiHitfindAllHitsCompatibleWithCluster (const InDet::PixelCluster *prd, const std::vector< const SiHit * > *sihits, std::vector< std::vector< int > > &trkBCs) const
void addNNTruthInfo (xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const std::vector< SiHit > &matchingHits) const
void addNNInformation (xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *pixelCluster, const unsigned int SizeX, const unsigned int SizeY) const
void addRdoInformation (xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *pixelCluster, const PixelChargeCalibCondData *calibData) const
InDetDD::SiCellId getCellIdWeightedPosition (const InDet::PixelCluster *pixelCluster, int *rrowMin=0, int *rrowMax=0, int *rcolMin=0, int *rcolMax=0) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

const PixelIDm_PixelHelper = nullptr
Gaudi::Property< bool > m_useTruthInfo {this, "UseTruthInfo", false}
Gaudi::Property< bool > m_writeSDOs {this, "WriteSDOs", false}
Gaudi::Property< bool > m_writeSiHits {this, "WriteSiHits", false}
Gaudi::Property< bool > m_writeNNinformation {this, "WriteNNinformation", true}
Gaudi::Property< bool > m_writeRDOinformation {this, "WriteRDOinformation", true}
Gaudi::Property< bool > m_writeExtendedPRDinformation {this, "WriteExtendedPRDinformation", false}
Gaudi::Property< bool > m_useSiHitsGeometryMatching {this, "UseSiHitsGeometryMatching", true}
ServiceHandle< InDetDD::IPixelReadoutManagerm_pixelReadout {this, "PixelReadoutManager", "PixelReadoutManager", "Pixel readout manager" }
SG::ReadCondHandleKey< PixelChargeCalibCondDatam_chargeDataKey {this, "PixelChargeCalibCondData", "PixelChargeCalibCondData", "Pixel charge calibration data"}
SG::ReadCondHandleKey< PixelDCSStateDatam_condDCSStateKey {this, "PixelDCSStateCondData", "PixelDCSStateCondData", "Pixel FSM state key"}
SG::ReadCondHandleKey< PixelDCSStatusDatam_condDCSStatusKey {this, "PixelDCSStatusCondData", "PixelDCSStatusCondData", "Pixel FSM status key"}
SG::ReadCondHandleKey< PixelDCSTempDatam_readKeyTemp {this, "ReadKeyTemp", "PixelDCSTempCondData", "Key of input sensor temperature conditions folder"}
SG::ReadCondHandleKey< PixelDCSHVDatam_readKeyHV {this, "ReadKeyHV", "PixelDCSHVCondData", "Key of input bias voltage conditions folder"}
ToolHandle< IInDetConditionsToolm_pixelSummary {this, "PixelConditionsSummaryTool", "PixelConditionsSummaryTool", "Tool for PixelConditionsSummaryTool"}
ToolHandle< ISiLorentzAngleToolm_lorentzAngleTool {this, "LorentzAngleTool", "SiLorentzAngleTool", "Tool to retreive Lorentz angle"}
SG::ReadHandleKey< Trk::ClusterSplitProbabilityContainerm_clusterSplitProbContainer {this, "ClusterSplitProbabilityName", "",""}
std::atomic< unsigned int > m_haveTruthLink {}
std::atomic< unsigned int > m_missingTruthParticle {}
std::atomic< unsigned int > m_missingParentParticle {}
bool m_firstEventWarnings = true
bool m_need_sihits = false
SG::ReadHandleKey< InDet::PixelClusterContainer > m_clustercontainer_key {this, "SiClusterContainer", "PixelClusters"}
SG::ReadHandleKey< SiHitCollectionm_sihitContainer_key {this, "MC_Hits", "PixelHits"}
SG::ReadHandleKey< InDetSimDataCollectionm_SDOcontainer_key {this, "MC_SDOs", "PixelSDO_Map"}
SG::ReadHandleKey< PRD_MultiTruthCollectionm_multiTruth_key {this, "PRD_MultiTruth", "PRD_MultiTruthPixel"}
SG::ReadHandleKey< xAODTruthParticleLinkVectorm_truthParticleLinks {this,"InputTruthParticleLinks","","The key for the truth particle link collection."}
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainerm_write_xaod_key {this, "OutputClusterContainer", "PixelClusters"}
SG::WriteHandleKey< std::vector< unsigned int > > m_write_offsets {this, "PixelxAodOffset", "PixelClustersOffsets"}
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 64 of file PixelPrepDataToxAOD.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Member Function Documentation

◆ addNNInformation()

void PixelPrepDataToxAOD::addNNInformation ( xAOD::TrackMeasurementValidation * xprd,
const InDet::PixelCluster * pixelCluster,
const unsigned int SizeX,
const unsigned int SizeY ) const
private

Definition at line 733 of file PixelPrepDataToxAOD.cxx.

736{
737 ATH_MSG_VERBOSE( " Starting creating input from cluster " );
738
739 const InDetDD::SiDetectorElement* de = pixelCluster->detectorElement();
740 if (de==nullptr) {
741 ATH_MSG_ERROR("Could not get detector element");
742 return;
743 }
744
745
746 const InDetDD::PixelModuleDesign* design(dynamic_cast<const InDetDD::PixelModuleDesign*>(&de->design()));
747 if (not design) {
748 ATH_MSG_WARNING("PixelModuleDesign was not retrieved in function 'addNNInformation'");
749 return;
750 }
751 const std::vector<Identifier>& rdos = pixelCluster->rdoList();
752
753 const std::vector<float>& chList = pixelCluster->chargeList();
754 const std::vector<int>& totList = pixelCluster->totList();
755
756 ATH_MSG_VERBOSE( "Number of RDOs: " << rdos.size() );
757 ATH_MSG_VERBOSE( "Number of charges: " << chList.size() );
758 ATH_MSG_VERBOSE( "Number of TOT: " << totList.size() );
759
760
761 //Calculate the centre of the cluster
762 int phiPixelIndexMin, phiPixelIndexMax, etaPixelIndexMin, etaPixelIndexMax;
763 InDetDD::SiCellId cellIdWeightedPosition= getCellIdWeightedPosition( pixelCluster, &phiPixelIndexMin, &phiPixelIndexMax, &etaPixelIndexMin, &etaPixelIndexMax);
764
765 if (!cellIdWeightedPosition.isValid())
766 {
767 ATH_MSG_WARNING( "Weighted position is on invalid CellID." );
768 }
769
770 int etaPixelIndexWeightedPosition=cellIdWeightedPosition.etaIndex();
771 int phiPixelIndexWeightedPosition=cellIdWeightedPosition.phiIndex();
772
773
774 ATH_MSG_DEBUG(" weighted pos phiPixelIndex: " << phiPixelIndexWeightedPosition << " etaPixelIndex: " << etaPixelIndexWeightedPosition );
775
776 // SiLocalPosition PixelModuleDesign::positionFromColumnRow(const int column, const int row) const;
777 //
778 // Given row and column index of diode, returns position of diode center
779 // ALTERNATIVE/PREFERED way is to use localPositionOfCell(const SiCellId & cellId) or
780 // rawLocalPositionOfCell method in SiDetectorElement.
781 // DEPRECATED (but used in numerous places)
782 //
783 // Comment by Hide (referring the original comment in the code) : 2015-02-04
784 // I automatically replaced column to etaPixelIndex and row to phiPixelIndex here. It was bofore:
785 // InDetDD::SiLocalPosition siLocalPosition( design->positionFromColumnRow(columnWeightedPosition,rowWeightedPosition) );
786 //
787 // Then I assume the argument of column/row in this function is in offline manner, not the real hardware column/row.
788 //
789 InDetDD::SiLocalPosition w = design->positionFromColumnRow(etaPixelIndexWeightedPosition,phiPixelIndexWeightedPosition);
790
791
792 double localEtaPixelIndexWeightedPosition = w.xEta();
793 double localPhiPixelIndexWeightedPosition = w.xPhi();
794
795 int centralIndexX=(sizeX-1)/2;
796 int centralIndexY=(sizeY-1)/2;
797
798
799
800 // Check to see if the cluster is too big for the NN
801
802 if (abs(phiPixelIndexWeightedPosition-phiPixelIndexMin)>centralIndexX ||
803 abs(phiPixelIndexWeightedPosition-phiPixelIndexMax)>centralIndexX)
804 {
805 ATH_MSG_DEBUG(" Cluster too large phiPixelIndexMin " << phiPixelIndexMin << " phiPixelIndexMax " << phiPixelIndexMax << " centralX " << centralIndexX);
806 //return;
807 }
808
809 if (abs(etaPixelIndexWeightedPosition-etaPixelIndexMin)>centralIndexY ||
810 abs(etaPixelIndexWeightedPosition-etaPixelIndexMax)>centralIndexY)
811 {
812 ATH_MSG_DEBUG(" Cluster too large etaPixelIndexMin" << etaPixelIndexMin << " etaPixelIndexMax " << etaPixelIndexMax << " centralY " << centralIndexY);
813 //return;
814 }
815
816 std::vector< std::vector<float> > matrixOfToT (sizeX, std::vector<float>(sizeY,0) );
817 std::vector< std::vector<float> > matrixOfCharge(sizeX, std::vector<float>(sizeY,0));
818 // Seed with the module's nominal pitch (from the design), as in
819 // NnClusterizationFactory::createInput; correct for ITk (25x100 / 50x50 um)
820 // where the old literal 0.4 (eta) seed and the >0.1 fill guard were both wrong.
821 std::vector<float> vectorOfPitchesY(sizeY, design->etaPitch());
822 std::vector<float> vectorOfPitchesX(sizeX, design->phiPitch());
823
824
825 //Itererate over all elements hits in the cluster and fill the charge and tot matrices
826 std::vector<Identifier>::const_iterator rdosBegin = rdos.begin();
827 std::vector<Identifier>::const_iterator rdosEnd = rdos.end();
828 auto charge = chList.begin();
829 auto tot = totList.begin();
830
831 ATH_MSG_VERBOSE(" Putting together the n. " << rdos.size() << " rdos into a matrix.");
832
833 for (; rdosBegin!= rdosEnd; ++rdosBegin)
834 {
835
836 Identifier rId = *rdosBegin;
837 int absphiPixelIndex = m_PixelHelper->phi_index(rId)-phiPixelIndexWeightedPosition + centralIndexX;
838 int absetaPixelIndex = m_PixelHelper->eta_index(rId)-etaPixelIndexWeightedPosition + centralIndexY;
839 if (charge != chList.end()){
840 ATH_MSG_VERBOSE( " Phi Index: " << m_PixelHelper->phi_index(rId) << " absphiPixelIndex: " << absphiPixelIndex << " eta Idx: " << m_PixelHelper->eta_index(rId) << " absetaPixelIndex: " << absetaPixelIndex << " charge " << *charge );
841 }
842 if (absphiPixelIndex <0 || absphiPixelIndex >= (int)sizeX)
843 {
844 ATH_MSG_DEBUG(" problem with index: " << absphiPixelIndex << " min: " << 0 << " max: " << sizeX);
845 continue;
846 }
847
848 if (absetaPixelIndex <0 || absetaPixelIndex >= (int)sizeY)
849 {
850 ATH_MSG_DEBUG(" problem with index: " << absetaPixelIndex << " min: " << 0 << " max: " << sizeY);
851 continue;
852 }
853
854 InDetDD::SiCellId cellId = de->cellIdFromIdentifier(*rdosBegin);
855 InDetDD::SiDiodesParameters diodeParameters = design->parameters(cellId);
856 float pitchY = diodeParameters.width().xEta();
857 float pitchX = diodeParameters.width().xPhi();
858
859 if ( (not totList.empty()) && tot != totList.end()) {
860 matrixOfToT[absphiPixelIndex][absetaPixelIndex] =*tot;
861 ++tot;
862 } else matrixOfToT[absphiPixelIndex][absetaPixelIndex] = -1;
863
864 if ( (not chList.empty()) && charge != chList.end()){
865 matrixOfCharge[absphiPixelIndex][absetaPixelIndex]=*charge;
866 ++charge;
867 } else matrixOfCharge[absphiPixelIndex][absetaPixelIndex] = -1;
868
869 // Store the real per-cell pitch, built the same way as
870 // NnClusterizationFactory::createInput so the dumped training inputs match
871 // the runtime inference inputs.
872 vectorOfPitchesY[absetaPixelIndex]=pitchY;
873 vectorOfPitchesX[absphiPixelIndex]=pitchX;
874 }//end iteration on rdos
875
876
877 ATH_MSG_VERBOSE( " End RDO LOOP " );
878
879 // Using the centre of the module and beam spot calculate
880 // the incidence angles of the tracks
881 const Amg::Vector2D& prdLocPos = pixelCluster->localPosition();
882 InDetDD::SiLocalPosition centroid(prdLocPos);
883
884 Amg::Vector3D globalPos = de->globalPosition(centroid);
885 Amg::Vector3D trackDir = globalPos; // - beamSpotPosition;
886 trackDir.normalize();
887
888 Amg::Vector3D module_normal = de->normal();
889 Amg::Vector3D module_phiax = de->phiAxis();
890 Amg::Vector3D module_etaax = de->etaAxis();
891
892 // Calculate the phi incidence angle
893 float trkphicomp = trackDir.dot(module_phiax);
894 float trketacomp = trackDir.dot(module_etaax);
895 float trknormcomp = trackDir.dot(module_normal);
896 double bowphi = atan2(trkphicomp,trknormcomp);
897 double boweta = atan2(trketacomp,trknormcomp);
898 double tanl = m_lorentzAngleTool->getTanLorentzAngle(de->identifyHash(),Gaudi::Hive::currentContext());
899 if(bowphi > pi/2) bowphi -= pi;
900 if(bowphi < -pi/2) bowphi += pi;
901 int readoutside = design->readoutSide();
902 double angle = atan(tan(bowphi)-readoutside*tanl);
903
904
905 // Calculate the theta incidence angle
906 ATH_MSG_VERBOSE( " Angle theta bef corr: " << boweta );
907 if (boweta>pi/2.) boweta-=pi;
908 if (boweta<-pi/2.) boweta+=pi;
909
910
911 ATH_MSG_VERBOSE(" Angle phi: " << angle << " theta: " << boweta );
912 ATH_MSG_VERBOSE(" PhiPixelIndexWeightedPosition: " << phiPixelIndexWeightedPosition << " EtaPixelIndexWeightedPosition: " << etaPixelIndexWeightedPosition );
913
914 // store the matrixOfToT in a vector
915 std::vector<float> vectorOfCharge(sizeX*sizeY,0);
916 std::vector<float> vectorOfToT(sizeX*sizeY,0);
917 int counter(0);
918 for (unsigned int u=0;u<sizeX;u++)
919 {
920 for (unsigned int s=0;s<sizeY;s++)
921 {
922 vectorOfToT[counter] = matrixOfToT[u][s];
923 vectorOfCharge[counter] = matrixOfCharge[u][s];
924 ++counter;
925 }
926 }
927
928 ATH_MSG_VERBOSE( "matrixOfToT converted in a std::vector<float> " );
929
930 ATH_MSG_VERBOSE( "... and saved " );
931 // Add information to xAOD
932 AUXDATA(xprd, int, NN_sizeX) = sizeX;
933 AUXDATA(xprd, int, NN_sizeY) = sizeY;
934
935 AUXDATA(xprd, float, NN_phiBS) = angle;
936 AUXDATA(xprd, float, NN_thetaBS) = boweta;
937
938 AUXDATA(xprd, std::vector<float>, NN_matrixOfToT) = std::move(vectorOfToT);
939 AUXDATA(xprd, std::vector<float>, NN_matrixOfCharge) = std::move(vectorOfCharge);
940 AUXDATA(xprd, std::vector<float>, NN_vectorOfPitchesY) = std::move(vectorOfPitchesY);
941 AUXDATA(xprd, std::vector<float>, NN_vectorOfPitchesX) = std::move(vectorOfPitchesX);
942
943
944 AUXDATA(xprd, int, NN_etaPixelIndexWeightedPosition) = etaPixelIndexWeightedPosition;
945 AUXDATA(xprd, int, NN_phiPixelIndexWeightedPosition) = phiPixelIndexWeightedPosition;
946
947 AUXDATA(xprd, float, NN_localEtaPixelIndexWeightedPosition) = localEtaPixelIndexWeightedPosition;
948 AUXDATA(xprd, float, NN_localPhiPixelIndexWeightedPosition) = localPhiPixelIndexWeightedPosition;
949
950 ATH_MSG_VERBOSE( "NN training Written" );
951}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
double charge(const T &p)
Definition AtlasPID.h:997
#define AUXDATA(OBJ, TYP, NAME)
double angle(const GeoTrf::Vector2D &a, const GeoTrf::Vector2D &b)
#define pi
int phiIndex() const
Get phi index. Equivalent to strip().
Definition SiCellId.h:122
bool isValid() const
Test if its in a valid state.
Definition SiCellId.h:136
int etaIndex() const
Get eta index.
Definition SiCellId.h:114
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):
const SiLocalPosition & width() const
width of the diodes:
double xPhi() const
position along phi direction:
double xEta() const
position along eta direction:
virtual const Amg::Vector3D & normal() const override final
Get reconstruction local normal axes in global frame.
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
HepGeom::Point3D< double > globalPosition(const HepGeom::Point3D< double > &localPos) const
transform a reconstruction local position into a global position (inline):
const PixelID * m_PixelHelper
InDetDD::SiCellId getCellIdWeightedPosition(const InDet::PixelCluster *pixelCluster, int *rrowMin=0, int *rrowMax=0, int *rcolMin=0, int *rcolMax=0) const
ToolHandle< ISiLorentzAngleTool > m_lorentzAngleTool
Eigen::Matrix< double, 2, 1 > Vector2D
Eigen::Matrix< double, 3, 1 > Vector3D
@ pixelCluster
@ u
Enums for curvilinear frames.
Definition ParamDefs.h:77

◆ addNNTruthInfo()

void PixelPrepDataToxAOD::addNNTruthInfo ( xAOD::TrackMeasurementValidation * xprd,
const InDet::PixelCluster * prd,
const std::vector< SiHit > & matchingHits ) const
private

Definition at line 953 of file PixelPrepDataToxAOD.cxx.

956{
957
958
959 unsigned int numberOfSiHits = matchingHits.size();
960
961 std::vector<float> positionsX(numberOfSiHits,0);
962 std::vector<float> positionsY(numberOfSiHits,0);
963
964 std::vector<float> positions_indexX(numberOfSiHits,0);
965 std::vector<float> positions_indexY(numberOfSiHits,0);
966
967 std::vector<float> theta(numberOfSiHits,0);
968 std::vector<float> phi(numberOfSiHits,0);
969
970 std::vector<int> uniqueID(numberOfSiHits,HepMC::UNDEFINED_ID);
971 std::vector<int> pdgid(numberOfSiHits,0);
972 std::vector<float> chargeDep(numberOfSiHits,0);
973 std::vector<float> truep(numberOfSiHits,0);
974
975 std::vector<float> pathlengthX(numberOfSiHits,0);
976 std::vector<float> pathlengthY(numberOfSiHits,0);
977 std::vector<float> pathlengthZ(numberOfSiHits,0);
978
979 std::vector<int> motherUniqueID(numberOfSiHits,HepMC::UNDEFINED_ID);
980 std::vector<int> motherPdgid(numberOfSiHits,0);
981
982
983
984 // Check if we have detector element -- needed to find the local position of the SiHits
985 const InDetDD::SiDetectorElement* de = pixelCluster->detectorElement();
986 if(!de)
987 return;
988
989 InDetDD::SiCellId cellIdWeightedPosition = getCellIdWeightedPosition( pixelCluster );
990
991 const InDetDD::PixelModuleDesign* design(dynamic_cast<const InDetDD::PixelModuleDesign*>(&de->design()));
992 if (not design) {
993 ATH_MSG_WARNING("PixelModuleDesign was not retrieved in function 'addNNTruthInfo'");
994 return;
995 }
996 // lorentz shift correction
997 double shift = m_lorentzAngleTool->getLorentzShift(de->identifyHash(),Gaudi::Hive::currentContext());
998 unsigned hitNumber(0);
999 for( const auto& siHit : matchingHits ){
1000
1001 HepGeom::Point3D<double> averagePosition = (siHit.localStartPosition() + siHit.localEndPosition()) * 0.5;
1002
1003 ATH_MSG_VERBOSE("Truth Part X: " << averagePosition.y() << " shift " << shift << " Y: " << averagePosition.z() );
1004
1005 // position lorentz shift corrected
1006 float YposC = averagePosition.y()-shift;
1007
1008 if (std::abs(YposC)>design->width()/2 &&
1009 std::abs(averagePosition.y())<design->width()/2)
1010 {
1011 if (YposC>design->width()/2)
1012 {
1013 YposC=design->width()/2-1e-6;
1014 } else if (YposC<-design->width()/2)
1015 {
1016 YposC=-design->width()/2+1e-6;
1017 }
1018 }
1019
1020 positionsX[hitNumber] = YposC;
1021 positionsY[hitNumber] = averagePosition.z();
1022
1023 HepGeom::Point3D<double> deltaPosition = siHit.localEndPosition() - siHit.localStartPosition();
1024
1025 pathlengthX[hitNumber] = deltaPosition.y();
1026 pathlengthY[hitNumber] = deltaPosition.z();
1027 pathlengthZ[hitNumber] = deltaPosition.x();
1028
1029
1030 // Here we convert the hit position to the right frame
1031 Amg::Vector2D siLocalTruthPosition = de->hitLocalToLocal(averagePosition.z(), YposC);
1032 InDetDD::SiCellId cellIdOfTruthPosition = design->cellIdOfPosition(siLocalTruthPosition);
1033
1034
1035// InDetDD::SiLocalPosition siLocalTruthPosition(averagePosition.z(),YposC ) ;
1036// InDetDD::SiCellId cellIdOfTruthPosition =design->cellIdOfPosition(siLocalTruthPosition);
1037
1038 int truthEtaIndex = cellIdOfTruthPosition.etaIndex();
1039 int truthPhiIndex = cellIdOfTruthPosition.phiIndex();
1040
1041 InDetDD::SiDiodesParameters diodeParameters = design->parameters(cellIdOfTruthPosition);
1042 double pitchY = diodeParameters.width().xEta();
1043 double pitchX = diodeParameters.width().xPhi();
1044
1045 // pixel center
1046 // SiLocalPosition PixelModuleDesign::positionFromColumnRow(const int column, const int row) const;
1047 //
1048 // Given row and column index of diode, returns position of diode center
1049 // ALTERNATIVE/PREFERED way is to use localPositionOfCell(const SiCellId & cellId) or
1050 // rawLocalPositionOfCell method in SiDetectorElement.
1051 // DEPRECATED (but used in numerous places)
1052 //
1053 // Comment by Hide (referring the original comment in the code) : 2015-02-04
1054 // I automatically replaced column to etaPixelIndex and row to phiPixelIndex here. It was bofore:
1055 // InDetDD::SiLocalPosition siLocalPosition( design->positionFromColumnRow(truthColumn,truthRow) );
1056 //
1057 // Then I assume the argument of column/row in this function is in offline manner, not the real hardware column/row.
1058 //
1059 InDetDD::SiLocalPosition siLocalPositionCenter(design->positionFromColumnRow(truthEtaIndex,truthPhiIndex));
1060 double pixelCenterY = siLocalPositionCenter.xEta();
1061 double pixelCenterX = siLocalPositionCenter.xPhi();
1062
1063
1064 // truth index
1065// double truthIndexY = truthEtaIndex + (averagePosition.z() - pixelCenterY)/pitchY;
1066// double truthIndexX = truthPhiIndex + (YposC - pixelCenterX)/pitchX;
1067 double truthIndexY = truthEtaIndex + (siLocalTruthPosition[Trk::distEta] - pixelCenterY)/pitchY;
1068 double truthIndexX = truthPhiIndex + (siLocalTruthPosition[Trk::distPhi] - pixelCenterX)/pitchX;
1069
1070
1071 positions_indexX[hitNumber] = truthIndexX - cellIdWeightedPosition.phiIndex();
1072 positions_indexY[hitNumber] = truthIndexY - cellIdWeightedPosition.etaIndex();
1073
1074 HepGeom::Point3D<double> diffPositions = (siHit.localEndPosition() - siHit.localStartPosition());
1075 double bowphi = std::atan2( diffPositions.y(), diffPositions.x() );
1076
1077
1078 //Truth Track incident angle theta
1079 theta[hitNumber] = std::atan2(diffPositions.z() ,diffPositions.x());
1080 //Truth track incident angle phi -- correct for lorentz angle
1081 float tanlorentz = m_lorentzAngleTool->getTanLorentzAngle(de->identifyHash(),Gaudi::Hive::currentContext());
1082
1083 int readoutside = design->readoutSide();
1084 phi[hitNumber] = std::atan(std::tan(bowphi)-readoutside*tanlorentz);
1085 const HepMcParticleLink& HMPL = siHit.particleLink();
1086 if (HMPL.isValid()){
1087 uniqueID[hitNumber] = HepMC::uniqueID(HMPL);
1088 const auto particle = HMPL.cptr();
1089 pdgid[hitNumber] = particle->pdg_id();
1090 HepMC::FourVector mom=particle->momentum();
1091 truep[hitNumber] = std::sqrt(mom.x()*mom.x()+mom.y()*mom.y()+mom.z()*mom.z());
1092 const auto vertex = particle->production_vertex();
1093//AV Please note that taking the first particle as a mother is ambiguous.
1094 if ( vertex && !vertex->particles_in().empty()){
1095 const auto& mother_of_particle=vertex->particles_in().front();
1096 motherUniqueID[hitNumber] = HepMC::uniqueID(mother_of_particle);
1097 motherPdgid[hitNumber] = mother_of_particle->pdg_id();
1098 }
1099 }
1100 chargeDep[hitNumber] = siHit.energyLoss() ;
1101
1102 ++hitNumber;
1103 }
1104
1105
1106 AUXDATA(xprd, std::vector<float>, NN_positionsX) = std::move(positionsX);
1107 AUXDATA(xprd, std::vector<float>, NN_positionsY) = std::move(positionsY);
1108
1109 AUXDATA(xprd, std::vector<float>, NN_positions_indexX) = std::move(positions_indexX);
1110 AUXDATA(xprd, std::vector<float>, NN_positions_indexY) = std::move(positions_indexY);
1111
1112 AUXDATA(xprd, std::vector<float>, NN_theta) = std::move(theta);
1113 AUXDATA(xprd, std::vector<float>, NN_phi) = std::move(phi);
1114
1115 AUXDATA(xprd, std::vector<int>, NN_barcode) = std::move(uniqueID); // TODO Rename variable to be consistent?
1116 AUXDATA(xprd, std::vector<int>, NN_pdgid) = std::move(pdgid);
1117 AUXDATA(xprd, std::vector<float>, NN_energyDep) = std::move(chargeDep);
1118 AUXDATA(xprd, std::vector<float>, NN_trueP) = std::move(truep);
1119
1120 AUXDATA(xprd, std::vector<int>, NN_motherBarcode) = std::move(motherUniqueID); // TODO Rename variable to be consistent?
1121 AUXDATA(xprd, std::vector<int>, NN_motherPdgid) = std::move(motherPdgid);
1122
1123
1124
1125 AUXDATA(xprd, std::vector<float>, NN_pathlengthX) = std::move(pathlengthX);
1126 AUXDATA(xprd, std::vector<float>, NN_pathlengthY) = std::move(pathlengthY);
1127 AUXDATA(xprd, std::vector<float>, NN_pathlengthZ) = std::move(pathlengthZ);
1128
1129
1130}
Scalar phi() const
phi method
Scalar theta() const
theta method
const double width
Amg::Vector2D hitLocalToLocal(double xEta, double xPhi) const
Simulation/Hit local frame to reconstruction local frame.
HepMC3::FourVector FourVector
int uniqueID(const T &p)
constexpr int UNDEFINED_ID
virtual void shift(size_t pos, ptrdiff_t offs) override
Shift the elements of the container.
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
@ distEta
readout for silicon
Definition ParamDefs.h:51
@ distPhi
Definition ParamDefs.h:50
std::size_t numberOfSiHits(const xAOD::TrackParticle *tp)
return the number of Si hits in the track particle

◆ addRdoInformation()

void PixelPrepDataToxAOD::addRdoInformation ( xAOD::TrackMeasurementValidation * xprd,
const InDet::PixelCluster * pixelCluster,
const PixelChargeCalibCondData * calibData ) const
private

Definition at line 668 of file PixelPrepDataToxAOD.cxx.

671{
672 ATH_MSG_VERBOSE( " Starting creating input from cluster " );
673
674
675 const std::vector<Identifier>& rdos = pixelCluster->rdoList();
676
677 const std::vector<float> &chList = pixelCluster->chargeList();
678 const std::vector<int> &totList = pixelCluster->totList();
679
680 // std::vector<int> rowList;
681 // std::vector<int> colList;
682 std::vector<int> etaIndexList;
683 std::vector<int> phiIndexList;
684 std::vector<float> CTerm;
685 std::vector<float> ATerm;
686 std::vector<float> ETerm;
687
688 ATH_MSG_VERBOSE( "Number of RDOs: " << rdos.size() );
689
690 //Itererate over all elements hits in the cluster and fill the charge and tot matricies
691 std::vector<Identifier>::const_iterator rdosBegin = rdos.begin();
692 std::vector<Identifier>::const_iterator rdosEnd = rdos.end();
693
694 ATH_MSG_VERBOSE(" Putting together the n. " << rdos.size() << " rdos into a matrix.");
695
696 phiIndexList.reserve( rdos.size());
697 etaIndexList.reserve( rdos.size());
698 CTerm.reserve( rdos.size());
699 ATerm.reserve( rdos.size());
700 ETerm.reserve( rdos.size());
701 for (; rdosBegin!= rdosEnd; ++rdosBegin)
702 {
703 Identifier rId = *rdosBegin;
704 phiIndexList.push_back( m_PixelHelper->phi_index(rId) );
705 etaIndexList.push_back( m_PixelHelper->eta_index(rId) );
706
707 // charge calibration parameters
708 Identifier moduleID = m_PixelHelper->wafer_id(rId);
709 IdentifierHash moduleHash = m_PixelHelper->wafer_hash(moduleID); // wafer hash
710 unsigned int FE = m_pixelReadout->getFE(rId, moduleID);
711 InDetDD::PixelDiodeType type = m_pixelReadout->getDiodeType(rId);
712 if (type == InDetDD::PixelDiodeType::NONE) continue;
713 const auto & parameters = calibData->getLegacyFitParameters(type, moduleHash, FE);
714 CTerm.emplace_back(parameters.C);
715 ATerm.emplace_back(parameters.A);
716 ETerm.emplace_back(parameters.E);
717
718 }//end iteration on rdos
719
720
721 AUXDATA(xprd, std::vector<int>,rdo_phi_pixel_index) = std::move(phiIndexList);
722 AUXDATA(xprd, std::vector<int>,rdo_eta_pixel_index) = std::move(etaIndexList);
723 AUXDATA(xprd, std::vector<float>,rdo_charge) = chList;
724 AUXDATA(xprd, std::vector<int>,rdo_tot) = totList;
725
726 AUXDATA(xprd, std::vector<float>,rdo_Cterm) = std::move(CTerm);
727 AUXDATA(xprd, std::vector<float>,rdo_Aterm) = std::move(ATerm);
728 AUXDATA(xprd, std::vector<float>,rdo_Eterm) = std::move(ETerm);
729
730}
PixelChargeCalib::LegacyFitParameters getLegacyFitParameters(InDetDD::PixelDiodeType type, unsigned int moduleHash, unsigned int FE) const
ServiceHandle< InDetDD::IPixelReadoutManager > m_pixelReadout

◆ addSDOInformation()

std::vector< std::vector< int > > PixelPrepDataToxAOD::addSDOInformation ( xAOD::TrackMeasurementValidation * xprd,
const InDet::PixelCluster * prd,
const InDetSimDataCollection & sdoCollection ) const
private

Definition at line 431 of file PixelPrepDataToxAOD.cxx.

434{
435 std::vector<int> sdo_word;
436 std::vector< std::vector< int > > sdo_depositsUniqueID;
437 std::vector< std::vector< float > > sdo_depositsEnergy;
438 // find hit
439 for( const auto &hitIdentifier : prd->rdoList() ){
440 auto pos = sdoCollection.find(hitIdentifier);
441 if( pos == sdoCollection.end() ) continue;
442 sdo_word.push_back( pos->second.word() ) ;
443 std::vector<int> sdoDepUID(pos->second.getdeposits().size(), HepMC::INVALID_PARTICLE_ID);
444 std::vector<float> sdoDepEnergy(pos->second.getdeposits().size());
445 unsigned int nDepos{0};
446 for (auto& deposit: pos->second.getdeposits()) {
447 if (deposit.first) sdoDepUID[nDepos] = HepMC::uniqueID(deposit.first);
448 ATH_MSG_DEBUG(" SDO Energy Deposit " << deposit.second ) ;
449 sdoDepEnergy[nDepos] = deposit.second;
450 nDepos++;
451 }
452 sdo_depositsUniqueID.push_back( std::move(sdoDepUID) );
453 sdo_depositsEnergy.push_back( std::move(sdoDepEnergy) );
454 }
455 AUXDATA(xprd,std::vector<int>,sdo_words) = std::move(sdo_word);
456 AUXDATA(xprd,std::vector< std::vector<int> >,sdo_depositsBarcode) = sdo_depositsUniqueID; // TODO rename variable to be consistent?
457 AUXDATA(xprd,std::vector< std::vector<float> >,sdo_depositsEnergy) = std::move(sdo_depositsEnergy);
458
459 return sdo_depositsUniqueID;
460}
const std::vector< Identifier > & rdoList() const
return the List of rdo identifiers (pointers)
constexpr int INVALID_PARTICLE_ID

◆ addSiHitInformation()

void PixelPrepDataToxAOD::addSiHitInformation ( xAOD::TrackMeasurementValidation * xprd,
const InDet::PixelCluster * prd,
const std::vector< SiHit > & matchingHits ) const
private

Definition at line 464 of file PixelPrepDataToxAOD.cxx.

467{
468
469 int numHits = matchingHits.size();
470
471 std::vector<float> sihit_energyDeposit(numHits,0);
472 std::vector<float> sihit_meanTime(numHits,0);
473 std::vector<int> sihit_uniqueID(numHits,HepMC::UNDEFINED_ID);
474 std::vector<int> sihit_pdgid(numHits,0);
475
476 std::vector<float> sihit_startPosX(numHits,0);
477 std::vector<float> sihit_startPosY(numHits,0);
478 std::vector<float> sihit_startPosZ(numHits,0);
479
480 std::vector<float> sihit_endPosX(numHits,0);
481 std::vector<float> sihit_endPosY(numHits,0);
482 std::vector<float> sihit_endPosZ(numHits,0);
483
484 int hitNumber(0);
485 const InDetDD::SiDetectorElement* de = prd->detectorElement();
486 if(de){
487 for ( const auto& sihit : matchingHits ) {
488 sihit_energyDeposit[hitNumber] = sihit.energyLoss() ;
489 sihit_meanTime[hitNumber] = sihit.meanTime() ;
490 const HepMcParticleLink& HMPL = sihit.particleLink();
491 sihit_uniqueID[hitNumber] = HepMC::uniqueID(HMPL) ;
492 if(HMPL.isValid()){
493 sihit_pdgid[hitNumber] = HMPL->pdg_id();
494 }
495
496 // Convert Simulation frame into reco frame
497 const HepGeom::Point3D<double>& startPos=sihit.localStartPosition();
498
499 Amg::Vector2D pos= de->hitLocalToLocal( startPos.z(), startPos.y() );
500 sihit_startPosX[hitNumber] = pos[0];
501 sihit_startPosY[hitNumber] = pos[1];
502 sihit_startPosZ[hitNumber] = startPos.x();
503
504
505 const HepGeom::Point3D<double>& endPos=sihit.localEndPosition();
506 pos= de->hitLocalToLocal( endPos.z(), endPos.y() );
507 sihit_endPosX[hitNumber] = pos[0];
508 sihit_endPosY[hitNumber] = pos[1];
509 sihit_endPosZ[hitNumber] = endPos.x();
510 ++hitNumber;
511 }
512 }
513
514 AUXDATA(xprd,std::vector<float>,sihit_energyDeposit) = std::move(sihit_energyDeposit);
515 AUXDATA(xprd,std::vector<float>,sihit_meanTime) = std::move(sihit_meanTime);
516 AUXDATA(xprd,std::vector<int>,sihit_barcode) = std::move(sihit_uniqueID); // TODO rename variable to be consistent?
517 AUXDATA(xprd,std::vector<int>,sihit_pdgid) = std::move(sihit_pdgid);
518
519 AUXDATA(xprd,std::vector<float>,sihit_startPosX) = std::move(sihit_startPosX);
520 AUXDATA(xprd,std::vector<float>,sihit_startPosY) = std::move(sihit_startPosY);
521 AUXDATA(xprd,std::vector<float>,sihit_startPosZ) = std::move(sihit_startPosZ);
522
523 AUXDATA(xprd,std::vector<float>,sihit_endPosX) = std::move(sihit_endPosX);
524 AUXDATA(xprd,std::vector<float>,sihit_endPosY) = std::move(sihit_endPosY);
525 AUXDATA(xprd,std::vector<float>,sihit_endPosZ) = std::move(sihit_endPosZ);
526
527
528}
virtual const InDetDD::SiDetectorElement * detectorElement() const override final
return the detector element corresponding to this PRD The pointer will be zero if the det el is not d...

◆ AthAlgorithm()

AthAlgorithm::AthAlgorithm ( const std::string & name,
ISvcLocator * pSvcLocator )

Constructor.

Definition at line 31 of file AthAlgorithm.cxx.

11 :
12 AthCommonAlgorithm<Gaudi::Algorithm>( name, pSvcLocator )
13{
14 // default cardinality for non-reentrant algorithms
15 setProperty( "Cardinality", 1 ).orThrow("Unable to set property 'Cardinality'", name);
16}
void setProperty(columnar::PythonToolHandle &self, const std::string &key, nb::object value)
AthCommonAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode PixelPrepDataToxAOD::execute ( const EventContext & ctx)
virtual

Execute method.

Implements AthAlgorithm.

Definition at line 95 of file PixelPrepDataToxAOD.cxx.

96{
97 //Mandatory. Require if the algorithm is scheduled.
98 SG::ReadHandle<InDet::PixelClusterContainer> PixelClusterContainer(m_clustercontainer_key,ctx);
99
100 if ( !PixelClusterContainer.isValid() )
101 {
102 ATH_MSG_ERROR("Failed to retrieve PixelClusterContainer with key" << PixelClusterContainer.key() );
103 return StatusCode::FAILURE;
104 }
105
106 const PRD_MultiTruthCollection* prdmtColl(nullptr);
107 const xAODTruthParticleLinkVector *truth_particle_links{nullptr};
108 if (m_useTruthInfo) {
109 SG::ReadHandle<PRD_MultiTruthCollection> prdmtCollHandle(m_multiTruth_key,ctx);
110 if (prdmtCollHandle.isValid()) {
111 prdmtColl = &*prdmtCollHandle;
112 }
113 if (!m_truthParticleLinks.empty()) {
114 SG::ReadHandle<xAODTruthParticleLinkVector> truthParticleLinksHandle{m_truthParticleLinks, ctx};
115 if (truthParticleLinksHandle.isValid()) {
116 truth_particle_links = truthParticleLinksHandle.cptr();
117 }
118 }
119 }
120
121 const InDetSimDataCollection* sdoCollection(nullptr);
122 if (m_writeSDOs) {
123 SG::ReadHandle<InDetSimDataCollection> sdoCollectionHandle(m_SDOcontainer_key,ctx);
124 if (sdoCollectionHandle.isValid()) {
125 sdoCollection = &*sdoCollectionHandle;
126 } else if (m_firstEventWarnings) {
127 ATH_MSG_WARNING("SDO information requested, but SDO collection not available!");
128 }
129 }
130
131 SG::ReadHandle<Trk::ClusterSplitProbabilityContainer> splitProbContainer;
132 bool foundSplitProbContainer = false;
133 if (!m_clusterSplitProbContainer.key().empty()) {
134 splitProbContainer=SG::ReadHandle<Trk::ClusterSplitProbabilityContainer>(m_clusterSplitProbContainer, ctx);
135 if (!splitProbContainer.isValid()) {
136 ATH_MSG_FATAL("Failed to get cluster splitting probability container " << m_clusterSplitProbContainer);
137 }
138 foundSplitProbContainer = true;
139 }
140
141 std::vector<std::vector<const SiHit*>> siHits(m_PixelHelper->wafer_hash_max());
142 if (m_need_sihits) {
143 SG::ReadHandle<SiHitCollection> siHitCollectionHandle(m_sihitContainer_key, ctx);
144 if (siHitCollectionHandle.isValid()) {
145 for (const SiHit& siHit: *siHitCollectionHandle) {
146 // Check if it is a Pixel hit
147 if (!siHit.isPixel()) continue;
148
149 Identifier wafer_id(m_PixelHelper->wafer_id(siHit.getBarrelEndcap(),
150 siHit.getLayerDisk(),
151 siHit.getPhiModule(),
152 siHit.getEtaModule()));
153 IdentifierHash wafer_hash(m_PixelHelper->wafer_hash(wafer_id));
154 if (wafer_hash>=m_PixelHelper->wafer_hash_max()) continue;
155 siHits[wafer_hash].push_back(&siHit);
156 }
157 } else if (m_firstEventWarnings) {
158 ATH_MSG_WARNING("SiHit information requested, but SiHit collection not available!");
159 }
160 }
161
162 const PixelChargeCalibCondData *calibData=nullptr;
164 SG::ReadCondHandle<PixelChargeCalibCondData> calibData_handle(m_chargeDataKey,ctx);
165 if (!calibData_handle.isValid()) {
166 ATH_MSG_FATAL("Failed to get PixelChargeCalibCondData with key " << m_chargeDataKey);
167 }
168 calibData=calibData_handle.cptr();
169 }
170
171 // Create the xAOD container and its auxiliary store:
172 SG::WriteHandle<xAOD::TrackMeasurementValidationContainer> xaod(m_write_xaod_key,ctx);
173 ATH_CHECK(xaod.record(std::make_unique<xAOD::TrackMeasurementValidationContainer>(),
174 std::make_unique<xAOD::TrackMeasurementValidationAuxContainer>()));
175
176 SG::WriteHandle<std::vector<unsigned int>> offsets(m_write_offsets,ctx);
177 ATH_CHECK(offsets.record(std::make_unique<std::vector<unsigned int>>(m_PixelHelper->wafer_hash_max(), 0)));
178
179 unsigned int have_truth_link=0u;
180 unsigned int missing_truth_particle=0u;
181 unsigned int missing_parent_particle=0u;
182 // Loop over the container
183 unsigned int counter(0);
184
185 SG::ReadCondHandle<PixelDCSStateData> dcsState(m_condDCSStateKey,ctx);
186 SG::ReadCondHandle<PixelDCSHVData> dcsHV(m_readKeyHV,ctx);
187 SG::ReadCondHandle<PixelDCSTempData> dcsTemp(m_readKeyTemp,ctx);
188
189 std::unordered_map< unsigned int , std::vector<unsigned int> > cluster_map;
190 for( const auto clusterCollection : * PixelClusterContainer ){
191
192 //Fill Offset container
193 (*offsets)[clusterCollection->identifyHash()] = counter;
194
195 // skip empty collections
196 if( clusterCollection->empty() ) continue;
197
198 // loop over collection and convert to xAOD
199 for( const InDet::PixelCluster* prd : *clusterCollection ){
200 ++counter;
201
202 Identifier clusterId = prd->identify();
203 if ( !clusterId.is_valid() ) {
204 ATH_MSG_WARNING("Pixel cluster identifier is not valid");
205 }
206
207 // create and add xAOD object
209 unsigned int cluster_idx = xaod->size();
210 xaod->push_back(xprd);
211
212 //Set Identifier
213 xprd->setIdentifier( clusterId.get_compact() );
214
215 //Set Global Position
216 Amg::Vector3D gpos = prd->globalPosition();
217 xprd->setGlobalPosition(gpos.x(),gpos.y(),gpos.z());
218
219 //Set Local Position
220 const Amg::Vector2D& locpos = prd->localPosition();
221
222 // Set local error matrix
223 xprd->setLocalPosition( locpos.x(), locpos.y() );
224
225 const Amg::MatrixX& localCov = prd->localCovariance();
226 if(localCov.size() == 1){
227 xprd->setLocalPositionError( localCov(0,0), 0., 0. );
228 } else if(localCov.size() == 4){
229 xprd->setLocalPositionError( localCov(0,0), localCov(1,1), localCov(0,1) );
230 } else {
231 xprd->setLocalPositionError(0.,0.,0.);
232 }
233
234 // Set vector of hit identifiers
235 std::vector< uint64_t > rdoIdentifierList;
236 rdoIdentifierList.reserve(prd->rdoList().size());
237 int rowmin=9999; int rowmax=-9999;
238 int colmin=9999; int colmax=-9999;
239 for( const auto &hitIdentifier : prd->rdoList() ){
240 rdoIdentifierList.push_back( hitIdentifier.get_compact() );
241 //May want to addinformation about the individual hits here
242 int row = m_PixelHelper->phi_index(hitIdentifier);
243 int col = m_PixelHelper->eta_index(hitIdentifier);
244 if(rowmin > row) rowmin = row;
245 if(rowmax < row) rowmax = row;
246 if(colmin > col) colmin = col;
247 if(colmax < col) colmax = col;
248 }
249 xprd->setRdoIdentifierList(rdoIdentifierList);
250
251 //Add pixel cluster properties
252 AUXDATA(xprd,int,bec) = m_PixelHelper->barrel_ec(clusterId) ;
253 char the_layer = m_PixelHelper->layer_disk(clusterId) ;
254 char the_eta = m_PixelHelper->eta_module(clusterId) ;
255 short the_phi = m_PixelHelper->phi_module(clusterId) ;
256 AUXDATA(xprd,int,layer) = the_layer ;
257 AUXDATA(xprd,int,phi_module) = the_phi ;
258 AUXDATA(xprd,int,eta_module) = the_eta ;
259 AUXDATA(xprd,int,eta_pixel_index) = m_PixelHelper->eta_index(clusterId);
260 AUXDATA(xprd,int,phi_pixel_index) = m_PixelHelper->phi_index(clusterId);
261
262 cluster_map[ makeKey(the_phi, the_eta, the_layer)].push_back(cluster_idx);
263
264 const InDet::SiWidth cw = prd->width();
265 AUXDATA(xprd,int,sizePhi) = (int)cw.colRow()[0];
266 AUXDATA(xprd,int,sizeZ) = (int)cw.colRow()[1];
267 AUXDATA(xprd,int,nRDO) = (int)prd->rdoList().size();
268
269 AUXDATA(xprd,float,charge) = prd->totalCharge();
270 AUXDATA(xprd,int,ToT) = prd->totalToT();
271 AUXDATA(xprd,int,LVL1A) = prd->LVL1A();
272
273 AUXDATA(xprd,char,isFake) = (char)prd->isFake();
274 AUXDATA(xprd,char,gangedPixel) = (char)prd->gangedPixel();
275 const Trk::ClusterSplitProbabilityContainer::ProbabilityInfo &
276 splitProb = foundSplitProbContainer ? splitProbContainer->splitProbability(prd) : Trk::ClusterSplitProbabilityContainer::getNoSplitProbability();
277 AUXDATA(xprd,char,isSplit) = static_cast<char>(splitProb.isSplit());
278 AUXDATA(xprd,float,splitProbability1) = splitProb.splitProbability1();
279 AUXDATA(xprd,float,splitProbability2) = splitProb.splitProbability2();
280
281 // Need to add something to Add the NN splitting information
282 if(m_writeNNinformation) addNNInformation( xprd, prd, 7, 7);
283
284 // Add information for each contributing hit
286 IdentifierHash moduleHash = clusterCollection->identifyHash();
287 AUXDATA(xprd,int,hasBSError) = (int)m_pixelSummary->hasBSError(moduleHash, ctx);
288 AUXDATA(xprd,int,DCSState) = dcsState->getModuleStatus(moduleHash);
289
290 float deplVoltage = 0.0;
291 AUXDATA(xprd,float,BiasVoltage) = dcsHV->getBiasVoltage(moduleHash);
292 AUXDATA(xprd,float,Temperature) = dcsTemp->getTemperature(moduleHash);
293 AUXDATA(xprd,float,DepletionVoltage) = deplVoltage;
294
295 AUXDATA(xprd,float,LorentzShift) = (float)m_lorentzAngleTool->getLorentzShift(moduleHash,ctx);
296
297 assert (calibData);
298 addRdoInformation(xprd, prd, calibData);
299 }
300
301
302 // Add the Detector element ID -- not sure if needed as we have the informations above
303 const InDetDD::SiDetectorElement* de = prd->detectorElement();
304 uint64_t detElementId(0);
305 if(de){
306 Identifier detId = de->identify();
307 if ( detId.is_valid() ) {
308 detElementId = detId.get_compact();
309 }
310 }
311 AUXDATA(xprd,uint64_t,detectorElementID) = detElementId;
312
314 AUXDATA(xprd,int,waferID) = m_PixelHelper->wafer_hash(de->identify());
315
316 const InDetDD::PixelModuleDesign* design = static_cast<const InDetDD::PixelModuleDesign*>(&de->design());
317 InDetDD::SiLocalPosition pos1 = design->positionFromColumnRow(colmin,rowmin);
318 InDetDD::SiLocalPosition pos2 = design->positionFromColumnRow(colmax,rowmin);
319 InDetDD::SiLocalPosition pos3 = design->positionFromColumnRow(colmin,rowmax);
320 InDetDD::SiLocalPosition pos4 = design->positionFromColumnRow(colmax,rowmax);
321 InDetDD::SiLocalPosition centroid = 0.25*(pos1+pos2+pos3+pos4);
322
323 AUXDATA(xprd,float,centroid_xphi) = centroid.xPhi();
324 AUXDATA(xprd,float,centroid_xeta) = centroid.xEta();
325
326 AUXDATA(xprd,float,omegax) = prd->omegax();
327 AUXDATA(xprd,float,omegay) = prd->omegay();
328 }
329
330 // Use the MultiTruth Collection to get a list of all true particle contributing to the cluster
331 if (prdmtColl) {
332 auto range{prdmtColl->equal_range(clusterId)};
333 if (truth_particle_links) {
334 std::vector<unsigned int> tp_indices;
335 for (auto i{range.first}; i!=range.second; ++i) {
336 ElementLink<xAOD::TruthParticleContainer> a_truth_particle_link = truth_particle_links->find(i->second);
337 if (a_truth_particle_link) {
338 const xAOD::TruthParticle *truth_particle = *a_truth_particle_link;
339 if (truth_particle) {
340 ++have_truth_link;
341 tp_indices.push_back(static_cast<int>(truth_particle->index()));
342 }
343 else {
344 ++missing_parent_particle;
345 }
346 }
347 else {
348 tp_indices.push_back(std::numeric_limits<unsigned int>::max());
349 ++missing_truth_particle;
350 }
351 }
352 // @TODO provide possibility to move tp_indices to its final destination
353 AUXDATA(xprd,std::vector<unsigned int>, truth_index) = std::move(tp_indices);
354 }
355 std::vector<int> uniqueIDs;
356 for (auto i = range.first; i != range.second; ++i) {
357 uniqueIDs.push_back( HepMC::uniqueID(i->second) );
358 }
359 AUXDATA(xprd,std::vector<int>, truth_barcode) = std::move(uniqueIDs); // TODO rename variable to be consistent?
360 }
361
362 std::vector< std::vector< int > > sdo_tracks;
363 // Use the SDO Collection to get a list of all true particle contributing to the cluster per readout element
364 // Also get the energy deposited by each true particle per readout element
365 if (sdoCollection) {
366 sdo_tracks = addSDOInformation(xprd, prd, *sdoCollection);
367 }
368
369 // Now Get the most detailed truth from the SiHits
370 // Note that this could get really slow if there are a lot of hits and clusters
371 if (m_need_sihits) {
372 const std::vector<SiHit> matched_hits = findAllHitsCompatibleWithCluster(prd, &siHits[prd->detectorElement()->identifyHash()], sdo_tracks);
373 if (m_writeSiHits) {
374 addSiHitInformation(xprd, prd, matched_hits);
375 }
376
378 addNNTruthInfo(xprd, prd, matched_hits);
379 }
380 }
381 }
382 }
383
384 for ( auto clusItr = xaod->begin(); clusItr != xaod->end(); ++clusItr ) {
385 AUXDATA(*clusItr,char,broken) = false;
386 }
387 m_haveTruthLink += have_truth_link;
388 m_missingTruthParticle += missing_truth_particle;
389 m_missingParentParticle += missing_parent_particle;
390
391 static const SG::AuxElement::Accessor<int> acc_layer ("layer");
392 static const SG::AuxElement::Accessor<int> acc_phi_module ("phi_module");
393 static const SG::AuxElement::Accessor<int> acc_eta_module ("eta_module");
394 static const SG::AuxElement::Accessor<std::vector<int> > acc_sihit_barcode ("sihit_barcode"); // TODO rename variable to be consistent?
395 for ( auto clusItr = xaod->begin(); clusItr != xaod->end(); ++clusItr)
396 {
397 auto pixelCluster = *clusItr;
398 int layer = acc_layer(*pixelCluster);
399 std::vector<int> uniqueIDs = acc_sihit_barcode(*pixelCluster); // TODO rename variable to be consistent?
400
401 const std::vector< unsigned int> &cluster_idx_list = cluster_map.at( makeKey(acc_phi_module(*pixelCluster), acc_eta_module(*pixelCluster), acc_layer(*pixelCluster) ));
402 for (unsigned int cluster_idx : cluster_idx_list) {
403 auto pixelCluster2 = xaod->at(cluster_idx);
404 if ( acc_layer(*pixelCluster2) != layer )
405 continue;
406 if ( acc_eta_module(*pixelCluster) != acc_eta_module(*pixelCluster2) )
407 continue;
408 if ( acc_phi_module(*pixelCluster) != acc_phi_module(*pixelCluster2) )
409 continue;
410
411 std::vector<int> uniqueIDs2 = acc_sihit_barcode(*pixelCluster2); // TODO rename variable to be consistent?
412
413 for ( auto uid : uniqueIDs ) {
414 if (std::find(uniqueIDs2.begin(), uniqueIDs2.end(), uid ) == uniqueIDs2.end()) continue;
415 static const SG::AuxElement::Accessor<char> acc_broken ("broken");
416 acc_broken(*pixelCluster) = true;
417 acc_broken(*pixelCluster2) = true;
418 break;
419 }
420 }
421 }
422
423 ATH_MSG_DEBUG( " recorded PixelPrepData objects: size " << xaod->size() );
424
425 m_firstEventWarnings = false;
426
427 return StatusCode::SUCCESS;
428}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
bool is_valid() const
Check if id is in a valid state.
value_type get_compact() const
Get the compact id.
SiLocalPosition positionFromColumnRow(const int column, const int row) const
Given row and column index of a diode, return position of diode center ALTERNATIVE/PREFERED way is to...
virtual Identifier identify() const override final
identifier of this detector element (inline)
const Amg::Vector2D & colRow() const
Definition SiWidth.h:115
void addNNInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *pixelCluster, const unsigned int SizeX, const unsigned int SizeY) const
SG::WriteHandleKey< std::vector< unsigned int > > m_write_offsets
Gaudi::Property< bool > m_writeExtendedPRDinformation
void addRdoInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *pixelCluster, const PixelChargeCalibCondData *calibData) const
std::atomic< unsigned int > m_missingTruthParticle
Gaudi::Property< bool > m_writeNNinformation
Gaudi::Property< bool > m_writeRDOinformation
SG::ReadCondHandleKey< PixelDCSHVData > m_readKeyHV
SG::ReadHandleKey< SiHitCollection > m_sihitContainer_key
SG::ReadCondHandleKey< PixelChargeCalibCondData > m_chargeDataKey
void addSiHitInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const std::vector< SiHit > &matchingHits) const
SG::ReadHandleKey< Trk::ClusterSplitProbabilityContainer > m_clusterSplitProbContainer
std::vector< SiHit > findAllHitsCompatibleWithCluster(const InDet::PixelCluster *prd, const std::vector< const SiHit * > *sihits, std::vector< std::vector< int > > &trkBCs) const
ToolHandle< IInDetConditionsTool > m_pixelSummary
Gaudi::Property< bool > m_useTruthInfo
SG::ReadHandleKey< xAODTruthParticleLinkVector > m_truthParticleLinks
SG::ReadCondHandleKey< PixelDCSTempData > m_readKeyTemp
SG::ReadHandleKey< InDetSimDataCollection > m_SDOcontainer_key
Gaudi::Property< bool > m_writeSDOs
std::atomic< unsigned int > m_missingParentParticle
void addNNTruthInfo(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const std::vector< SiHit > &matchingHits) const
SG::ReadHandleKey< InDet::PixelClusterContainer > m_clustercontainer_key
SG::ReadHandleKey< PRD_MultiTruthCollection > m_multiTruth_key
SG::ReadCondHandleKey< PixelDCSStateData > m_condDCSStateKey
SG::WriteHandleKey< xAOD::TrackMeasurementValidationContainer > m_write_xaod_key
std::vector< std::vector< int > > addSDOInformation(xAOD::TrackMeasurementValidation *xprd, const InDet::PixelCluster *prd, const InDetSimDataCollection &sdoCollection) const
Gaudi::Property< bool > m_writeSiHits
std::atomic< unsigned int > m_haveTruthLink
virtual bool isValid() override final
Can the handle be successfully dereferenced?
const_pointer_type cptr()
Dereference the pointer.
static const ProbabilityInfo & getNoSplitProbability()
ElementLink< xAOD::TruthParticleContainer > find(const HepMcParticleLink &hepMCLink) const
void setRdoIdentifierList(const std::vector< uint64_t > &rdoIdentifierList)
Sets the list of RDO identifiers.
void setLocalPositionError(float localXError, float localYError, float localXYCorrelation)
Sets the local position error.
void setLocalPosition(float localX, float localY)
Sets the local position.
void setIdentifier(uint64_t identifier)
Sets the identifier.
void setGlobalPosition(float globalX, float globalY, float globalZ)
Sets the global position.
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > MatrixX
Dynamic Matrix - dynamic allocation.
row
Appending html table to final .html summary file.
@ layer
Definition HitInfo.h:79
PixelClusterContainer_v1 PixelClusterContainer
Define the version of the pixel cluster container.
TrackMeasurementValidation_v1 TrackMeasurementValidation
Reference the current persistent version:
TruthParticle_v1 TruthParticle
Typedef to implementation.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ extraOutputDeps()

const DataObjIDColl & AthCommonAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 89 of file AthCommonAlgorithm.cxx.

54{
55 // If we didn't find any symlinks to add, just return the collection
56 // from the base class. Otherwise, return the extended collection.
57 if (!m_extendedExtraObjects.empty()) {
59 }
61}
Common base class for algorithms.

◆ filterPassed()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Get filter decision:

Definition at line 93 of file AthCommonAlgorithm.h.

93 {
94 return execState( ctx ).filterPassed();
95 }
virtual bool filterPassed(const EventContext &ctx) const
Get filter decision:

◆ finalize()

StatusCode PixelPrepDataToxAOD::finalize ( )
virtual

Definition at line 1239 of file PixelPrepDataToxAOD.cxx.

1240{
1241 if (m_useTruthInfo && !m_truthParticleLinks.empty()) {
1242 ATH_MSG_INFO("Missing truth particles " << m_missingTruthParticle << " missing parent: " << m_missingParentParticle
1243 << " have " << m_haveTruthLink);
1244 }
1245 return StatusCode::SUCCESS;
1246}
#define ATH_MSG_INFO(x)

◆ findAllHitsCompatibleWithCluster()

std::vector< SiHit > PixelPrepDataToxAOD::findAllHitsCompatibleWithCluster ( const InDet::PixelCluster * prd,
const std::vector< const SiHit * > * sihits,
std::vector< std::vector< int > > & trkBCs ) const
private

Definition at line 535 of file PixelPrepDataToxAOD.cxx.

538{
539 ATH_MSG_VERBOSE( "Got " << sihits->size() << " SiHits to look through" );
540 std::vector<SiHit> matchingHits;
541
542 // Check if we have detector element -- needed to find the local position of the SiHits
543 const InDetDD::SiDetectorElement* de = prd->detectorElement();
544 if(!de)
545 return matchingHits;
546
547 std::vector<const SiHit* > multiMatchingHits;
548
549 for ( const SiHit* siHit : *sihits) {
550 // Now we have all hits in the module that match lets check to see if they match the cluster
551 // Must be within +/- 1 hits of any hit in the cluster to be included
552
554 {
555 HepGeom::Point3D<double> averagePosition = siHit->localStartPosition() + siHit->localEndPosition();
556 averagePosition *= 0.5;
557 Amg::Vector2D pos = de->hitLocalToLocal( averagePosition.z(), averagePosition.y() );
558 InDetDD::SiCellId diode = de->cellIdOfPosition(pos);
559
560 for( const auto &hitIdentifier : prd->rdoList() ){
561 ATH_MSG_DEBUG("Truth Phi " << diode.phiIndex() << " Cluster Phi " << m_PixelHelper->phi_index( hitIdentifier ) );
562 ATH_MSG_DEBUG("Truth Eta " << diode.etaIndex() << " Cluster Eta " << m_PixelHelper->eta_index( hitIdentifier ) );
563 if( abs( int(diode.etaIndex()) - m_PixelHelper->eta_index( hitIdentifier ) ) <=1
564 && abs( int(diode.phiIndex()) - m_PixelHelper->phi_index( hitIdentifier ) ) <=1 )
565 {
566 multiMatchingHits.push_back(siHit);
567 break;
568 }
569 }
570 }
571 else
572 {
573 auto uid = HepMC::uniqueID(siHit->particleLink());
574 for ( const auto& uniqueIDSDOColl : trkUIDs ) {
575 if (std::find(uniqueIDSDOColl.begin(),uniqueIDSDOColl.end(),uid) == uniqueIDSDOColl.end() ) continue;
576 multiMatchingHits.push_back(siHit);
577 break;
578 }
579 }
580 }
581 //Now we will now make 1 SiHit for each true particle if the SiHits "touch" other
582 std::vector<const SiHit* >::iterator siHitIter = multiMatchingHits.begin();
583 std::vector<const SiHit* >::iterator siHitIter2 = multiMatchingHits.begin();
584 ATH_MSG_DEBUG( "Found " << multiMatchingHits.size() << " SiHit " );
585 for ( ; siHitIter != multiMatchingHits.end(); ++siHitIter) {
586 const SiHit* lowestXPos = *siHitIter;
587 const SiHit* highestXPos = *siHitIter;
588
589
590 // We will merge these hits
591 std::vector<const SiHit* > ajoiningHits;
592 ajoiningHits.push_back( *siHitIter );
593
594 siHitIter2 = siHitIter+1;
595 while ( siHitIter2 != multiMatchingHits.end() ) {
596 // Need to come from the same truth particle
597
598 if( !HepMC::is_same_particle((*siHitIter)->particleLink(),(*siHitIter2)->particleLink()) ){
599 ++siHitIter2;
600 continue;
601 }
602
603 // Check to see if the SiHits are compatible with each other.
604 if (std::abs((highestXPos->localEndPosition().x()-(*siHitIter2)->localStartPosition().x()))<0.00005 &&
605 std::abs((highestXPos->localEndPosition().y()-(*siHitIter2)->localStartPosition().y()))<0.00005 &&
606 std::abs((highestXPos->localEndPosition().z()-(*siHitIter2)->localStartPosition().z()))<0.00005 )
607 {
608 highestXPos = *siHitIter2;
609 ajoiningHits.push_back( *siHitIter2 );
610 // Dont use hit more than once
611 // @TODO could invalidate siHitIter
612 siHitIter2 = multiMatchingHits.erase( siHitIter2 );
613 }else if (std::abs((lowestXPos->localStartPosition().x()-(*siHitIter2)->localEndPosition().x()))<0.00005 &&
614 std::abs((lowestXPos->localStartPosition().y()-(*siHitIter2)->localEndPosition().y()))<0.00005 &&
615 std::abs((lowestXPos->localStartPosition().z()-(*siHitIter2)->localEndPosition().z()))<0.00005)
616 {
617 lowestXPos = *siHitIter2;
618 ajoiningHits.push_back( *siHitIter2 );
619 // Dont use hit more than once
620 // @TODO could invalidate siHitIter
621 siHitIter2 = multiMatchingHits.erase( siHitIter2 );
622 } else {
623 ++siHitIter2;
624 }
625 }
626
627 if( ajoiningHits.size() == 0){
628 ATH_MSG_WARNING("This should really never happen");
629 continue;
630 }else if(ajoiningHits.size() == 1){
631 // Copy Si Hit ready to return
632 matchingHits.push_back( *ajoiningHits[0] );
633 continue;
634 } else {
635 // Build new SiHit and merge information together.
636 ATH_MSG_DEBUG("Merging " << ajoiningHits.size() << " SiHits together." );
637
638
639 float energyDep(0);
640 float time(0);
641 for( const auto& siHit : ajoiningHits){
642 energyDep += siHit->energyLoss();
643 time += siHit->meanTime();
644 }
645 time /= (float)ajoiningHits.size();
646
647 matchingHits.emplace_back(lowestXPos->localStartPosition(),
648 highestXPos->localEndPosition(),
649 energyDep,
650 time,
651 (*siHitIter)->particleLink(),
652 0, // 0 for pixel 1 for Pixel
653 (*siHitIter)->getBarrelEndcap(),
654 (*siHitIter)->getLayerDisk(),
655 (*siHitIter)->getEtaModule(),
656 (*siHitIter)->getPhiModule(),
657 (*siHitIter)->getSide() );
658 ATH_MSG_DEBUG("Finished Merging " << ajoiningHits.size() << " SiHits together." );
659
660 }
661 }
662
663
664 return matchingHits;
665
666}
SiCellId cellIdOfPosition(const Amg::Vector2D &localPos) const
As in previous method but returns SiCellId.
Gaudi::Property< bool > m_useSiHitsGeometryMatching
HepGeom::Point3D< double > localStartPosition() const
Definition SiHit.cxx:146
HepGeom::Point3D< double > localEndPosition() const
Definition SiHit.cxx:153
time(flags, cells_name, *args, **kw)
bool is_same_particle(const T1 &p1, const T2 &p2)
Method to establish if two particles in the GenEvent actually represent the same particle.

◆ getCellIdWeightedPosition()

InDetDD::SiCellId PixelPrepDataToxAOD::getCellIdWeightedPosition ( const InDet::PixelCluster * pixelCluster,
int * rrowMin = 0,
int * rrowMax = 0,
int * rcolMin = 0,
int * rcolMax = 0 ) const
private

Definition at line 1135 of file PixelPrepDataToxAOD.cxx.

1140{
1141
1142 const InDetDD::SiDetectorElement* de = pixelCluster->detectorElement();
1143 if (de==nullptr) {
1144 ATH_MSG_ERROR("Could not get detector element");
1145 return {};
1146 }
1147
1148 const InDetDD::PixelModuleDesign* design(dynamic_cast<const InDetDD::PixelModuleDesign*>(&de->design()));
1149 if (not design) {
1150 ATH_MSG_WARNING("PixelModuleDesign was not retrieved in function 'getCellIdWeightedPosition'");
1151 return {};
1152 }
1153 const std::vector<Identifier>& rdos = pixelCluster->rdoList();
1154
1155 ATH_MSG_VERBOSE( "Number of RDOs: " << rdos.size() );
1156 const std::vector<float>& chList = pixelCluster->chargeList();
1157
1158 ATH_MSG_VERBOSE( "Number of charges: " << chList.size() );
1159 std::vector<Identifier>::const_iterator rdosBegin = rdos.begin();
1160 std::vector<Identifier>::const_iterator rdosEnd = rdos.end();
1161
1162 auto charge = chList.begin();
1163
1164 InDetDD::SiLocalPosition sumOfWeightedPositions(0,0,0);
1165 double sumOfCharge=0;
1166
1167 int phiPixelIndexMin = 99999;
1168 int phiPixelIndexMax = -99999;
1169 int etaPixelIndexMin = 99999;
1170 int etaPixelIndexMax = -99999;
1171
1172 for (; rdosBegin!= rdosEnd; ++rdosBegin, ++charge)
1173 {
1174
1175 Identifier rId = *rdosBegin;
1176 int phiPixelIndex = m_PixelHelper->phi_index(rId);
1177 int etaPixelIndex = m_PixelHelper->eta_index(rId);
1178
1179 ATH_MSG_VERBOSE(" Adding pixel phiPixelIndex: " << phiPixelIndex << " etaPixelIndex: " << etaPixelIndex << " charge: " << *charge );
1180
1181 // SiLocalPosition PixelModuleDesign::positionFromColumnRow(const int column, const int row) const;
1182 //
1183 // Given row and column index of diode, returns position of diode center
1184 // ALTERNATIVE/PREFERED way is to use localPositionOfCell(const SiCellId & cellId) or
1185 // rawLocalPositionOfCell method in SiDetectorElement.
1186 // DEPRECATED (but used in numerous places)
1187 //
1188 // Comment by Hide (referring the original comment in the code): 2015-02-04
1189 // I automatically replaced column to etaPixelIndex and row to phiPixelIndex here. It was bofore:
1190 // InDetDD::SiLocalPosition siLocalPosition( design->positionFromColumnRow(column,row) );
1191 //
1192 // Then I assume the argument of column/row in this function is in offline manner, not the real hardware column/row.
1193 //
1194 InDetDD::SiLocalPosition siLocalPosition( design->positionFromColumnRow(etaPixelIndex,phiPixelIndex) );
1195 ATH_MSG_VERBOSE ( "Local Position: Row = " << siLocalPosition.xRow() << ", Col = " << siLocalPosition.xColumn() );
1196
1197 sumOfWeightedPositions += (*charge)*siLocalPosition;
1198 sumOfCharge += (*charge);
1199
1200 if (phiPixelIndex < phiPixelIndexMin)
1201 phiPixelIndexMin = phiPixelIndex;
1202
1203 if (phiPixelIndex > phiPixelIndexMax)
1204 phiPixelIndexMax = phiPixelIndex;
1205
1206 if (etaPixelIndex < etaPixelIndexMin)
1207 etaPixelIndexMin = etaPixelIndex;
1208
1209 if (etaPixelIndex > etaPixelIndexMax)
1210 etaPixelIndexMax = etaPixelIndex;
1211
1212 }
1213 sumOfWeightedPositions /= sumOfCharge;
1214
1215 ATH_MSG_VERBOSE ( "Wighted position: Row = " << sumOfWeightedPositions.xRow() << ", Col = " << sumOfWeightedPositions.xColumn() );
1216
1217 if(rphiPixelIndexMin) *rphiPixelIndexMin = phiPixelIndexMin;
1218 if(rphiPixelIndexMax) *rphiPixelIndexMax = phiPixelIndexMax;
1219 if(retaPixelIndexMin) *retaPixelIndexMin = etaPixelIndexMin;
1220 if(retaPixelIndexMax) *retaPixelIndexMax = etaPixelIndexMax;
1221
1222 //what you want to know is simple:
1223 //just the phiPixelIndex and etaPixelIndex of this average position!
1224
1225 InDetDD::SiCellId cellIdWeightedPosition=design->cellIdOfPosition(sumOfWeightedPositions);
1226
1227
1228 return cellIdWeightedPosition;
1229
1230}

◆ initialize()

StatusCode PixelPrepDataToxAOD::initialize ( )
virtual

Definition at line 53 of file PixelPrepDataToxAOD.cxx.

54{
55 ATH_CHECK( detStore()->retrieve(m_PixelHelper, "PixelID") );
56
57 //make sure we don't write what we don't have
58 if (not m_useTruthInfo) {
59 m_writeSDOs = false;
60 m_writeSiHits = false;
61 }
62
63 ATH_CHECK(m_pixelReadout.retrieve());
65
66 ATH_CHECK(m_condDCSStateKey.initialize());
67 ATH_CHECK(m_condDCSStatusKey.initialize());
68 ATH_CHECK(m_readKeyTemp.initialize());
69 ATH_CHECK(m_readKeyHV.initialize());
70
71 ATH_CHECK(m_pixelSummary.retrieve(DisableTool{!m_writeRDOinformation} ));
72
73 ATH_CHECK(m_lorentzAngleTool.retrieve());
74
81
82 ATH_CHECK(m_write_xaod_key.initialize());
83 ATH_CHECK(m_write_offsets.initialize());
84
86
87 return StatusCode::SUCCESS;
88}
const ServiceHandle< StoreGateSvc > & detStore() const
SG::ReadCondHandleKey< PixelDCSStatusData > m_condDCSStatusKey

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isClonable()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::isClonable ( ) const
inlineoverridevirtualinherited

Specify if the algorithm is clonable.

Only relevant for non-reentrant algorithms. Actual number of clones needs to be set via the "Cardinality" property.

Reimplemented in AFP_DigiTop, AlgB, AlgT, BCM_Digitization, CscDigitBuilder, CscDigitToCscRDO, G4AtlasAlg, G4RunAlg, HGTD_Digitization, HiveAlgBase, InDet::GNNSeedingTrackMaker, InDet::SCT_Clusterization, InDet::SiSPGNNTrackMaker, InDet::SiSPSeededTrackFinder, InDet::SiTrackerSpacePointFinder, ISF::SimKernelMT, ITk::StripDigitization, ITkPixelCablingAlg, ITkStripCablingAlg, LArHitEMapMaker, LArTTL1Maker, LUCID_DigiTop, LVL1::L1TopoSimulation, MergeCalibHits, MergeGenericMuonSimHitColl, MergeHijingPars, MergeMcEventCollection, MergeTrackRecordCollection, MergeTruthJets, MergeTruthParticles, MuonDigitizer, PileUpMTAlg, PixelDigitization, RoIBResultToxAOD, SCT_ByteStreamErrorsTestAlg, SCT_CablingCondAlgFromCoraCool, SCT_CablingCondAlgFromText, SCT_ConditionsParameterTestAlg, SCT_ConditionsSummaryTestAlg, SCT_ConfigurationConditionsTestAlg, SCT_Digitization, SCT_FlaggedConditionTestAlg, SCT_LinkMaskingTestAlg, SCT_MajorityConditionsTestAlg, SCT_ModuleVetoTestAlg, SCT_MonitorConditionsTestAlg, SCT_PrepDataToxAOD, SCT_RawDataToxAOD, SCT_ReadCalibChipDataTestAlg, SCT_ReadCalibDataTestAlg, SCT_RODVetoTestAlg, SCT_SensorsTestAlg, SCT_SiliconConditionsTestAlg, SCT_StripVetoTestAlg, SCT_TdaqEnabledTestAlg, SCT_TestCablingAlg, SCTEventFlagWriter, SCTRawDataProvider, SCTSiLorentzAngleTestAlg, SCTSiPropertiesTestAlg, SGInputLoader, Simulation::BeamEffectsAlg, TileHitVecToCnt, TileMuonFitter, TilePulseForTileMuonReceiver, TileRawChannelMaker, TRTDigitization, and ZDC_DigiTop.

Definition at line 68 of file AthCommonAlgorithm.h.

68 {
69 return true;
70 }

◆ isReEntrant()

virtual bool AthAlgorithm::isReEntrant ( ) const
inlinefinaloverrideprotectedvirtualinherited

Legacy algorithms are not thread-safe.

Definition at line 47 of file AthAlgorithm.h.

47{ return false; }

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ setFilterPassed()

virtual void AthCommonAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Set filter decision:

Reimplemented in AthFilterAlgorithm.

Definition at line 99 of file AthCommonAlgorithm.h.

99 {
101 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const
Set filter decision:

◆ sysExecute()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Reimplemented in AthAnalysisAlgorithm.

Definition at line 80 of file AthCommonAlgorithm.cxx.

41{
42 return BaseAlg::sysExecute (ctx);
43}

◆ sysInitialize()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in AthAnalysisAlgorithm, AthFilterAlgorithm, AthHistogramAlgorithm, HypoBase, InputMakerBase, and PyAthena::Alg.

Definition at line 60 of file AthCommonAlgorithm.cxx.

71 {
73
74 if (sc.isFailure()) {
75 return sc;
76 }
77
78 ServiceHandle<ICondSvc> cs("CondSvc",name());
79 for (auto h : outputHandles()) {
80 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
81 // do this inside the loop so we don't create the CondSvc until needed
82 if ( cs.retrieve().isFailure() ) {
83 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
85 }
86 if (cs->regHandle(this,*h).isFailure()) {
88 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
89 << " with CondSvc");
90 }
91 }
92 }
93 return sc;
94}
virtual StatusCode sysInitialize() override
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }

Member Data Documentation

◆ m_chargeDataKey

SG::ReadCondHandleKey<PixelChargeCalibCondData> PixelPrepDataToxAOD::m_chargeDataKey {this, "PixelChargeCalibCondData", "PixelChargeCalibCondData", "Pixel charge calibration data"}
private

Definition at line 127 of file PixelPrepDataToxAOD.h.

128{this, "PixelChargeCalibCondData", "PixelChargeCalibCondData", "Pixel charge calibration data"};

◆ m_clustercontainer_key

SG::ReadHandleKey<InDet::PixelClusterContainer> PixelPrepDataToxAOD::m_clustercontainer_key {this, "SiClusterContainer", "PixelClusters"}
private

Definition at line 158 of file PixelPrepDataToxAOD.h.

159{this, "SiClusterContainer", "PixelClusters"};

◆ m_clusterSplitProbContainer

SG::ReadHandleKey<Trk::ClusterSplitProbabilityContainer> PixelPrepDataToxAOD::m_clusterSplitProbContainer {this, "ClusterSplitProbabilityName", "",""}
private

Definition at line 148 of file PixelPrepDataToxAOD.h.

149{this, "ClusterSplitProbabilityName", "",""};

◆ m_condDCSStateKey

SG::ReadCondHandleKey<PixelDCSStateData> PixelPrepDataToxAOD::m_condDCSStateKey {this, "PixelDCSStateCondData", "PixelDCSStateCondData", "Pixel FSM state key"}
private

Definition at line 130 of file PixelPrepDataToxAOD.h.

131{this, "PixelDCSStateCondData", "PixelDCSStateCondData", "Pixel FSM state key"};

◆ m_condDCSStatusKey

SG::ReadCondHandleKey<PixelDCSStatusData> PixelPrepDataToxAOD::m_condDCSStatusKey {this, "PixelDCSStatusCondData", "PixelDCSStatusCondData", "Pixel FSM status key"}
private

Definition at line 133 of file PixelPrepDataToxAOD.h.

134{this, "PixelDCSStatusCondData", "PixelDCSStatusCondData", "Pixel FSM status key"};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 393 of file AthCommonDataStore.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 390 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 108 of file AthCommonAlgorithm.h.

◆ m_firstEventWarnings

bool PixelPrepDataToxAOD::m_firstEventWarnings = true
private

Definition at line 155 of file PixelPrepDataToxAOD.h.

◆ m_haveTruthLink

std::atomic<unsigned int> PixelPrepDataToxAOD::m_haveTruthLink {}
mutableprivate

Definition at line 152 of file PixelPrepDataToxAOD.h.

152{};

◆ m_lorentzAngleTool

ToolHandle<ISiLorentzAngleTool> PixelPrepDataToxAOD::m_lorentzAngleTool {this, "LorentzAngleTool", "SiLorentzAngleTool", "Tool to retreive Lorentz angle"}
private

Definition at line 145 of file PixelPrepDataToxAOD.h.

146{this, "LorentzAngleTool", "SiLorentzAngleTool", "Tool to retreive Lorentz angle"};

◆ m_missingParentParticle

std::atomic<unsigned int> PixelPrepDataToxAOD::m_missingParentParticle {}
mutableprivate

Definition at line 154 of file PixelPrepDataToxAOD.h.

154{};

◆ m_missingTruthParticle

std::atomic<unsigned int> PixelPrepDataToxAOD::m_missingTruthParticle {}
mutableprivate

Definition at line 153 of file PixelPrepDataToxAOD.h.

153{};

◆ m_multiTruth_key

SG::ReadHandleKey<PRD_MultiTruthCollection> PixelPrepDataToxAOD::m_multiTruth_key {this, "PRD_MultiTruth", "PRD_MultiTruthPixel"}
private

Definition at line 164 of file PixelPrepDataToxAOD.h.

165{this, "PRD_MultiTruth", "PRD_MultiTruthPixel"};

◆ m_need_sihits

bool PixelPrepDataToxAOD::m_need_sihits = false
private

Definition at line 156 of file PixelPrepDataToxAOD.h.

◆ m_PixelHelper

const PixelID* PixelPrepDataToxAOD::m_PixelHelper = nullptr
private

Definition at line 112 of file PixelPrepDataToxAOD.h.

◆ m_pixelReadout

ServiceHandle<InDetDD::IPixelReadoutManager> PixelPrepDataToxAOD::m_pixelReadout {this, "PixelReadoutManager", "PixelReadoutManager", "Pixel readout manager" }
private

Definition at line 124 of file PixelPrepDataToxAOD.h.

125{this, "PixelReadoutManager", "PixelReadoutManager", "Pixel readout manager" };

◆ m_pixelSummary

ToolHandle<IInDetConditionsTool> PixelPrepDataToxAOD::m_pixelSummary {this, "PixelConditionsSummaryTool", "PixelConditionsSummaryTool", "Tool for PixelConditionsSummaryTool"}
private

Definition at line 142 of file PixelPrepDataToxAOD.h.

143{this, "PixelConditionsSummaryTool", "PixelConditionsSummaryTool", "Tool for PixelConditionsSummaryTool"};

◆ m_readKeyHV

SG::ReadCondHandleKey<PixelDCSHVData> PixelPrepDataToxAOD::m_readKeyHV {this, "ReadKeyHV", "PixelDCSHVCondData", "Key of input bias voltage conditions folder"}
private

Definition at line 139 of file PixelPrepDataToxAOD.h.

140{this, "ReadKeyHV", "PixelDCSHVCondData", "Key of input bias voltage conditions folder"};

◆ m_readKeyTemp

SG::ReadCondHandleKey<PixelDCSTempData> PixelPrepDataToxAOD::m_readKeyTemp {this, "ReadKeyTemp", "PixelDCSTempCondData", "Key of input sensor temperature conditions folder"}
private

Definition at line 136 of file PixelPrepDataToxAOD.h.

137{this, "ReadKeyTemp", "PixelDCSTempCondData", "Key of input sensor temperature conditions folder"};

◆ m_SDOcontainer_key

SG::ReadHandleKey<InDetSimDataCollection> PixelPrepDataToxAOD::m_SDOcontainer_key {this, "MC_SDOs", "PixelSDO_Map"}
private

Definition at line 162 of file PixelPrepDataToxAOD.h.

163{this, "MC_SDOs", "PixelSDO_Map"};

◆ m_sihitContainer_key

SG::ReadHandleKey<SiHitCollection> PixelPrepDataToxAOD::m_sihitContainer_key {this, "MC_Hits", "PixelHits"}
private

Definition at line 160 of file PixelPrepDataToxAOD.h.

161{this, "MC_Hits", "PixelHits"};

◆ m_truthParticleLinks

SG::ReadHandleKey<xAODTruthParticleLinkVector> PixelPrepDataToxAOD::m_truthParticleLinks {this,"InputTruthParticleLinks","","The key for the truth particle link collection."}
private

Definition at line 166 of file PixelPrepDataToxAOD.h.

167{this,"InputTruthParticleLinks","","The key for the truth particle link collection."};

◆ m_useSiHitsGeometryMatching

Gaudi::Property<bool> PixelPrepDataToxAOD::m_useSiHitsGeometryMatching {this, "UseSiHitsGeometryMatching", true}
private

Definition at line 121 of file PixelPrepDataToxAOD.h.

122{this, "UseSiHitsGeometryMatching", true};

◆ m_useTruthInfo

Gaudi::Property<bool> PixelPrepDataToxAOD::m_useTruthInfo {this, "UseTruthInfo", false}
private

Definition at line 114 of file PixelPrepDataToxAOD.h.

114{this, "UseTruthInfo", false};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_write_offsets

SG::WriteHandleKey<std::vector<unsigned int> > PixelPrepDataToxAOD::m_write_offsets {this, "PixelxAodOffset", "PixelClustersOffsets"}
private

Definition at line 171 of file PixelPrepDataToxAOD.h.

172{this, "PixelxAodOffset", "PixelClustersOffsets"};

◆ m_write_xaod_key

SG::WriteHandleKey<xAOD::TrackMeasurementValidationContainer> PixelPrepDataToxAOD::m_write_xaod_key {this, "OutputClusterContainer", "PixelClusters"}
private

Definition at line 169 of file PixelPrepDataToxAOD.h.

170{this, "OutputClusterContainer", "PixelClusters"};

◆ m_writeExtendedPRDinformation

Gaudi::Property<bool> PixelPrepDataToxAOD::m_writeExtendedPRDinformation {this, "WriteExtendedPRDinformation", false}
private

Definition at line 119 of file PixelPrepDataToxAOD.h.

120{this, "WriteExtendedPRDinformation", false};

◆ m_writeNNinformation

Gaudi::Property<bool> PixelPrepDataToxAOD::m_writeNNinformation {this, "WriteNNinformation", true}
private

Definition at line 117 of file PixelPrepDataToxAOD.h.

117{this, "WriteNNinformation", true};

◆ m_writeRDOinformation

Gaudi::Property<bool> PixelPrepDataToxAOD::m_writeRDOinformation {this, "WriteRDOinformation", true}
private

Definition at line 118 of file PixelPrepDataToxAOD.h.

118{this, "WriteRDOinformation", true};

◆ m_writeSDOs

Gaudi::Property<bool> PixelPrepDataToxAOD::m_writeSDOs {this, "WriteSDOs", false}
private

Definition at line 115 of file PixelPrepDataToxAOD.h.

115{this, "WriteSDOs", false};

◆ m_writeSiHits

Gaudi::Property<bool> PixelPrepDataToxAOD::m_writeSiHits {this, "WriteSiHits", false}
private

Definition at line 116 of file PixelPrepDataToxAOD.h.

116{this, "WriteSiHits", false};

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