30 #include "CLHEP/Units/SystemOfUnits.h" 32 #include "Geant4/G4MuonMinus.hh" 33 #include "Geant4/G4MuonPlus.hh" 34 #include "Geant4/G4ParticleDefinition.hh" 35 #include "Geant4/G4StackManager.hh" 36 #include "Geant4/G4String.hh" 37 #include "Geant4/G4ThreeVector.hh" 38 #include "Geant4/G4Track.hh" 39 #include "Geant4/G4TrackStatus.hh" 40 #include "Geant4/G4VProcess.hh" 43 #include "RtypesCore.h" 51 : fstage(0), freqMuon(2), freqIsoMuon(0), freqIso(10), fangRoI(30. *
CLHEP::deg)
60 G4ClassificationOfNewTrack classification = fWaiting;
63 Double_t buffer = 500;
66 int ppdg = aTrack->GetParentID();
67 TString process(
"NA");
68 if (ppdg) process = (TString)aTrack->GetCreatorProcess()->GetProcessName();
72 if (aTrack->GetParentID() == 0) {
73 G4ParticleDefinition* particleType = aTrack->GetDefinition();
74 if (((particleType == G4MuonPlus::MuonPlusDefinition()) ||
75 (particleType == G4MuonMinus::MuonMinusDefinition())) &&
76 !volName.Contains(
"unknown")) {
77 classification = fUrgent;
80 if (volName.Contains(
"unknown")) classification = fKill;
85 if (aTrack->GetTrackStatus() == fSuspend) {
break; }
87 if ((aTrack->GetDefinition()->GetPDGEncoding() == 2112 ||
88 aTrack->GetDefinition()->GetPDGEncoding() == 130 ||
89 aTrack->GetDefinition()->GetPDGEncoding() == 310 ||
90 aTrack->GetDefinition()->GetPDGEncoding() == 311 ||
91 aTrack->GetDefinition()->GetPDGEncoding() == 3122) &&
92 (aTrack->GetParentID() == 1) && !volName.Contains(
"unknown")) {
94 const G4ThreeVector tr4Pos = aTrack->GetPosition();
96 const TVector3 trPos(tr4Pos.x() / CLHEP::cm, tr4Pos.y() / CLHEP::cm, tr4Pos.z() / CLHEP::cm);
97 classification = fUrgent;
99 auto const& tpc = geom->
TPC({0, 0});
100 if (trPos.X() < (tpc.HalfWidth() * 2.0 + buffer) && trPos.X() > (-buffer) &&
101 trPos.Y() < (tpc.HalfHeight() * 2.0 + buffer) &&
102 trPos.Y() > (-tpc.HalfHeight() * 2.0 - buffer) && trPos.Z() < (tpc.Length() + buffer) &&
103 trPos.Z() > (-buffer)) {
104 classification = fUrgent;
110 classification = fKill;
115 if (volName.Contains(
"unknown")) classification = fKill;
121 if (aTrack->GetParentID() == 0 && !volName.Contains(
"unknown")) {
122 classification = fUrgent;
126 auto const& tpc = geom->
TPC({0, 0});
127 if (volName.Contains(tpc.ActiveVolume()->GetName()) && aTrack->GetParentID() != 0) {
128 classification = fUrgent;
129 if (
fStack & 0
x4 && aTrack->GetCreatorProcess()->GetProcessName().contains(
"muIoni")) {
130 classification = fKill;
134 else if (volName.Contains(
"unknown")) {
135 classification = fKill;
139 if (aTrack->GetDefinition()->GetPDGEncoding() == 11 &&
140 aTrack->GetCreatorProcess()->GetProcessName().contains(
"muIoni")) {
141 classification = fKill;
145 classification = fKill;
149 return classification;
155 const G4ThreeVector tr4Pos = aTrack->GetPosition();
158 const geo::Point_t trPos(tr4Pos.x() / CLHEP::cm, tr4Pos.y() / CLHEP::cm, tr4Pos.z() / CLHEP::cm);
178 stackManager->ReClassify();
187 stackManager->ReClassify();
193 stackManager->ReClassify();
std::string InsideTPC(const G4Track *aTrack)
std::string VolumeName(Point_t const &point) const
Returns the name of the deepest volume containing specified point.
Float_t x4[n_points_geant4]
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space.
virtual G4ClassificationOfNewTrack ClassifyNewTrack(const G4Track *aTrack)
virtual void PrepareNewEvent()
TPCGeo const & TPC(TPCID const &tpcid=details::tpc_zero) const
Returns the specified TPC.
art framework interface to geometry description