Project
Loading...
Searching...
No Matches
ExternalDetector.h
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
31
32#ifndef ALICEO2_EXT_EXTERNALDETECTOR_H
33#define ALICEO2_EXT_EXTERNALDETECTOR_H
34
35#include "DetectorsBase/Detector.h" // for DetImpl
36#include "DetectorsCommonDataFormats/DetID.h" // for DetID
37#include "ExternalDetectors/Hit.h" // for the generic external hit type
38
39#include "Rtypes.h"
40#include "TLorentzVector.h"
41
42#include <functional>
43#include <set>
44#include <string>
45#include <unordered_map>
46#include <vector>
47
48class FairVolume;
49class TGeoMatrix;
50class TVector3;
51
52namespace o2::ext
53{
54
57 std::string root_macro_file; // ROOT macro describing the CAD geometry (O2_CADtoTGeo.py output)
58 std::string anchor_volume; // existing volume into which the geometry is hooked
59 TGeoMatrix const* placement = nullptr; // placement of the geometry inside the anchor (may be null)
60 std::vector<std::string> sensitiveMedia; // media (substring match on the medium name) to be made sensitive
61 std::vector<std::string> sensitiveVolumes; // volumes (substring match on the volume name) to be made sensitive
62 int detID = o2::detectors::DetID::ITS; // DetID this detector's hits are tied to (identity / output format)
63 std::string sensitiveMacro; // optional ROOT macro implementing the sensitive action
64 std::string sensitiveFunction; // global function in the macro returning the action (default "sensitiveAction()")
65};
66
67class ExternalDetector : public o2::base::DetImpl<ExternalDetector>
68{
69 public:
74 using SensitiveFcn = std::function<bool(o2::ext::ExternalDetector*)>;
75
76 ExternalDetector(const char* name, const char* title, ExternalDetectorOptions options);
78 ~ExternalDetector() override;
79
87 static std::vector<ExternalDetector*> createFromJSON(const std::string& jsonfile);
88
90 void ConstructGeometry() override;
91
93 void InitializeO2Detector() override;
94
96 Bool_t ProcessHits(FairVolume* v = nullptr) override;
97
99 void Register() override;
100
102 std::vector<o2::ext::Hit>* getHits(Int_t iColl) const
103 {
104 if (iColl == 0) {
105 return mHits;
106 }
107 return nullptr;
108 }
109
110 void Reset() override;
111 void EndOfEvent() override;
112
113 void FinishPrimary() override {}
114 void BeginPrimary() override {}
115 void PostTrack() override {}
116 void PreTrack() override {}
117
124 o2::ext::Hit* addHit(int trackID, int sensorID, const TVector3& startPos, const TVector3& endPos,
125 const TVector3& startMom, double startE, double endTime, double eLoss,
126 unsigned char startStatus, unsigned char endStatus, int pdg = 0, float length = 0.f);
127
130 int currentSensorID() const;
131
133 int currentTrackID() const;
135
136 protected:
138 Bool_t defaultProcessHits();
139
141 void collectSensitiveVolumeNames(TGeoVolume* vol, std::set<TGeoVolume*>& visited);
142
144
145 std::vector<std::string> mSensitiveVolumeNames;
146 std::set<int> mSensitiveVolIDs;
147 std::unordered_map<int, int> mVolID2SensorID;
148
150 struct TrackData {
152 unsigned char mTrkStatusStart;
153 TLorentzVector mPositionStart;
154 TLorentzVector mMomentumStart;
155 double mEnergyLoss;
157
158 std::vector<o2::ext::Hit>* mHits = nullptr;
159
161 FairVolume* mCurrentVolume = nullptr;
162
163 int mStepCount = 0;
164
165 private:
167 ExternalDetector& operator=(const ExternalDetector&);
168
169 template <typename Det>
170 friend class o2::base::DetImpl;
171 ClassDefOverride(ExternalDetector, 1);
172};
173
174} // namespace o2::ext
175
176#endif
Definition of the Detector class.
Generic hit type for externally injected (CAD-derived) sensitive detectors.
static constexpr ID ITS
Definition DetID.h:63
int currentTrackID() const
MCTrack number of the track currently being stepped.
static std::vector< ExternalDetector * > createFromJSON(const std::string &jsonfile)
std::vector< o2::ext::Hit > * mHits
void InitializeO2Detector() override
Resolve the Monte Carlo volume IDs of the sensitive volumes.
int mStepCount
volume currently passed to ProcessHits (for the action helpers)
std::unordered_map< int, int > mVolID2SensorID
MC volume IDs of the sensitive volumes.
o2::ext::Hit * addHit(int trackID, int sensorID, const TVector3 &startPos, const TVector3 &endPos, const TVector3 &startMom, double startE, double endTime, double eLoss, unsigned char startStatus, unsigned char endStatus, int pdg=0, float length=0.f)
ExternalDetectorOptions mOptions
void Register() override
Register the hit collection with the FairRootManager.
std::function< bool(o2::ext::ExternalDetector *)> SensitiveFcn
std::vector< o2::ext::Hit > * getHits(Int_t iColl) const
Get the produced hit collection (probe interface used by DetImpl).
SensitiveFcn mSensitiveAction
container for produced hits
FairVolume * mCurrentVolume
optional user-provided sensitive action (loaded from a macro)
void collectSensitiveVolumeNames(TGeoVolume *vol, std::set< TGeoVolume * > &visited)
recursively collect names of volumes whose medium matches the configured sensitive media
Bool_t ProcessHits(FairVolume *v=nullptr) override
Called for each tracking step; produces hits in the sensitive volumes.
void ConstructGeometry() override
Build the CAD geometry, remap its media and register the sensitive volumes.
std::vector< std::string > mSensitiveVolumeNames
Bool_t defaultProcessHits()
the built-in sensitive action used when no macro is configured (generic entrance/exit hit)
struct o2::ext::ExternalDetector::TrackData mTrackData
std::set< int > mSensitiveVolIDs
names of the volumes to be made sensitive (filled at geometry build)
const GLdouble * v
Definition glcorearb.h:832
GLuint const GLchar * name
Definition glcorearb.h:781
GLuint GLsizei GLsizei * length
Definition glcorearb.h:790
Configuration of a single sensitive external detector.
std::vector< std::string > sensitiveMedia
std::vector< std::string > sensitiveVolumes
dense sensor index per sensitive MC volume ID
TLorentzVector mPositionStart
track status flag at entrance
double mEnergyLoss
momentum at entrance
unsigned char mTrkStatusStart
hit creation started
TLorentzVector mMomentumStart
position at entrance