Author: [log in to unmask] Date: Mon Jan 12 16:20:09 2015 New Revision: 3489 Log: Merge v05-00-00-dev branch into trunk. Added: projects/lcdd/trunk/examples/segmentation/CartesianGridXY.lcdd - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/examples/segmentation/CartesianGridXY.lcdd projects/lcdd/trunk/examples/segmentation/CartesianGridXYZ.lcdd - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/examples/segmentation/CartesianGridXYZ.lcdd projects/lcdd/trunk/examples/segmentation/CartesianGridXZ.lcdd - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/examples/segmentation/CartesianGridXZ.lcdd projects/lcdd/trunk/examples/segmentation/ProjectiveCylinder.lcdd - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/examples/segmentation/ProjectiveCylinder.lcdd projects/lcdd/trunk/include/lcdd/detectors/DDSegmentationCalorimeterHitProcessor.hh - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/include/lcdd/detectors/DDSegmentationCalorimeterHitProcessor.hh projects/lcdd/trunk/include/lcdd/schema/CartesianGridXYType.hh - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/include/lcdd/schema/CartesianGridXYType.hh projects/lcdd/trunk/include/lcdd/schema/CartesianGridXYZType.hh - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/include/lcdd/schema/CartesianGridXYZType.hh projects/lcdd/trunk/include/lcdd/schema/CartesianGridXZType.hh - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/include/lcdd/schema/CartesianGridXZType.hh projects/lcdd/trunk/include/lcdd/schema/ProjectiveCylinderType.hh - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/include/lcdd/schema/ProjectiveCylinderType.hh projects/lcdd/trunk/include/lcdd/schema/cartesian_grid_xy.hh - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/include/lcdd/schema/cartesian_grid_xy.hh projects/lcdd/trunk/include/lcdd/schema/cartesian_grid_xyz.hh - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/include/lcdd/schema/cartesian_grid_xyz.hh projects/lcdd/trunk/include/lcdd/schema/cartesian_grid_xz.hh - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/include/lcdd/schema/cartesian_grid_xz.hh projects/lcdd/trunk/include/lcdd/schema/projective_cylinder.hh - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/include/lcdd/schema/projective_cylinder.hh projects/lcdd/trunk/include/lcdd/schema/projective_cylinder_old.hh - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/include/lcdd/schema/projective_cylinder_old.hh projects/lcdd/trunk/schemas/lcdd/2.0/ - copied from r3487, projects/lcdd/branches/v05-00-00-dev/schemas/lcdd/2.0/ projects/lcdd/trunk/src/lcdd/detectors/DDSegmentationCalorimeterHitProcessor.cc - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/src/lcdd/detectors/DDSegmentationCalorimeterHitProcessor.cc projects/lcdd/trunk/src/lcdd/processes/cartesian_grid_xyProcess.cc - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/src/lcdd/processes/cartesian_grid_xyProcess.cc projects/lcdd/trunk/src/lcdd/processes/cartesian_grid_xyzProcess.cc - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/src/lcdd/processes/cartesian_grid_xyzProcess.cc projects/lcdd/trunk/src/lcdd/processes/cartesian_grid_xzProcess.cc - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/src/lcdd/processes/cartesian_grid_xzProcess.cc projects/lcdd/trunk/src/lcdd/processes/projective_cylinderProcess.cc - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/src/lcdd/processes/projective_cylinderProcess.cc projects/lcdd/trunk/src/lcdd/processes/projective_cylinder_oldProcess.cc - copied unchanged from r3487, projects/lcdd/branches/v05-00-00-dev/src/lcdd/processes/projective_cylinder_oldProcess.cc Modified: projects/lcdd/trunk/ (props changed) projects/lcdd/trunk/CMakeLists.txt projects/lcdd/trunk/include/lcdd/detectors/CalorimeterSD.hh projects/lcdd/trunk/include/lcdd/detectors/CurrentTrackState.hh projects/lcdd/trunk/include/lcdd/detectors/SensitiveDetectorFactory.hh projects/lcdd/trunk/include/lcdd/hits/CalorimeterHit.hh projects/lcdd/trunk/include/lcdd/hits/CalorimeterHitMap.hh projects/lcdd/trunk/include/lcdd/id/IdFactory.hh projects/lcdd/trunk/include/lcdd/util/TimerUtil.hh projects/lcdd/trunk/src/lcdd/core/LCDDLibLoad.cc projects/lcdd/trunk/src/lcdd/detectors/BasicTrackerHitProcessor.cc projects/lcdd/trunk/src/lcdd/detectors/CalorimeterSD.cc projects/lcdd/trunk/src/lcdd/detectors/CurrentTrackState.cc projects/lcdd/trunk/src/lcdd/detectors/HitProcessorManager.cc projects/lcdd/trunk/src/lcdd/detectors/ScoringTrackerHitProcessor.cc projects/lcdd/trunk/src/lcdd/detectors/SensitiveDetectorFactory.cc projects/lcdd/trunk/src/lcdd/hits/CalorimeterHit.cc projects/lcdd/trunk/src/lcdd/hits/CalorimeterHitMap.cc projects/lcdd/trunk/src/lcdd/id/IdFactory.cc projects/lcdd/trunk/src/lcdd/segmentation/SegmentationFactory.cc Modified: projects/lcdd/trunk/CMakeLists.txt ============================================================================= --- projects/lcdd/trunk/CMakeLists.txt (original) +++ projects/lcdd/trunk/CMakeLists.txt Mon Jan 12 16:20:09 2015 @@ -50,6 +50,14 @@ MESSAGE( STATUS "Found GDML: ${GDML_DIR}" ) ENDIF() +# find DDSegmentation +FIND_PACKAGE(DDSegmentation REQUIRED) +if ( NOT DDSegmentation_FOUND ) + MESSAGE( FATAL_ERROR "DDSegmentation was not found! Define DDSegmentation_DIR when calling cmake." ) +ELSE() + MESSAGE( STATUS "Found DDSegmentation: ${DDSegmentation_DIR}" ) +ENDIF() + # local includes SET( LCDD_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include ) INCLUDE_DIRECTORIES( ${LCDD_INCLUDE_DIR} ) @@ -65,13 +73,13 @@ ADD_DEFINITIONS( ${Geant4_DEFINITIONS} ) # include directories -INCLUDE_DIRECTORIES( ${XERCES_INCLUDE_DIR} ${Geant4_INCLUDE_DIRS} ${GDML_INCLUDE_DIRS} ) +INCLUDE_DIRECTORIES( ${XERCES_INCLUDE_DIR} ${Geant4_INCLUDE_DIRS} ${GDML_INCLUDE_DIRS} ${DDSegmentation_INCLUDE_DIRS} ) # add GDML link directory -LINK_DIRECTORIES( ${GDML_LIBRARY_DIR} ) +LINK_DIRECTORIES( ${GDML_LIBRARY_DIR} ${DDSegmentation_LIBRARY_DIR} ) # libraries -LINK_LIBRARIES( ${XERCES_LIBRARY} ${Geant4_LIBRARIES} ${GDML_LIBRARY} ) +LINK_LIBRARIES( ${XERCES_LIBRARY} ${Geant4_LIBRARIES} ${GDML_LIBRARY} ${DDSegmentation_LIBRARIES} ) # output shared library ADD_LIBRARY( lcdd SHARED ${library_sources} ) Modified: projects/lcdd/trunk/include/lcdd/detectors/CalorimeterSD.hh ============================================================================= --- projects/lcdd/trunk/include/lcdd/detectors/CalorimeterSD.hh (original) +++ projects/lcdd/trunk/include/lcdd/detectors/CalorimeterSD.hh Mon Jan 12 16:20:09 2015 @@ -7,6 +7,11 @@ #include "lcdd/hits/CalorimeterHit.hh" #include "lcdd/hits/CalorimeterHitMap.hh" #include "lcdd/segmentation/Segmentation.hh" + +// DD4HEP +#include "DDSegmentation/Segmentation.h" + +#include <vector> /** * @brief The implementation of a calorimeter that accumulates energy depositions by event. @@ -29,7 +34,7 @@ * @param[in] sdSeg The detector's segmentation object for dividing into artificial cells. * @param[in] compare The hit comparator to be used by this detector. */ - CalorimeterSD(G4String sdName, G4String hcName, Segmentation* sdSeg); + CalorimeterSD(G4String sensitiveDetectorName, G4String hitsCollectionName, Segmentation* segmentation); /** * Class constructor. @@ -38,7 +43,7 @@ * @param[in] sdSeg The detector's segmentation object for dividing into artificial cells. * @param[in] compare The hit comparator to be used by this detector. */ - CalorimeterSD(G4String sdName, const std::vector<G4String>& hcNames, Segmentation* sdSeg); + CalorimeterSD(G4String sensitiveDetectorName, const std::vector<G4String>& hitsCollectionName, Segmentation* segmentation); /** * Class destructor. @@ -70,11 +75,16 @@ Segmentation* getSegmentation() const; /** - * Print out the hit data to an output stream. - * @param[in] os The output stream. - * @return The same output stream. + * Set the DD4hep Segmentation of this Calorimeter. + * @param[in] segmentation The Segmentation object. */ - //std::ostream& printHits(std::ostream& os); + void setDDSegmentation(DD4hep::DDSegmentation::Segmentation* segmentation); + + /** + * Get the DD4HEP Segmentation of this CalorimeterSD. + * @return The DD4HEP Segmentation or NULL if not set. + */ + DD4hep::DDSegmentation::Segmentation* getDDSegmentation() const; /** * Print the calorimeter's basic information. @@ -99,6 +109,12 @@ */ CalorimeterHit* findHit(const Id64bit& id, int collectionIndex = 0); + /** + * Get a CalorimeterHitMap by collection index. + * @return The CalorimeterHitMap by collection index. + */ + CalorimeterHitMap* getCalorimeterHitMap(int index); + protected: /** @@ -113,6 +129,8 @@ // The calorimeter's virtual segmentation. Segmentation* _segmentation; + DD4hep::DDSegmentation::Segmentation* _ddsegmentation; + // Pointers to current hits collections. std::vector<CalorimeterHitsCollection*> _hitsCollections; Modified: projects/lcdd/trunk/include/lcdd/detectors/CurrentTrackState.hh ============================================================================= --- projects/lcdd/trunk/include/lcdd/detectors/CurrentTrackState.hh (original) +++ projects/lcdd/trunk/include/lcdd/detectors/CurrentTrackState.hh Mon Jan 12 16:20:09 2015 @@ -21,22 +21,22 @@ _currentTrackID = trackID; } - static void setCurrentPrimaryID(G4int trackID) { - _currentPrimaryID = trackID; - } + //static void setCurrentPrimaryID(G4int trackID) { + // _currentPrimaryID = trackID; + //} static G4int getCurrentTrackID() { return _currentTrackID; } - static G4int getCurrentPrimaryID() { - return _currentPrimaryID; - } + //static G4int getCurrentPrimaryID() { + // return _currentPrimaryID; + //} public: static G4int _currentTrackID; - static G4int _currentPrimaryID; + //static G4int _currentPrimaryID; }; #endif Modified: projects/lcdd/trunk/include/lcdd/detectors/SensitiveDetectorFactory.hh ============================================================================= --- projects/lcdd/trunk/include/lcdd/detectors/SensitiveDetectorFactory.hh (original) +++ projects/lcdd/trunk/include/lcdd/detectors/SensitiveDetectorFactory.hh Mon Jan 12 16:20:09 2015 @@ -85,6 +85,14 @@ * @return True if segmentation tag is valid; false if not. */ static bool isSegmentationTag(const std::string& s); + + /** + * Create a DDSegmentation Segmentation object, if found in the XML content, + * and register it with the CalorimeterSD. + * @param[in] calorimeter The CalorimeterSD which will use the Segmentation. + * @param[in] seq The XML content of the calorimeter element. + */ + static void createDDSegmentation(CalorimeterSD* calorimeter, ContentSequence* seq); }; #endif Modified: projects/lcdd/trunk/include/lcdd/hits/CalorimeterHit.hh ============================================================================= --- projects/lcdd/trunk/include/lcdd/hits/CalorimeterHit.hh (original) +++ projects/lcdd/trunk/include/lcdd/hits/CalorimeterHit.hh Mon Jan 12 16:20:09 2015 @@ -142,18 +142,6 @@ */ const Id64bit& getId64bit() const; - /** - * Set the endcap flag. - * @param[in] ec The endcap flag. - */ - void setEndcapFlag(bool ec = true); - - /** - * Get the endcap flag. - * @return The endcap flag. - */ - bool getEndcapFlag(); - private: // 64-bit id. @@ -164,9 +152,6 @@ // Position. G4ThreeVector _pos; - - // Endcap flag. - bool _endcap; // List of contributions by MCParticle. HitContributionList _particleList; Modified: projects/lcdd/trunk/include/lcdd/hits/CalorimeterHitMap.hh ============================================================================= --- projects/lcdd/trunk/include/lcdd/hits/CalorimeterHitMap.hh (original) +++ projects/lcdd/trunk/include/lcdd/hits/CalorimeterHitMap.hh Mon Jan 12 16:20:09 2015 @@ -47,6 +47,8 @@ */ CalorimeterHit* get(const Id64bit& id); + CalorimeterHit* get(Id64bit::ValueType); + /** * Get the size of the map. * @return The size of the map. Modified: projects/lcdd/trunk/include/lcdd/id/IdFactory.hh ============================================================================= --- projects/lcdd/trunk/include/lcdd/id/IdFactory.hh (original) +++ projects/lcdd/trunk/include/lcdd/id/IdFactory.hh Mon Jan 12 16:20:09 2015 @@ -8,6 +8,9 @@ // STL #include <iostream> #include <vector> + +// DD4HEP +#include "DDSegmentation/Segmentation.h" // LCDD class Segmentation; @@ -61,6 +64,8 @@ */ static IdVec createOrderedIdVec(G4Step* aStep, const SensitiveDetector* sd); + static DD4hep::DDSegmentation::VolumeID createVolumeId(G4Step*, IdSpec*); + private: /* Modified: projects/lcdd/trunk/include/lcdd/util/TimerUtil.hh ============================================================================= --- projects/lcdd/trunk/include/lcdd/util/TimerUtil.hh (original) +++ projects/lcdd/trunk/include/lcdd/util/TimerUtil.hh Mon Jan 12 16:20:09 2015 @@ -8,7 +8,7 @@ #include <mach/mach_time.h> #define CLOCK_REALTIME 0 #define CLOCK_MONOTONIC 0 -int clock_gettime(int clk_id, struct timespec *t){ +inline int clock_gettime(int clk_id, struct timespec *t){ mach_timebase_info_data_t timebase; mach_timebase_info(&timebase); uint64_t time; Modified: projects/lcdd/trunk/src/lcdd/core/LCDDLibLoad.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/core/LCDDLibLoad.cc (original) +++ projects/lcdd/trunk/src/lcdd/core/LCDDLibLoad.cc Mon Jan 12 16:20:09 2015 @@ -9,38 +9,44 @@ */ void LCDDLoadProcesses() { - // header + // Header LOAD_COMPONENT (headerProcess); LOAD_COMPONENT (detectorProcess); LOAD_COMPONENT (authorProcess); LOAD_COMPONENT (generatorProcess); LOAD_COMPONENT (commentProcess); - // volume extended + // Volume extended LOAD_COMPONENT (volumeExtendedProcess); LOAD_COMPONENT (physvolidProcess); - // SDs + // Sensitive Detectors LOAD_COMPONENT (calorimeterProcess); LOAD_COMPONENT (trackerProcess); LOAD_COMPONENT (sdrefProcess); - // hit_processor + // Hit Processors LOAD_COMPONENT (hit_processorProcess); - // segmentations + // Segmentations (legacy) LOAD_COMPONENT (grid_xyzProcess); LOAD_COMPONENT (projective_cylinderProcess); LOAD_COMPONENT (projective_zplaneProcess); LOAD_COMPONENT (global_grid_xyProcess); LOAD_COMPONENT (cell_readout_2dProcess); - // Ids + // New DD4hep Segmentations + LOAD_COMPONENT (cartesian_grid_xyProcess); + LOAD_COMPONENT (cartesian_grid_xzProcess); + LOAD_COMPONENT (cartesian_grid_xyzProcess); + LOAD_COMPONENT (projective_cylinderProcess); + + // Identifiers LOAD_COMPONENT (idspecProcess); LOAD_COMPONENT (idfieldProcess); LOAD_COMPONENT (idspecrefProcess); - // field + // B-fields LOAD_COMPONENT (fieldrefProcess); LOAD_COMPONENT (global_fieldProcess); LOAD_COMPONENT (solenoidProcess); @@ -51,36 +57,36 @@ LOAD_COMPONENT (box_dipoleProcess); LOAD_COMPONENT (field_map_3dProcess) - // region + // Region LOAD_COMPONENT (regionProcess); LOAD_COMPONENT (regionrefProcess); - // display + // Visualization LOAD_COMPONENT (visProcess); LOAD_COMPONENT (visrefProcess); LOAD_COMPONENT (colorProcess); - // limit + // Physics limits LOAD_COMPONENT (limitsetProcess); LOAD_COMPONENT (limitsetrefProcess); LOAD_COMPONENT (limitProcess); } /** - * Function for loading LCDD subscribers. + * Function for loading LCDD subscribers to create runtime objects. */ void LCDDLoadSubscribers() { - // subscribers + // Header LOAD_COMPONENT (headerSubscriber); - // SDs + // Sensitive Detectors LOAD_COMPONENT (calorimeterSubscriber); LOAD_COMPONENT (trackerSubscriber); - // Ids + // Identifiers LOAD_COMPONENT (idspecSubscriber); - // field + // B-fields LOAD_COMPONENT (solenoidSubscriber); LOAD_COMPONENT (rz_field_mapSubscriber); LOAD_COMPONENT (dipoleSubscriber); @@ -88,13 +94,13 @@ LOAD_COMPONENT (global_fieldSubscriber); LOAD_COMPONENT (field_map_3dSubscriber); - // region + // Regions LOAD_COMPONENT (regionSubscriber); - // display + // Visualization LOAD_COMPONENT (visSubscriber); - // limit + // Physics limits LOAD_COMPONENT (limitsetSubscriber); } Modified: projects/lcdd/trunk/src/lcdd/detectors/BasicTrackerHitProcessor.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/detectors/BasicTrackerHitProcessor.cc (original) +++ projects/lcdd/trunk/src/lcdd/detectors/BasicTrackerHitProcessor.cc Mon Jan 12 16:20:09 2015 @@ -16,6 +16,8 @@ } bool BasicTrackerHitProcessor::processHits(G4Step* step) { + + //G4cout << "BasicTrackerHitProcessor::processHits" << G4endl; TrackerSD* tracker = getTracker(); @@ -36,6 +38,8 @@ // Get the track. G4Track* track = step->GetTrack(); + + //G4cout << " trackID: " << track->GetTrackID() << G4endl; // Get the pre-step point. G4StepPoint* pre = step->GetPreStepPoint(); @@ -80,8 +84,23 @@ // Create the hit's identifier. Id64bit id64 = tracker->makeIdentifier(step); + VUserTrackInformation* trackInformation = + dynamic_cast<VUserTrackInformation*>(step->GetTrack()->GetUserInformation()); + + // If there is a user track info object, then flag it as having a hit. + //if (trackInformation) + // trackInformation->setHasTrackerHit(); + // Set the hit information from above. - hit->setTrackID(trackID); + if (trackInformation != NULL) { + trackInformation->setHasTrackerHit(); + + // Use the ID from this track, as it has track info for creating the TrackSummary. + hit->setTrackID(trackID); + } else { + // In the case where there is no track info, then we use the current global track ID. + hit->setTrackID(CurrentTrackState::getCurrentTrackID()); + } hit->setEdep(edep); hit->setPosition(mid); hit->setMomentum(momentum); @@ -92,12 +111,10 @@ // Add the hit to the TrackerSD. tracker->addHit(hit, _collectionIndex); - // Get the TrackInformation and flag track as having a tracker hit. - VUserTrackInformation* trackInformation = dynamic_cast<VUserTrackInformation*>(step->GetTrack()->GetUserInformation()); - if (trackInformation) - trackInformation->setHasTrackerHit(); - else - G4Exception("BasicTrackerHitProcessor::processHits", "", FatalException, "Missing required VUserTrackInformation."); + //G4cout << " CurrentTrackState::getCurrentTrackID: " + // << CurrentTrackState::getCurrentTrackID() << G4endl; + //else + // G4Exception("BasicTrackerHitProcessor::processHits", "", FatalException, "Missing required VUserTrackInformation."); // Return true because created new hit. return true; Modified: projects/lcdd/trunk/src/lcdd/detectors/CalorimeterSD.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/detectors/CalorimeterSD.cc (original) +++ projects/lcdd/trunk/src/lcdd/detectors/CalorimeterSD.cc Mon Jan 12 16:20:09 2015 @@ -12,18 +12,30 @@ using std::vector; CalorimeterSD::CalorimeterSD(G4String sdName, G4String hcName, Segmentation* sdSeg) : - SensitiveDetector(sdName, hcName, SensitiveDetector::eCalorimeter), _segmentation(sdSeg) { + SensitiveDetector(sdName, hcName, SensitiveDetector::eCalorimeter), _segmentation(sdSeg), _ddsegmentation(NULL) { // Setup a dummy hits collection that will be overridden later. _hitsCollections.push_back(NULL); } CalorimeterSD::CalorimeterSD(G4String sdName, const vector<G4String>& hcNames, Segmentation* sdSeg) : - SensitiveDetector(sdName, hcNames, SensitiveDetector::eCalorimeter), _segmentation(sdSeg) { + SensitiveDetector(sdName, hcNames, SensitiveDetector::eCalorimeter), _segmentation(sdSeg), _ddsegmentation(NULL) { // Setup entries for each hits collection. These null pointers will be overridden later. for (int i = 0; i < (int) hcNames.size(); i++) { _hitsCollections.push_back(NULL); } } + +/* +CalorimeterSD::CalorimeterSD( + G4String sensitiveDetectorName, + const vector<G4String>& hitsCollectionNames, + DD4hep::DDSegmentation::Segmentation* segmentation) : + SensitiveDetector(sensitiveDetectorName, hitsCollectionNames, SensitiveDetector::eCalorimeter), _ddsegmentation(segmentation) { + for (int i = 0; i < (int) hitsCollectionNames.size(); i++) { + _hitsCollections.push_back(NULL); + } +} +*/ CalorimeterSD::~CalorimeterSD() { } @@ -62,8 +74,16 @@ } } +void CalorimeterSD::setDDSegmentation(DD4hep::DDSegmentation::Segmentation* ddsegmentation) { + _ddsegmentation = ddsegmentation; +} + Segmentation* CalorimeterSD::getSegmentation() const { return _segmentation; +} + +DD4hep::DDSegmentation::Segmentation* CalorimeterSD::getDDSegmentation() const { + return _ddsegmentation; } G4bool CalorimeterSD::ProcessHits(G4Step* aStep, G4TouchableHistory*) { @@ -100,3 +120,7 @@ CalorimeterHit* CalorimeterSD::findHit(const Id64bit& id, int collectionIndex) { return _hitMaps[collectionIndex]->get(id); } + +CalorimeterHitMap* CalorimeterSD::getCalorimeterHitMap(int collectionIndex) { + return _hitMaps[collectionIndex]; +} Modified: projects/lcdd/trunk/src/lcdd/detectors/CurrentTrackState.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/detectors/CurrentTrackState.cc (original) +++ projects/lcdd/trunk/src/lcdd/detectors/CurrentTrackState.cc Mon Jan 12 16:20:09 2015 @@ -1,4 +1,4 @@ #include "lcdd/detectors/CurrentTrackState.hh" int CurrentTrackState::_currentTrackID = -1; -int CurrentTrackState::_currentPrimaryID = -1; +//int CurrentTrackState::_currentPrimaryID = -1; Modified: projects/lcdd/trunk/src/lcdd/detectors/HitProcessorManager.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/detectors/HitProcessorManager.cc (original) +++ projects/lcdd/trunk/src/lcdd/detectors/HitProcessorManager.cc Mon Jan 12 16:20:09 2015 @@ -4,6 +4,7 @@ #include "lcdd/detectors/BasicCalorimeterHitProcessor.hh" #include "lcdd/detectors/BasicTrackerHitProcessor.hh" #include "lcdd/detectors/ScoringTrackerHitProcessor.hh" +#include "lcdd/detectors/DDSegmentationCalorimeterHitProcessor.hh" HitProcessorManager* HitProcessorManager::_manager = 0; @@ -25,6 +26,8 @@ registerFactory(new BasicCalorimeterHitProcessorFactory()); registerFactory(new ScoringTrackerHitProcessorFactory()); registerFactory(new BasicTrackerHitProcessorFactory()); + + registerFactory(new DDSegmentationCalorimeterHitProcessorFactory()); } void HitProcessorManager::registerFactory(HitProcessorFactory* factory) { Modified: projects/lcdd/trunk/src/lcdd/detectors/ScoringTrackerHitProcessor.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/detectors/ScoringTrackerHitProcessor.cc (original) +++ projects/lcdd/trunk/src/lcdd/detectors/ScoringTrackerHitProcessor.cc Mon Jan 12 16:20:09 2015 @@ -2,6 +2,7 @@ // LCDD #include "lcdd/core/VUserTrackInformation.hh" +#include "lcdd/detectors/CurrentTrackState.hh" // Geant4 #include "G4ThreeVector.hh" @@ -53,8 +54,15 @@ // Compute the step's path length. G4double length = sqrt(pow(startPosition.x() - endPosition.x(), 2) + pow(startPosition.y() - endPosition.y(), 2) + pow(startPosition.z() - endPosition.z(), 2)); + VUserTrackInformation* trackInformation = dynamic_cast<VUserTrackInformation*>(step->GetTrack()->GetUserInformation()); + // Set the hit information. - newHit->setTrackID(trackID); + if (trackInformation != NULL) { + trackInformation->setHasTrackerHit(); + newHit->setTrackID(trackID); + } else { + newHit->setTrackID(CurrentTrackState::getCurrentTrackID()); + } newHit->setEdep(edep); newHit->setPosition(midPoint); newHit->setMomentum(step->GetPreStepPoint()->GetMomentum()); @@ -63,11 +71,11 @@ newHit->setLength(length); // Get the TrackInformation and flag track as having a tracker hit. - VUserTrackInformation* trackInformation = dynamic_cast<VUserTrackInformation*>(step->GetTrack()->GetUserInformation()); - if (trackInformation) - trackInformation->setHasTrackerHit(); - else - G4Exception("ScoringTrackerHitProcessor::processHits", "", FatalException, "Missing required VUserTrackInformation."); + + //if (trackInformation) + // trackInformation->setHasTrackerHit(); + //else + // G4Exception("ScoringTrackerHitProcessor::processHits", "", FatalException, "Missing required VUserTrackInformation."); // Add hit to detector. getTracker()->addHit(newHit, getCollectionIndex()); Modified: projects/lcdd/trunk/src/lcdd/detectors/SensitiveDetectorFactory.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/detectors/SensitiveDetectorFactory.cc (original) +++ projects/lcdd/trunk/src/lcdd/detectors/SensitiveDetectorFactory.cc Mon Jan 12 16:20:09 2015 @@ -9,8 +9,27 @@ #include "lcdd/detectors/BasicTrackerHitProcessor.hh" #include "lcdd/detectors/ScoringTrackerHitProcessor.hh" #include "lcdd/schema/hit_processor.hh" +#include "lcdd/schema/cartesian_grid_xy.hh" +#include "lcdd/schema/cartesian_grid_xz.hh" +#include "lcdd/schema/cartesian_grid_xyz.hh" +#include "lcdd/schema/projective_cylinder.hh" + +// GDML +#include "G4Evaluator/GDMLExpressionEvaluator.h" + +// DD4hep +#include "DDSegmentation/CartesianGridXY.h" +#include "DDSegmentation/CartesianGridXZ.h" +#include "DDSegmentation/CartesianGridXYZ.h" +#include "DDSegmentation/ProjectiveCylinder.h" + +using DD4hep::DDSegmentation::CartesianGridXY; +using DD4hep::DDSegmentation::CartesianGridXZ; +using DD4hep::DDSegmentation::CartesianGridXYZ; +using DD4hep::DDSegmentation::ProjectiveCylinder; #include <algorithm> +#include <exception> SensitiveDetector* SensitiveDetectorFactory::createSensitiveDetector(const SAXObject* object) { @@ -121,8 +140,13 @@ // Set the IdSpec. sensitiveDetector->setIdSpec(idspec); + // Create DDSegmentation if exists, which requires idspec and SensitiveDetector to be instantiated beforehand. + // FIXME: This is a weird place for this to happen I guess. + if (dynamic_cast<CalorimeterSD*>(sensitiveDetector) != NULL) + createDDSegmentation((CalorimeterSD*)sensitiveDetector, seq); + // Add the list of HitProcessors. This will automatically cause the HitProcessor setup code - // to be called to configure it for this SD. + // to be called in order to configure it for this SD. sensitiveDetector->addHitProcessors(hitProcessors); // Register the SensitiveDetector with the LCDDProcessor. @@ -136,6 +160,133 @@ return sensitiveDetector; } +// FIXME: The grid size calculations should apply a length unit. +void SensitiveDetectorFactory::createDDSegmentation(CalorimeterSD* calorimeter, ContentSequence* seq) { + + GDMLExpressionEvaluator* calc = GDMLProcessor::GetInstance()->GetEvaluator(); + + size_t count = seq->size(); + for (size_t i = 0; i < count; i++) { + std::string childTag = seq->content(i).tag; + const ContentGroup::ContentItem& segitem = seq->content(i); + DD4hep::DDSegmentation::Segmentation* segmentation = NULL; + if (childTag == "cartesian_grid_xy") { + + cartesian_grid_xy* element = dynamic_cast<cartesian_grid_xy*>(segitem.object); + CartesianGridXY* cartesianGridXY = new CartesianGridXY(calorimeter->getIdSpec()->getFieldDescription()); + + double gridSizeX, gridSizeY, offsetX, offsetY; + gridSizeX = gridSizeY = offsetX = offsetY = 0; + std::string rawValue = element->get_grid_size_x(); + gridSizeX = calc->Eval(rawValue); + + rawValue = element->get_grid_size_y(); + gridSizeY = calc->Eval(rawValue); + + rawValue = element->get_offset_x(); + offsetX = calc->Eval(rawValue); + + rawValue = element->get_offset_y(); + offsetY = calc->Eval(rawValue); + + cartesianGridXY->setGridSizeX(gridSizeX); + cartesianGridXY->setGridSizeY(gridSizeY); + cartesianGridXY->setOffsetX(offsetX); + cartesianGridXY->setOffsetY(offsetY); + + segmentation = cartesianGridXY; + + } else if (childTag == "cartesian_grid_xyz") { + cartesian_grid_xyz* element = dynamic_cast<cartesian_grid_xyz*>(segitem.object); + CartesianGridXYZ* cartesianGridXYZ = new CartesianGridXYZ(calorimeter->getIdSpec()->getFieldDescription()); + + double gridSizeX, gridSizeY, gridSizeZ, offsetX, offsetY, offsetZ; + gridSizeX = gridSizeY = gridSizeZ = offsetX = offsetY = offsetZ = 0; + + std::string rawValue = element->get_grid_size_x(); + gridSizeX = calc->Eval(rawValue); + + rawValue = element->get_grid_size_y(); + gridSizeY = calc->Eval(rawValue); + + rawValue = element->get_grid_size_z(); + gridSizeZ = calc->Eval(rawValue); + + rawValue = element->get_offset_x(); + offsetX = calc->Eval(rawValue); + + rawValue = element->get_offset_y(); + offsetY = calc->Eval(rawValue); + + rawValue = element->get_offset_z(); + offsetZ = calc->Eval(rawValue); + + cartesianGridXYZ->setGridSizeX(gridSizeX); + cartesianGridXYZ->setGridSizeY(gridSizeY); + cartesianGridXYZ->setGridSizeZ(gridSizeZ); + cartesianGridXYZ->setOffsetX(offsetX); + cartesianGridXYZ->setOffsetY(offsetY); + cartesianGridXYZ->setOffsetZ(offsetZ); + + segmentation = cartesianGridXYZ; + } else if (childTag == "cartesian_grid_xz") { + cartesian_grid_xz* element = dynamic_cast<cartesian_grid_xz*>(segitem.object); + CartesianGridXZ* cartesianGridXZ = new CartesianGridXZ(calorimeter->getIdSpec()->getFieldDescription()); + + double gridSizeX, gridSizeZ, offsetX, offsetZ; + gridSizeX = gridSizeZ = offsetX = offsetZ = 0; + + std::string rawValue = element->get_grid_size_x(); + gridSizeX = calc->Eval(rawValue); + + rawValue = element->get_grid_size_z(); + gridSizeZ = calc->Eval(rawValue); + + rawValue = element->get_offset_x(); + offsetX = calc->Eval(rawValue); + + rawValue = element->get_offset_z(); + offsetZ = calc->Eval(rawValue); + + cartesianGridXZ->setGridSizeX(gridSizeX); + cartesianGridXZ->setGridSizeZ(gridSizeZ); + cartesianGridXZ->setOffsetX(offsetX); + cartesianGridXZ->setOffsetZ(offsetZ); + + segmentation = cartesianGridXZ; + } else if (childTag == "projective_cylinder") { + + projective_cylinder* element = dynamic_cast<projective_cylinder*>(segitem.object); + ProjectiveCylinder* projectiveCylinder = new ProjectiveCylinder(calorimeter->getIdSpec()->getFieldDescription()); + + double thetaBins, phiBins, offsetTheta, offsetPhi; + thetaBins = phiBins = offsetTheta = offsetPhi; + + std::string rawValue = element->get_theta_bins(); + thetaBins = calc->Eval(rawValue); + + rawValue = element->get_phi_bins(); + phiBins = calc->Eval(rawValue); + + rawValue = element->get_offset_theta(); + offsetTheta = calc->Eval(rawValue); + + rawValue = element->get_offset_phi(); + offsetPhi = calc->Eval(rawValue); + + projectiveCylinder->setThetaBins(thetaBins); + projectiveCylinder->setPhiBins(phiBins); + projectiveCylinder->setOffsetTheta(offsetTheta); + projectiveCylinder->setOffsetPhi(offsetPhi); + + segmentation = projectiveCylinder; + } + + if (segmentation != NULL) + calorimeter->setDDSegmentation(segmentation); + } +} + SensitiveDetector* SensitiveDetectorFactory::createCalorimeter(const SAXObject* object, const std::vector<G4String>& hitsCollections) { const SensitiveDetectorType* sensitiveDetectorType = dynamic_cast<const SensitiveDetectorType*>(object); Segmentation* segmentation = 0; @@ -143,20 +294,21 @@ // Create the segmentation child object prior to the calorimeter. ContentSequence* seq = const_cast<ContentSequence*>(sensitiveDetectorType->get_content()); size_t count = seq->size(); - bool fnd_seg = false; for (size_t i = 0; i < count; i++) { std::string child_tag = seq->content(i).tag; const ContentGroup::ContentItem& segitem = seq->content(i); // Create segmentation using factory. if (isSegmentationTag(child_tag)) { segmentation = SegmentationFactory::createSegmentation(segitem.object, segitem.tag); - fnd_seg = true; break; } } - // Create the calorimeter SD. - return new CalorimeterSD(sensitiveDetectorType->get_name(), hitsCollections, segmentation); + // Create the CalorimeterSD object. + CalorimeterSD* calorimeter = new CalorimeterSD(sensitiveDetectorType->get_name(), hitsCollections, segmentation); + + // Return the detector that was created. + return calorimeter; } TrackerSD* SensitiveDetectorFactory::createTracker(const SAXObject* object, const std::vector<G4String>& hitsCollections) { @@ -185,8 +337,12 @@ } bool SensitiveDetectorFactory::isSegmentationTag(const std::string& s) { - // FIXME This should automatically know all segmentation types somehow. - // Can this be read from the schema? + // FIXME This should automatically know all segmentation types. + // Can they be read from the schema? // http://xerces-c.sourcearchive.com/documentation/3.1.1-1/SchemaGrammar_8hpp_source.html - return (s == "projective_cylinder" || s == "grid_xyz" || s == "global_grid_xy" || s == "projective_zplane" || s == "cell_readout_2d"); -} + return (s == "projective_cylinder_old" || + s == "grid_xyz" || + s == "global_grid_xy" || + s == "projective_zplane" || + s == "cell_readout_2d"); +} Modified: projects/lcdd/trunk/src/lcdd/hits/CalorimeterHit.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/hits/CalorimeterHit.cc (original) +++ projects/lcdd/trunk/src/lcdd/hits/CalorimeterHit.cc Mon Jan 12 16:20:09 2015 @@ -12,11 +12,11 @@ G4Allocator<CalorimeterHit> CalorimeterHitAllocator; CalorimeterHit::CalorimeterHit() : - G4VHit(), _edep(0), _endcap(false) { + G4VHit(), _edep(0) { } CalorimeterHit::CalorimeterHit(Id64bit id, G4double edep, G4ThreeVector globalCellPos) : - G4VHit(), _edep(edep), _pos(globalCellPos), _endcap(false), _id(id) { + G4VHit(), _edep(edep), _pos(globalCellPos), _id(id) { } CalorimeterHit::~CalorimeterHit() { @@ -27,7 +27,6 @@ _edep = right._edep; _pos = right._pos; _id = right._id; - _endcap = right._endcap; } const CalorimeterHit& CalorimeterHit::operator=(const CalorimeterHit &right) { @@ -114,11 +113,3 @@ const Id64bit& CalorimeterHit::getId64bit() const { return _id; } - -void CalorimeterHit::setEndcapFlag(bool ec) { - _endcap = ec; -} - -bool CalorimeterHit::getEndcapFlag() { - return _endcap; -} Modified: projects/lcdd/trunk/src/lcdd/hits/CalorimeterHitMap.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/hits/CalorimeterHitMap.cc (original) +++ projects/lcdd/trunk/src/lcdd/hits/CalorimeterHitMap.cc Mon Jan 12 16:20:09 2015 @@ -15,6 +15,10 @@ return _map[id.getValue()]; } +CalorimeterHit* CalorimeterHitMap::get(Id64bit::ValueType value) { + return _map[value]; +} + void CalorimeterHitMap::clear() { _map.clear(); } Modified: projects/lcdd/trunk/src/lcdd/id/IdFactory.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/id/IdFactory.cc (original) +++ projects/lcdd/trunk/src/lcdd/id/IdFactory.cc Mon Jan 12 16:20:09 2015 @@ -381,3 +381,21 @@ return fnd; } + +DD4hep::DDSegmentation::VolumeID IdFactory::createVolumeId(G4Step* aStep, IdSpec* idspec) { + IdVec idvec; + for (IdSpec::IdFields::const_iterator iter = idspec->IdFieldsBegin(); iter != idspec->IdFieldsEnd(); iter++) { + IdField* field = *iter; + std::vector<G4VPhysicalVolume*> pvolumes = ReadoutUtil::getPhysVolList(aStep); + if (hasPhysVolId(pvolumes, field->getLabel())) { + int pvolId = findIdInPhysVols(pvolumes, field->getLabel()); + idvec.addFieldValue(pvolId); + } else { + idvec.addFieldValue(0); + } + } + Id64bit id = IdFactory::createIdentifier(idvec, idspec); + id.encode(); + Id64bit::ValueType volId = id.getValue(); + return (DD4hep::DDSegmentation::VolumeID)volId; +} Modified: projects/lcdd/trunk/src/lcdd/segmentation/SegmentationFactory.cc ============================================================================= --- projects/lcdd/trunk/src/lcdd/segmentation/SegmentationFactory.cc (original) +++ projects/lcdd/trunk/src/lcdd/segmentation/SegmentationFactory.cc Mon Jan 12 16:20:09 2015 @@ -3,7 +3,7 @@ // LCDD #include "lcdd/schema/grid_xyz.hh" #include "lcdd/schema/global_grid_xy.hh" -#include "lcdd/schema/projective_cylinder.hh" +#include "lcdd/schema/projective_cylinder_old.hh" #include "lcdd/schema/projective_zplane.hh" #include "lcdd/schema/cell_readout_2d.hh" #include "lcdd/segmentation/Segmentation.hh" @@ -29,7 +29,7 @@ GDMLExpressionEvaluator* calc = GDMLProcessor::GetInstance()->GetEvaluator(); if (tag == "projective_cylinder") { - projective_cylinder* prj = dynamic_cast<projective_cylinder*>(obj); + projective_cylinder_old* prj = dynamic_cast<projective_cylinder_old*>(obj); if (prj) { int ntheta, nphi; std::string sval = prj->get_ntheta(); @@ -127,7 +127,7 @@ std::cerr << "Unknown child tag for calorimeter: " << tag << "." << std::endl; } - if (seg == 0) { + if (seg == NULL) { G4Exception("", "", FatalException, "Failed to create segmentation."); } ######################################################################## Use REPLY-ALL to reply to list To unsubscribe from the LCDET-SVN list, click the following link: https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCDET-SVN&A=1