diff --git a/Detector/DetGeomSvc/src/DetGeomSvc.cpp b/Detector/DetGeomSvc/src/DetGeomSvc.cpp index 72009ab29d83cb1fd9f48ae0311c7d723dd42486..79847faf3c62360fc73fd408b9dcd65f16238efc 100644 --- a/Detector/DetGeomSvc/src/DetGeomSvc.cpp +++ b/Detector/DetGeomSvc/src/DetGeomSvc.cpp @@ -41,6 +41,13 @@ DetGeomSvc::initialize() { m_dd4hep_geo->fromCompact(m_dd4hep_xmls.value()); // recover to old level, if not, too many DD4hep print //dd4hep::setPrintLevel(level); + auto world = getDD4HepGeo(); + auto subs = world.children(); + for (auto sub : subs) { + int detId = sub.second.id(); + if (detId!=-1) m_detIdToNames[detId] = sub.first; + info() << sub.second.id() << " " << sub.first << endmsg; + } return sc; } @@ -69,7 +76,6 @@ DetGeomSvc::lcdd() { return m_dd4hep_geo; } - IGeomSvc::Decoder* DetGeomSvc::getDecoder(const std::string& readout_name) { @@ -124,3 +130,12 @@ DetGeomSvc::getSurfaceMap(const std::string& det_name) { } return m_surface_manager->map(det_name); } + +std::string +DetGeomSvc::getDetName(const int det_id) { + auto it = m_detIdToNames.find(det_id); + if (it!=m_detIdToNames.end()) + return it->second; + else + return lcdd()->world().name(); +} diff --git a/Detector/DetGeomSvc/src/DetGeomSvc.h b/Detector/DetGeomSvc/src/DetGeomSvc.h index 85c2401a37f0b619d7d0285914cf65ebb7de1b6e..6c8d00114f9884d3a4319762977bc691ecd401fa 100644 --- a/Detector/DetGeomSvc/src/DetGeomSvc.h +++ b/Detector/DetGeomSvc/src/DetGeomSvc.h @@ -33,10 +33,11 @@ class DetGeomSvc: public extends<Service, IGeomSvc> { // IGeomSvc dd4hep::DetElement getDD4HepGeo() override; dd4hep::Detector* lcdd() override; - + private: Decoder* getDecoder(const std::string& readout_name) override; const dd4hep::rec::SurfaceMap* getSurfaceMap(const std::string& det_name) override; + std::string getDetName(const int det_id) override; private: // DD4hep XML compact file path @@ -45,6 +46,8 @@ private: // dd4hep::Detector* m_dd4hep_geo; dd4hep::rec::SurfaceManager* m_surface_manager = nullptr; + + std::map<int, std::string> m_detIdToNames; }; #endif // GeomSvc_h diff --git a/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h b/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h index 11809c872955fa088e7768dd0ecbb581988610ca..6de9c474f3bff216ffdc4edc9229027fbdc8162d 100644 --- a/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h +++ b/Detector/DetIdentifier/include/DetIdentifier/CEPCConf.h @@ -13,7 +13,13 @@ namespace CEPCConf{ static const int TPC = 4; static const int SET = 5; static const int ETD = 6; - static const int DC = 7; + static const int DC = 7; + // keep compatibility of tracking algorothm for old detector design, + // need to update these options as comprehensive consideration after switching new tracking in good algorithm design + static const int ITKBarrel = SIT; + static const int ITKEndcap = FTD; + static const int OTKBarrel = SET; + static const int OTKEndcap = ETD; static const int ECAL = 20; static const int ECAL_PLUG = 21; diff --git a/Detector/DetInterface/include/DetInterface/IGeomSvc.h b/Detector/DetInterface/include/DetInterface/IGeomSvc.h index 5c63e5a64dd2e3683e14cf4e0b5c1c0b8db7f48a..b314a2e103eb81dff8e4966fbe4e0dfc8525f589 100644 --- a/Detector/DetInterface/include/DetInterface/IGeomSvc.h +++ b/Detector/DetInterface/include/DetInterface/IGeomSvc.h @@ -16,14 +16,11 @@ #include <map> namespace dd4hep { - class Detector; - class DetElement; - namespace DDSegmentation { - class BitFieldCoder; - } class Detector; class DetElement; - + namespace DDSegmentation { + class BitFieldCoder; + } } class StructExtension; @@ -39,6 +36,7 @@ public: // receive DD4hep Geometry virtual dd4hep::DetElement getDD4HepGeo() = 0; virtual dd4hep::Detector* lcdd() = 0; + // receive Geant4 Geometry // virtual G4VUserDetectorConstruction* getGeant4Geo() = 0; @@ -46,6 +44,8 @@ public: virtual Decoder* getDecoder(const std::string& readout_name) = 0; virtual const dd4hep::rec::SurfaceMap* getSurfaceMap(const std::string& det_name) = 0; + virtual std::string getDetName(const int det_id) = 0; + virtual ~IGeomSvc() {} }; diff --git a/Reconstruction/RecSiTracking/CMakeLists.txt b/Reconstruction/RecSiTracking/CMakeLists.txt index 8fd9be94f130023a15e91f362d5297e5e248d4c5..96a95c4ffc9de4178ab4dab64b86ffe9d45303f4 100644 --- a/Reconstruction/RecSiTracking/CMakeLists.txt +++ b/Reconstruction/RecSiTracking/CMakeLists.txt @@ -1,22 +1,25 @@ - # Modules gaudi_add_module(SiliconTracking SOURCES src/ForwardTrackingAlg.cpp src/SiliconTrackingAlg.cpp src/SpacePointBuilderAlg.cpp src/TrackSubsetAlg.cpp - LINK GearSvc - EventSeeder + LINK EventSeeder TrackingLib TrackSystemSvcLib DataHelperLib KiTrackLib Gaudi::GaudiKernel - k4FWCore::k4FWCore - ${GEAR_LIBRARIES} - ${GSL_LIBRARIES} - ${LCIO_LIBRARIES} + k4FWCore::k4FWCore + ${GSL_LIBRARIES} + ${LCIO_LIBRARIES} ) + +if (CEPCSW_USE_GEAR) + target_compile_definitions(SiliconTracking PRIVATE CEPCSW_USE_GEAR) + target_link_libraries(SiliconTracking PRIVATE GearSvc ${GEAR_LIBRARIES}) +endif() + install(TARGETS SiliconTracking EXPORT CEPCSWTargets RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin diff --git a/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp b/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp index 3184563ffb2390fc231ae216da04cfc6ce7c6ba5..831aa8c8be3a5ba2b41950129bbf6e6778eb57b4 100644 --- a/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp +++ b/Reconstruction/RecSiTracking/src/ForwardTrackingAlg.cpp @@ -1,5 +1,5 @@ #include "ForwardTrackingAlg.h" -#include "GearSvc/IGearSvc.h" + #include "TrackSystemSvc/ITrackSystemSvc.h" #include "DataHelper/Navigation.h" @@ -16,14 +16,19 @@ #endif #include "UTIL/ILDConf.h" +#include "DetIdentifier/CEPCConf.h" //#include "MarlinCED.h" - +#ifdef CEPCSW_USE_GEAR +#include "GearSvc/IGearSvc.h" #include "gear/GEAR.h" #include "gear/GearParameters.h" #include "gear/BField.h" #include "gear/FTDParameters.h" #include "gear/FTDLayerLayout.h" +#else +#include "DetInterface/IGeomSvc.h" +#endif //----From KiTrack----------------------------- #include "KiTrack/SubsetHopfieldNN.h" @@ -127,13 +132,16 @@ StatusCode ForwardTrackingAlg::initialize(){ debug() << endmsg; } +#ifdef CEPCSW_USE_GEAR auto _gear = service<IGearSvc>("GearSvc"); if ( !_gear ) { error() << "Failed to find GearSvc ..." << endmsg; return StatusCode::FAILURE; } gear::GearMgr* gearMgr = _gear->getGearMgr(); - + + // Get the B Field in z direction + _Bz = gearMgr->getBField().at( gear::Vector3D(0., 0., 0.) ).z(); /**********************************************************************************************/ /* Make a SectorSystemFTD */ /**********************************************************************************************/ @@ -152,14 +160,38 @@ StatusCode ForwardTrackingAlg::initialize(){ if( ftdLayers.getNSensors(i) > nSensors ) nSensors = ftdLayers.getNSensors(i); } +#else + auto geomSvc = service<IGeomSvc>("GeomSvc"); + if ( !geomSvc ) { + info() << "Failed to find GeomSvc ..." << endmsg; + return StatusCode::FAILURE; + } + + const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0)); + _Bz = field.z()/dd4hep::tesla; + + int nLayers(0), nModules(0), nSensors(0); + try { + auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD)); + auto ftdData = ftdDet.extension<dd4hep::rec::ZDiskPetalsData>(); + auto ftdlayers = ftdData->layers; + + nLayers = ftdlayers.size() + 1; + for (int layer = 0; layer < ftdlayers.size(); layer++) { + auto& ftdlayer = ftdlayers[layer]; + if (ftdlayer.petalNumber > nModules) nModules = ftdlayer.petalNumber; + if (ftdlayer.sensorsPerPetal > nSensors) nSensors = ftdlayer.sensorsPerPetal; + } + } catch(std::runtime_error& e) { + fatal() << e.what() << endmsg; + return StatusCode::FAILURE; + } +#endif debug() << "SectorSystemFTD is using " << nLayers << " layers (including one for the IP), " << nModules << " petals and " << nSensors << " sensors." << endmsg; _sectorSystemFTD = new SectorSystemFTD( nLayers, nModules , nSensors ); - // Get the B Field in z direction - _Bz = gearMgr->getBField().at( gear::Vector3D(0., 0., 0.) ).z(); //The B field in z direction - /**********************************************************************************************/ /* Initialise the MarlinTrkSystem, needed by the tracks for fitting */ /**********************************************************************************************/ @@ -1001,20 +1033,7 @@ void ForwardTrackingAlg::finaliseTrack( edm4hep::MutableTrack* trackImpl ){ ++hitNumbers[ subdet ]; } - - //trackImpl->subdetectorHitNumbers().resize(2 * lcio::ILDDetID::ETD); - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::VXD - 2 ] = hitNumbers[lcio::ILDDetID::VXD]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - 2 ] = hitNumbers[lcio::ILDDetID::FTD]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SIT - 2 ] = hitNumbers[lcio::ILDDetID::SIT]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::TPC - 2 ] = hitNumbers[lcio::ILDDetID::TPC]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SET - 2 ] = hitNumbers[lcio::ILDDetID::SET]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::ETD - 2 ] = hitNumbers[lcio::ILDDetID::ETD]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::VXD - 1 ] = hitNumbers[lcio::ILDDetID::VXD]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::FTD - 1 ] = hitNumbers[lcio::ILDDetID::FTD]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SIT - 1 ] = hitNumbers[lcio::ILDDetID::SIT]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::TPC - 1 ] = hitNumbers[lcio::ILDDetID::TPC]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::SET - 1 ] = hitNumbers[lcio::ILDDetID::SET]; - //trackImpl->subdetectorHitNumbers()[ 2 * lcio::ILDDetID::ETD - 1 ] = hitNumbers[lcio::ILDDetID::ETD]; + #if EDM4HEP_BUILD_VERSION > EDM4HEP_VERSION(0, 9, 0) trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::VXD]); trackImpl->addToSubdetectorHitNumbers(hitNumbers[UTIL::ILDDetID::SIT]); diff --git a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp index 73f833e6bd6a66fb2808d89a5f6c1f84d6fb91f8..f5316ac5f45d68ff8c551c7933c35831df36c2e8 100644 --- a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp +++ b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.cpp @@ -25,6 +25,7 @@ #include <cmath> #include <climits> +#ifdef CEPCSW_USE_GEAR #include <gear/GEAR.h> #include <gear/GearMgr.h> #include <gear/GearParameters.h> @@ -32,8 +33,13 @@ #include <gear/VXDParameters.h> #include "gear/FTDLayerLayout.h" #include "gear/FTDParameters.h" - #include <gear/BField.h> +#else +#include "DetInterface/IGeomSvc.h" +#include "DetIdentifier/CEPCDetectorData.h" +#endif + +#include "DDRec/Vector3D.h" #include <UTIL/BitField64.h> #include <UTIL/BitSet32.h> @@ -184,7 +190,7 @@ StatusCode SiliconTrackingAlg::initialize() { #endif - if(setupGearGeom()==StatusCode::FAILURE) return StatusCode::FAILURE; + if (setupGeom().isFailure()) return StatusCode::FAILURE; if (_useSIT == 0) _nLayers = _nLayersVTX; @@ -503,9 +509,9 @@ int SiliconTrackingAlg::InitialiseFTD() { TrackerHitExtended * hitExt = new TrackerHitExtended( hit ); //gear::Vector3D U(1.0,hit->getU()[1],hit->getU()[0],gear::Vector3D::spherical); //gear::Vector3D V(1.0,hit->getV()[1],hit->getV()[0],gear::Vector3D::spherical); - gear::Vector3D U(1.0,hit.getCovMatrix()[1],hit.getCovMatrix()[0],gear::Vector3D::spherical); - gear::Vector3D V(1.0,hit.getCovMatrix()[4],hit.getCovMatrix()[3],gear::Vector3D::spherical); - gear::Vector3D Z(0.0,0.0,1.0); + dd4hep::rec::Vector3D U(1.0,(double)hit.getCovMatrix()[1],(double)hit.getCovMatrix()[0],dd4hep::rec::Vector3D::spherical); + dd4hep::rec::Vector3D V(1.0,(double)hit.getCovMatrix()[4],(double)hit.getCovMatrix()[3],dd4hep::rec::Vector3D::spherical); + dd4hep::rec::Vector3D Z(0.0,0.0,1.0); const float eps = 1.0e-07; // V must be the global z axis @@ -729,9 +735,9 @@ int SiliconTrackingAlg::InitialiseVTX() { if (UTIL::BitSet32(type)[CEPCConf::TrkHitTypeBit::PLANAR]) { //gear::Vector3D U(1.0,hit->getU()[1],hit->getU()[0],gear::Vector3D::spherical); //gear::Vector3D V(1.0,hit->getV()[1],hit->getV()[0],gear::Vector3D::spherical); - gear::Vector3D U(1.0,hit.getCovMatrix()[1],hit.getCovMatrix()[0],gear::Vector3D::spherical); - gear::Vector3D V(1.0,hit.getCovMatrix()[4],hit.getCovMatrix()[3],gear::Vector3D::spherical); - gear::Vector3D Z(0.0,0.0,1.0); + dd4hep::rec::Vector3D U(1.0,hit.getCovMatrix()[1],hit.getCovMatrix()[0],dd4hep::rec::Vector3D::spherical); + dd4hep::rec::Vector3D V(1.0,hit.getCovMatrix()[4],hit.getCovMatrix()[3],dd4hep::rec::Vector3D::spherical); + dd4hep::rec::Vector3D Z(0.0,0.0,1.0); //debug() << "covMatrix : " << hit->getCovMatrix()[0] << " " << hit->getCovMatrix()[1] << endmsg; const float eps = 1.0e-07; // V must be the global z axis @@ -877,9 +883,9 @@ int SiliconTrackingAlg::InitialiseVTX() { // first we need to check if the measurement vectors are aligned with the global coordinates //gear::Vector3D U(1.0,trkhit_P->getU()[1],trkhit_P->getU()[0],gear::Vector3D::spherical); //gear::Vector3D V(1.0,trkhit_P->getV()[1],trkhit_P->getV()[0],gear::Vector3D::spherical); - gear::Vector3D U(1.0,trkhit.getCovMatrix()[1],trkhit.getCovMatrix()[0],gear::Vector3D::spherical); - gear::Vector3D V(1.0,trkhit.getCovMatrix()[4],trkhit.getCovMatrix()[3],gear::Vector3D::spherical); - gear::Vector3D Z(0.0,0.0,1.0); + dd4hep::rec::Vector3D U(1.0,trkhit.getCovMatrix()[1],trkhit.getCovMatrix()[0],dd4hep::rec::Vector3D::spherical); + dd4hep::rec::Vector3D V(1.0,trkhit.getCovMatrix()[4],trkhit.getCovMatrix()[3],dd4hep::rec::Vector3D::spherical); + dd4hep::rec::Vector3D Z(0.0,0.0,1.0); const float eps = 1.0e-07; // V must be the global z axis @@ -2846,10 +2852,10 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) { try { //status = MarlinTrk::createFinalisedLCIOTrack(marlinTrk, trkHits, &track, fit_backwards, covMatrix, _bField, _maxChi2PerHit); status = m_fitTool->Fit(track, trkHits, covMatrix, _maxChi2PerHit, fit_backwards); - } catch (...) { + } catch (MarlinTrk::Exception& excep) { // delete Track; // delete marlinTrk; - error() << "MarlinTrk::createFinalisedLCIOTrack fail" << endmsg; + error() << "MarlinTrk::createFinalisedLCIOTrack fail, " << excep.what() << endmsg; //throw ; } debug() << "createFinalisedLCIOTrack finish" << endmsg; @@ -2997,7 +3003,9 @@ void SiliconTrackingAlg::FinalRefit(edm4hep::TrackCollection* trk_col) { << " Pz = " << pzTot << endmsg; } -StatusCode SiliconTrackingAlg::setupGearGeom(){ +StatusCode SiliconTrackingAlg::setupGeom() { + +#ifdef CEPCSW_USE_GEAR auto _gear = service<IGearSvc>("GearSvc"); if ( !_gear ) { error() << "Failed to find GearSvc ..." << endmsg; @@ -3143,6 +3151,63 @@ StatusCode SiliconTrackingAlg::setupGearGeom(){ } } +#else + auto geomSvc = service<IGeomSvc>("GeomSvc"); + if ( !geomSvc ) { + info() << "Failed to find GeomSvc ..." << endmsg; + return StatusCode::FAILURE; + } + + const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0)); + _bField = field.z()/dd4hep::tesla; + + _nLayersVTX = 0; + dd4hep::rec::CompositeData* vtxData = nullptr; + auto vxdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::VXD)); + try { + vtxData = vxdDet.extension<dd4hep::rec::CompositeData>(); + } catch(std::runtime_error& e) { + warning() << e.what() << endmsg; + } + if (vtxData) { + _nLayersVTX = vtxData->layersPlanar.size() + vtxData->layersBent.size(); + } + else { + try{ + auto oldData = vxdDet.extension<dd4hep::rec::ZPlanarData>(); + _nLayersVTX = oldData->layers.size(); + } catch(std::runtime_error& e){ + error() << e.what() << " not CompositeData and ZPlanarData for vertex detector, check geometry" << endmsg; + } + } + + _nLayersSIT = 0; + try { + auto sitDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::SIT)); + auto sitData = sitDet.extension<dd4hep::rec::ZPlanarData>(); + _nLayersSIT = sitData->layers.size(); + } catch(std::runtime_error& e) { + error() << e.what() << endmsg; + } + + _nlayersFTD = 0; + try { + auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD)); + auto ftdData = ftdDet.extension<dd4hep::rec::ZDiskPetalsData>(); + auto ftdlayers = ftdData->layers; + for (int layer = 0; layer < ftdlayers.size(); layer++) { + dd4hep::rec::ZDiskPetalsData::LayerLayout& ftdlayer = ftdlayers[layer]; + _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm - ftdlayer.zOffsetSensitive/dd4hep::mm); // front petal even numbered + if (ftdlayer.petalNumber > 0) { + _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm - ftdlayer.zOffsetSensitive/dd4hep::mm - 2*ftdlayer.zOffsetSupport/dd4hep::mm); // front petal odd numbered + _petalBasedFTDWithOverlaps = true; + } + } + _nlayersFTD =_zLayerFTD.size(); + } catch(std::runtime_error& e){ + warning() << e.what() << endmsg; + } +#endif info() << "nvxd = " << _nLayersVTX << " nsit = " << _nLayersSIT << " nftd = " << _nlayersFTD << endmsg; diff --git a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.h b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.h index 2d0bbd2d2bd42c2bae0b63568ea86ee07347e374..13f3e323c7069e91ce6e33bb893846f3e9e6b444 100644 --- a/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.h +++ b/Reconstruction/RecSiTracking/src/SiliconTrackingAlg.h @@ -424,7 +424,7 @@ class SiliconTrackingAlg : public GaudiAlgorithm { int getModuleID(edm4hep::TrackerHit hit) { _encoder->setValue(hit.getCellID()); return (*_encoder)[lcio::ILDCellID0::module]; }; int getSensorID(edm4hep::TrackerHit hit) { _encoder->setValue(hit.getCellID()); return (*_encoder)[lcio::ILDCellID0::sensor]; }; - StatusCode setupGearGeom() ; + StatusCode setupGeom() ; std::vector<float> _zLayerFTD; diff --git a/Reconstruction/RecSiTracking/src/TrackSubsetAlg.cpp b/Reconstruction/RecSiTracking/src/TrackSubsetAlg.cpp index c8b6d1ea988b1a0daf139f2b793e4463824357b7..9fa7479255d454f8ecda560db233f1bc4273d6d2 100644 --- a/Reconstruction/RecSiTracking/src/TrackSubsetAlg.cpp +++ b/Reconstruction/RecSiTracking/src/TrackSubsetAlg.cpp @@ -1,13 +1,17 @@ #include "TrackSubsetAlg.h" +#ifdef CEPCSW_USE_GEAR #include "GearSvc/IGearSvc.h" +#include <gear/BField.h> +#else +#include "DetInterface/IGeomSvc.h" +#endif + #include "TrackSystemSvc/ITrackSystemSvc.h" #include "DataHelper/Navigation.h" #include <UTIL/ILDConf.h> -#include <gear/BField.h> - #include "KiTrack/SubsetSimple.h" #include "KiTrack/SubsetHopfieldNN.h" #include "Tools/Fitter.h" @@ -72,6 +76,7 @@ StatusCode TrackSubsetAlg::initialize() { /**********************************************************************************************/ /* Initialise the MarlinTrkSystem, needed by the tracks for fitting */ /**********************************************************************************************/ +#ifdef CEPCSW_USE_GEAR auto _gear = service<IGearSvc>("GearSvc"); if ( !_gear ) { error() << "Failed to find GearSvc ..." << endmsg; @@ -79,7 +84,17 @@ StatusCode TrackSubsetAlg::initialize() { } gear::GearMgr* gearMgr = _gear->getGearMgr(); _bField = gearMgr->getBField().at( gear::Vector3D( 0.,0.,0.) ).z() ; - +#else + auto geomSvc = service<IGeomSvc>("GeomSvc"); + if ( !geomSvc ) { + info() << "Failed to find GeomSvc ..." << endmsg; + return StatusCode::FAILURE; + } + + const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0)); + _bField = field.z()/dd4hep::tesla; +#endif + // set upt the geometry auto _trackSystemSvc = service<ITrackSystemSvc>("TrackSystemSvc"); if ( !_trackSystemSvc ) { diff --git a/Reconstruction/RecTrkGlobal/CMakeLists.txt b/Reconstruction/RecTrkGlobal/CMakeLists.txt index 9ea9ecd6794902b915681f461703868feabd6909..df71dda6ff7eebcbaaacb2e0d15f30b752207baf 100644 --- a/Reconstruction/RecTrkGlobal/CMakeLists.txt +++ b/Reconstruction/RecTrkGlobal/CMakeLists.txt @@ -7,16 +7,13 @@ gaudi_add_module(Tracking src/FullLDCTracking/FullLDCTrackingAlg.cpp src/TruthTracker/TruthTrackerAlg.cpp src/FitterTool/KalTestTool.cpp - LINK GearSvc - EventSeeder + LINK EventSeeder TrackSystemSvcLib DetSegmentation Gaudi::GaudiAlgLib Gaudi::GaudiKernel - ${GEAR_LIBRARIES} ${GSL_LIBRARIES} ${LCIO_LIBRARIES} - DetSegmentation EDM4HEP::edm4hep EDM4HEP::edm4hepDict k4FWCore::k4FWCore ) @@ -25,6 +22,11 @@ target_include_directories(Tracking PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>/include $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>) +if (CEPCSW_USE_GEAR) + target_compile_definitions(Tracking PRIVATE CEPCSW_USE_GEAR) + target_link_libraries(Tracking PRIVATE GearSvc ${GEAR_LIBRARIES}) +endif() + install(TARGETS Tracking EXPORT CEPCSWTargets RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin diff --git a/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.cpp b/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.cpp index 678bedddc41ded731ae5d63d987b5db816e767c2..1218198c38a0c64f0f27284af19a759f4fcb47b9 100644 --- a/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.cpp +++ b/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.cpp @@ -22,12 +22,12 @@ //#include "UTIL/CellIDDecoder.h" #include "UTIL/ILDConf.h" //#include "UTIL/LCIterator.h" - +#include "DetIdentifier/CEPCConf.h" //-------gsl ----- #include "gsl/gsl_randist.h" #include "gsl/gsl_cdf.h" - +#ifdef CEPCSW_USE_GEAR //---- GEAR ---- #include "gear/GEAR.h" #include "gear/TPCParameters.h" @@ -35,7 +35,12 @@ #include "gear/ZPlanarLayerLayout.h" #include "gear/PadRowLayout2D.h" #include "gear/BField.h" - +gear::GearMgr* gearMgr; +#else +#include "DetIdentifier/CEPCDetectorData.h" +#include "DetInterface/IGeomSvc.h" +SmartIF<IGeomSvc> geomSvc; +#endif #include "TrackSystemSvc/IMarlinTrack.h" #include "TrackSystemSvc/IMarlinTrkSystem.h" @@ -53,22 +58,12 @@ using namespace MarlinTrk ; using namespace clupatra_new ; -/* - namespace edm4hep::TrackState { - const int AtIP = 0; - const int AtFirstHit = 1; - const int AtLastHit = 2; - const int AtCalorimeter = 3; - }; - */ - RuntimeMap<edm4hep::Track, clupatra_new::TrackInfoStruct*> TrackInfo_of_edm4hepTrack; RuntimeMap<edm4hep::Track, MarlinTrk::IMarlinTrack*> MarTrk_of_edm4hepTrack; RuntimeMap<MarlinTrk::IMarlinTrack*, clupatra_new::CluTrack*> CluTrk_of_MarTrack; RuntimeMap<edm4hep::TrackerHit, clupatra_new::Hit*> GHitof; RuntimeMap<clupatra_new::CluTrack*, MarlinTrk::IMarlinTrack*> MarTrkof; -gear::GearMgr* gearMgr; #define WRITE_PICKED_DEBUG_TRACKS false //---------------------------------------------------------------- @@ -197,56 +192,85 @@ void ClupatraAlg::printParameters() { StatusCode ClupatraAlg::initialize() { - // Usually a good idea to - // don't need, since Gaudi Algorithm will print all Property - //printParameters() ; + // Usually a good idea to + // don't need, since Gaudi Algorithm will print all Property + //printParameters() ; + +#ifdef CEPCSW_USE_GEAR + // Gear can be put as global + auto _gear = service<IGearSvc>("GearSvc"); + gearMgr = _gear->getGearMgr(); + + _gearTPC = &(gearMgr->getTPCParameters()); + _bfield = gearMgr->getBField().at( gear::Vector3D(0.,0.0,0.) ).z() ; + + // Support for more than one module + // The ternary operator is used to make the trick with the static variable which + // is supposed to be calculated only once, also for performance reason + _maxTPCLayers = (gearMgr->getDetectorName() == "LPTPC" ) ? + _gearTPC->getModule(0).getNRows() + _gearTPC->getModule(2).getNRows() + _gearTPC->getModule(5).getNRows() : // LCTPC + _gearTPC->getModule(0).getNRows(); // ILD + + _driftLength = _gearTPC->getMaxDriftLength() ; +#else + geomSvc = service<IGeomSvc>("GeomSvc"); + if (!geomSvc) { + fatal() << "Fail to find GeomSvc" << endmsg; + return StatusCode::FAILURE; + } + const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0)); + _bfield = field.z()/dd4hep::tesla; + dd4hep::DetElement tpcDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC)); + auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>(); + _maxTPCLayers = tpcData->maxRow; + _driftLength = tpcData->driftLength/dd4hep::mm; +#endif // Set up the track fit tool m_fitTool = ToolHandle<ITrackFitterTool>(m_fitToolName.value()); - auto _trackSystemSvc = service<ITrackSystemSvc>("TrackSystemSvc"); - if ( !_trackSystemSvc ) { - error() << "Fail to find TrackSystemSvc ..." << endmsg; - } - - _trksystem = _trackSystemSvc->getTrackSystem(this); - if(!_trksystem){ - error() << "Cannot initialize MarlinTrkSystem of Type: KalTest" <<endmsg; - return StatusCode::FAILURE; - } - - _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useQMS, _MSOn ) ; - _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::usedEdx, _ElossOn) ; - _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useSmoothing, _SmoothOn) ; - _trksystem->init() ; - - _nRun = 0 ; - _nEvt = 0 ; - // FIXME: fucd - //tree = new TTree("Tuple", "Particle Tree"); - //tree->Branch("omega", &omega, "omega/D"); - //tree->Branch("totalCandidates", &totalCandidates, "totalCandidates/I"); - //tree->Branch("eventNumber", &_nEvt, "eventNumber/I"); - if(_DumpTime){ - NTuplePtr nt1(ntupleSvc(), "MyTuples/Time"+name()); - if ( !nt1 ) { - m_tuple = ntupleSvc()->book("MyTuples/Time"+name(),CLID_ColumnWiseTuple,"Tracking time"); - if ( 0 != m_tuple ) { - m_tuple->addItem ("timeTotal", m_timeTotal ).ignore(); - m_tuple->addItem ("timeKalman", m_timeKalman ).ignore(); - } - else { - fatal() << "Cannot book MyTuples/Time"+name() <<endmsg; - return StatusCode::FAILURE; - } - } - else{ - m_tuple = nt1; - } - } - - return GaudiAlgorithm::initialize(); - + auto _trackSystemSvc = service<ITrackSystemSvc>("TrackSystemSvc"); + if ( !_trackSystemSvc ) { + error() << "Fail to find TrackSystemSvc ..." << endmsg; + } + + _trksystem = _trackSystemSvc->getTrackSystem(this); + if(!_trksystem){ + error() << "Cannot initialize MarlinTrkSystem of Type: KalTest" <<endmsg; + return StatusCode::FAILURE; + } + + _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useQMS, _MSOn ) ; + _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::usedEdx, _ElossOn) ; + _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useSmoothing, _SmoothOn) ; + _trksystem->init() ; + + _nRun = 0 ; + _nEvt = 0 ; + // FIXME: fucd + //tree = new TTree("Tuple", "Particle Tree"); + //tree->Branch("omega", &omega, "omega/D"); + //tree->Branch("totalCandidates", &totalCandidates, "totalCandidates/I"); + //tree->Branch("eventNumber", &_nEvt, "eventNumber/I"); + if(_DumpTime){ + NTuplePtr nt1(ntupleSvc(), "MyTuples/Time"+name()); + if ( !nt1 ) { + m_tuple = ntupleSvc()->book("MyTuples/Time"+name(),CLID_ColumnWiseTuple,"Tracking time"); + if ( 0 != m_tuple ) { + m_tuple->addItem ("timeTotal", m_timeTotal ).ignore(); + m_tuple->addItem ("timeKalman", m_timeKalman ).ignore(); + } + else { + fatal() << "Cannot book MyTuples/Time"+name() <<endmsg; + return StatusCode::FAILURE; + } + } + else{ + m_tuple = nt1; + } + } + + return GaudiAlgorithm::initialize(); } @@ -284,32 +308,16 @@ StatusCode ClupatraAlg::execute() { PLCIOTrackConverter converter ; - // Gear can be put as global - auto _gear = service<IGearSvc>("GearSvc"); - gearMgr = _gear->getGearMgr(); - - _gearTPC = &(gearMgr->getTPCParameters()); - _bfield = gearMgr->getBField().at( gear::Vector3D(0.,0.0,0.) ).z() ; - - // Support for more than one module - // The ternary operator is used to make the trick with the static variable which - // is supposed to be calculated only once, also for performance reason - static const unsigned int maxTPCLayers = (gearMgr->getDetectorName() == "LPTPC" ) ? - _gearTPC->getModule(0).getNRows() + _gearTPC->getModule(2).getNRows() + _gearTPC->getModule(5).getNRows() : // LCTPC - _gearTPC->getModule(0).getNRows(); // ILD - - double driftLength = _gearTPC->getMaxDriftLength() ; - ZIndex zIndex( -driftLength , driftLength , _nZBins ) ; + ZIndex zIndex( -_driftLength , _driftLength , _nZBins ) ; const edm4hep::TrackerHitCollection* col = nullptr; debug() << "col" << endmsg; - try{ col = _TPCHitCollectionHandle.get(); - + try { + col = _TPCHitCollectionHandle.get(); } catch(...) { - // FIXME: Mingrui fix the output message - // streamlog_out( WARNING ) << " input collection not in event : " << _colName << " - nothing to do !!! " << std::endl ; + warning() << " input collection not in event : " << _colName << " - nothing to do !!! " << endmsg; } //=============================================================================================== @@ -333,7 +341,7 @@ StatusCode ClupatraAlg::execute() { //------ TrackerHit th(col->at(i)); //debug() << i << " " << th->getCellID() << endmsg; - if ( fabs(th.getPosition()[2]) > driftLength ) continue; + if ( fabs(th.getPosition()[2]) > _driftLength ) continue; ClupaHit* ch = & clupaHits[i] ; @@ -369,7 +377,7 @@ StatusCode ClupatraAlg::execute() { //--------------------------------------------------------------------------------------------------------- - HitListVector hitsInLayer( maxTPCLayers ) ; + HitListVector hitsInLayer( _maxTPCLayers ) ; addToHitListVector( nncluHits.begin(), nncluHits.end() , hitsInLayer ) ; debug() << " added " << nncluHits.size() << " tp hitsInLayer - > size " << hitsInLayer.size() << endmsg; @@ -455,7 +463,7 @@ StatusCode ClupatraAlg::execute() { HitDistance dist( nloop * dcut , _cosAlphaCut ) ; - outerRow = maxTPCLayers - 1 ; + outerRow = _maxTPCLayers - 1 ; while( outerRow >= _minCluSize ) { @@ -521,7 +529,7 @@ StatusCode ClupatraAlg::execute() { // remove clusters whith too many duplicate hits per pad row Clusterer::cluster_list bclu ; // bad clusters bclu.setOwner() ; - split_list( sclu, std::back_inserter(bclu), DuplicatePadRows( maxTPCLayers, _duplicatePadRowFraction ) ) ; + split_list( sclu, std::back_inserter(bclu), DuplicatePadRows( _maxTPCLayers, _duplicatePadRowFraction ) ) ; // free hits from bad clusters std::for_each( bclu.begin(), bclu.end(), std::mem_fun( &CluTrack::freeElements ) ) ; @@ -625,12 +633,12 @@ StatusCode ClupatraAlg::execute() { static const int do_global_reclustering = true ; if( do_global_reclustering ) { - outerRow = maxTPCLayers - 1 ; + outerRow = _maxTPCLayers - 1 ; int padRangeRecluster = 50 ; // FIXME: make parameter // define an inner cylinder where we exclude hits from re-clustering: - double zMaxInnerHits = driftLength * .67 ; // FIXME: make parameter - double rhoMaxInnerHits = _gearTPC->getPlaneExtent()[0] + ( _gearTPC->getPlaneExtent()[1] - _gearTPC->getPlaneExtent()[0] ) * .67 ;// FIXME: make parameter + double zMaxInnerHits = _driftLength * .67 ; // FIXME: make parameter + double rhoMaxInnerHits = _rmin + ( _rmax - _rmin ) * .67 ;// FIXME: make parameter while( outerRow > 0 ) { @@ -1305,9 +1313,9 @@ void ClupatraAlg::computeTrackInfo( edm4hep::Track lTrk ){ if( ! TrackInfo_of_edm4hepTrack(lTrk) ) TrackInfo_of_edm4hepTrack(lTrk) = new TrackInfoStruct ; - float r_inner = _gearTPC->getPlaneExtent()[0] ; - float r_outer = _gearTPC->getPlaneExtent()[1] ; - float driftLength = _gearTPC->getMaxDriftLength() ; + float r_inner = _rmin ; + float r_outer = _rmax ; + float driftLength = _driftLength ; // compute z-extend of this track segment // auto hv = lTrk->getTrackerHits() ; diff --git a/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.h b/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.h index 2e81b9e670edb319c5d50c74f6e15c18df4cec7b..a15c7c10879616b993e56c9156f03500b56da507 100644 --- a/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.h +++ b/Reconstruction/RecTrkGlobal/src/Clupatra/ClupatraAlg.h @@ -153,6 +153,10 @@ class ClupatraAlg : public GaudiAlgorithm { DataHandle<edm4hep::TrackCollection> _ClupatraTrackSegmentCollectionHandle{"ClupatraSegmentTracks", Gaudi::DataHandle::Writer, this}; float _bfield ; + float _maxTPCLayers ; + float _driftLength ; + float _rmin ; + float _rmax ; int _nRun ; int _nEvt ; diff --git a/Reconstruction/RecTrkGlobal/src/Clupatra/clupatra_new.cpp b/Reconstruction/RecTrkGlobal/src/Clupatra/clupatra_new.cpp index 8e732aed84563ed7fa8d5f7285074487aa8808d7..ac62fa4ef65307b352c23bc6e6b94f061e98ca7a 100644 --- a/Reconstruction/RecTrkGlobal/src/Clupatra/clupatra_new.cpp +++ b/Reconstruction/RecTrkGlobal/src/Clupatra/clupatra_new.cpp @@ -7,19 +7,24 @@ #include <DetIdentifier/CEPCConf.h> #include <UTIL/BitSet32.h> +#ifdef CEPCSW_USE_GEAR ///---- GEAR ---- #include "gear/GEAR.h" #include "gear/TPCParameters.h" #include "gear/TPCModule.h" - #include "gear/BField.h" +extern gear::GearMgr* gearMgr; // = _gear->getGearMgr(); +#else +#include "DetInterface/IGeomSvc.h" +extern IGeomSvc* geomSvc; +#endif #include "IMPL/TrackerHitImpl.h" #include "IMPL/TrackStateImpl.h" #include "k4FWCore/DataHandle.h" #include "GaudiAlg/GaudiAlgorithm.h" -#include "GearSvc/IGearSvc.h" +//#include "GearSvc/IGearSvc.h" #include "podio/podioVersion.h" @@ -31,7 +36,6 @@ namespace lcio{ const int ILDTrackTypeBit::COMPOSITE = 17 ; } -extern gear::GearMgr* gearMgr; // = _gear->getGearMgr(); extern RuntimeMap<clupatra_new::CluTrack*, MarlinTrk::IMarlinTrack*> MarTrkof; extern RuntimeMap<edm4hep::Track, MarlinTrk::IMarlinTrack*> MarTrk_of_edm4hepTrack; extern RuntimeMap<edm4hep::Track, clupatra_new::TrackInfoStruct*> TrackInfo_of_edm4hepTrack; @@ -248,6 +252,7 @@ namespace clupatra_new{ int nHitsAdded = 0 ; +#ifdef CEPCSW_USE_GEAR const double bfield = gearMgr->getBField().at( gear::Vector3D(0.,0.0,0.) ).z() ; // Support for more than one module @@ -257,6 +262,13 @@ namespace clupatra_new{ static const int maxTPCLayerID = (gearMgr->getDetectorName() == "LPTPC" ) ? gearTPC->getModule(0).getNRows() + gearTPC->getModule(2).getNRows() + gearTPC->getModule(5).getNRows() - 1 : // LCTPC gearTPC->getModule(0).getNRows() - 1 ; // ILD +#else + const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0)); + const double bfield = field.z()/dd4hep::tesla; + auto tpcDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC)); + auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>(); + static const int maxTPCLayerID = tpcData->maxRow - 1; +#endif clu->sort( LayerSortIn() ) ; @@ -709,7 +721,7 @@ namespace clupatra_new{ // Support for more than one module //auto _gear = service<IGearSvc>("GearSvc"); - +#ifdef CEPCSW_USE_GEAR static const gear::TPCParameters* gearTPC = &(gearMgr->getTPCParameters()); // The ternary operator is used to make the trick with the static variable which // is supposed to be calculated only once, also for performance reason @@ -717,7 +729,11 @@ namespace clupatra_new{ (gearMgr->getDetectorName() == "LPTPC" ) ? gearTPC->getModule(0).getNRows() + gearTPC->getModule(2).getNRows() + gearTPC->getModule(5).getNRows() : // LCTPC gearTPC->getModule(0).getNRows() ; // ILD - +#else + auto tpcDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC)); + auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>(); + static const int tpcNRow = tpcData->maxRow; +#endif HitListVector hitsInLayer( tpcNRow ) ; addToHitListVector( hV.begin(), hV.end(), hitsInLayer ) ; @@ -860,6 +876,7 @@ namespace clupatra_new{ // auto _gear = service<IGearSvc>("GearSvc"); // Support for more than one module +#ifdef CEPCSW_USE_GEAR static const gear::TPCParameters* gearTPC = &(gearMgr->getTPCParameters()); // The ternary operator is used to make the trick with the static variable which // is supposed to be calculated only once, also for performance reason @@ -867,6 +884,11 @@ namespace clupatra_new{ (gearMgr->getDetectorName() == "LPTPC" ) ? gearTPC->getModule(0).getNRows() + gearTPC->getModule(2).getNRows() + gearTPC->getModule(5).getNRows() : // LCTPC gearTPC->getModule(0).getNRows() ; // ILD +#else + auto tpcDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC)); + auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>(); + static const int tpcNRow = tpcData->maxRow; +#endif HitListVector hitsInLayer( tpcNRow ) ; addToHitListVector( hV.begin(), hV.end(), hitsInLayer ) ; @@ -1041,6 +1063,7 @@ namespace clupatra_new{ // Support for more than one module +#ifdef CEPCSW_USE_GEAR static const gear::TPCParameters* gearTPC = &(gearMgr->getTPCParameters()); // The ternary operator is used to make the trick with the static variable which // is supposed to be calculated only once, also for performance reason @@ -1048,7 +1071,11 @@ namespace clupatra_new{ (gearMgr->getDetectorName() == "LPTPC" ) ? gearTPC->getModule(0).getNRows() + gearTPC->getModule(2).getNRows() + gearTPC->getModule(5).getNRows() : // LCTPC gearTPC->getModule(0).getNRows() ; // ILD - +#else + auto tpcDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC)); + auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>(); + static const int tpcNRow = tpcData->maxRow; +#endif HitListVector hitsInLayer( tpcNRow ) ; addToHitListVector( clu.begin(), clu.end(), hitsInLayer ) ; diff --git a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp index e7a64ee2cdaff20ad1f8fbd618ae9f3766cbe27f..61160c99816dcd450c9ed0af757dfb09f979a912 100755 --- a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp +++ b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.cpp @@ -3,8 +3,6 @@ #include "DataHelper/Navigation.h" #include "Tracking/TrackingHelper.h" -#include <GearSvc/IGearSvc.h> - #include <edm4hep/TrackerHit.h> #include <edm4hep/TrackerHitPlane.h> #include <edm4hep/Track.h> @@ -25,6 +23,8 @@ #include <map> //#include "DataHelper/ClusterShapes.h" +#ifdef CEPCSW_USE_GEAR +#include <GearSvc/IGearSvc.h> #include <gear/GEAR.h> #include <gear/GearParameters.h> #include <gear/BField.h> @@ -34,6 +34,10 @@ #include "gear/FTDParameters.h" #include <gear/TPCParameters.h> #include <gear/PadRowLayout2D.h> +#else +#include "DetIdentifier/CEPCDetectorData.h" +#include "DetInterface/IGeomSvc.h" +#endif #include "TrackSystemSvc/IMarlinTrack.h" #include "TrackSystemSvc/IMarlinTrkSystem.h" @@ -197,7 +201,7 @@ StatusCode FullLDCTrackingAlg::initialize() { _trksystem->setOption( MarlinTrk::IMarlinTrkSystem::CFG::useSmoothing, _SmoothOn) ; _trksystem->init() ; - this->setupGearGeom(); + if (this->setupGeom().isFailure()) return StatusCode::FAILURE; return GaudiAlgorithm::initialize(); } @@ -5038,8 +5042,9 @@ StatusCode FullLDCTrackingAlg::finalize() { return StatusCode::SUCCESS; } -void FullLDCTrackingAlg::setupGearGeom(){ - +StatusCode FullLDCTrackingAlg::setupGeom(){ + +#ifdef CEPCSW_USE_GEAR auto _gear = service<IGearSvc>("GearSvc"); gearMgr = _gear->getGearMgr(); @@ -5226,9 +5231,96 @@ void FullLDCTrackingAlg::setupGearGeom(){ debug() << " ### gear::FTD Parameters as defined in SFtd05 Not Present in GEAR FILE" << endmsg; } } +#else + auto geomSvc = service<IGeomSvc>("GeomSvc"); + if (!geomSvc) { + fatal() << "Fail to find GeomSvc" << endmsg; + return StatusCode::FAILURE; + } + const dd4hep::Direction& field = geomSvc->lcdd()->field().magneticField(dd4hep::Position(0,0,0)); + _bField = field.z()/dd4hep::tesla; + + _nLayersVTX = 0; + dd4hep::rec::CompositeData* vtxData = nullptr; + auto vxdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::VXD)); + try { + vtxData = vxdDet.extension<dd4hep::rec::CompositeData>(); + } catch(std::runtime_error& e) { + warning() << e.what() << endmsg; + } + if (vtxData) { + _nLayersVTX = vtxData->layersPlanar.size() + vtxData->layersBent.size(); + } + else { + try{ + auto oldData = vxdDet.extension<dd4hep::rec::ZPlanarData>(); + _nLayersVTX = oldData->layers.size(); + } catch(std::runtime_error& e){ + error() << e.what() << " not CompositeData and ZPlanarData for vertex detector, check geometry" << endmsg; + } + } + + _nLayersSIT = 0; + try { + auto sitDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::SIT)); + auto sitData = sitDet.extension<dd4hep::rec::ZPlanarData>(); + _nLayersSIT = sitData->layers.size(); + } catch(std::runtime_error& e) { + error() << e.what() << endmsg; + } + + _nLayersSET = 0; + try { + auto setDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::SET)); + auto setData = setDet.extension<dd4hep::rec::ZPlanarData>(); + _nLayersSET = setData->layers.size(); + } catch(std::runtime_error& e) { + error() << e.what() << endmsg; + } + + try { + auto tpcDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::TPC)); + auto tpcData = tpcDet.extension<dd4hep::rec::FixedPadSizeTPCData>(); + _tpc_nrows = tpcData->maxRow; + _tpc_max_drift_length = tpcData->driftLength/dd4hep::mm; + _tpc_inner_r = tpcData->rMin/dd4hep::mm; + _tpc_outer_r = tpcData->rMax/dd4hep::mm; + _tpc_pad_height = tpcData->padHeight/dd4hep::mm; + } catch(std::runtime_error& e) { + error() << e.what() << endmsg; + } + + _nLayersFTD = 0; + try { + auto ftdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::FTD)); + auto ftdData = ftdDet.extension<dd4hep::rec::ZDiskPetalsData>(); + auto ftdlayers = ftdData->layers; + for (int layer = 0; layer < ftdlayers.size(); layer++) { + dd4hep::rec::ZDiskPetalsData::LayerLayout& ftdlayer = ftdlayers[layer]; + _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm - ftdlayer.zOffsetSensitive/dd4hep::mm); // front petal even numbered + if (ftdlayer.petalNumber > 0) { + _zLayerFTD.push_back(ftdlayer.zPosition/dd4hep::mm - ftdlayer.zOffsetSensitive/dd4hep::mm - 2*ftdlayer.zOffsetSupport/dd4hep::mm); // front petal odd numbered + _petalBasedFTDWithOverlaps = true; + } + } + _nLayersFTD =_zLayerFTD.size(); + } catch(std::runtime_error& e){ + warning() << e.what() << endmsg; + } + + _nLayersETD = 0; + try { + auto etdDet = geomSvc->lcdd()->detector(geomSvc->getDetName(CEPCConf::DetID::ETD)); + auto etdData = etdDet.extension<dd4hep::rec::ZDiskPetalsData>(); + _nLayersETD = etdData->layers.size(); + } catch(std::runtime_error& e){ + warning() << e.what() << endmsg; + } +#endif debug() << "layer number read: nvxd = " << _nLayersVTX << " nsit = " << _nLayersSIT << " ntpc = " << _tpc_nrows - << " nset = " << _nLayersSET << " nftd = " << _nLayersFTD << endmsg; + << " nset = " << _nLayersSET << " nftd = " << _nLayersFTD << " netd = " << _nLayersETD << endmsg; + return StatusCode::SUCCESS; } void FullLDCTrackingAlg::checkTrackState(int location){ diff --git a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.h b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.h index a73866ca3549392b0d90acfebbdc887274125a8d..1728f1b2580dd5307ee16a37f4a976c28a0a4344 100755 --- a/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.h +++ b/Reconstruction/RecTrkGlobal/src/FullLDCTracking/FullLDCTrackingAlg.h @@ -418,7 +418,7 @@ protected: int getSensorID(edm4hep::TrackerHit hit) { _encoder->setValue(hit.getCellID()); return (*_encoder)[lcio::ILDCellID0::sensor]; }; - void setupGearGeom() ; + StatusCode setupGeom() ; double _tpc_max_drift_length; double _tpc_inner_r; @@ -500,7 +500,7 @@ protected: // // std::vector<FTD_Disk> _FTDgeo; std::vector<float> _zLayerFTD; - gear::GearMgr* gearMgr; + //gear::GearMgr* gearMgr; unsigned int _nLayersFTD; int _nPhiFTD; diff --git a/cmake/CEPCSWOptions.cmake b/cmake/CEPCSWOptions.cmake index 5dca0ca413d83b3f5520004947e2c5f68e521df3..9ec71b8f6c24b9170273514ae7a0d1e28a194a49 100644 --- a/cmake/CEPCSWOptions.cmake +++ b/cmake/CEPCSWOptions.cmake @@ -48,3 +48,5 @@ if (NOT CEPCSW_EXTERNAL_AS_COMPONENT) set(CEPCSW_EXTERNAL_ROOT ${CMAKE_INSTALL_PREFIX}/External) endif() endif() + +option(CEPCSW_USE_GEAR "Use gear" FALSE)