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)