File indexing completed on 2024-04-06 12:30:31
0001 #ifndef SimG4Core_SensitiveDetector_H
0002 #define SimG4Core_SensitiveDetector_H
0003
0004 #include "DataFormats/GeometryVector/interface/LocalPoint.h"
0005 #include "SimG4Core/Geometry/interface/SensitiveDetectorCatalog.h"
0006 #include "SimG4Core/Notification/interface/TrackInformation.h"
0007
0008 #include "G4VSensitiveDetector.hh"
0009
0010 #include <string>
0011 #include <cstdint>
0012
0013 class G4Track;
0014 class G4Step;
0015 class G4HCofThisEvent;
0016 class G4TouchableHistory;
0017 class G4VPhysicalVolume;
0018
0019 class SensitiveDetector : public G4VSensitiveDetector {
0020 public:
0021 explicit SensitiveDetector(const std::string& iname,
0022 const SensitiveDetectorCatalog&,
0023 bool calo,
0024 const std::string& newcollname = "");
0025
0026 ~SensitiveDetector() override;
0027
0028 void Initialize(G4HCofThisEvent* eventHC) override;
0029 G4bool ProcessHits(G4Step* step, G4TouchableHistory* tHistory) override = 0;
0030 void EndOfEvent(G4HCofThisEvent* eventHC) override;
0031
0032 virtual uint32_t setDetUnitId(const G4Step* step) = 0;
0033 virtual void clearHits() = 0;
0034
0035 inline const std::vector<std::string>& getNames() const { return m_namesOfSD; }
0036
0037 inline bool isCaloSD() const { return m_isCalo; }
0038
0039 protected:
0040
0041 enum coordinates { WorldCoordinates, LocalCoordinates };
0042 Local3DPoint InitialStepPosition(const G4Step* step, coordinates) const;
0043 Local3DPoint FinalStepPosition(const G4Step* step, coordinates) const;
0044
0045
0046 Local3DPoint LocalPreStepPosition(const G4Step* step) const;
0047 Local3DPoint LocalPostStepPosition(const G4Step* step) const;
0048
0049 inline Local3DPoint ConvertToLocal3DPoint(const G4ThreeVector& point) const {
0050 return Local3DPoint(point.x(), point.y(), point.z());
0051 }
0052
0053 void setNames(const std::vector<std::string>&);
0054 void NaNTrap(const G4Step* step) const;
0055
0056 TrackInformation* cmsTrackInformation(const G4Track* aTrack);
0057
0058 private:
0059 void AssignSD(const std::string& vname);
0060
0061 std::vector<std::string> m_namesOfSD;
0062 bool m_isCalo;
0063 };
0064
0065 #endif