File indexing completed on 2024-04-06 12:29:47
0001 #ifndef SimG4CMS_CaloTrkProcessing_H
0002 #define SimG4CMS_CaloTrkProcessing_H
0003
0004 #include "SimG4Core/Notification/interface/Observer.h"
0005 #include "SimG4Core/SensitiveDetector/interface/SensitiveCaloDetector.h"
0006
0007 #include "CondFormats/GeometryObjects/interface/CaloSimulationParameters.h"
0008
0009 #include "FWCore/Framework/interface/Frameworkfwd.h"
0010 #include "FWCore/ParameterSet/interface/ParameterSetfwd.h"
0011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0012
0013 #include "G4VTouchable.hh"
0014 #include "G4Track.hh"
0015 #include "DataFormats/Math/interface/LorentzVector.h"
0016
0017 #include <map>
0018 #include <vector>
0019 #include <string>
0020 #include <iostream>
0021
0022 class BeginOfEvent;
0023 class G4LogicalVolume;
0024 class G4Step;
0025 class SimTrackManager;
0026
0027 class CaloTrkProcessing : public SensitiveCaloDetector,
0028 public Observer<const BeginOfEvent*>,
0029 public Observer<const G4Step*> {
0030 public:
0031 CaloTrkProcessing(const std::string& aSDname,
0032 const CaloSimulationParameters& csps,
0033 const SensitiveDetectorCatalog& clg,
0034 bool testBeam,
0035 double eMin,
0036 bool putHistory,
0037 bool doFineCalo,
0038 double eMinFine,
0039 int addlevel,
0040 const std::vector<std::string>& fineNames,
0041 const std::vector<int>& fineLevels,
0042 const std::vector<int>& useFines,
0043 const SimTrackManager*);
0044 ~CaloTrkProcessing() override;
0045 void Initialize(G4HCofThisEvent*) override {}
0046 void clearHits() override {}
0047 bool ProcessHits(G4Step*, G4TouchableHistory*) override { return true; }
0048 uint32_t setDetUnitId(const G4Step* step) override { return 0; }
0049 void EndOfEvent(G4HCofThisEvent*) override {}
0050 void fillHits(edm::PCaloHitContainer&, const std::string&) override {}
0051
0052 private:
0053 struct Detector {
0054 Detector() {}
0055 std::string name;
0056 G4LogicalVolume* lv;
0057 int level;
0058 std::vector<std::string> fromDets;
0059 std::vector<G4LogicalVolume*> fromDetL;
0060 std::vector<int> fromLevels;
0061 };
0062
0063 void update(const BeginOfEvent* evt) override;
0064 void update(const G4Step*) override;
0065 int isItCalo(const G4VTouchable*, const std::vector<Detector>&);
0066 int isItInside(const G4VTouchable*, int, int);
0067
0068
0069 int detLevels(const G4VTouchable*) const;
0070 G4LogicalVolume* detLV(const G4VTouchable*, int) const;
0071 void detectorLevel(const G4VTouchable*, int&, int*, G4String*) const;
0072
0073 const bool testBeam_;
0074 const double eMin_;
0075 const bool putHistory_;
0076 bool doFineCalo_;
0077 const double eMinFine_;
0078 const int addlevel_;
0079 int lastTrackID_;
0080 std::vector<Detector> detectors_, fineDetectors_;
0081 };
0082
0083 #endif