9 #include "lcdd/util/StringUtil.hh"
12 #include "G4SDManager.hh"
13 #include "G4SystemOfUnits.hh"
16 #include "EVENT/MCParticle.h"
17 #include "IMPL/LCCollectionVec.h"
18 #include "IMPL/LCFlagImpl.h"
21 using IMPL::SimCalorimeterHitImpl;
22 using IMPL::SimTrackerHitImpl;
23 using IMPL::LCEventImpl;
24 using IMPL::LCFlagImpl;
25 using IMPL::LCCollectionVec;
27 using EVENT::MCParticle;
37 Module(
"LcioHitsCollectionBuilder"), m_storeMomentum(0) {
59 G4HCtable* HCtbl = G4SDManager::GetSDMpointer()->GetHCtable();
64 LCCollectionVec* collVec = 0;
67 for (std::vector<int>::const_iterator iter = hcids.begin(); iter != hcids.end(); iter++) {
72 SensitiveDetector *SD =
static_cast<SensitiveDetector*
>(G4SDManager::GetSDMpointer()->FindSensitiveDetector(HCtbl->GetSDname(hcid)));
75 for (
int i = 0; i < SD->getNumberOfHitsCollections(); i++) {
76 if (SD->getHCID(i) == hcid) {
77 G4VHitsCollection* HC = HCE->GetHC(hcid);
88 if (SD->getIdSpec()) {
89 std::string
id = SD->getIdSpec()->getFieldDescription();
90 collVec->parameters().setValue(LCIO::CellIDEncoding,
id);
97 LCCollectionVec * collection = (LCCollectionVec*)
m_currentLCEvent->getCollection(HC->GetName());
98 collection->insert(collection->begin(), collVec->begin(), collVec->end());
112 G4Exception(
"LcioHitsCollectionBuilder::createHitCollections()",
"", FatalException,
"No collection found for Hits Collection ID");
123 LCCollectionVec* collVec = 0;
126 if (SDtype == SensitiveDetector::eCalorimeter) {
130 else if (SDtype == SensitiveDetector::eTracker) {
135 G4Exception(
"",
"", FatalException,
"Unknown HC type.");
143 LCCollectionVec* collVec =
new LCCollectionVec(LCIO::SIMTRACKERHIT);
146 TrackerHitsCollection* trkHits =
dynamic_cast<TrackerHitsCollection*
>(g4HC);
159 LCCollectionVec* collVec =
new LCCollectionVec(LCIO::SIMCALORIMETERHIT);
162 CalorimeterHitsCollection* calHits =
dynamic_cast<CalorimeterHitsCollection*
>(g4HC);
179 bool ec_flag = g4sd->getEndcapFlag();
182 if (g4sd->getType() == SensitiveDetector::eCalorimeter) {
190 else if (g4sd->getType() == SensitiveDetector::eTracker) {
201 size_t s = calHits->GetSize();
202 for (
size_t i = 0; i < s; i++) {
203 CalorimeterHit* calHit =
static_cast<CalorimeterHit*
>(calHits->GetHit(i));
210 size_t s = trkHits->GetSize();
211 for (
size_t i = 0; i < s; i++) {
212 TrackerHit* trkHit =
static_cast<TrackerHit*
>(trkHits->GetHit(i));
219 SimCalorimeterHitImpl* simCalHit =
new SimCalorimeterHitImpl();
222 const Id64bit& id64 = calHit->getId64bit();
223 simCalHit->setCellID0(id64.getId0());
224 simCalHit->setCellID1(id64.getId1());
227 const G4ThreeVector hitPos = calHit->getPosition();
228 float pos[3] = { (float)hitPos.x(), (float)hitPos.y(), (float)hitPos.z() };
229 simCalHit->setPosition(pos);
236 const HitContributionList& contribs = calHit->getHitContributions();
238 for (HitContributionList::const_iterator iter = contribs.begin(); iter != contribs.end(); iter++) {
239 totE += (*iter).getEdep();
261 SimTrackerHitImpl* simTrackerHit =
new SimTrackerHitImpl();
264 const G4ThreeVector hitPos = trackerHit->getPosition();
265 double pos[3] = { hitPos.x(), hitPos.y(), hitPos.z() };
266 simTrackerHit->setPosition(pos);
269 const G4ThreeVector& momentum = trackerHit->getMomentum();
270 simTrackerHit->setMomentum(momentum.x() / GeV, momentum.y() / GeV, momentum.z() / GeV);
273 simTrackerHit->setPathLength(trackerHit->getLength());
276 float edep = trackerHit->getEdep();
277 simTrackerHit->setEDep(edep / GeV);
280 float tEdep = trackerHit->getTdep();
281 simTrackerHit->setTime(tEdep);
284 simTrackerHit->setCellID0(trackerHit->getId());
290 log().
error(
"No MCParticle found for trackID <" + StringUtil::toString(trackerHit->getTrackID()) +
"> when processing SimTrackerHit");
292 simTrackerHit->setMCParticle(mcp);
295 return simTrackerHit;
301 HitContributionList contribs;
310 contribs = g4CalHit->getHitContributions();
315 for (HitContributionList::const_iterator iter = contribs.begin(); iter != contribs.end(); iter++) {
317 const HitContribution& contrib = (*iter);
322 if (contribMcp != 0) {
324 simCalHit->addMCParticleContribution(contribMcp, (
float) (contrib.getEdep() / GeV), (
float) (contrib.getGlobalTime()), contrib.getPDGID(),
const_cast<float*
>(contrib.getPosition()));
331 log() <<
LOG::error <<
"No MCParticle from track ID <" << contrib.getTrackID() <<
"> when processing SimCalorimeterHit" <<
LOG::endl;
337 if ( ncontrib == 0 ) {
338 log().
error(
"No hit contributions for CalorimeterHit.");
344 combinedContrib.clear();
347 for (HitContributionList::const_iterator iter = longContrib.begin(); iter != longContrib.end(); iter++) {
348 int trkId = (*iter).getTrackID();
353 HitContribution* trk_contrib = 0;
356 trk_contrib->incrEdep((*iter).getEdep());
359 trk_contrib->setMinTime((*iter).getGlobalTime());
364 combinedContrib.push_back(HitContribution(trkId, (*iter).getEdep(), (*iter).getPDGID(), (*iter).getGlobalTime()));
370 HitContribution* c = 0;
371 for (HitContributionList::iterator iter = contribs.begin(); iter != contribs.end(); iter++) {
372 if ((*iter).getTrackID() == trk_id) {
401 log().
verbose(
"Set CHBIT_LONG: " + StringUtil::toString( setting ) );
413 log().
verbose(
"Set CHBIT_PDG: " + StringUtil::toString( setting ) );
418 for (std::vector<string>::const_iterator iter = event->getCollectionNames()->begin(); iter != event->getCollectionNames()->end(); iter++) {
419 const string thisName = *iter;
420 if (thisName.compare(collectionName) == 0) {
static MCParticleManager * instance()
static std::vector< int > getHCIDs()
void setPDGFlag(bool pdgFlag=true)
virtual ~LcioHitsCollectionBuilder()
void combineMcpHitContribs(const HitContributionList &allContributions, HitContributionList &combinedContributions)
IMPL::LCFlagImpl m_calCollFlag
IMPL::LCCollectionVec * createCollectionVec(G4VHitsCollection *hitCollection, SensitiveDetector::EType sensitiveDetectorType)
EVENT::LCEvent * m_currentLCEvent
void createHitCollections()
const G4Event * m_currentG4Event
HitContribution * findHitContribution(int trackID, HitContributionList &contributions)
void setEndcapFlag(SensitiveDetector *sensitiveDetector)
static bool containsCollection(EVENT::LCEvent *event, const std::string &name)
IMPL::LCCollectionVec * createTrackerCollectionVec(G4VHitsCollection *hitCollection)
EVENT::LCEvent * createHitCollectionsFromEvent(const G4Event *event, EVENT::LCEvent *lcioEvent)
void addParticleContributions(CalorimeterHit *calorimeterHit, IMPL::SimCalorimeterHitImpl *simCalorimeterHit)
void setLongFlag(bool longFlag=true)
IMPL::LCCollectionVec * createCalorimeterCollectionVec(G4VHitsCollection *hitCollection)
IMPL::LCFlagImpl m_trkCollFlag
void saveHits(CalorimeterHitsCollection *calorimeterHits, IMPL::LCCollectionVec *collection)
IMPL::SimCalorimeterHitImpl * createHit(CalorimeterHit *calorimeterHit)
LcioHitsCollectionBuilder()
Base class for slic code modules that provides common functionality, such as logging to an output str...