ATLAS Offline Software
Public Member Functions | Private Member Functions | Private Attributes | List of all members
BLMSensorSD Class Reference

#include <BLMSensorSD.h>

Inheritance diagram for BLMSensorSD:
Collaboration diagram for BLMSensorSD:

Public Member Functions

 BLMSensorSD (const std::string &name, const std::string &hitCollectionName)
 
G4bool ProcessHits (G4Step *, G4TouchableHistory *) override final
 
void Initialize (G4HCofThisEvent *) override final
 
template<class... Args>
void AddHit (Args &&... args)
 Templated method to stuff a single hit into the sensitive detector class. More...
 

Private Member Functions

 FRIEND_TEST (BLMSensorSDtest, ProcessHits)
 
 FRIEND_TEST (BLMSensorSDtest, AddHit)
 

Private Attributes

std::string m_HitCollName
 
SiHitCollectionm_HitColl {nullptr}
 

Detailed Description

Definition at line 23 of file BLMSensorSD.h.

Constructor & Destructor Documentation

◆ BLMSensorSD()

BLMSensorSD::BLMSensorSD ( const std::string &  name,
const std::string &  hitCollectionName 
)

Definition at line 29 of file BLMSensorSD.cxx.

30  : G4VSensitiveDetector( name )
31  , m_HitCollName( hitCollectionName )
32 {
33 }

Member Function Documentation

◆ AddHit()

template<class... Args>
void BLMSensorSD::AddHit ( Args &&...  args)
inline

Templated method to stuff a single hit into the sensitive detector class.

This could get rather tricky, but the idea is to allow fast simulations to use the very same SD classes as the standard simulation.

Definition at line 40 of file BLMSensorSD.h.

40 { m_HitColl->Emplace( args... ); }

◆ FRIEND_TEST() [1/2]

BLMSensorSD::FRIEND_TEST ( BLMSensorSDtest  ,
AddHit   
)
private

◆ FRIEND_TEST() [2/2]

BLMSensorSD::FRIEND_TEST ( BLMSensorSDtest  ,
ProcessHits   
)
private

◆ Initialize()

void BLMSensorSD::Initialize ( G4HCofThisEvent *  )
finaloverride

Definition at line 37 of file BLMSensorSD.cxx.

38 {
39  // ISF calls G4SDManager::PrepareNewEvent() before the Geant4 event loop starts...
40  if(auto* eventManger = G4EventManager::GetEventManager()){
41  if(auto* eventInfo = static_cast<AtlasG4EventUserInfo*>(eventManger->GetUserInformation())){
42  m_HitColl = eventInfo->GetHitCollectionMap()->Find<SiHitCollection>(m_HitCollName);
43  }
44  }
45 }

◆ ProcessHits()

G4bool BLMSensorSD::ProcessHits ( G4Step *  aStep,
G4TouchableHistory *   
)
finaloverride

Definition at line 47 of file BLMSensorSD.cxx.

48 {
49  G4double edep = aStep->GetTotalEnergyDeposit();
50  edep *= CLHEP::MeV;
51 
52  //if there is no energy deposition skip everything
53  if(edep==0.)
54  {
55  if(aStep->GetTrack()->GetDefinition()!=G4Geantino::GeantinoDefinition() && aStep->GetTrack()->GetDefinition()!=G4ChargedGeantino::ChargedGeantinoDefinition()) return false;
56  }
57 
58  //Get the Touchable History:
59  const G4TouchableHistory *myTouch = dynamic_cast<const G4TouchableHistory*>(aStep->GetPreStepPoint()->GetTouchable());
60  if (not myTouch) {
61  G4cout << "BLMSensorSD::ProcessHits bad dynamic_cast" << G4endl;
62  return false;
63  }
64  int BEcopyNo = myTouch->GetVolume()->GetCopyNo();
65 
66  // Get the hit coordinates. Start and End Point
67  G4ThreeVector coord1 = aStep->GetPreStepPoint()->GetPosition();
68  G4ThreeVector coord2 = aStep->GetPostStepPoint()->GetPosition();
69 
70  // Calculate the local step begin and end position.
71  // From a G4 FAQ:
72  // http://geant4-hn.slac.stanford.edu:5090/HyperNews/public/get/geometry/17/1.html
73  const G4AffineTransform transformation = myTouch->GetHistory()->GetTopTransform();
74  G4ThreeVector localPosition1 = transformation.TransformPoint(coord1);
75  G4ThreeVector localPosition2 = transformation.TransformPoint(coord2);
76 
77  HepGeom::Point3D<double> lP1,lP2;
78  lP1[SiHit::xEta] = localPosition1[2]*CLHEP::mm;
79  lP1[SiHit::xPhi] = localPosition1[1]*CLHEP::mm;
80  lP1[SiHit::xDep] = localPosition1[0]*CLHEP::mm;
81 
82  lP2[SiHit::xEta] = localPosition2[2]*CLHEP::mm;
83  lP2[SiHit::xPhi] = localPosition2[1]*CLHEP::mm;
84  lP2[SiHit::xDep] = localPosition2[0]*CLHEP::mm;
85 
86  //BLM hit stuff
87  if(BEcopyNo == 2009)
88  {
89  TrackHelper trHelp(aStep->GetTrack());
90  //primary or not
91  int primaren = 0;
92  if(trHelp.IsPrimary())
93  primaren = 1;
94  else if(trHelp.IsRegeneratedPrimary())
95  primaren = 2;
96  else if(trHelp.IsSecondary())
97  primaren = 3;
98  else if(trHelp.IsRegisteredSecondary())
99  primaren = 4;
100 
101  int produced_in_diamond = 0;
102  if(aStep->GetTrack()->GetLogicalVolumeAtVertex()->GetName() == "Pixel::blmDiamondLog")
103  produced_in_diamond = 1;
104  else if(aStep->GetTrack()->GetLogicalVolumeAtVertex()->GetName() == "Pixel::blmModLog")
105  produced_in_diamond = 2;
106  else if(aStep->GetTrack()->GetLogicalVolumeAtVertex()->GetName() == "Pixel::blmWallLog")
107  produced_in_diamond = 3;
108 
109  m_HitColl->Emplace(lP1, lP2, edep, aStep->GetPreStepPoint()->GetGlobalTime(), trHelp.GenerateParticleLink(),
110  0, 0, myTouch->GetVolume(1)->GetCopyNo()-222, 0, primaren, produced_in_diamond);
111  }
112  return true;
113 }

Member Data Documentation

◆ m_HitColl

SiHitCollection* BLMSensorSD::m_HitColl {nullptr}
private

Definition at line 44 of file BLMSensorSD.h.

◆ m_HitCollName

std::string BLMSensorSD::m_HitCollName
private

Definition at line 43 of file BLMSensorSD.h.


The documentation for this class was generated from the following files:
AtlasG4EventUserInfo
This class is attached to G4Event objects as UserInformation. It holds a pointer to the HepMC::GenEve...
Definition: AtlasG4EventUserInfo.h:23
SiHit::xDep
@ xDep
Definition: SiHit.h:162
python.SystemOfUnits.mm
float mm
Definition: SystemOfUnits.py:98
python.CaloAddPedShiftConfig.args
args
Definition: CaloAddPedShiftConfig.py:47
SiHit::xPhi
@ xPhi
Definition: SiHit.h:162
AtlasHitsVector< SiHit >
BLMSensorSD::m_HitColl
SiHitCollection * m_HitColl
Definition: BLMSensorSD.h:44
python.SystemOfUnits.MeV
float MeV
Definition: SystemOfUnits.py:172
AtlasHitsVector::Emplace
void Emplace(Args &&... args)
Definition: AtlasHitsVector.h:80
TrackHelper
Definition: TrackHelper.h:14
BLMSensorSD::m_HitCollName
std::string m_HitCollName
Definition: BLMSensorSD.h:43
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
SiHit::xEta
@ xEta
Definition: SiHit.h:162