long long Geant4SensitiveDetector::getVolumeID(G4Step* aStep) { Geant4StepHandler step(aStep); Geant4VolumeManager volMgr = Geant4Mapping::instance().volumeManager(); VolumeID id = volMgr.volumeID(step.preTouchable()); #if 0 // additional checks ... const G4VPhysicalVolume* g4v = step.volume( step.pre ); if ( id == Geant4VolumeManager::InvalidPath ) { ::printf(" --> Severe ERROR: Invalid placement path: touchable corrupted?\n"); } else if ( id == Geant4VolumeManager::Insensitive ) { ::printf(" --> WARNING: Only sensitive volumes may be decoded. %s\n" , g4v->GetName().c_str() ); } else if ( id == Geant4VolumeManager::NonExisting ) { ::printf(" --> WARNING: non existing placement path.\n"); } else { std::stringstream str; Geant4VolumeManager::VolIDDescriptor dsc; Geant4VolumeManager::VolIDFields& fields = dsc.second; volMgr.volumeDescriptor( step.preTouchable(), dsc ); for(Geant4VolumeManager::VolIDFields::iterator i=fields.begin(); i!=fields.end();++i) { str << (*i).first->name() << "=" << (*i).second << " "; } ::printf(" --> CellID: %X [%X] -> %s\n",id,dsc.first,str.str().c_str()); } #endif return id; }
/// Filter action. Return true if hits should be processed bool Geant4ReadoutVolumeFilter::operator()(const G4Step* s) const { Geant4StepHandler step(s); Geant4VolumeManager volMgr = Geant4Mapping::instance().volumeManager(); VolumeID id = volMgr.volumeID(step.preTouchable()); long64 key = m_key->value(id); if ( m_collection->key_min <= key && m_collection->key_max >= key ) return true; return false; }
long long Geant4SensitiveDetector::getCellID(G4Step* s) { StepHandler h(s); Geant4VolumeManager volMgr = Geant4Mapping::instance().volumeManager(); VolumeID volID = volMgr.volumeID(h.preTouchable()); Segmentation seg = m_readout.segmentation(); if ( seg.isValid() ) { G4ThreeVector global = 0.5 * ( h.prePosG4()+h.postPosG4()); G4ThreeVector local = h.preTouchable()->GetHistory()->GetTopTransform().TransformPoint(global); Position loc(local.x()*MM_2_CM, local.y()*MM_2_CM, local.z()*MM_2_CM); Position glob(global.x()*MM_2_CM, global.y()*MM_2_CM, global.z()*MM_2_CM); VolumeID cID = seg.cellID(loc,glob,volID); return cID; } return volID; }