From 004a854da82cdf854a2a7c88d3b57e19fc03f208 Mon Sep 17 00:00:00 2001 From: "myliu@ihep.ac.cn" <myliu@ihep.ac.cn> Date: Mon, 29 Apr 2024 14:06:06 +0000 Subject: [PATCH] Add Tracking algorithm based on CKF --- CMakeLists.txt | 2 +- .../CRD_common_v01/DC_Simple_v01_06.xml | 79 ++ .../CRD_o1_v01/CRD_Dimensions_v01_01.xml | 6 +- .../CRD_o1_v01/CRD_o1_v01-onlyTracker.xml | 2 +- .../TDR_o2_v01/TDR_Dimensions_v02_01.xml | 20 +- .../TDR_o2_v01/TDR_o2_v01-onlyTracker.xml | 2 +- .../DetCRD/compact/TDR_o2_v01/TDR_o2_v01.xml | 2 +- .../TDR_o2_v02/TDR_Dimensions_v02_02.xml | 17 + .../TDR_o2_v02/TDR_o2_v02-onlyTracker.xml | 2 +- .../DetCRD/compact/TDR_o2_v02/TDR_o2_v02.xml | 2 +- Detector/DetDriftChamber/compact/det.xml | 14 +- Detector/DetSegmentation/CMakeLists.txt | 1 + .../DetSegmentation/GridDriftChamber.h | 17 +- .../DetSegmentation/src/GridDriftChamber.cpp | 107 ++- Digitisers/DCHDigi/CMakeLists.txt | 2 +- Digitisers/DCHDigi/src/DCHDigiAlg.cpp | 132 ++- Digitisers/DCHDigi/src/DCHDigiAlg.h | 38 +- Reconstruction/RecGenfitAlg/CMakeLists.txt | 8 +- .../RecGenfitAlg/src/DCTrackFinding.cpp | 668 +++++++++++++ .../RecGenfitAlg/src/DCTrackFinding.h | 213 ++++ .../RecGenfitAlg/src/GenfitFitter.cpp | 22 + .../RecGenfitAlg/src/GenfitFitter.h | 2 + Reconstruction/RecGenfitAlg/src/GenfitHit.cpp | 4 +- .../RecGenfitAlg/src/GenfitTrack.cpp | 632 +++++++++++- Reconstruction/RecGenfitAlg/src/GenfitTrack.h | 69 +- .../RecGenfitAlg/src/RecGenfitAlgDC.cpp | 409 -------- .../RecGenfitAlg/src/RecGenfitAlgDC.h | 190 ---- .../RecGenfitAlg/src/RecGenfitAlgSDT.cpp | 308 ++++-- .../RecGenfitAlg/src/RecGenfitAlgSDT.h | 309 +++--- .../RecGenfitAlg/src/WireMeasurementDC.cpp | 9 +- .../RecGenfitAlg/src/WireMeasurementDC.h | 18 +- .../src/TruthTracker/TruthTrackerAlg.cpp | 907 +++++++++--------- .../src/TruthTracker/TruthTrackerAlg.h | 128 +-- Utilities/DataHelper/CMakeLists.txt | 18 +- .../include/DataHelper/GeomeryHelper.h | 55 ++ .../include/DataHelper/TrackHelper.h | 11 + .../include/DataHelper/TrackerHitHelper.h | 15 +- Utilities/DataHelper/src/GeomeryHelper.cpp | 58 ++ Utilities/DataHelper/src/TrackHelper.cc | 34 +- Utilities/DataHelper/src/TrackerHitHelper.cpp | 29 +- cmake/CEPCSWDependencies.cmake | 2 + 41 files changed, 3075 insertions(+), 1488 deletions(-) create mode 100644 Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_06.xml create mode 100644 Reconstruction/RecGenfitAlg/src/DCTrackFinding.cpp create mode 100644 Reconstruction/RecGenfitAlg/src/DCTrackFinding.h delete mode 100644 Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp delete mode 100644 Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.h create mode 100644 Utilities/DataHelper/include/DataHelper/GeomeryHelper.h create mode 100644 Utilities/DataHelper/src/GeomeryHelper.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c8290cc..a42be1e5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,7 +9,7 @@ include(cmake/CEPCSWEnv.cmake) find_package(ROOT COMPONENTS RIO Tree) find_package(Gaudi) - +find_package(Eigen3) include(GNUInstallDirs) include(CTest) diff --git a/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_06.xml b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_06.xml new file mode 100644 index 00000000..4f7045ab --- /dev/null +++ b/Detector/DetCRD/compact/CRD_common_v01/DC_Simple_v01_06.xml @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="UTF-8"?> +<lccdd> + + <info name="DriftChamber" + title="Test with Drift Chamber" + author="Tao Lin" + url="http://github.com/cepc/CEPCSW" + status="development" + version="v0"> + <comment>Test with Drift Chamber</comment> + </info> + + <define> + + <constant name="DC_layer_number" value="66"/> + <constant name="Alpha" value="12*deg"/> + <constant name="Gas_radius_min" value="DC_rbegin+DC_inner_wall_thickness+DC_safe_distance"/> + <constant name="Gas_half_length" value="DC_half_length-DC_Endcap_dz-DC_safe_distance"/> + <constant name="Gas_length" value="Gas_half_length*2"/> + <constant name="DC_cell_width" value="18*mm"/> + <constant name="DC_inner_wall_radius_min" value="DC_rbegin"/> + <constant name="DC_inner_wall_radius_max" value="DC_rbegin+DC_inner_wall_thickness"/> + <constant name="DC_Endcap_rmin" value="DC_rbegin"/> + <constant name="DC_Endcap_rmax" value="DC_rend"/> + + <constant name="DC_construct_wire" value="0"/> + + <constant name="DC_layer_width" value="18*mm"/> + + </define> + + <limits> + <limitset name="DC_limits"> + <limit name="step_length_max" particles="*" value="0.1" unit="mm" /> + </limitset> + </limits> + + <regions> + <region name="DriftChamberRegion"> + </region> + </regions> + + <detectors> + <detector id="DetID_DC" name="DriftChamber" type="DriftChamber" readout="DriftChamberHitsCollection" vis="DCVis" sensitive="true" limits="DC_limits"> + <material name="Air"/> + <chamber id="0" material="GasHe_90Isob_10"/> + <side material="CarbonFiber"/> + <envelope vis="SeeThrough"> + <shape type="BooleanShape" operation="Union" material="Air"> + <shape type="Tube" rmin="DC_rbegin" rmax="DC_rend" dz="DC_half_length" /> + </shape> + </envelope> + + <module id="0" name="SignalWire" type="Tube" rmin="0*mm" rmax="0.01*mm" vis="RedVis"> + <tubs name="W" type="Tube" rmin="0*mm" rmax="0.007*mm" material="Tungsten"/> + <tubs name="Au" type="Tube" rmin="0.007*mm" rmax="0.01*mm" material="Gold"/> + </module> + + <module id="1" name="FieldWire" type="Tube" rmin="0*mm" rmax="0.03*mm" vis="GreenVis"> + <tubs name="Al" type="Tube" rmin="0*mm" rmax="0.027*mm" material="Aluminum"/> + <tubs name="Ag" type="Tube" rmin="0.027*mm" rmax="0.03*mm" material="Silver"/> + </module> + + <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_GASEOUS + DetType_WIRE"/> + <!-- Use cm as unit if you want to use Pandora for reconstruction --> + <sensitive type="SimpleDriftChamber"/> + </detector> + </detectors> + + <readouts> + <readout name="DriftChamberHitsCollection"> + <segmentation type="GridDriftChamber" cell_size="DC_cell_width" detector_length="Gas_length" identifier_phi="cellID" layerID="layer" DC_rbegin="DC_rbegin" DC_rend="DC_rend" layer_width="DC_layer_width"/> + + + <id>system:5,layer:7:9,chamber:8,cellID:32:16</id> + </readout> + </readouts> + +</lccdd> diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml index 9a79f6fb..63686bcc 100644 --- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml +++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_Dimensions_v01_01.xml @@ -85,14 +85,14 @@ <constant name="Vertex_Side_rmin" value="BeamPipe_VertexRegion_rmax"/> <!-- Parameters of single drift chamber --> - <constant name="DC_rbegin" value="800*mm"/> + <constant name="DC_rbegin" value="600*mm"/> <constant name="DC_rend" value="1800*mm"/> <constant name="DC_Endcap_dz" value="0.1*mm"/> - <constant name="DC_half_length" value="2980*mm" /> + <constant name="DC_half_length" value="2900*mm" /> <constant name="DC_safe_distance" value="0.02*mm"/> <constant name="DC_inner_wall_thickness" value="0.2*mm"/> - <constant name="DC_outer_wall_thickness" value="2.8*mm"/> + <constant name="DC_outer_wall_thickness" value="0.3*mm"/> <constant name="MainTracker_half_length" value="DC_half_length"/> <!--obselete for single drift chamber--> diff --git a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml index d80301fb..738e55c4 100644 --- a/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml +++ b/Detector/DetCRD/compact/CRD_o1_v01/CRD_o1_v01-onlyTracker.xml @@ -31,7 +31,7 @@ <include ref="../CRD_common_v01/VXD_v01_01.xml"/> <include ref="../CRD_common_v01/FTD_SkewRing_v01_01.xml"/> <include ref="../CRD_common_v01/SIT_SimplePixel_v01_01.xml"/> - <include ref="../CRD_common_v01/DC_Simple_v01_05.xml"/> + <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/> <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/> <fields> diff --git a/Detector/DetCRD/compact/TDR_o2_v01/TDR_Dimensions_v02_01.xml b/Detector/DetCRD/compact/TDR_o2_v01/TDR_Dimensions_v02_01.xml index 368a017e..85c18ce0 100644 --- a/Detector/DetCRD/compact/TDR_o2_v01/TDR_Dimensions_v02_01.xml +++ b/Detector/DetCRD/compact/TDR_o2_v01/TDR_Dimensions_v02_01.xml @@ -34,6 +34,7 @@ <constant name="DetID_TPC" value=" 4"/> <constant name="DetID_SET" value=" 5"/> <constant name="DetID_ETD" value=" 6"/> + <constant name="DetID_DC" value=" 4"/> <constant name="DetID_ECAL" value=" 20"/> <constant name="DetID_ECAL_PLUG" value=" 21"/> @@ -90,10 +91,21 @@ +(BeamPipe_FirstExpand_width/2-BeamPipe_Central_inner_radius)/(BeamPipe_ExpandAl_zmax-BeamPipe_CentralAl_zmax)*(Vertex_half_length-BeamPipe_CentralAl_zmax)"/> <constant name="Vertex_Side_rmin" value="BeamPipe_VertexRegion_rmax"/> - <constant name="DC_inner_radius" value="600*mm"/> - <constant name="DC_outer_radius" value="1800*mm"/> - <constant name="DC_half_length" value="2905*mm"/> - <constant name="OuterTracker_half_length" value="DC_half_length"/> + <!-- Parameters of single drift chamber --> + <constant name="DC_rbegin" value="600*mm"/> + <constant name="DC_rend" value="1800*mm"/> + + <constant name="DC_Endcap_dz" value="0.1*mm"/> + <constant name="DC_half_length" value="2900*mm" /> + <constant name="DC_safe_distance" value="0.02*mm"/> + <constant name="DC_inner_wall_thickness" value="0.2*mm"/> + <constant name="DC_outer_wall_thickness" value="0.3*mm"/> + <constant name="MainTracker_half_length" value="DC_half_length"/> + + <!--obselete for single drift chamber--> + <constant name="OuterTracker_half_length" value="DC_half_length"/> + <constant name="OuterTracker_inner_radius" value="1082.18*mm"/> + <constant name="OuterTracker_outer_radius" value="1723*mm"/> <constant name="SIT1_inner_radius" value="150*mm"/> <constant name="SIT2_inner_radius" value="360*mm"/> diff --git a/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01-onlyTracker.xml b/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01-onlyTracker.xml index f707fdc8..0c7e65ac 100644 --- a/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01-onlyTracker.xml +++ b/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01-onlyTracker.xml @@ -33,7 +33,7 @@ <include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_01.xml"/> <include ref="../CRD_common_v01/FTD_SkewRing_v01_02.xml"/> <include ref="../CRD_common_v01/SIT_SimplePixel_v01_02.xml"/> - <!--TODO: DC/--> + <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/> <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/> diff --git a/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01.xml b/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01.xml index 6a0fbaf8..76701836 100644 --- a/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01.xml +++ b/Detector/DetCRD/compact/TDR_o2_v01/TDR_o2_v01.xml @@ -33,7 +33,7 @@ <include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_01.xml"/> <include ref="../CRD_common_v01/FTD_SkewRing_v01_02.xml"/> <include ref="../CRD_common_v01/SIT_SimplePixel_v01_02.xml"/> - <!--TODO: DC/--> + <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/> <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/> <!--TODO: Ecal and Hcal/--> diff --git a/Detector/DetCRD/compact/TDR_o2_v02/TDR_Dimensions_v02_02.xml b/Detector/DetCRD/compact/TDR_o2_v02/TDR_Dimensions_v02_02.xml index 94a77c81..44643fa8 100644 --- a/Detector/DetCRD/compact/TDR_o2_v02/TDR_Dimensions_v02_02.xml +++ b/Detector/DetCRD/compact/TDR_o2_v02/TDR_Dimensions_v02_02.xml @@ -34,6 +34,7 @@ <constant name="DetID_TPC" value=" 4"/> <constant name="DetID_SET" value=" 5"/> <constant name="DetID_ETD" value=" 6"/> + <constant name="DetID_DC" value=" 4"/> <constant name="DetID_ECAL" value=" 20"/> <constant name="DetID_ECAL_PLUG" value=" 21"/> @@ -95,6 +96,22 @@ <constant name="TPC_half_length" value="2905*mm"/> <constant name="OuterTracker_half_length" value="TPC_half_length"/> + <!-- Parameters of single drift chamber --> + <constant name="DC_rbegin" value="600*mm"/> + <constant name="DC_rend" value="1800*mm"/> + + <constant name="DC_Endcap_dz" value="0.1*mm"/> + <constant name="DC_half_length" value="2900*mm" /> + <constant name="DC_safe_distance" value="0.02*mm"/> + <constant name="DC_inner_wall_thickness" value="0.2*mm"/> + <constant name="DC_outer_wall_thickness" value="0.3*mm"/> + <constant name="MainTracker_half_length" value="DC_half_length"/> + + <!--obselete for single drift chamber--> + <constant name="OuterTracker_half_length" value="DC_half_length"/> + <constant name="OuterTracker_inner_radius" value="1082.18*mm"/> + <constant name="OuterTracker_outer_radius" value="1723*mm"/> + <constant name="SIT1_inner_radius" value="100*mm"/> <constant name="SIT2_inner_radius" value="300*mm"/> <constant name="SIT3_inner_radius" value="580*mm"/> diff --git a/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02-onlyTracker.xml b/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02-onlyTracker.xml index 7cea5e89..6e955313 100644 --- a/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02-onlyTracker.xml +++ b/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02-onlyTracker.xml @@ -33,7 +33,7 @@ <include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_02.xml"/> <include ref="../CRD_common_v02/FTD_SkewRing_v01_04.xml"/> <include ref="../CRD_common_v01/SIT_SimplePixel_v01_02.xml"/> - <!--TODO: DC/--> + <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/> <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/> diff --git a/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02.xml b/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02.xml index 494b42fe..ad6767ac 100644 --- a/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02.xml +++ b/Detector/DetCRD/compact/TDR_o2_v02/TDR_o2_v02.xml @@ -33,7 +33,7 @@ <include ref="../CRD_common_v02/VXD_StaggeredLadder_v02_02.xml"/> <include ref="../CRD_common_v02/FTD_SkewRing_v01_04.xml"/> <include ref="../CRD_common_v01/SIT_SimplePixel_v01_02.xml"/> - <!--TODO: DC/--> + <include ref="../CRD_common_v01/DC_Simple_v01_06.xml"/> <include ref="../CRD_common_v01/SET_SimplePixel_v01_01.xml"/> <!--TODO: Ecal and Hcal/--> diff --git a/Detector/DetDriftChamber/compact/det.xml b/Detector/DetDriftChamber/compact/det.xml index 22548148..fa353ba5 100644 --- a/Detector/DetDriftChamber/compact/det.xml +++ b/Detector/DetDriftChamber/compact/det.xml @@ -30,19 +30,19 @@ <constant name="DC_safe_distance" value="0.02*mm"/> <constant name="DC_inner_wall_thickness" value="0.2*mm"/> - <constant name="DC_outer_wall_thickness" value="2.8*mm"/> + <constant name="DC_outer_wall_thickness" value="0.3*mm"/> - <constant name="DC_rbegin" value="800*mm"/> + <constant name="DC_rbegin" value="600*mm"/> <constant name="DC_rend" value="1800*mm"/> - <constant name="DC_layer_number" value="55"/> + <constant name="DC_layer_number" value="66"/> <constant name="Alpha" value="12*deg"/> <constant name="Gas_radius_min" value="DC_rbegin+DC_inner_wall_thickness+DC_safe_distance"/> <constant name="DC_Endcap_dz" value="0.1*mm"/> - <constant name="DC_half_length" value="2980*mm"/> + <constant name="DC_half_length" value="2900*mm"/> <constant name="Gas_half_length" value="DC_half_length-DC_Endcap_dz-DC_safe_distance"/> <constant name="Gas_length" value="Gas_half_length*2"/> @@ -97,9 +97,9 @@ <tubs name="Au" type="Tube" rmin="0.007*mm" rmax="0.01*mm" material="Gold"/> </module> - <module id="1" name="FieldWire" type="Tube" rmin="0*mm" rmax="0.02*mm" vis="VisibleGreen"> - <tubs name="Al" type="Tube" rmin="0*mm" rmax="0.017*mm" material="Aluminum"/> - <tubs name="Ag" type="Tube" rmin="0.017*mm" rmax="0.02*mm" material="Silver"/> + <module id="1" name="FieldWire" type="Tube" rmin="0*mm" rmax="0.03*mm" vis="VisibleGreen"> + <tubs name="Al" type="Tube" rmin="0*mm" rmax="0.027*mm" material="Aluminum"/> + <tubs name="Ag" type="Tube" rmin="0.027*mm" rmax="0.03*mm" material="Silver"/> </module> <type_flags type="DetType_TRACKER + DetType_BARREL + DetType_GASEOUS + DetType_WIRE"/> diff --git a/Detector/DetSegmentation/CMakeLists.txt b/Detector/DetSegmentation/CMakeLists.txt index 9b027334..09e060a9 100644 --- a/Detector/DetSegmentation/CMakeLists.txt +++ b/Detector/DetSegmentation/CMakeLists.txt @@ -12,6 +12,7 @@ gaudi_add_library(DetSegmentation LINK Gaudi::GaudiKernel ${DD4hep_COMPONENT_LIBRARIES} ${ROOT_LIBRARIES} + BelleIICKF::CKFDataobjects ) gaudi_add_module(DetSegmentationPlugin diff --git a/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h b/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h index 77e9bfa5..4b36c832 100644 --- a/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h +++ b/Detector/DetSegmentation/include/DetSegmentation/GridDriftChamber.h @@ -2,6 +2,7 @@ #define DETSEGMENTATION_GRIDDRIFTCHAMBER_H #include "DDSegmentation/Segmentation.h" +#include "IDCSegmentation.h" #include "TVector3.h" #include <cmath> @@ -45,7 +46,7 @@ inline bool operator < (const struct CID &c1, const struct CID &c2) { namespace dd4hep { namespace DDSegmentation { -class GridDriftChamber : public Segmentation { +class GridDriftChamber : public Belle2::IDCSegmentation,public Segmentation { public: /// default constructor using an arbitrary type GridDriftChamber(const std::string& aCellEncoding); @@ -61,15 +62,25 @@ public: virtual double distanceTrackWire(const CellID& cID, const TVector3& hit_start, const TVector3& hit_end) const; virtual double distanceTrackWire2(const CellID& cID, const TVector3& hit_pos) const; virtual void cellposition(const CellID& cID, TVector3& Wstart, TVector3& Wend) const; - virtual void cellposition2(int chamber, int layer, int cell, TVector3& Wstart, TVector3& Wend) const; + int maxWireID(int chamber,int layer) override; + virtual int GobalWireID(int layer,int cellID) const; + void cellposition2(int chamber, int layer, int cell, + TVector3& Wstart, TVector3& Wend) override ; TVector3 LineLineIntersect(TVector3& p1, TVector3& p2, TVector3& p3, TVector3& p4) const; virtual TVector3 distanceClosestApproach(const CellID& cID, const TVector3& hitPos, TVector3& PCA) const; virtual TVector3 Line_TrackWire(const CellID& cID, const TVector3& hit_start, const TVector3& hit_end) const; virtual TVector3 IntersectionTrackWire(const CellID& cID, const TVector3& hit_start, const TVector3& hit_end) const; virtual TVector3 wirePos_vs_z(const CellID& cID, const double& zpos) const; - virtual double Distance(const CellID& cID, const TVector3& pointIn, const TVector3& pointOut, TVector3& hitPosition, TVector3& PCA) const; + virtual TVector3 wirePos_vs_z2(const int layerID,const int wireID, + const double& zpos) const; + virtual double Distance(const CellID& cID, const TVector3& pointIn, + const TVector3& pointOut, TVector3& hitPosition, TVector3& PCA) const; virtual TVector3 returnPhi0(int chamber,int layer, double z) const; + virtual void cellpositionZ(int layerID, int cellID,double z,TVector3& cellPos) const; + int wireID_Z(int chamberID,int layerID,TVector3 posz) override; + int layerNum() override; + int wireAllNum() override; // double phi(const CellID& cID) const; inline double cell_Size() const { return m_cellSize; } diff --git a/Detector/DetSegmentation/src/GridDriftChamber.cpp b/Detector/DetSegmentation/src/GridDriftChamber.cpp index 5c59f200..e35e1105 100644 --- a/Detector/DetSegmentation/src/GridDriftChamber.cpp +++ b/Detector/DetSegmentation/src/GridDriftChamber.cpp @@ -1,4 +1,5 @@ #include "DetSegmentation/GridDriftChamber.h" +#include "IDCSegmentation.h" #include <map> namespace dd4hep { @@ -14,6 +15,9 @@ GridDriftChamber::GridDriftChamber(const std::string& cellEncoding) : Segmentati registerParameter("detector_length", "Length of the wire", m_detectorLength, 1., SegmentationParameter::LengthUnit); registerIdentifier("identifier_phi", "Cell ID identifier for phi", m_phiID, "cellID"); registerIdentifier("layerID", "layer id", layer_id, "layer"); + registerParameter("layer_width", "layer_width", m_layer_width, 0., SegmentationParameter::LengthUnit); + registerParameter("DC_rbegin", "DC_rbegin", m_DC_rbegin, 0., SegmentationParameter::LengthUnit); + registerParameter("DC_rend", "DC_rend", m_DC_rend, 0., SegmentationParameter::LengthUnit); } GridDriftChamber::GridDriftChamber(const BitFieldCoder* decoder) : Segmentation(decoder) { @@ -69,6 +73,30 @@ CellID GridDriftChamber::cellID(const Vector3D& /*localPosition*/, const Vector3 return cID; } +int GridDriftChamber::wireID_Z(int chamberID,int layerID,TVector3 poca_onwire) +{ + + updateParams(chamberID,layerID); + + TVector3 Phi0 = returnPhi0(chamberID,layerID,poca_onwire.Z()); + double phi0 = phiFromXY2(Phi0); + + double phi_hit = std::atan2(poca_onwire.Y(),poca_onwire.X()); + if(phi_hit<0) phi_hit += 2 * M_PI; + double offsetphi= m_offset; + double _lphi; + + _lphi = phi_hit - phi0 + _currentLayerphi/2.; + if(_lphi<0.){ + _lphi+=2*M_PI; + }else if(_lphi>2*M_PI){ + _lphi=fmod(_lphi,2*M_PI); + } + int cellID=floor(_lphi/_currentLayerphi); + + return cellID; +} + double GridDriftChamber::phi(const CellID& cID) const { CellID phiValue = _decoder->get(cID, m_phiID); return binToPosition(phiValue, _currentLayerphi, m_offset); @@ -88,6 +116,32 @@ void GridDriftChamber::cellposition(const CellID& cID, TVector3& Wstart, Wend = returnWirePosition(phi_end, 1); } +//myliu:FIXME +void GridDriftChamber::cellpositionZ(int layerID, int cellID,double z, + TVector3& cellPos) const{ + + int chamberID=0; + updateParams(chamberID,layerID); + + TVector3 Phi0 = returnPhi0(chamberID,layerID,z); + double phi0 = phiFromXY2(Phi0); + + double phi_hit = phi0+(cellID+0.5)*_currentLayerphi; + if(phi_hit<0.){ + phi_hit+=2*M_PI; + }else if(phi_hit>2*M_PI){ + phi_hit=fmod(phi_hit,2*M_PI); + } + + double x = _currentRadius*std::cos(phi_hit); + double y = _currentRadius*std::sin(phi_hit); + + cellPos.SetX(x); + cellPos.SetY(y); + cellPos.SetZ(z); + +} + TVector3 GridDriftChamber::returnPhi0(int chamber,int layer, double z) const { updateParams(chamber,layer); @@ -105,9 +159,21 @@ TVector3 GridDriftChamber::returnPhi0(int chamber,int layer, double z) const return TVector3(x_pos,y_pos,z); } +int GridDriftChamber::maxWireID(int chamber,int layer) +{ + updateParams(chamber,layer); + // std::cout << " maxWireID = " << (int) ((2*3.1415926/_currentLayerphi)+1) << std::endl; + return (int) ((2*3.1415926/_currentLayerphi)+1); +} + +int GridDriftChamber::GobalWireID(int layer,int cellID) const +{ + return layer*1000000+cellID; +} + void GridDriftChamber::cellposition2(int chamber,int layer, int cell, - TVector3& Wstart, TVector3& Wend) const { + TVector3& Wstart, TVector3& Wend){ updateParams(chamber,layer); double phi_start = binToPosition(cell, _currentLayerphi, m_offset); double phi_end = phi_start + returnAlpha(); @@ -251,6 +317,29 @@ TVector3 GridDriftChamber::wirePos_vs_z(const CellID& cID, const double& zpos) c return wireCoord; } +// Get the wire position for a z +TVector3 GridDriftChamber::wirePos_vs_z2(const int layerID, const int wireID, + const double& zpos) const { + + TVector3 Wstart = {0,0,0}; + TVector3 Wend = {0,0,0}; + + updateParams(0,layerID); + double phi_start = binToPosition(wireID, _currentLayerphi, m_offset); + double phi_end = phi_start + returnAlpha(); + + Wstart = returnWirePosition(phi_start, -1); + Wend = returnWirePosition(phi_end, 1); + + double t = (zpos - Wstart.Z())/(Wend.Z()-Wstart.Z()); + double x = Wstart.X()+t*(Wend.X()-Wstart.X()); + double y = Wstart.Y()+t*(Wend.Y()-Wstart.Y()); + + TVector3 wireCoord(x, y, zpos); + return wireCoord; +} + + TVector3 GridDriftChamber::IntersectionTrackWire(const CellID& cID, const TVector3& hit_start, const TVector3& hit_end) const { // Intersection between the particle track and the wire assuming that the track between hit_start and hit_end is linear @@ -329,5 +418,21 @@ double GridDriftChamber::Distance(const CellID& cID, const TVector3& pointIn, co return distance; } +int GridDriftChamber::layerNum() { + + int num = (m_DC_rend-m_DC_rbegin)/m_layer_width; + return num; + +} + +int GridDriftChamber::wireAllNum() { + + int nwire =0; + for(int i=0;i<layerNum();i++){ + nwire = nwire + maxWireID(0,i); + } + return nwire; +} + } } diff --git a/Digitisers/DCHDigi/CMakeLists.txt b/Digitisers/DCHDigi/CMakeLists.txt index 8246da79..e494f226 100644 --- a/Digitisers/DCHDigi/CMakeLists.txt +++ b/Digitisers/DCHDigi/CMakeLists.txt @@ -3,13 +3,13 @@ gaudi_add_module(DCHDigi SOURCES src/DCHDigiAlg.cpp LINK DetInterface DetSegmentation + DataHelperLib k4FWCore::k4FWCore Gaudi::GaudiKernel Gaudi::GaudiAlgLib ${CLHEP_LIBRARIES} ${DD4hep_COMPONENT_LIBRARIES} ${ROOT_LIBRARIES} - DetSegmentation EDM4HEP::edm4hep EDM4HEP::edm4hepDict ) install(TARGETS DCHDigi diff --git a/Digitisers/DCHDigi/src/DCHDigiAlg.cpp b/Digitisers/DCHDigi/src/DCHDigiAlg.cpp index 21a84041..6e44d37b 100644 --- a/Digitisers/DCHDigi/src/DCHDigiAlg.cpp +++ b/Digitisers/DCHDigi/src/DCHDigiAlg.cpp @@ -21,6 +21,9 @@ #include <algorithm> #include "time.h" +#include <unordered_map> + +#include "DataHelper/HelixClass.h" DECLARE_COMPONENT( DCHDigiAlg ) @@ -34,6 +37,7 @@ DCHDigiAlg::DCHDigiAlg(const std::string& name, ISvcLocator* svcLoc) // Output collections declareProperty("DigiDCHitCollection", w_DigiDCHCol, "Handle of Digi DCHit collection"); + declareProperty("SignalDigiDCHitCollection", w_SignalDigiDCHCol, "Handle of Signal Digi DCHit collection"); declareProperty("AssociationCollection", w_AssociationCol, "Handle of Association collection"); @@ -89,8 +93,14 @@ StatusCode DCHDigiAlg::initialize() m_tuple->addItem( "poca_x" , m_n_digi, m_poca_x ).ignore(); m_tuple->addItem( "poca_y" , m_n_digi, m_poca_y ).ignore(); m_tuple->addItem( "hit_dE" , m_n_digi,m_hit_dE ).ignore(); - m_tuple->addItem( "hit_dE_dx", m_n_digi,m_hit_dE_dx ).ignore(); m_tuple->addItem( "truthlength", m_n_digi,m_truthlength).ignore(); + m_tuple->addItem( "N_noise", m_n_noise, 0, 1000000 ).ignore(); + m_tuple->addItem( "layer_noise", m_n_noise,m_noise_layer).ignore(); + m_tuple->addItem( "cell_noise", m_n_noise,m_noise_cell).ignore(); + m_tuple->addItem( "NoiseT", m_n_noise,m_noise_time).ignore(); + m_tuple->addItem( "N_noiseCover", m_n_noiseCover, 0, 1000000 ).ignore(); + m_tuple->addItem( "layer_noiseCover", m_n_noiseCover,m_noiseCover_layer).ignore(); + m_tuple->addItem( "cell_noiseCover", m_n_noiseCover,m_noiseCover_cell).ignore(); } else { // did not manage to book the N tuple.... info() << " Cannot book N-tuple:" << long( m_tuple ) << endmsg; } @@ -108,6 +118,7 @@ StatusCode DCHDigiAlg::execute() info() << "Processing " << _nEvt << " events " << endmsg; if(m_WriteAna) m_evt = _nEvt; edm4hep::TrackerHitCollection* Vec = w_DigiDCHCol.createAndPut(); + edm4hep::TrackerHitCollection* SignalVec = w_SignalDigiDCHCol.createAndPut(); edm4hep::MCRecoTrackerAssociationCollection* AssoVec = w_AssociationCol.createAndPut(); const edm4hep::SimTrackerHitCollection* SimHitCol = r_SimDCHCol.get(); if (SimHitCol->size() == 0) { @@ -129,7 +140,7 @@ StatusCode DCHDigiAlg::execute() if(SimHit.getEDep() <= m_edep_threshold) continue; //Wire efficiency - double hitProb = fRandom.Uniform(1.); + float hitProb = fRandom.Uniform(1.); if(hitProb > m_wireEff) continue; if ( id_hits_map.find(id) != id_hits_map.end()) id_hits_map[id].push_back(SimHit); @@ -144,18 +155,25 @@ StatusCode DCHDigiAlg::execute() m_n_sim = 0; m_n_digi = 0 ; } + + std::vector<TVector2> HitPosition2D; + bool ismixNoise[55] = {0}; + std::cout << " id_hits_map size = " << id_hits_map.size() << std::endl; + for(auto iter = id_hits_map.begin(); iter != id_hits_map.end(); iter++) { unsigned long long wcellid = iter->first; auto trkHit = Vec->create(); + auto SignaltrkHit = SignalVec->create(); trkHit.setCellID(wcellid); - double tot_edep = 0 ; - double tot_length = 0 ; - double pos_x = 0 ; - double pos_y = 0 ; - double pos_z = 0 ; - double momx,momy = 0; - int simhit_size = iter->second.size(); + SignaltrkHit.setCellID(wcellid); + float tot_edep = 0 ; + float tot_length = 0 ; + float pos_x = 0 ; + float pos_y = 0 ; + float pos_z = 0 ; + float momx,momy,momz = 0; + const int simhit_size = iter->second.size(); for(unsigned int i=0; i< simhit_size; i++) { tot_edep += iter->second.at(i).getEDep();//GeV @@ -173,16 +191,18 @@ StatusCode DCHDigiAlg::execute() float min_distance = 999 ; float sim_distance = 999 ; float tmp_distance =0; - float SMdca = 0; - float distance =0; TVector3 hitPosition; TVector3 PCA; for(unsigned int i=0; i< simhit_size; i++) { float sim_hit_mom = sqrt( iter->second.at(i).getMomentum()[0]*iter->second.at(i).getMomentum()[0] + iter->second.at(i).getMomentum()[1]*iter->second.at(i).getMomentum()[1] + iter->second.at(i).getMomentum()[2]*iter->second.at(i).getMomentum()[2] );//GeV - float sim_hit_pt = sqrt( iter->second.at(i).getMomentum()[0]*iter->second.at(i).getMomentum()[0] + iter->second.at(i).getMomentum()[1]*iter->second.at(i).getMomentum()[1] );//GeV + if(sim_hit_mom<1e-4) continue; + TVector3 pos(iter->second.at(i).getPosition()[0]*dd4hep_mm, iter->second.at(i).getPosition()[1]*dd4hep_mm, iter->second.at(i).getPosition()[2]*dd4hep_mm); + float simpos[3] = {iter->second.at(i).getPosition()[0],iter->second.at(i).getPosition()[1],iter->second.at(i).getPosition()[2]}; + float simmom[3] = {iter->second.at(i).getMomentum()[0],iter->second.at(i).getMomentum()[1],iter->second.at(i).getMomentum()[2]}; + TVector3 sim_mon(iter->second.at(i).getMomentum()[0],iter->second.at(i).getMomentum()[1],iter->second.at(i).getMomentum()[2]); float Steplength = iter->second.at(i).getPathLength(); TVector3 pos_start = pos - 0.5 * Steplength * sim_mon.Unit(); @@ -191,7 +211,6 @@ StatusCode DCHDigiAlg::execute() tmp_distance = tmp_distance/dd4hep_mm; //mm sim_distance = tmp_distance; - if(tmp_distance < min_distance){ min_distance = tmp_distance; pos_x = hitPosition.x(); //pos.x(); @@ -205,7 +224,6 @@ StatusCode DCHDigiAlg::execute() asso.setRec(trkHit); asso.setSim(iter->second.at(i)); asso.setWeight(iter->second.at(i).getEDep()/tot_edep); - //std::cout<<" asso setRec setSim "<<trkHit<<" "<<iter->second.at(i)<<std::endl; if(m_WriteAna && (nullptr!=m_tuple)) { m_simhit_x[m_n_sim] = pos.x(); @@ -219,12 +237,26 @@ StatusCode DCHDigiAlg::execute() } } + //Smear drift distance + if(m_smear){ + float dd = min_distance + gRandom->Gaus(0,fabs(m_res_x)); + if(dd>=0) min_distance = dd; + else min_distance = -dd; + } + trkHit.setTime(min_distance*1e3/m_velocity);//m_velocity is um/ns, drift time in ns + trkHit.setQuality(1);//1:singal 0:noise of overlap singal -1:noise trkHit.setEDep(tot_edep);// GeV - //trkHit.setEdx (tot_edep/tot_length); // GeV/mm trkHit.setPosition (edm4hep::Vector3d(pos_x, pos_y, pos_z));//position of closest sim hit trkHit.setCovMatrix(std::array<float, 6>{m_res_x, 0, m_res_y, 0, 0, m_res_z});//cov(x,x) , cov(y,x) , cov(y,y) , cov(z,x) , cov(z,y) , cov(z,z) in mm + //add noise every layer + if(m_mixNoise && !ismixNoise[layer]) mixNoise(layer,cellID,Vec,&trkHit,ismixNoise); + + SignaltrkHit.setEDep(tot_edep);// GeV + SignaltrkHit.setPosition (edm4hep::Vector3d(pos_x, pos_y, pos_z));//position of closest sim hit + SignaltrkHit.setCovMatrix(std::array<float, 6>{m_res_x, 0, m_res_y, 0, 0, m_res_z});//cov(x,x) , cov(y,x) , cov(y,y) , cov(z,x) , cov(z,y) , cov(z,z) in mm + if(m_WriteAna && (nullptr!=m_tuple)) { m_chamber [m_n_digi] = chamber; m_layer [m_n_digi] = layer ; @@ -242,7 +274,6 @@ StatusCode DCHDigiAlg::execute() m_poca_x [m_n_digi] = PCA.x(); m_poca_y [m_n_digi] = PCA.y(); m_hit_dE [m_n_digi] = trkHit.getEDep(); - //m_hit_dE_dx[m_n_digi] = trkHit.getEdx() ; m_truthlength[m_n_digi] = tot_length ; m_n_digi ++ ; } @@ -271,3 +302,72 @@ StatusCode DCHDigiAlg::finalize() info() << "Processed " << _nEvt << " events " << endmsg; return GaudiAlgorithm::finalize(); } + +void DCHDigiAlg::mixNoise(int layerID ,int wireID, + edm4hep::TrackerHitCollection* Vec, + edm4hep::MutableTrackerHit* trackerHitLayer, + bool ismixNoise[55]){ + + int maxCellID = m_segmentation->maxWireID(0,layerID); + int nNoiseHits = (int) maxCellID*m_noiseEff; + + //loop over noise hits in this layer + for(int ic=0;ic<nNoiseHits;ic++){ + int cellid = (int) maxCellID*fRandom.Uniform(1.); + float time = m_timeWindow*fRandom.Uniform(1.); + TVector3 Wstart,Wend; + m_segmentation->cellposition2(0,layerID,cellid,Wstart,Wend); + //found noise overlap with signal + if(!(cellid != wireID)) + { + if(time<trackerHitLayer->getTime()){ + //1. overlap with signal and time > signal time + if(!m_mixNoiseAndSkipOverlap){ + //set time + trackerHitLayer->setTime(time); + trackerHitLayer->setQuality(0); + + m_noiseCover_layer[m_n_noiseCover] = layerID; + m_noiseCover_cell[m_n_noiseCover] = cellid; + + m_n_noiseCover++; + + m_noise_layer[m_n_noise] = layerID; + m_noise_cell[m_n_noise] = cellid; + m_noise_time[m_n_noise] = time; + + m_n_noise++; + } // end fo m_mixNoiseAndSkipOverlap + }else{ + //2. overlap with signal and time > signal time + // TODO adc sum with signal + continue; + } + }else{ // not found noise overlap with signal + //3. create a noise hit + //create another trackerHit + if(!m_mixNoiseAndSkipNoOverlap){ + auto trkNoiseHit = Vec->create(); + + dd4hep::rec::CellID ncellid; + m_decoder->set(ncellid,"chamber",0); + m_decoder->set(ncellid,"layer",layerID); + m_decoder->set(ncellid,"cellID",cellid); + + trkNoiseHit.setCellID(ncellid); + trkNoiseHit.setTime(time); + trkNoiseHit.setQuality(-1); + + m_noise_layer[m_n_noise] = layerID; + m_noise_cell[m_n_noise] = cellid; + m_noise_time[m_n_noise] = time; + + m_n_noise++; + + }// end of m_mixNoiseAndSkipNoOverlap + } // end of if + + + }// loop over noise hit + ismixNoise[layerID] = true; +}//end of mixNoise diff --git a/Digitisers/DCHDigi/src/DCHDigiAlg.h b/Digitisers/DCHDigi/src/DCHDigiAlg.h index 946363c1..a9bf59bd 100644 --- a/Digitisers/DCHDigi/src/DCHDigiAlg.h +++ b/Digitisers/DCHDigi/src/DCHDigiAlg.h @@ -18,6 +18,11 @@ #include "TVector3.h" #include "TRandom3.h" +namespace dd4hep { + namespace rec{ + class CellIDPositionConverter; + } +} class DCHDigiAlg : public GaudiAlgorithm { @@ -44,6 +49,13 @@ protected: typedef std::vector<float> FloatVec; int _nEvt ; + void addNoiseHit(edm4hep::TrackerHitCollection* Vec,double time, int chamber, + int layer, int cellID,unsigned long long wcellid); + void mixNoise(int layerID,int wireID, + edm4hep::TrackerHitCollection* Vec, + edm4hep::MutableTrackerHit* trackerHitLayer, + bool ismixNoise[55]); + TRandom3 fRandom; NTuple::Tuple* m_tuple = nullptr ; @@ -80,14 +92,23 @@ protected: NTuple::Array<float> m_hit_dE_dx ; NTuple::Array<double> m_truthlength ; + //Noise hit in cellID + NTuple::Item<long> m_n_noise; + NTuple::Array<int> m_noise_layer; + NTuple::Array<int> m_noise_cell; + NTuple::Array<float> m_noise_time; + NTuple::Item<long> m_n_noiseCover; + NTuple::Array<int> m_noiseCover_layer; + NTuple::Array<int> m_noiseCover_cell; + clock_t m_start,m_end; dd4hep::rec::CellIDPositionConverter* m_cellIDConverter; dd4hep::DDSegmentation::GridDriftChamber* m_segmentation; dd4hep::DDSegmentation::BitFieldCoder* m_decoder; - + Gaudi::Property<std::string> m_readout_name{ this, "readout", "DriftChamberHitsCollection"};//readout for getting segmentation - + Gaudi::Property<float> m_res_x { this, "res_x", 0.11};//mm Gaudi::Property<float> m_res_y { this, "res_y", 0.11};//mm Gaudi::Property<float> m_res_z { this, "res_z", 1 };//mm @@ -99,11 +120,24 @@ protected: Gaudi::Property<bool> m_debug{ this, "debug", false}; Gaudi::Property<double> m_wireEff{ this, "wireEff", 1.0}; + //Smear drift distance + Gaudi::Property<bool> m_smear{ this, "smear", false}; + + //Mixed Noise + Gaudi::Property<bool> m_mixNoise{ this, "mixNoise", false}; + Gaudi::Property<bool> m_mixNoiseAndSkipOverlap{ this, "mixNoiseAndSkipOverlapthis", false}; + Gaudi::Property<bool> m_mixNoiseAndSkipNoOverlap{ this, "mixNoiseAndSkipNoOverlapthis", false}; + Gaudi::Property<double> m_noiseEff{ this, "noiseEff", 0.0}; + Gaudi::Property<double> m_timeWindow{ this, "timeWindow", 2000.0}; //ns + Gaudi::Property<int> m_layerNum{ this, "layerNum", 55}; //ns + // Input collections DataHandle<edm4hep::SimTrackerHitCollection> r_SimDCHCol{"DriftChamberHitsCollection", Gaudi::DataHandle::Reader, this}; // Output collections DataHandle<edm4hep::TrackerHitCollection> w_DigiDCHCol{"DigiDCHitCollection", Gaudi::DataHandle::Writer, this}; DataHandle<edm4hep::MCRecoTrackerAssociationCollection> w_AssociationCol{"DCHitAssociationCollection", Gaudi::DataHandle::Writer, this}; + // Output signal digiHits + DataHandle<edm4hep::TrackerHitCollection> w_SignalDigiDCHCol{"SignalDigiDCHitCollection", Gaudi::DataHandle::Writer, this}; }; #endif diff --git a/Reconstruction/RecGenfitAlg/CMakeLists.txt b/Reconstruction/RecGenfitAlg/CMakeLists.txt index f7c5b696..389cd34b 100644 --- a/Reconstruction/RecGenfitAlg/CMakeLists.txt +++ b/Reconstruction/RecGenfitAlg/CMakeLists.txt @@ -11,6 +11,7 @@ gaudi_add_module(RecGenfitAlg src/LSFitting.cpp src/WireMeasurementDC.cpp src/PlanarMeasurementSDT.cpp + src/DCTrackFinding.cpp LINK GearSvc Gaudi::GaudiAlgLib Gaudi::GaudiKernel @@ -22,8 +23,11 @@ gaudi_add_module(RecGenfitAlg DataHelperLib EDM4HEP::edm4hep EDM4HEP::edm4hepDict - GenFit::genfit2 k4FWCore::k4FWCore + GenFit::genfit2 + BelleIICKF::CKFDataobjects + BelleIICKF::CKFFramework + BelleIICKF::CKFTracking ) target_include_directories(RecGenfitAlg PUBLIC @@ -32,6 +36,8 @@ target_include_directories(RecGenfitAlg PUBLIC $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}> ) +set_target_properties(RecGenfitAlg PROPERTIES POSITION_INDEPENDENT_CODE ON) + install(TARGETS RecGenfitAlg EXPORT CEPCSWTargets RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT bin diff --git a/Reconstruction/RecGenfitAlg/src/DCTrackFinding.cpp b/Reconstruction/RecGenfitAlg/src/DCTrackFinding.cpp new file mode 100644 index 00000000..fd28e135 --- /dev/null +++ b/Reconstruction/RecGenfitAlg/src/DCTrackFinding.cpp @@ -0,0 +1,668 @@ +#include<stdlib.h> +#include "DCTrackFinding.h" + +//belle_CKF +#include "ckf/CDCCKFPath.h" +#include "eventdata/CDCWireHit.h" +#include "ckf/CKFToCDCFindlet.h" +#include "topology/CDCWireTopology.h" +#include "CDCWireGeo.h" + +//genfit +#include "AbsKalmanFitter.h" +#include "KalmanFitterRefTrack.h" +#include "EventDisplay.h" +#include "ReferenceStateOnPlane.h" +#include "AbsMeasurement.h" +#include "AbsTrackRep.h" +#include "FitStatus.h" +#include "KalmanFitterInfo.h" +#include "KalmanFittedStateOnPlane.h" +#include "RKTrackRep.h" +//#include "PlanarMeasurement.h" +#include "PlanarMeasurementSDT.h" +#include "SpacepointMeasurement.h" +#include "StateOnPlane.h" +#include "RectangularFinitePlane.h" +#include "Track.h" +#include "TrackPoint.h" +#include "MeasuredStateOnPlane.h" +#include "WireMeasurementNew.h" +#include "AbsMeasurement.h" +#include "TrackPoint.h" + +//cepcsw +#include "DetInterface/IGeomSvc.h" +#include "DataHelper/HelixClass.h" +#include "DataHelper/TrackHelper.h" +#include "DataHelper/TrackerHitHelper.h" +#include "DetSegmentation/GridDriftChamber.h" +#include "UTIL/ILDConf.h" + +//externals +#include "edm4hep/EventHeaderCollection.h" +#include "edm4hep/MCParticle.h" +#include "edm4hep/MCParticleCollection.h" +#include "edm4hep/SimTrackerHitCollection.h" +#include "edm4hep/TrackerHitCollection.h" +#include "edm4hep/TrackCollection.h" +#include "edm4hep/MCRecoTrackerAssociationCollection.h" +#include "edm4hep/ReconstructedParticle.h" +#include "edm4hep/ReconstructedParticleCollection.h" +#include "edm4hep/Track.h" +#include "edm4hep/TrackCollection.h" +#include "DD4hep/DD4hepUnits.h" +#include "DD4hep/Detector.h" +#include "UTIL/BitField64.h" +#include "DDSegmentation/Segmentation.h" +#include "TRandom.h" +#include "TLorentzVector.h" + +//ROOT +#include "TLorentzVector.h" +#include "TMatrixDSym.h" +#include "TRandom.h" +#include "TVector3.h" + +//stl +#include <chrono> +#include "time.h" +#include <stdlib.h> +#include <thread> +#include <iostream> +#include <fstream> + +#include <TTimeStamp.h> + +#include <ctime> +#include <cstdlib> + +#include <array> + +#include "map" +#include "DataHelper/GeomeryHelper.h" + +DECLARE_COMPONENT( DCTrackFinding ) + + ///////////////////////////////////////////////////////////////////// + DCTrackFinding::DCTrackFinding(const std::string& name, + ISvcLocator* pSvcLocator):GaudiAlgorithm(name, pSvcLocator), + m_dd4hepDetector(nullptr),m_gridDriftChamber(nullptr),m_decoder(nullptr) +{ + + // Rec Si Track + declareProperty("SubsetTracks", m_siSubsetTrackCol, + "Handle of silicon subset track collection"); + //DC DigiHit SimHit DCAsso + declareProperty("DigiDCHitCollection", m_DCDigiCol, + "Handle of DC digi(TrakerHit) collection"); + declareProperty("SignalDigiDCHitCollection", m_SignalDCDigiCol, + "Handle of Signal DC digi(TrakerHit) collection"); + declareProperty("DCHitAssociationCollection", m_DCHitAssociationCol, + "Handle of DCsimTrackerHit and DCTrackerHit association collection"); + declareProperty("SimTrackerHitCollection",m_simDCHitCol, + "Handle of the DCsimTrackerHit collection"); + //SIT SimTrackHit DCHitAssociation + declareProperty("SITCollection",m_simSITHitCol, + "Handle of the SITsimTrackerHit collection"); + declareProperty("SITTrackerHitAssociation",m_SITHitAssociationCol, + "Handle of SITsimTrackerHit and SITTrackerHit association collection"); + //VXD SimTrackHit DCHitAssociation + declareProperty("VXDCollection",m_simVXDHitCol, + "Handle of the VXDsimTrackerHit collection"); + declareProperty("VXDTrackerHitAssociation", m_VXDHitAssociationCol, + "Handle of VXD association collection"); + //FTD SimTrackHit DCHitAssociation + declareProperty("FTDCollection",m_simFTDHitCol, + "Handle of the FTDsimTrackerHit collection"); + declareProperty("FTDTrackerHitAssociation",m_FTDHitAssociationCol, + "Handle of FTDsimTrackerHit and FTDTrackerHit association collection"); + //SET SimTrackHit DCHitAssociation + declareProperty("SETCollection",m_simSETHitCol, + "Handle of the SETsimTrackerHit collection"); + declareProperty("SETTrackerHitAssociation",m_SETHitAssociationCol, + "Handle of SETsimTrackerHit and SETTrackerHit association collection"); + + // Output collections + declareProperty("DCTrackFindingHitCollection",w_DCTrackFindingCol, + "Handle of TrackFinding DCHit collection"); + + //SDTTrackCollection + declareProperty("SDTTrackCollection", m_SDTTrackCol, + "Handle of input silicon track collection"); + //SDTTrackFindCollection + declareProperty("SDTTrackFindCollection", m_SDTTrackFindCol, + "Handle of input silicon track finding collection"); +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +StatusCode DCTrackFinding::initialize() +{ + MsgStream log(msgSvc(), name()); + info()<<" DCTrackFinding initialize()"<<endmsg; + + m_eventNo=0; + + ///Get GeomSvc + m_geomSvc=Gaudi::svcLocator()->service("GeomSvc"); + if (nullptr==m_geomSvc) { + std::cout<<"Failed to find GeomSvc"<<std::endl; + return StatusCode::FAILURE; + } + ///Get Detector + m_dd4hepDetector=m_geomSvc->lcdd(); + + ///Get Field + m_dd4hepField=m_geomSvc->lcdd()->field(); + + ///Get Readout + dd4hep::Readout readout=m_dd4hepDetector->readout(m_readout_name); + ///Get Segmentation + m_gridDriftChamber=dynamic_cast<dd4hep::DDSegmentation::GridDriftChamber*> + (readout.segmentation().segmentation()); + if(nullptr==m_gridDriftChamber){ + error() << "Failed to get the GridDriftChamber" << endmsg; + return StatusCode::FAILURE; + } + + //set BelleII segmentation + Belle2::TrackFindingCDC::CDCWireTopology::getInstance(m_gridDriftChamber); + Belle2::CDCWireGeo::getInstance(m_gridDriftChamber); + + ///Get Decoder + m_decoder = m_geomSvc->getDecoder(m_readout_name); + if (nullptr==m_decoder) { + error() << "Failed to get the decoder" << endmsg; + return StatusCode::FAILURE; + } + + /// New a genfit fitter + //m_genfitFitter = new genfit::KalmanFitterRefTrack(); + m_genfitFitter=new GenfitFitter(m_fitterType.toString().c_str()); + m_genfitField=new GenfitField(m_dd4hepField); + m_genfitFitter->setField(m_genfitField); + m_genfitFitter->setGeoMaterial(m_geomSvc->lcdd(),m_extMinDistCut, + m_skipWireMaterial); + m_genfitFitter->setEnergyLossBrems(m_correctBremsstrahlung); + m_genfitFitter->setNoiseBrems(m_correctBremsstrahlung); + if(m_noMaterialEffects) m_genfitFitter->setNoEffects(true); + if(m_fitterType=="DAF"||m_fitterType=="DafRef"){ + m_genfitFitter->setMaxIterationsBetas(m_bStart,m_bFinal,m_maxIteration); + } else { + m_genfitFitter->setMaxIterations(m_maxIteration); + } + //print genfit parameters + if(""!=m_genfitHistRootName) m_genfitFitter->initHist(m_genfitHistRootName); + + ///book tuple + NTuplePtr nt(ntupleSvc(), "DCTrackFinding/dcTrackFinding"); + if(nt){ + m_tuple=nt; + }else{ + m_tuple=ntupleSvc()->book("DCTrackFinding/dcTrackFinding", + CLID_ColumnWiseTuple,"DCTrackFinding"); + if(m_tuple){ + StatusCode sc; + sc=m_tuple->addItem("N_SiTrack",m_n_N_SiTrack,0,100); + sc=m_tuple->addItem("N_DCTrackFinding",m_n_N_SiTrack,m_n_DCTrackFinding); + sc=m_tuple->addItem("CPUTime",m_n_N_SiTrack,m_CPUTime); + sc=m_tuple->addItem("layer",m_n_N_SiTrack,m_layer,100); + sc=m_tuple->addItem("cellID",m_n_N_SiTrack,m_cellID,100); + sc=m_tuple->addItem("NoiseFlag",m_n_N_SiTrack,m_NoiseFlag,100); + sc=m_tuple->addItem("isNoOverlap",m_n_N_SiTrack,m_isNoOverlap); + sc=m_tuple->addItem("N_digiOverlap",m_n_N_SiTrack,m_digiOverlap); + sc=m_tuple->addItem("hit_wx",m_n_N_SiTrack,m_hit_wx,100); + sc=m_tuple->addItem("hit_wy",m_n_N_SiTrack,m_hit_wy,100); + sc=m_tuple->addItem("hit_wz",m_n_N_SiTrack,m_hit_wz,100); + sc=m_tuple->addItem("hit_ex",m_n_N_SiTrack,m_hit_ex,100); + sc=m_tuple->addItem("hit_ey",m_n_N_SiTrack,m_hit_ey,100); + sc=m_tuple->addItem("hit_ez",m_n_N_SiTrack,m_hit_ez,100); + sc=m_tuple->addItem("recoPosX",m_n_N_SiTrack,m_recoPosX,100); + sc=m_tuple->addItem("recoPosY",m_n_N_SiTrack,m_recoPosY,100); + sc=m_tuple->addItem("recoPosZ",m_n_N_SiTrack,m_recoPosZ,100); + sc=m_tuple->addItem("cellPosX",m_n_N_SiTrack,m_cellPosX,100); + sc=m_tuple->addItem("cellPosY",m_n_N_SiTrack,m_cellPosY,100); + sc=m_tuple->addItem("cellPosZ",m_n_N_SiTrack,m_cellPosZ,100); + sc=m_tuple->addItem("radius",m_n_N_SiTrack,m_radius,100); + sc=m_tuple->addItem("arcLength",m_n_N_SiTrack,m_arcLength,100); + sc=m_tuple->addItem("hitDistance",m_n_N_SiTrack,m_hitDistance,100); + sc=m_tuple->addItem("doca",m_n_N_SiTrack,m_doca,100); + sc=m_tuple->addItem("ReconstructedZ",m_n_N_SiTrack,m_ReconstructedZ,100); + sc=m_tuple->addItem("trackParD0",m_n_N_SiTrack,m_trackParD0,100); + sc=m_tuple->addItem("trackParPhi0",m_n_N_SiTrack,m_trackParPhi0,100); + sc=m_tuple->addItem("trackParOmega",m_n_N_SiTrack,m_trackParOmega,100); + sc=m_tuple->addItem("trackParZ0",m_n_N_SiTrack,m_trackParZ0,100); + sc=m_tuple->addItem("trackParTanLambda",m_n_N_SiTrack,m_trackParTanLambda,100); + sc=m_tuple->addItem("CircleCenterX",m_n_N_SiTrack,m_centerX,100); + sc=m_tuple->addItem("CircleCenterY",m_n_N_SiTrack,m_centerY,100); + sc=m_tuple->addItem("N_Digi",m_n_Digi,0,100000); + sc=m_tuple->addItem("N_SignalDigi",m_n_SignalDigi,0,100000); + sc=m_tuple->addItem("N_match",m_n_N_SiTrack,m_n_match); + sc=m_tuple->addItem("match_hit_wx",m_n_N_SiTrack,m_match_hit_wx,100); + sc=m_tuple->addItem("match_hit_wy",m_n_N_SiTrack,m_match_hit_wy,200); + sc=m_tuple->addItem("match_hit_wz",m_n_N_SiTrack,m_match_hit_wz,200); + sc=m_tuple->addItem("match_hit_ex",m_n_N_SiTrack,m_match_hit_ex,200); + sc=m_tuple->addItem("match_hit_ey",m_n_N_SiTrack,m_match_hit_ey,200); + sc=m_tuple->addItem("match_hit_ez",m_n_N_SiTrack,m_match_hit_ez,200); + }else{ + warning()<<"Tuple DCTrackFinding/dcTrackFinding not booked"<<endmsg; + } + } //end of book tuple + + return StatusCode::SUCCESS; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +StatusCode DCTrackFinding::execute() +{ + info()<<"DCTrackFinding in execute()"<<endmsg; + + StatusCode sc=StatusCode::SUCCESS; + + edm4hep::TrackerHitCollection* TrF = w_DCTrackFindingCol.createAndPut(); + + edm4hep::TrackCollection* sdtTkFCol= m_SDTTrackFindCol.createAndPut(); + + const edm4hep::TrackCollection* siTrackCol=nullptr; + siTrackCol=m_siSubsetTrackCol.get(); + if(nullptr==siTrackCol){ + debug()<<"SDTTrackCollection is empty"<<endmsg; + return StatusCode::SUCCESS; + }else{ + debug()<<"SiSubsetTrackCol size "<<siTrackCol->size()<<endmsg; + if(0==siTrackCol->size()){ + return StatusCode::SUCCESS; + } + } + + //DC + auto assoDCHitsCol=m_DCHitAssociationCol.get(); + const edm4hep::TrackerHitCollection* dCDigiCol=nullptr; + dCDigiCol=m_DCDigiCol.get(); + + // Signal DC hit + const edm4hep::TrackerHitCollection* SignaldCDigiCol=m_SignalDCDigiCol.get(); + int truthNumdc = SignaldCDigiCol->size(); + m_n_SignalDigi = truthNumdc; + //VXDAssoHits + const edm4hep::MCRecoTrackerAssociationCollection* VXDAssoVec = m_VXDHitAssociationCol.get(); + //SIT + auto assoSITHitsCol=m_SITHitAssociationCol.get(); + const edm4hep::SimTrackerHitCollection* simSITHitCol=nullptr; + simSITHitCol=m_simSITHitCol.get(); + + //FTD + auto assoFTDHitsCol=m_FTDHitAssociationCol.get(); + const edm4hep::SimTrackerHitCollection* simFTDHitCol=nullptr; + simFTDHitCol=m_simFTDHitCol.get(); + + //SDTtrackCollection + const edm4hep::TrackCollection* sdtTrackCol=nullptr; + if(m_SDTTrackCol.exist())sdtTrackCol=m_SDTTrackCol.get(); + if(nullptr==sdtTrackCol || sdtTrackCol->size()<=0) { + std::cout<<"TrackCollection not found or sdtTrackCol size=0"<<std::endl; + return StatusCode::SUCCESS; + } + + std::vector<std::vector<int>> truthDChit; + for(auto trudchit: *SignaldCDigiCol){ + unsigned short iLayer=0; + unsigned short iWire=0; + + unsigned long long dccellID=trudchit.getCellID(); + iLayer = m_decoder->get(dccellID,"layer"); + iWire = m_decoder->get(dccellID,"cellID"); + + std::vector<int> mid; + mid.push_back(iLayer); + mid.push_back(iWire); + + truthDChit.push_back(mid); + + mid.clear(); + + } + + int siNum = 0; + for(auto sdtTk:*sdtTrackCol){ + + edm4hep::MutableTrack sdtTFk=sdtTkFCol->create(); + + edm4hep::TrackState trackStat=sdtTk.getTrackStates(0); + edm4hep::TrackerHit trackHit = sdtTk.getTrackerHits(0); + edm4hep::MCParticle mcParticle; + edm4hep::SimTrackerHit simTrackerHit; + CEPC::getAssoMCParticle(VXDAssoVec,trackHit,mcParticle,simTrackerHit); + TVector3 seedPos,seedMom; + TMatrixDSym seedCov; + double charge_double; + TVectorD seedState(6); + TMatrixDSym covMInit_6(6); + GenfitTrack::getTrackFromEDMTrackFinding(sdtTk,charge_double,seedState,covMInit_6, + seedPos,seedMom); + + int charge = (int) charge_double; + int pdg = mcParticle.getPDG(); + + Belle2::RecoTrack *newRecoTrack = new Belle2::RecoTrack(seedPos,seedMom,charge); + Belle2::RecoTrackGenfitAccess *recoTrackGenfitAccess = new Belle2::RecoTrackGenfitAccess(); + genfit::AbsTrackRep* RecoRep = recoTrackGenfitAccess->createOrReturnRKTrackRep(*newRecoTrack,pdg); + + genfit::AbsTrackRep* rep; + rep = new genfit::RKTrackRep(pdg); + genfit::MeasuredStateOnPlane state(rep); + rep->setPosMom(state, seedPos, seedMom); + + const TVector3 linePoint(0,0,0); + const TVector3 lineDirection(0,0,1); + const double R = 80.5;//cm + + try { + double L = rep->extrapolateToCylinder(state, R, linePoint, lineDirection, false); + } + catch (genfit::Exception& e) { + std::cerr << e.what(); + } + + std::vector<Belle2::TrackFindingCDC::CDCWireHit> bestElement2; + + if(m_tuple) m_n_Digi = dCDigiCol->size(); + + // DC digi hit find MCParticle + int ndigi =0; + int detID = 7; + std::map < std::vector<int> , unsigned long long > findCellID; + edm4hep::TrackerHit digihits[66][1000]; + for(auto dcDigi: *dCDigiCol){ + + if(0==dcDigi.getQuality()) m_digiOverlap[siNum]++; + TVectorD hitpos(3); + TMatrixDSym hitCov(3); + + hitpos[0]=dcDigi.getPosition()[0]; + hitpos[1]=dcDigi.getPosition()[1]; + hitpos[2]=dcDigi.getPosition()[2]; + + hitCov(0,0)=dcDigi.getCovMatrix().at(0); + hitCov(1,1)=dcDigi.getCovMatrix().at(2); + hitCov(2,2)=dcDigi.getCovMatrix().at(5); + + unsigned short tdcCount = dcDigi.getTime(); + unsigned short adcCount = 0; + unsigned short iSuperLayer=0; + + unsigned short iLayer=0; + unsigned short iWire=0; + + genfit::TrackPoint* trackPoint =nullptr; + bool insertPoint =false; + unsigned long long dccellID=dcDigi.getCellID(); + iLayer = m_decoder->get(dccellID,"layer"); + iWire = m_decoder->get(dccellID,"cellID"); + + digihits[iLayer][iWire] = dcDigi; + + std::vector<int> id; + id.push_back(iLayer); + id.push_back(iWire); + + findCellID.insert(std::pair< std::vector<int> , int>(id,dccellID)); + + id.clear(); + + double driftDistance = 1e-4*m_driftVelocity*dcDigi.getTime(); //cm + + TVector3 Wstart(0,0,0); + TVector3 Wend (0,0,0); + m_gridDriftChamber->cellposition(dcDigi.getCellID(), Wstart, Wend); + + if(1==dcDigi.getQuality()){ + double hitphi = atan(hitpos[1]/hitpos[0]); + double wirephi = atan(Wstart.Y()/Wstart.X()); + } + + ndigi++; + + Belle2::CDCHit * cdchit = new Belle2::CDCHit(tdcCount,adcCount, + iSuperLayer,iLayer,iWire); + + Belle2::TrackFindingCDC::CDCWireHit cdcWireHit(cdchit, + driftDistance,m_sigma,0,dcDigi.getTime()); + + bestElement2.push_back(cdcWireHit); + } + if(ndigi<1e-5) return StatusCode::SUCCESS; + + Belle2::CKFToCDCFindlet::clearSeedRecoTrack(); + Belle2::CKFToCDCFindlet::addSeedRecoTrack(newRecoTrack); + + Belle2::CKFToCDCFindlet m_CKFToCDC; + std::vector< std::vector<unsigned short> > output; + std::vector<double> radius; + std::vector<double> arcLength; + std::vector<double> hitDistance; + std::vector<double> doca; + std::vector<double> reconstructedZ; + std::vector<TVector3> recoPos; + std::vector<std::vector<double>> trackParams; + std::vector<std::vector<double>> circleCenter; + m_CKFToCDC.beginEvent(); + m_CKFToCDC.addMeasuredStateOnPlane(state); + m_CKFToCDC.setpathSelectFilterName(m_pathSelectFilterName); + m_CKFToCDC.setMaximalLayerJump(m_maximalLayerJump); + + + auto start = std::chrono::high_resolution_clock::now(); + m_CKFToCDC.apply(bestElement2); + + auto finish = std::chrono::high_resolution_clock::now(); + std::chrono::duration<double> elapsed = finish - start; + + m_CPUTime[siNum] = elapsed.count(); + + m_CKFToCDC.getResult(output,trackParams, + radius,circleCenter,arcLength,hitDistance,doca, + reconstructedZ,recoPos); + m_n_DCTrackFinding[siNum] = output.size(); + + for(int i=0;i<radius.size();i++) m_radius[siNum][i] = radius[i]; + for(int i=0;i<arcLength.size();i++) m_arcLength[siNum][i] = arcLength[i]; + for(int i=0;i<hitDistance.size();i++) m_hitDistance[siNum][i] = hitDistance[i]; + for(int i=0;i<doca.size();i++) m_doca[siNum][i] = doca[i]; + for(int i=0;i<reconstructedZ.size();i++) m_ReconstructedZ[siNum][i] = reconstructedZ[i]; + + for(int i=0;i<recoPos.size();i++){ + m_recoPosX[siNum][i] = recoPos[i].X(); + m_recoPosY[siNum][i] = recoPos[i].Y(); + m_recoPosZ[siNum][i] = recoPos[i].Z(); + } + + for(int i=0;i<trackParams.size();i++){ + m_trackParD0[siNum][i] = trackParams[i][0]; + m_trackParPhi0[siNum][i] = trackParams[i][1]; + m_trackParOmega[siNum][i] = trackParams[i][2]; + m_trackParZ0[siNum][i] = trackParams[i][3]; + m_trackParTanLambda[siNum][i] = trackParams[i][4]; + } + for(int i=0;i<circleCenter.size();i++){ + m_centerX[siNum][i] = circleCenter[i][0]; + m_centerY[siNum][i] = circleCenter[i][1]; + } + + int num_match =0; + //add sdtTk To sdtTFk + sdtTFk.addToTrackStates(sdtTk.getTrackStates(0)); + for(int i=0;i<sdtTk.trackerHits_size();i++){ + sdtTFk.addToTrackerHits(sdtTk.getTrackerHits(i)); + } + + for(int i = 0;i<output.size();i++) + { + auto trkHit = TrF->create(); + edm4hep::TrackerHit digihit = digihits[output[i].at(0)][output[i].at(1)]; + + TVector3 Wstart(0,0,0); + TVector3 Wend (0,0,0); + m_gridDriftChamber->cellposition(digihit.getCellID(), Wstart, Wend); + + TVector3 cellPos = m_gridDriftChamber->wirePos_vs_z2(output[i].at(0),output[i].at(1), + reconstructedZ[i]); + + m_cellPosX[siNum][i] = cellPos.X(); + m_cellPosY[siNum][i] = cellPos.Y(); + m_cellPosZ[siNum][i] = cellPos.Z(); + + m_layer[siNum][i] = output[i].at(0); + m_cellID[siNum][i] = output[i].at(1); + m_NoiseFlag[siNum][i] = digihit.getQuality(); + + //match hit with truth hits + for(int j=0;j<truthDChit.size();j++){ + if((output[i].at(0) == truthDChit[j].at(0)) && + (output[i].at(1) == truthDChit[j].at(1))){ + + m_match_hit_wx[siNum][num_match] = Wstart.X(); + m_match_hit_wy[siNum][num_match] = Wstart.Y(); + m_match_hit_wz[siNum][num_match] = Wstart.Z(); + + m_match_hit_ex[siNum][num_match] = Wend.X(); + m_match_hit_ey[siNum][num_match] = Wend.Y(); + m_match_hit_ez[siNum][num_match] = Wend.Z(); + if(1==digihit.getQuality())m_isNoOverlap[siNum]++; + + num_match++; + } + } + + m_hit_wx[siNum][i] = Wstart.X(); + m_hit_wy[siNum][i] = Wstart.Y(); + m_hit_wz[siNum][i] = Wstart.Z(); + + m_hit_ex[siNum][i] = Wend.X(); + m_hit_ey[siNum][i] = Wend.Y(); + m_hit_ez[siNum][i] = Wend.Z(); + + trkHit.setCellID(digihit.getCellID()); + trkHit.setQuality(digihit.getQuality()); + trkHit.setTime(digihit.getTime()); + trkHit.setEDep(digihit.getEDep()); + trkHit.setPosition(digihit.getPosition()); + trkHit.setCovMatrix(digihit.getCovMatrix()); + + sdtTFk.addToTrackerHits(trkHit); + } + + m_n_match[siNum] = num_match; + + delete newRecoTrack; + delete recoTrackGenfitAccess; + + for(auto& it : bestElement2){ + delete it.getHit(); + } + bestElement2.clear(); + siNum++; + } + + m_n_N_SiTrack = siNum; + if(m_tuple) sc=m_tuple->write(); + + m_eventNo++; + + return StatusCode::SUCCESS; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +StatusCode DCTrackFinding::finalize() +{ + MsgStream log(msgSvc(), name()); + info()<< " DCTrackFinding in finalize()" << endmsg; + delete m_genfitFitter; + + std::cout << " End of DCTrackFinding .... " << std::endl; + return StatusCode::SUCCESS; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + +int DCTrackFinding::getNumPointsWithFittedInfo(genfit::Track genfitTrack, + int repID) const +{ + int nHitWithFittedInfo = 0; + //check number of hit with fitter info + int nHit = genfitTrack.getNumPointsWithMeasurement(); + //check number of hit with fitter info + for(int i=0; i<nHit; i++){ + if(nullptr != genfitTrack.getPointWithFitterInfo(i,genfitTrack.getTrackRep(repID))){ + nHitWithFittedInfo++; + } + } + return nHitWithFittedInfo; +} + +int DCTrackFinding::getFittedState(genfit::Track genfitTrack, + TLorentzVector& pos, TVector3& mom, + TMatrixDSym& cov, int trackPointId, int repID, bool biased) const +{ + //check number of hit with fitter info + if(getNumPointsWithFittedInfo(genfitTrack,repID)<=2) return 1; + + //get track rep + genfit::AbsTrackRep* rep = genfitTrack.getTrackRep(repID); + if(nullptr == rep) return 2; + + //get first or last measured state on plane + genfit::MeasuredStateOnPlane mop; + try{ + mop = genfitTrack.getFittedState(trackPointId,rep,biased); + }catch(genfit::Exception& e){ + std::cout<<" getNumPointsWithFittedInfo=" + <<getNumPointsWithFittedInfo(genfitTrack,repID) + <<" no TrackPoint with fitted info "<<std::endl; + return 3; + } + + //get state + TVector3 p; + mop.getPosMomCov(p,mom,cov); + pos.SetVect(p); + pos.SetT(9999);//FIXME + + return 0;//success +} + +bool DCTrackFinding::getMOP(int hitID,genfit::MeasuredStateOnPlane& mop, + genfit::AbsTrackRep* trackRep,genfit::Track* track) const +{ + if(nullptr == trackRep) trackRep = getRep(0,track); + try{ + mop = track->getFittedState(hitID,trackRep); + }catch(genfit::Exception& e){ + e.what(); + return false; + } + return true; +} + +genfit::AbsTrackRep* DCTrackFinding::getRep(int id,genfit::Track* track) const +{ + return track->getTrackRep(id); +} + +int DCTrackFinding::addHitsToTk(edm4hep::TrackerHitCollection * +col, edm4hep::Track& track, const char* msg) const +{ + int nHit=0; + debug()<<"add "<<msg<<" "<<col->size()<<" trackerHit"<<endmsg; + //sort,FIXME + edm4hep::MutableTrack sdtTrack = track.clone(); + for(auto hit:*col){ + sdtTrack.addToTrackerHits(hit); + ++nHit; + } + track = sdtTrack; + return nHit; +} diff --git a/Reconstruction/RecGenfitAlg/src/DCTrackFinding.h b/Reconstruction/RecGenfitAlg/src/DCTrackFinding.h new file mode 100644 index 00000000..d90c71dd --- /dev/null +++ b/Reconstruction/RecGenfitAlg/src/DCTrackFinding.h @@ -0,0 +1,213 @@ +////////////////////////////////////////////////////////////////////// +/// +/// This is an algorithm for track fitting for CEPC track with genfit. +/// +/// In this file, including: +/// An algorithm for combined silicon and drift chamber track fitting +/// with genfit for 5 particle hypothesis +/// +/// Units are following DD4hepUnits +/// +/// Authors: +/// Mengyao Liu(myliu@ihep.ac.cn) +/// +///////////////////////////////////////////////////////////////////// + +#ifndef RECGENFITALG_DCTRACKFINDING_H +#define RECGENFITALG_DCTRACKFINDING_H + +#include "GaudiAlg/GaudiAlgorithm.h" +#include "GaudiKernel/NTuple.h" +#include "k4FWCore/DataHandle.h" +#include "DD4hep/Fields.h" +#include <string> +#include <vector> +#include "AbsKalmanFitter.h" + +#include "DataHelper/GeomeryHelper.h" + +#include "GenfitTrack.h" +#include "GenfitFitter.h" +#include "GenfitField.h" +#include "GenfitUnit.h" + + +//ROOT +#include "TVector3.h" +#include "TVectorD.h" +#include "TMatrixDSym.h" +#include "TLorentzVector.h" + +class GenfitTrack; +class GenfitFitter; +class GenfitField; +class IGeomSvc; + +namespace dd4hep { + class Detector; + namespace DDSegmentation{ + class GridDriftChamber; + class BitFieldCoder; + } +} +namespace edm4hep{ + class EventHeaderCollection; + class MCParticleCollection; + class SimTrackerHitCollection; + class TrackCollection; + class TrackerHitCollection; + class MCRecoTrackerAssociationCollection; + class ReconstructedParticle; + class ReconstructedParticleCollection; + class TrackerHit; + class Track; +} + +///////////////////////////////////////////////////////////////////////////// + +class DCTrackFinding:public GaudiAlgorithm { + public: + DCTrackFinding (const std::string& name,ISvcLocator* pSvcLocator); + StatusCode initialize() override; StatusCode execute() override; StatusCode finalize() override; + + private: + GeomeryWire* geomery_wire; + GenfitFitter* m_genfitFitter; + const GenfitField* m_genfitField; + SmartIF<IGeomSvc> m_geomSvc; + dd4hep::OverlayedField m_dd4hepField; + dd4hep::Detector* m_dd4hepDetector; + + dd4hep::DDSegmentation::GridDriftChamber* m_gridDriftChamber; + dd4hep::DDSegmentation::BitFieldCoder* m_decoder; + + Gaudi::Property<std::string> m_pathSelectFilterName{this,"pathSelectFilterName","distance"}; + Gaudi::Property<int> m_maximalLayerJump{this,"MaximalLayerJump",1}; + + Gaudi::Property<double> m_extMinDistCut{this,"extMinDistCut",1e-4}; + Gaudi::Property<bool> m_skipWireMaterial{this, + "skipWireMaterial",false}; + Gaudi::Property<bool> m_correctBremsstrahlung{this, + "correctBremsstrahlung",true}; + Gaudi::Property<std::string> m_fitterType{this,"fitterType","DAF"}; + Gaudi::Property<bool> m_noMaterialEffects{this, + "noMaterialEffects",false}; + Gaudi::Property<int> m_debugPid{this,"debugPid",-99}; + Gaudi::Property<double> m_bStart{this,"bStart",100}; + Gaudi::Property<double> m_bFinal{this,"bFinal",0.01}; + Gaudi::Property<int> m_maxIteration{this,"maxIteration",20}; + Gaudi::Property<std::string> m_genfitHistRootName{this, + "genfitHistRootName",""}; + Gaudi::Property<double> m_driftVelocity{this,"driftVelocity",40};//um/ns + Gaudi::Property<bool> m_Smear{this,"Smear",false}; + Gaudi::Property<float> m_resX{this,"resX",0.11};//mm + Gaudi::Property<double> m_Noiseff{this,"Noiseff",0.5};//um/ns + Gaudi::Property<double> m_sigma{this,"sigmaL",0.011};//0.011cm=110um + Gaudi::Property<std::string> m_readout_name{this, + "readout", "DriftChamberHitsCollection"}; + + // Rec Si Track + DataHandle<edm4hep::TrackCollection> m_siSubsetTrackCol{ + "SubsetTracks" , Gaudi::DataHandle::Reader, this}; + //DC DigiHit SimTrackHit DCHitAssociation + DataHandle<edm4hep::TrackerHitCollection> m_DCDigiCol{ + "DigiDCHitCollection", Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::TrackerHitCollection> m_SignalDCDigiCol{ + "SignalDigiDCHitCollection", Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::SimTrackerHitCollection> m_simDCHitCol{ + "DriftChamberHitsCollection" , Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> + m_DCHitAssociationCol{"DCHitAssociationCollection", + Gaudi::DataHandle::Reader, this}; + //SIT SimTrackHit DCHitAssociation + DataHandle<edm4hep::SimTrackerHitCollection> m_simSITHitCol{ + "SITCollection", Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> + m_SITHitAssociationCol{"SITTrackerHitAssociation", + Gaudi::DataHandle::Reader, this}; + //VXD SimTrackHit DCHitAssociation + DataHandle<edm4hep::SimTrackerHitCollection> m_simVXDHitCol{ + "VXDCollection", Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> + m_VXDHitAssociationCol{"VXDTrackerHitAssociation", + Gaudi::DataHandle::Reader, this}; + //FTD SimTrackHit DCHitAssociation + DataHandle<edm4hep::SimTrackerHitCollection> m_simFTDHitCol{ + "FTDCollection", Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> + m_FTDHitAssociationCol{"FTDTrackerHitAssociation", + Gaudi::DataHandle::Reader, this}; + //SET SimTrackHit DCHitAssociation + DataHandle<edm4hep::SimTrackerHitCollection> m_simSETHitCol{ + "SETCollection", Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> + m_SETHitAssociationCol{"SETTrackerHitAssociation", + Gaudi::DataHandle::Reader, this}; + + DataHandle<edm4hep::TrackCollection> m_SDTTrackCol{"SDTTrackCollection", + Gaudi::DataHandle::Reader, this}; + + DataHandle<edm4hep::TrackCollection> m_SDTTrackFindCol{"SDTTrackFindCollection", + Gaudi::DataHandle::Writer, this}; + + // Output collections + DataHandle<edm4hep::TrackerHitCollection> w_DCTrackFindingCol{ + "DCTrackFindingHitCollection", Gaudi::DataHandle::Writer, this}; + + int getNumPointsWithFittedInfo(genfit::Track genfitTrack,int repID) const; + int getFittedState(genfit::Track genfitTrack, + TLorentzVector& pos, TVector3& mom, TMatrixDSym& cov, + int trackPointId=0, int repID=0, bool biased=true) const; + genfit::AbsTrackRep* getRep(int id,genfit::Track* track) const; + bool getMOP(int hitID, genfit::MeasuredStateOnPlane& mop, + genfit::AbsTrackRep* trackRep,genfit::Track* track) const; + + int addHitsToTk(edm4hep::TrackerHitCollection* col, edm4hep::Track& track, const char* msg) const; + int m_eventNo; + + /// tuples + NTuple::Tuple* m_tuple; + NTuple::Item<int> m_n_N_SiTrack; + NTuple::Array<int> m_n_DCTrackFinding; + NTuple::Array<float> m_CPUTime; + NTuple::Item<int> m_n_Digi; + NTuple::Item<int> m_n_SignalDigi; + NTuple::Array<int> m_n_match; + NTuple::Matrix<int> m_layer; + NTuple::Matrix<int> m_cellID; + NTuple::Matrix<int> m_NoiseFlag; + NTuple::Array<int> m_isNoOverlap; + NTuple::Array<int> m_digiOverlap; + NTuple::Matrix<double> m_hit_wx; + NTuple::Matrix<double> m_hit_wy; + NTuple::Matrix<double> m_hit_wz; + NTuple::Matrix<double> m_hit_ex; + NTuple::Matrix<double> m_hit_ey; + NTuple::Matrix<double> m_hit_ez; + NTuple::Matrix<double> m_recoPosX; + NTuple::Matrix<double> m_recoPosY; + NTuple::Matrix<double> m_recoPosZ; + NTuple::Matrix<double> m_cellPosX; + NTuple::Matrix<double> m_cellPosY; + NTuple::Matrix<double> m_cellPosZ; + NTuple::Matrix<double> m_match_hit_wx; + NTuple::Matrix<double> m_match_hit_wy; + NTuple::Matrix<double> m_match_hit_wz; + NTuple::Matrix<double> m_match_hit_ex; + NTuple::Matrix<double> m_match_hit_ey; + NTuple::Matrix<double> m_match_hit_ez; + NTuple::Matrix<double> m_radius; + NTuple::Matrix<double> m_arcLength; + NTuple::Matrix<double> m_hitDistance; + NTuple::Matrix<double> m_doca; + NTuple::Matrix<double> m_ReconstructedZ; + NTuple::Matrix<double> m_trackParD0; + NTuple::Matrix<double> m_trackParPhi0; + NTuple::Matrix<double> m_trackParOmega; + NTuple::Matrix<double> m_trackParZ0; + NTuple::Matrix<double> m_trackParTanLambda; + NTuple::Matrix<double> m_centerX; + NTuple::Matrix<double> m_centerY; + +}; +#endif diff --git a/Reconstruction/RecGenfitAlg/src/GenfitFitter.cpp b/Reconstruction/RecGenfitAlg/src/GenfitFitter.cpp index 501b5af3..062b37d2 100644 --- a/Reconstruction/RecGenfitAlg/src/GenfitFitter.cpp +++ b/Reconstruction/RecGenfitAlg/src/GenfitFitter.cpp @@ -191,6 +191,28 @@ int GenfitFitter::processTrack(GenfitTrack* track, bool resort) return true; } // End of ProcessTrack +/// Fit a genfit::track from a candidate track +int GenfitFitter::processTrack(genfit::Track* track, bool resort) +{ + if(m_debug>=2)std::cout<<"In ProcessTrack"<<std::endl; + if(track->getNumPoints()<=0){ + if(m_debug>=2)std::cout<<"skip track w.o. hit"<<std::endl; + return false; + } + if(getDebug()>2) print(""); + + /// Do the fitting + try{ + m_absKalman->processTrack(track,resort); + }catch(genfit::Exception& e){ + if(m_debug>=2)std::cout<<"Genfit exception caught "<<std::endl; + e.what(); + return false; + } + if(m_debug>=2)std::cout<<"End of ProcessTrack"<<std::endl; + return true; +} // End of Process genfit::Track + void GenfitFitter::setFitterType(const char* val) { diff --git a/Reconstruction/RecGenfitAlg/src/GenfitFitter.h b/Reconstruction/RecGenfitAlg/src/GenfitFitter.h index 7b3363e6..dc8590a0 100644 --- a/Reconstruction/RecGenfitAlg/src/GenfitFitter.h +++ b/Reconstruction/RecGenfitAlg/src/GenfitFitter.h @@ -31,6 +31,7 @@ namespace genfit{ class KalmanFitterRefTrack; class DAF; class MaterialEffects; + class Track; } namespace dd4hep{ class OverlayedField; @@ -54,6 +55,7 @@ class GenfitFitter{ /// Main fitting function int processTrack(GenfitTrack* track, bool resort=true); + int processTrack(genfit::Track* track, bool resort=true); /// fitting with rep int processTrackWithRep(GenfitTrack* track,int repID=0, diff --git a/Reconstruction/RecGenfitAlg/src/GenfitHit.cpp b/Reconstruction/RecGenfitAlg/src/GenfitHit.cpp index 85af21fe..f3c6f26c 100644 --- a/Reconstruction/RecGenfitAlg/src/GenfitHit.cpp +++ b/Reconstruction/RecGenfitAlg/src/GenfitHit.cpp @@ -26,8 +26,7 @@ GenfitHit::GenfitHit(const edm4hep::TrackerHit* trackerHit, m_driftDistanceErr=driftDistanceErr*GenfitUnit::cm; //driftVelocity um/ns m_driftDistanceTruth=m_trackerHit->getTime()*driftVelocity*GenfitUnit::um; - m_driftDistance=m_driftDistanceTruth*GenfitUnit::cm; -// if(driftDistanceErr>0) m_driftDistance+=gRandom->Gaus(0,fabs(driftDistanceErr*GenfitUnit::cm));//FIXME + m_driftDistance=fabs(m_driftDistanceTruth*GenfitUnit::cm); } unsigned long long GenfitHit::getCellID() const { @@ -50,7 +49,6 @@ int GenfitHit::getLeftRightAmbig() const { TVector3 pocaOnWire= m_gridDriftChamber->wirePos_vs_z(getCellID(),pocaOnTrack.Z()); TVector3 pocaDir=(pocaOnWire-pocaOnTrack).Unit(); - //TVector3 a=pocaDir.Cross(trackDir); int lrAmbig=(pocaDir.Cross(trackDir))*wireDir; return fabs(lrAmbig)/lrAmbig; } diff --git a/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp b/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp index 19bb23c7..8b58400b 100644 --- a/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp +++ b/Reconstruction/RecGenfitAlg/src/GenfitTrack.cpp @@ -27,6 +27,7 @@ #include "edm4hep/TrackerHit.h" #include "edm4hep/TrackerHitCollection.h" #include "edm4hep/MCParticle.h" +#include "edm4hep/MCParticleCollection.h" #include "edm4hep/MCRecoTrackerAssociationCollection.h" #include "edm4hep/Vector3d.h" #include "GaudiKernel/SmartIF.h" @@ -72,6 +73,7 @@ sortDCSimHit(edm4hep::SimTrackerHit hit1,edm4hep::SimTrackerHit hit2) bool isEarly=hit1.getTime()<hit2.getTime(); return isEarly; } + bool sortDCDigi(std::pair<double,edm4hep::TrackerHit*> hitPair1,std::pair<double,edm4hep::TrackerHit*> hitPair2) { @@ -79,6 +81,13 @@ sortDCDigi(std::pair<double,edm4hep::TrackerHit*> hitPair1,std::pair<double,edm4 return isEarly; } +bool +sortDCWireMeasurement(std::pair<int,WireMeasurementDC*> hitPair1,std::pair<int,WireMeasurementDC*> hitPair2) +{ + bool isEarly=hitPair1.first<hitPair2.first; + return isEarly; +} + GenfitTrack::GenfitTrack(const GenfitField* genfitField, const dd4hep::DDSegmentation::GridDriftChamber* seg, SmartIF<IGeomSvc> geom, const char* name) @@ -133,6 +142,18 @@ bool GenfitTrack::createGenfitTrack(int pdgType,int charge, return true; } +void GenfitTrack::getSeedStateCov(TVectorD& seedState, TMatrixDSym& covSeed) +{ + seedState = m_track->getStateSeed(); + covSeed.Zero(); + for(int i=0;i<3;i++) { + double posResolusion=1.; + covSeed(i,i)=posResolusion*posResolusion; //seed position + double momResolusion=5.; + covSeed(i+3,i+3)=momResolusion*momResolusion; //seed momentum + } +} + ///Create a Genfit track with MCParticle, unit conversion here bool GenfitTrack::createGenfitTrackFromMCParticle(int pidType, const edm4hep::MCParticle& mcParticle, double eventStartTime) @@ -262,8 +283,8 @@ GenfitTrack::getISurface(edm4hep::TrackerHit* hit){ /// Add a 1d strip or 2d pixel smeared by sigma bool -GenfitTrack::addSiliconMeasurement(edm4hep::TrackerHit* hit, - float sigmaU,float sigmaV,int cellID,int hitID) +GenfitTrack::addSiliconMeasurement(edm4hep::TrackerHit* hit,TVector3 pos, + TVector3 mom,float sigmaU,float sigmaV,int cellID,int hitID) { if(m_debug>0) std::cout<<"addSiliconMeasurement "<<*hit<<std::endl; @@ -326,6 +347,14 @@ int GenfitTrack::addSiliconMeasurements(edm4hep::Track& track, { ///Get TrackerHit on Track int nHitAdd=0; + + TVector3 pos; + TVector3 mom; + double charge; + TMatrixDSym cov; + double Bz=m_genfitField->getBz(TVector3{0.,0.,0.})/GenfitUnit::tesla; + CEPC::getPosMomFromTrackState(track.getTrackStates(0),Bz,pos,mom,charge,cov); + for(unsigned int iHit=0;iHit<track.trackerHits_size();iHit++){ edm4hep::TrackerHit* trackerHit= new edm4hep::TrackerHit(track.getTrackerHits(iHit)); @@ -333,7 +362,7 @@ int GenfitTrack::addSiliconMeasurements(edm4hep::Track& track, float sigmaU,sigmaV; int sigmaUID=getSigmas(cellID,sigmaUVec,sigmaVVec,sigmaU,sigmaV); if(0==sigmaUID) continue;//skip DC track - addSiliconMeasurement(trackerHit,sigmaU,sigmaV,cellID,nHitAdd++); + addSiliconMeasurement(trackerHit,pos,mom,sigmaU,sigmaV,cellID,nHitAdd++); GenfitHit* genfitHit= new GenfitHit(trackerHit,nullptr,nullptr, nullptr,0.,0.); @@ -343,6 +372,36 @@ int GenfitTrack::addSiliconMeasurements(edm4hep::Track& track, return nHitAdd; } +///Add WireMeasurements of hits on track +bool GenfitTrack::addWireMeasurements(const edm4hep::TrackerHit& trackerHit, + edm4hep::SimTrackerHit simTrackerHitAsso,int dcID,float sigma){ + + //FIXME driftVelocity + double driftVelocity=40.;//um/ns;;;FIXME + TVector3 end0(0,0,0); + TVector3 end1(0,0,0); + getEndPointsOfWire(trackerHit.getCellID(),end0,end1); + + int layer = m_decoderDC->get(trackerHit.getCellID(),"layer"); + int wireID = m_decoderDC->get(trackerHit.getCellID(),"cellID"); + + WireMeasurementDC* wireMeasurementDC= + new WireMeasurementDC(1e-4*driftVelocity*trackerHit.getTime(),sigma, + end0,end1,getDetTypeID(trackerHit.getCellID()),dcID,nullptr); + wireMeasurementDC->setTrackerHitObj(trackerHit,layer,wireID,trackerHit.getTime()); + //wireMeasurementDC->setLeftRightResolution(0);//FIXME + genfit::TrackPoint* trackPoint = + new genfit::TrackPoint(wireMeasurementDC,m_track); + m_track->insertPoint(trackPoint); + //m_track->insertPoint(new genfit::TrackPoint(wireMeasurementDC,m_track)); + if(m_debug>2){ + std::cout << " addWireMeasurements wireMeasurementDC : " << std::endl; + wireMeasurementDC->print(); + } + return true; +} + + //Add wire measurement on wire, unit conversion here int GenfitTrack::addWireMeasurementsFromListTrF(const edm4hep::TrackerHitCollection* trkHits, float sigma,int sortMethod) @@ -368,15 +427,17 @@ int GenfitTrack::addWireMeasurementsFromListTrF(const edm4hep::TrackerHitCollect ///New a TrackPoint,create connection between meas. and trackPoint WireMeasurementDC* wireMeasurementDC= - new WireMeasurementDC(1e-3*driftVelocity*trackerHit->getTime(),sigma, + new WireMeasurementDC(1e-4*driftVelocity*trackerHit->getTime(),sigma, end0,end1,getDetTypeID(trackerHit->getCellID()),nHitAdd,nullptr); int layer = m_decoderDC->get(trackerHit->getCellID(),"layer"); int cellID = m_decoderDC->get(trackerHit->getCellID(),"cellID"); const edm4hep::TrackerHit trackerHit_; - wireMeasurementDC->setTrackerHit(trackerHit_,layer,cellID); + wireMeasurementDC->setTrackerHit(trackerHit_,layer,cellID,trackerHit->getTime()); - m_track->insertPoint(new genfit::TrackPoint(wireMeasurementDC,m_track)); + genfit::TrackPoint* trackPoint = + new genfit::TrackPoint(wireMeasurementDC,m_track); + m_track->insertPoint(trackPoint); if(m_debug>=2){ std::cout<<nHitAdd-1; wireMeasurementDC->Print(); } nHitAdd++; }//end of loop over sotred hits @@ -398,12 +459,12 @@ int GenfitTrack::addWireMeasurementsFromList(std::vector<edm4hep::TrackerHit*>& std::cout<<"n sortedTrackerHits "<<sortedTrackerHits.size()<<std::endl; } int nHitAdd=0; - for(auto trackerHit : sortedTrackerHits){ + for(int i=0;i<sortedTrackerHits.size();i++){ edm4hep::SimTrackerHit simTrackerHitAsso; - getAssoSimTrackerHit(assoHits,trackerHit,simTrackerHitAsso); + getAssoSimTrackerHit(assoHits,sortedTrackerHits[i],simTrackerHitAsso); //FIXME driftVelocity GenfitHit* genfitHit= - makeAGenfitHit(trackerHit,&simTrackerHitAsso,sigma,truthAmbig, + makeAGenfitHit(sortedTrackerHits[i],&simTrackerHitAsso,sigma,truthAmbig, skipCorner,skipNear); if(nullptr==genfitHit) continue; @@ -412,7 +473,9 @@ int GenfitTrack::addWireMeasurementsFromList(std::vector<edm4hep::TrackerHit*>& ///New a TrackPoint,create connection between meas. and trackPoint WireMeasurementDC* wireMeasurementDC= new WireMeasurementDC(genfitHit,nHitAdd++); - m_track->insertPoint(new genfit::TrackPoint(wireMeasurementDC,m_track)); + genfit::TrackPoint* trackPoint = + new genfit::TrackPoint(wireMeasurementDC,m_track); + m_track->insertPoint(trackPoint); if(m_debug>=2){ std::cout<<nHitAdd-1; wireMeasurementDC->Print(); } }//end of loop over sotred hits return nHitAdd; @@ -507,6 +570,11 @@ unsigned int GenfitTrack::getNumPoints() const return m_track->getNumPoints(); } +unsigned int GenfitTrack::getNumPointsWithMeasurement() const +{ + return m_track->getNumPointsWithMeasurement(); +} + GenfitHit* GenfitTrack::GetHit(long unsigned int i) const { if(i>=m_genfitHitVec.size())return nullptr; return m_genfitHitVec[i]; @@ -622,6 +690,20 @@ void GenfitTrack::print( TLorentzVector pos, TVector3 mom, } } +/// Print track information +void GenfitTrack::print() const +{ + std::cout << "Genfit Track TrackRep: Num = " << m_track->getNumReps() << std::endl; + for(unsigned int i=0;i<m_track->getNumReps();i++){ + m_track->getTrackRep(i)->Print(); + } + + std::cout << "Genfit Track TrackPoint: Num = " << m_track->getNumPoints() << std::endl; + for(unsigned int i=0; i<m_track->getNumPoints(); i++){ + m_track->getPoint(i)->Print(); + } +} + /// Get position, momentum, cov on plane of hitID-th hit bool GenfitTrack::getPosMomCovMOP(int hitID, TLorentzVector& pos, TVector3& mom, TMatrixDSym& cov,int repID) const @@ -714,26 +796,174 @@ GenfitTrack::getFitStatus(int repID) const /// unit conversion here double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir, TVector3& pocaOnWire, double& doca,edm4hep::MCParticle mcParticle, - int cellID, int repID, bool stopAtBoundary, bool calcJacobianNoise)const + HelixClass helix, unsigned long long cellID, + int repID, bool stopAtBoundary, bool calcJacobianNoise) +{ + int chargeId; + mcParticle.getCharge() >0 ? chargeId=0 : chargeId=1;//s_PDG[0]: positive particle + + float refPos[3] = {0,0,0}; + float Point[6] = {0,0,0}; + float helixMom[3] = {0,0,0}; + helix.getPointOnCircle(800,refPos,Point); //mm + helix.getExtrapolatedMomentum(Point,helixMom);//mm + + TVector3 extraPos(0,0,0); + TVector3 extraMom(0,0,0); + extraPos.SetXYZ(Point[0]*GenfitUnit::mm,Point[1]*GenfitUnit::mm,Point[2]*GenfitUnit::mm);//cm + extraMom.SetXYZ(helixMom[0],helixMom[1],helixMom[2]); + if(m_debug>2){ + std::cout << " extraPos: " << std::endl; + extraPos.Print(); + std::cout << " extraMom: " << std::endl; + extraMom.Print(); + } + + //extrapolateToHit + double extraLength = + extrapolateToHit(poca,pocaDir,pocaOnWire,doca,extraPos,extraMom, + chargeId,cellID,repID,stopAtBoundary,calcJacobianNoise); + + return extraLength; +} + +/// Extrapolate track to the cloest point of approach(POCA) to the wire of hit, +/// return doca, poca on wire and track +/// outputs poca [cm] +/// unit conversion here +double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir, + TVector3& pocaOnWire, double& doca,edm4hep::MCParticle mcParticle, + unsigned long long cellID, + int repID, bool stopAtBoundary, bool calcJacobianNoise) { ///Get MCParticle and convert unit - TVector3 pos; - TVector3 mom; + TVector3 pos(0,0,0); + TVector3 mom(0,0,0); getPosMomFromMCPartile(mcParticle,pos,mom); + int chargeId; + mcParticle.getCharge() >0 ? chargeId=0 : chargeId=1;//s_PDG[0]: positive particle + + //extrapolateToCylinder + double startRadius = 1; // cm + const TVector3 linePoint(0,0,0); + const TVector3 lineDirection(0,0,1); + + for(int i=0;i<81;i++){ + + double radius = startRadius+1*i; //cm + double length = extrapolateToCylinder(pos,mom,radius,linePoint,lineDirection); + if(m_debug){ + std::cout<<"GenfitterTrack::extrapolateToHit before pos and mom " << __LINE__ + <<" charge "<<(int)mcParticle.getCharge()<<" repID "<<repID + <<" pdg "<<s_PDG[chargeId][repID]<< " radius = " << radius <<std::endl; + pos.Print(); + mom.Print(); + std::cout << " GenfitTrack::extrapolateToHit length = " << length << std::endl; + } + } + + //extrapolateToHit + double extraLength = + extrapolateToHit(poca,pocaDir,pocaOnWire,doca,pos,mom,chargeId,cellID, + repID,stopAtBoundary,calcJacobianNoise); + + return extraLength; +} + +/// Extrapolate track to the cloest point of approach(POCA) to the wire of hit, +/// return doca, poca on wire and track +/// outputs poca [cm] +/// unit conversion here +double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir, + TVector3& pocaOnWire, double& doca,TVector3 startPos,TVector3 startMom, + unsigned long long cellID,int pdg, bool stopAtBoundary, + bool calcJacobianNoise)const +{ + ///Get MCParticle and convert unit + TVector3 pos=startPos; + TVector3 mom=startMom; + TVector3 end0(0,0,0); TVector3 end1(0,0,0); - getEndPointsOfWire(cellID,end0,end1); + getEndPointsOfWire(cellID,end0,end1); //cm + + genfit::RKTrackRep* rep = new genfit::RKTrackRep(pdg); + //std::cout << " s_PDG[chargeId][repID] = " << s_PDG[chargeId][repID] << std::endl; + //genfit::MeasuredStateOnPlane state(rep); + genfit::StateOnPlane state(rep); + rep->setPosMom(state, pos, mom); + TVector3 wireDir = (end1-end0).Unit(); + + if(m_debug){ + std::cout<<"GenfitterTrack::extrapolateToHit before pos and mom " + <<" pdg "<<pdg<<std::endl; + pos.Print(); + mom.Print(); + std::cout<<" end point"<<std::endl; + end0.Print(); + end1.Print(); + std::cout<<" state "<<std::endl; + state.Print(); + std::cout<<" wireDir: "<<std::endl; + wireDir.Print(); + std::cout<<" stopAtBoundary "<<stopAtBoundary<<std::endl; + std::cout<<" calcJacobianNoise "<<calcJacobianNoise<<std::endl; + } + + double extrapoLen=0.; + try { + extrapoLen = rep->extrapolateToLine(state,end0,wireDir, + stopAtBoundary,calcJacobianNoise); + poca = rep->getPos(state); + pocaDir = rep->getMom(state); + pocaDir = pocaDir.Unit(); + pocaOnWire = end0 + wireDir*((poca - end0)*wireDir); + }catch(genfit::Exception& e) { + if(m_debug>=3)std::cout<< + "Exception in GenfitterTrack::extrapolateToHit"<<e.what()<<std::endl; + return extrapoLen/GenfitUnit::mm*dd4hep::mm; + } + + doca = (pocaOnWire-poca).Mag(); + if(m_debug>=2){ + std::cout<< "extrapoLen= " << extrapoLen << " poca "<<poca.x()<<","<<poca.y()<<" "<<poca.z() + <<" pocaDir "<<pocaDir.x()<<","<<pocaDir.y()<<" "<<pocaDir.z() + <<" pocaOnWire "<<pocaOnWire.x()<<","<<pocaOnWire.y()<<" "<<pocaOnWire.z() + <<" doca "<<doca<<" cm " << " dd4hep::mm = " << dd4hep::mm << " dd4hep::cm = " << dd4hep::cm <<std::endl; + } + + delete rep; + return extrapoLen/GenfitUnit::mm*dd4hep::mm; +}//end of extrapolateToHit + +/// Extrapolate track to the cloest point of approach(POCA) to the wire of hit, +/// return doca, poca on wire and track +/// outputs poca [cm] +/// unit conversion here +double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir, + TVector3& pocaOnWire, double& doca,TVector3 startPos,TVector3 startMom, + int chargeId,unsigned long long cellID, int repID, bool stopAtBoundary, + bool calcJacobianNoise)const +{ + ///Get MCParticle and convert unit + TVector3 pos=startPos; + TVector3 mom=startMom; + + TVector3 end0(0,0,0); + TVector3 end1(0,0,0); + getEndPointsOfWire(cellID,end0,end1); //cm - int chargeId; - mcParticle.getCharge() >0 ? chargeId=0 : chargeId=1;//s_PDG[0]: positive particle genfit::RKTrackRep* rep = new genfit::RKTrackRep(s_PDG[chargeId][repID]); + //std::cout << " s_PDG[chargeId][repID] = " << s_PDG[chargeId][repID] << std::endl; + //genfit::MeasuredStateOnPlane state(rep); genfit::StateOnPlane state(rep); rep->setPosMom(state, pos, mom); + TVector3 wireDir = (end1-end0).Unit(); if(m_debug){ std::cout<<"GenfitterTrack::extrapolateToHit before pos and mom " - <<" charge "<<(int)mcParticle.getCharge()<<" repID "<<repID + <<" charge "<< chargeId <<" repID "<<repID <<" pdg "<<s_PDG[chargeId][repID]<<std::endl; pos.Print(); mom.Print(); @@ -742,15 +972,20 @@ double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir, end1.Print(); std::cout<<" state "<<std::endl; state.Print(); + std::cout<<" wireDir: "<<std::endl; + wireDir.Print(); std::cout<<" stopAtBoundary "<<stopAtBoundary<<std::endl; std::cout<<" calcJacobianNoise "<<calcJacobianNoise<<std::endl; } - double extrapoLen=0.; try { - extrapoLen = rep->extrapolateToLine(state,end0,end0-end1, - poca,pocaDir,pocaOnWire,stopAtBoundary,calcJacobianNoise); + extrapoLen = rep->extrapolateToLine(state,end0,wireDir, + stopAtBoundary,calcJacobianNoise); + poca = rep->getPos(state); + pocaDir = rep->getMom(state); + pocaDir = pocaDir.Unit(); + pocaOnWire = end0 + wireDir*((poca - end0)*wireDir); }catch(genfit::Exception& e) { if(m_debug>=3)std::cout<< "Exception in GenfitterTrack::extrapolateToHit"<<e.what()<<std::endl; @@ -769,6 +1004,30 @@ double GenfitTrack::extrapolateToHit(TVector3& poca, TVector3& pocaDir, return extrapoLen/GenfitUnit::mm*dd4hep::mm; }//end of extrapolateToHit +double GenfitTrack::extrapolateToPlane(TVector3 startPos,TVector3 startMom, + genfit::SharedPlanePtr plane,int pdg, bool stopAtBoundary, + bool calcJacobianNoise)const +{ + genfit::AbsTrackRep* rep; + rep = new genfit::RKTrackRep(pdg); + + genfit::StateOnPlane state(rep); + rep->setPosMom(state, startPos, startMom); + + genfit::SharedPlanePtr origPlane = state.getPlane(); + genfit::StateOnPlane origState(state); + + double extrapoLen = 1e9; + try { + extrapoLen = rep->extrapolateToPlane(state, plane); + }catch (genfit::Exception& e) { + if(m_debug>=3)std::cout<< + "Exception in GenfitterTrack::extrapolateToPlane"<<e.what()<<std::endl; + return extrapoLen/GenfitUnit::mm*dd4hep::mm; + } + + return extrapoLen/GenfitUnit::mm*dd4hep::mm; +} ///Add space point measurement of silicon from edm4hep::Track to genfit track int GenfitTrack::addSpacePointsSi(const edm4hep::Track& track, std::vector<float> sigmaU,std::vector<float> sigmaV) @@ -1002,12 +1261,12 @@ bool GenfitTrack::debugDistance(const edm4hep::TrackerHitCollection* dCDigiCol, dynamic_cast<WireMeasurementDC*>(absMea); if(dcMea){ const edm4hep::TrackerHit* TrackerHit_ = dcMea->getTrackerHit(); - smearDistance.push_back(1e-3*driftVelocity*TrackerHit_->getTime()); + smearDistance.push_back(1e-3*driftVelocity*TrackerHit_->getTime());//mm DCHit++; for(auto dcDigi: *dCDigiCol){ if(dcDigi.getCellID() == TrackerHit_->getCellID()) { - truthDistance.push_back(1e-3*driftVelocity*(dcDigi.getTime())); + truthDistance.push_back(1e-3*driftVelocity*(dcDigi.getTime()));//mm } } } @@ -1039,11 +1298,30 @@ bool GenfitTrack::GetDocaRes(int hitID, double& DriftDis,double& fittedDoca, return true; } +void GenfitTrack::setNewHitCov(int hitID) const +{ + std::cout << " setNewHitCov No." << hitID << " is running!!!" << std::endl; + genfit::TrackPoint* tp = m_track->getPoint(hitID); + genfit::AbsMeasurement * abs = tp->getRawMeasurement(0); + + TMatrixDSym D = abs->getRawHitCov(); + std::cout<< " setNewHitCov D:" << std::endl; + D.Print(); + + int dimCov = abs->getDim(); + std::cout<< " setNewHitCov dimCov = " << dimCov << std::endl; + TMatrixDSym DNew(1); + DNew(0,0)=9999.0; + if(dimCov<2){ + abs->setRawHitCov(DNew); + } +} + bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle, edm4hep::MutableTrack& track,TVector3& pocaToOrigin_pos, TVector3& pocaToOrigin_mom,TMatrixDSym& pocaToOrigin_cov, // edm4hep::TrackState& trackState, - int pidType, int ndfCut, double chi2Cut, + int pidType, int ndfCut, double chi2Cut,int& nDC, int& nSDT, int& nFittedDC, int& nFittedSDT, int& ngenfitHit, std::vector<double>& trackL, std::vector<double>& hitMom, std::vector<float>& truthMomEdep, @@ -1052,7 +1330,9 @@ bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle, std::vector<double>& FittedDoca, std::vector<double>& truthDoca, std::vector<double>& Res, - std::vector<double>& truthRes) + std::vector<double>& truthRes,std::vector<int>& isNoise,std::vector<int>& isFitNoise, + std::vector<int>& layerFit,std::vector<int>& wireIDFit, + std::vector<int>& layer,std::vector<int>& wireID,std::vector<double>& extrapoLen) { int id = 0; @@ -1071,6 +1351,7 @@ bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle, while(1){ genfit::TrackPoint* point = m_track->getPointWithFitterInfo(id); if(!point)break; + extrapoLen.push_back(point->getSortingParameter()); id++; genfit::AbsMeasurement* absMea = point->getRawMeasurement(); @@ -1107,9 +1388,18 @@ bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle, dynamic_cast<WireMeasurementDC*>(absMea); if(dcMea){ const edm4hep::TrackerHit* TrackerHit_ = dcMea->getTrackerHit(); - if(nullptr==TrackerHit_) std::cout << __LINE__ << std::endl; - track.addToTrackerHits(*TrackerHit_); - + edm4hep::TrackerHit TrackerHitObj_; + if(nullptr==TrackerHit_){ + TrackerHitObj_ = dcMea->getTrackerHitObj(); + TrackerHit_ = &TrackerHitObj_; + track.addToTrackerHits(TrackerHitObj_); + }else { + track.addToTrackerHits(*TrackerHit_); + TrackerHitObj_ = *TrackerHit_; + } + isNoise.push_back(TrackerHit_->getQuality()); + layer.push_back(m_decoderDC->get(TrackerHit_->getCellID(),"layer")); + wireID.push_back(m_decoderDC->get(TrackerHit_->getCellID(),"cellID")); DCHit++; if(flag) @@ -1123,9 +1413,11 @@ bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle, truthDoca.push_back(40*1e-3*TrackerHit_->getTime()); truthRes.push_back((40*1e-3*TrackerHit_->getTime())-10*fittedDoca); Res.push_back(res); - - + isFitNoise.push_back(TrackerHit_->getQuality()); dcFit++; + + layerFit.push_back(m_decoderDC->get(TrackerHit_->getCellID(),"layer")); + wireIDFit.push_back(m_decoderDC->get(TrackerHit_->getCellID(),"cellID")); } } } @@ -1134,6 +1426,9 @@ bool GenfitTrack::storeTrack(edm4hep::MutableReconstructedParticle& recParticle, nFittedDC = dcFit; nFittedSDT = SDTHit; + nDC = DCHit; + nSDT = SDTHit; + if(fitid<1e-9) return false; if(m_debug>0)std::cout<<m_name<<" store track ndfCut "<<ndfCut<<" chi2Cut " @@ -1322,15 +1617,28 @@ int GenfitTrack::getDetTypeID(unsigned long long cellID) const return encoder[lcio::ILDCellID0::subdet]; } +void GenfitTrack::getAssoSimTrackerHit2( + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + const edm4hep::TrackerHit& trackerHit, + edm4hep::SimTrackerHit& simTrackerHit) const +{ + for(int i =0;i<assoHits->size();i++){ + if(assoHits->at(i).getRec()==trackerHit) + { + simTrackerHit=assoHits->at(i).getSim(); + + } + } +} void GenfitTrack::getAssoSimTrackerHit( - const edm4hep::MCRecoTrackerAssociationCollection*& assoHits, + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, edm4hep::TrackerHit* trackerHit, edm4hep::SimTrackerHit& simTrackerHit) const { - for(auto assoHit: *assoHits){ - if(assoHit.getRec()==*trackerHit) + for(int i =0;i<assoHits->size();i++){ + if(assoHits->at(i).getRec()==*trackerHit) { - simTrackerHit=assoHit.getSim(); + simTrackerHit=assoHits->at(i).getSim(); } } @@ -1352,7 +1660,7 @@ void GenfitTrack::getSeedCov(TMatrixDSym& cov){ } //unit conversion here -void GenfitTrack::getEndPointsOfWire(int cellID,TVector3& end0,TVector3& end1) const{ +void GenfitTrack::getEndPointsOfWire(unsigned long long cellID,TVector3& end0,TVector3& end1) const{ m_gridDriftChamber->cellposition(cellID,end0,end1);//dd4hep unit end0*=(1./dd4hep::cm*GenfitUnit::cm); end1*=(1./dd4hep::cm*GenfitUnit::cm); @@ -1422,7 +1730,7 @@ void GenfitTrack::getTrackFromEDMTrackFinding(const edm4hep::Track& edm4HepTrack // FIXME double Bz=3*GenfitUnit::tesla; double charge_double; - CEPC::getPosMomFromTrackState(edm4HepTrack.getTrackStates(1),Bz,pos,mom,charge_double,cov); + CEPC::getPosMomFromTrackState(edm4HepTrack.getTrackStates(0),Bz,pos,mom,charge_double,cov); charge=(int) charge_double; trackParam[0]=pos[0]*GenfitUnit::mm; @@ -1552,6 +1860,180 @@ void GenfitTrack::getSortedTrackerHitsTrF( return; }//end of getSortedTrackerHits +double GenfitTrack::checkGenfitTrack(int& dcFitNum){ + + int id = 0; + int dcID=0; + + unsigned int nPoints = m_track->getNumPoints(); + unsigned int nPointsWithMea = m_track->getNumPointsWithMeasurement(); + + while(1){ + genfit::TrackPoint* point = m_track->getPointWithFitterInfo(id); + if(!point)break; + id++; + genfit::AbsMeasurement* absMea = point->getRawMeasurement(); + + // getPoint FitterInfo + genfit::AbsFitterInfo* FitterInfo = point->getFitterInfo(); + genfit::KalmanFitterInfo *KalmanfitterInfo = + dynamic_cast<genfit::KalmanFitterInfo*>(FitterInfo); + + unsigned int nNumMea = KalmanfitterInfo->getNumMeasurements(); + + bool flag = false; + for(int i=0;i<nNumMea;i++) + { + genfit::MeasurementOnPlane* MeaOnPlane = + KalmanfitterInfo->getMeasurementOnPlane(i); + double weight = MeaOnPlane->getWeight(); + if(weight>0.8) flag = true; + } + + genfit::MeasurementOnPlane * Mea = + KalmanfitterInfo->getMeasurementOnPlane(); + + genfit::PlanarMeasurementSDT* sdtMea = + dynamic_cast<genfit::PlanarMeasurementSDT*>(absMea); + if(!sdtMea){ + WireMeasurementDC* dcMea = + dynamic_cast<WireMeasurementDC*>(absMea); + if(dcMea){ + if(flag) dcID++; + const edm4hep::TrackerHit* TrackerHit_ = dcMea->getTrackerHit(); + edm4hep::TrackerHit TrackerHitObj_; + if(nullptr==TrackerHit_){ + TrackerHitObj_ = dcMea->getTrackerHitObj(); + TrackerHit_ = &TrackerHitObj_; + }else { + TrackerHitObj_ = *TrackerHit_; + } + } + } + } + + dcFitNum = dcID; + const genfit::FitStatus* fitState = getFitStatus(); + double ndf = fitState->getNdf(); + double chi2 = fitState->getChi2(); + return (chi2/ndf); +} + +int GenfitTrack::salvageHits(int PDG, + const edm4hep::MCParticleCollection* mcParticleCol, + const edm4hep::TrackerHitCollection* dCDigiCol, + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + double sigma,bool truthAmbig,double skipCorner,double skipNear, + double extraCut,double extraDocaCut, + std::vector<double>& docaTrack,std::vector<int>& isNoise, + int& nDC){ + + TVector3 seedPos(0,0,0); + TVector3 seedMom(0,0,0); + + edm4hep::MCParticle mcParticle; + for(int i=0;i<mcParticleCol->size();i++){ + if(PDG==mcParticleCol->at(i).getPDG()) mcParticle = mcParticleCol->at(i); + } + getPosMomFromMCPartile(mcParticle,seedPos,seedMom); + seedPos.SetXYZ(seedPos.X()/GenfitUnit::mm,seedPos.Y()/GenfitUnit::mm, + seedPos.Z()/GenfitUnit::mm); + double Bz = m_genfitField->getBz(TVector3{0.,0.,0.})/GenfitUnit::tesla; + int charge = (int)(mcParticle.getCharge()); + HelixClass helix; + double xc,yc,helixR; + CEPC::getHelixFromPosMom(helix,xc,yc,helixR,Bz,seedPos,seedMom,charge); + + TVector3 poca(0,0,0); + TVector3 pocaDir(0,0,0); + TVector3 pocaOnWire(0,0,0); + double doca = 0; + + int id = 0; + int idAdd = 0; + int dcID=0; + std::vector<unsigned long long> fitcellID; + + unsigned int nPoints = m_track->getNumPoints(); + unsigned int nPointsWithMea = m_track->getNumPointsWithMeasurement(); + + while(1){ + genfit::TrackPoint* point = m_track->getPointWithFitterInfo(id); + if(!point)break; + id++; + genfit::AbsMeasurement* absMea = point->getRawMeasurement(); + + // getPoint FitterInfo + genfit::AbsFitterInfo* FitterInfo = point->getFitterInfo(); + genfit::KalmanFitterInfo *KalmanfitterInfo = + dynamic_cast<genfit::KalmanFitterInfo*>(FitterInfo); + + unsigned int nNumMea = KalmanfitterInfo->getNumMeasurements(); + + bool flag = false; + for(int i=0;i<nNumMea;i++) + { + genfit::MeasurementOnPlane* MeaOnPlane = + KalmanfitterInfo->getMeasurementOnPlane(i); + double weight = MeaOnPlane->getWeight(); + if(weight>0.8) flag = true; + } + + genfit::MeasurementOnPlane * Mea = + KalmanfitterInfo->getMeasurementOnPlane(); + + genfit::PlanarMeasurementSDT* sdtMea = + dynamic_cast<genfit::PlanarMeasurementSDT*>(absMea); + if(!sdtMea){ + WireMeasurementDC* dcMea = + dynamic_cast<WireMeasurementDC*>(absMea); + if(dcMea){ + const edm4hep::TrackerHit* TrackerHit_ = dcMea->getTrackerHit(); + if(nullptr==TrackerHit_) std::cout << __LINE__ << std::endl; + dcID++; + fitcellID.push_back(dcMea->getTrackerHit()->getCellID()); + } + } + } + nDC = dcID; + + int nAddHits=0; + + for(int i=0;i<dCDigiCol->size();i++){ + unsigned long long cellID = dCDigiCol->at(i).getCellID(); + int layer = m_decoderDC->get(cellID,"layer"); + int wireID = m_decoderDC->get(cellID,"cellID"); + + + std::vector<unsigned long long>::iterator it; + it = find(fitcellID.begin(), fitcellID.end(), cellID); + if (it == fitcellID.end()){ + + double distance = + extrapolateToHit(poca,pocaDir,pocaOnWire,doca, + mcParticle,helix,cellID); + double driftdis = 40*1e-4*dCDigiCol->at(i).getTime(); //fixed speed FIXME && cm + if(abs(doca)>extraDocaCut) continue; + if(abs(driftdis-doca)>extraCut) continue; + edm4hep::SimTrackerHit simTrackerHit; + getAssoSimTrackerHit2(assoHits,dCDigiCol->at(i),simTrackerHit); + if(addWireMeasurements(dCDigiCol->at(i),simTrackerHit,dcID,sigma)){ + dcID++; + nAddHits++; + + docaTrack.push_back(doca); + isNoise.push_back(dCDigiCol->at(i).getQuality()); + } + } + }// all DC digi hits + return nAddHits; +}//end of salvageHits + +//Exclude the hits that may be noise +//void GenfitTrack::Excludehits(){ +// +//}//end of Excludehits + void GenfitTrack::getSortedTrackerHits( std::vector<edm4hep::TrackerHit*>& trackerHits, const edm4hep::MCRecoTrackerAssociationCollection* assoHits, @@ -1622,3 +2104,83 @@ GenfitHit* GenfitTrack::makeAGenfitHit(edm4hep::TrackerHit* trackerHit, return genfitHit; } +bool GenfitTrack::sortedHitOnTrack(int pdg){ + + TVectorD seedState(6); + seedState = m_track->getStateSeed(); + TVector3 pos(seedState[0],seedState[1],seedState[2]); + TVector3 mom(seedState[3],seedState[4],seedState[5]); + + //std::cout << " genfitTrack Seed: " << std::endl; + //pos.Print(); + //mom.Print(); + + unsigned int nPoints = m_track->getNumPoints(); + for(unsigned int i = 0; i<nPoints; i++){ + + double extrapoLen = 0; + + genfit::TrackPoint* point = m_track->getPoint(i); + genfit::AbsMeasurement* absMea = point->getRawMeasurement(); + genfit::PlanarMeasurementSDT* sdtMea = + dynamic_cast<genfit::PlanarMeasurementSDT*>(absMea); + + if(sdtMea){ + const edm4hep::TrackerHit* TrackerHit_ = sdtMea->getTrackerHit(); + const dd4hep::rec::ISurface* iSurface = + getISurface(const_cast<edm4hep::TrackerHit*>(TrackerHit_)); + if(nullptr==iSurface){ + std::cout<<m_name<<" addSiliconMeasurement get surface ERROR!"<<std::endl; + return false; + } + + TVector3 o,u,v; + double lengthU,lengthV; + getISurfaceOUV(iSurface,o,u,v,lengthU,lengthV); + genfit::SharedPlanePtr plane(new genfit::DetPlane(o,u,v)); + extrapoLen = extrapolateToPlane(pos,mom,plane,pdg); + + point->setSortingParameter(extrapoLen); + //std::cout << " sortedHitOnTrack PlanarMeasurementSDT trackLen = " << extrapoLen << std::endl; + } else { + WireMeasurementDC* dcMea = + dynamic_cast<WireMeasurementDC*>(absMea); + if(dcMea){ + const edm4hep::TrackerHit* TrackerHit_ = dcMea->getTrackerHit(); + edm4hep::TrackerHit TrackerHitObj_; + if(nullptr==TrackerHit_){ + TrackerHitObj_ = dcMea->getTrackerHitObj(); + TrackerHit_ = &TrackerHitObj_; + }else { + TrackerHitObj_ = *TrackerHit_; + } + + unsigned long long cellID = TrackerHit_->getCellID(); + TVector3 poca; + TVector3 pocaDir; + TVector3 pocaOnWire; + double doca; + extrapoLen = + extrapolateToHit(poca,pocaDir,pocaOnWire,doca,pos,mom,cellID,pdg); + point->setSortingParameter(extrapoLen); + + }else { + std::cout << " sortedHitOnTrack WireMeasurementDC nllptr ERROR !!!!!!" << std::endl; + return false; + } + } + + } + + return true; +} + +void GenfitTrack::checkTrackPoint(){ + + unsigned int nPoints = m_track->getNumPoints(); + for(unsigned int i = 0; i<nPoints; i++){ + + genfit::TrackPoint* point = m_track->getPoint(i); + std::cout << " checkTrackPoint No." << i << " getSortingParameter = " << point->getSortingParameter() << std::endl; + } +} diff --git a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h index 58f25014..47e85238 100644 --- a/Reconstruction/RecGenfitAlg/src/GenfitTrack.h +++ b/Reconstruction/RecGenfitAlg/src/GenfitTrack.h @@ -32,6 +32,10 @@ //STL #include <vector> +#include "DataHelper/HelixClass.h" +#include "WireMeasurementDC.h" +#include "PlanarMeasurementSDT.h" + class TLorentzVector; class IGeomSvc; class WireMeasurementDC; @@ -42,6 +46,7 @@ namespace genfit{ class AbsTrackRep; class RKTrackRep; class KalmanFittedStateOnPlane; + class PlanarMeasurementSDT; } namespace edm4hep{ class MCParticle; @@ -57,6 +62,7 @@ namespace edm4hep{ class Vector3d; class Vector3f; class TrackerHitCollection; + class MCParticleCollection; } namespace dd4hep { namespace DDSegmentation{ @@ -72,6 +78,9 @@ class GenfitTrack { friend int GenfitFitter::processTrack( GenfitTrack* track, bool resort); + friend int GenfitFitter::processTrack( + genfit::Track* track, bool resort); + friend int GenfitFitter::processTrackWithRep( GenfitTrack* track, int repID, bool resort); @@ -115,8 +124,13 @@ class GenfitTrack { virtual int addWireMeasurementsFromListTrF(const edm4hep::TrackerHitCollection* trkHits, float sigma,int sortMethod); + //Add salhits + bool addWireMeasurements(const edm4hep::TrackerHit& trackerHit, + edm4hep::SimTrackerHit simTrackerHitAsso,int dcID,float sigma); + double checkGenfitTrack(int& dcFitNum); + ///Add one silicon hits - bool addSiliconMeasurement(edm4hep::TrackerHit* hit, + bool addSiliconMeasurement(edm4hep::TrackerHit* hit,TVector3 pos,TVector3 mom, float sigmaU,float sigmaV,int cellID,int hitID); ///Add silicon measurements, return number of hits on track @@ -129,6 +143,7 @@ class GenfitTrack { std::vector<double>& truthDistance,double driftVelocity); bool GetDocaRes(int hitID, double& DriftDis,double& fittedDoca, double& res,int repID=0, bool biased=true) const; + void setNewHitCov(int hitID) const; ///Store track to ReconstructedParticle bool storeTrack(edm4hep::MutableReconstructedParticle& recParticle, @@ -136,7 +151,7 @@ class GenfitTrack { TVector3& pocaToOrigin_pos, TVector3& pocaToOrigin_mom, TMatrixDSym& pocaToOrigin_cov, - int pidType, int ndfCut, double chi2Cut, + int pidType, int ndfCut, double chi2Cut,int& nDC, int& nSDT, int& nFittedDC, int& nFittedSDT,int& ngenfitHit, std::vector<double>& trackL, std::vector<double>& hitMom, std::vector<float>& truthMomEdep, @@ -145,10 +160,12 @@ class GenfitTrack { std::vector<double>& FittedDoca, std::vector<double>& truthDoca, std::vector<double>& Res, - std::vector<double>& truthRes); + std::vector<double>& truthRes, std::vector<int>& isNoise, + std::vector<int>& isFitNoise, + std::vector<int>& layerFit,std::vector<int>& wireIDFit, + std::vector<int>& layer,std::vector<int>& wireID,std::vector<double>& extrapoLen); ///A tool to convert track to the first layer of DC - void pivotToFirstLayer(const edm4hep::Vector3d& pos, const edm4hep::Vector3f& mom, edm4hep::Vector3d& firstPos, edm4hep::Vector3f& firstMom); @@ -159,7 +176,24 @@ class GenfitTrack { //return dd4hep unit double extrapolateToHit(TVector3& poca, TVector3& pocaDir, TVector3& pocaOnWire, double& doca,edm4hep::MCParticle mcParticle, - int cellID, int repID, bool stopAtBoundary, bool calcJacobianNoise)const; + unsigned long long cellID, int repID=1, + bool stopAtBoundary=false, + bool calcJacobianNoise=true); + //return dd4hep unit + double extrapolateToHit(TVector3& poca, TVector3& pocaDir, + TVector3& pocaOnWire, double& doca,edm4hep::MCParticle mcParticle, + HelixClass helix,unsigned long long cellID, int repID=1, + bool stopAtBoundary=false, + bool calcJacobianNoise=true); + //return dd4hep unit + double extrapolateToHit(TVector3& poca, TVector3& pocaDir, + TVector3& pocaOnWire, double& doca,TVector3 startPos,TVector3 startMom, + int chargeId, unsigned long long cellID, int repID=1, bool stopAtBoundary=false, + bool calcJacobianNoise=true)const; + double extrapolateToHit(TVector3& poca, TVector3& pocaDir, + TVector3& pocaOnWire, double& doca,TVector3 startPos,TVector3 startMom, + unsigned long long cellID,int pdg, bool stopAtBoundary=false, + bool calcJacobianNoise=true)const; /// Extrapolate the track to the point /// Output: pos and mom of POCA point to point /// Input: genfitTrack,point,repID,stopAtBoundary and calcAverageState @@ -177,6 +211,9 @@ class GenfitTrack { const TVector3 lineDirection, int hitID =0, int repID=0, bool stopAtBoundary=false, bool calcJacobianNoise=true); + double extrapolateToPlane(TVector3 startPos, TVector3 startMom, + genfit::SharedPlanePtr plane,int pdg, + bool stopAtBoundary = false, bool calcJacobianNoise = true) const; bool getPosMomCovMOP(int hitID, TLorentzVector& pos, TVector3& mom, TMatrixDSym& cov, int repID=0) const; @@ -186,7 +223,9 @@ class GenfitTrack { const TVector3 getSeedStateMom() const; void getSeedStateMom(TLorentzVector& pos, TVector3& mom) const; unsigned int getNumPoints() const; + unsigned int getNumPointsWithMeasurement() const; unsigned int getNumPointsDet(int cellID) const; + void getSeedStateCov(TVectorD& seedState,TMatrixDSym& covSeed); /// get the fitted track status const genfit::FitStatus* getFitStatus(int repID=0) const; @@ -206,6 +245,7 @@ class GenfitTrack { void printSeed() const;//print seed void printFitted(int repID=0) const;//print seed void print(TLorentzVector pos, TVector3 mom, const char* comment="") const; + void print() const; /// set and get debug level void setDebug(int debug){m_debug=debug;} @@ -213,6 +253,9 @@ class GenfitTrack { void setDebugLocal(int debug); int getDebug(void) const { return m_debug;} + bool sortedHitOnTrack(int pdg); + void checkTrackPoint(); + /// get name of this object const char* getName() const {return m_name;} genfit::Track* getTrack() const{return m_track;} @@ -226,6 +269,14 @@ class GenfitTrack { static void getTrackFromEDMTrackFinding(const edm4hep::Track& edm4HepTrack, double& charge, TVectorD& trackParam, TMatrixDSym& cov,TVector3& pos, TVector3& mom); + int salvageHits(int PDG, + const edm4hep::MCParticleCollection* mcParticleCol, + const edm4hep::TrackerHitCollection* dCDigiCol, + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + double sigma,bool truthAmbig,double skipCorner,double skipNear, + double extraCut,double extraDocaCut, + std::vector<double>& docaTrack,std::vector<int>& isNoise, + int& nDC); protected: //genfit::Track* getTrack() {return m_track;} @@ -246,10 +297,14 @@ class GenfitTrack { const dd4hep::rec::ISurface* getISurface(edm4hep::TrackerHit* hit); void getSeedCov(TMatrixDSym& cov); void getAssoSimTrackerHit( - const edm4hep::MCRecoTrackerAssociationCollection*& assoHits, + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, edm4hep::TrackerHit* trackerHit, edm4hep::SimTrackerHit& simTrackerHit) const; - void getEndPointsOfWire(int cellID,TVector3& end0,TVector3& end1)const; + void getAssoSimTrackerHit2( + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + const edm4hep::TrackerHit& trackerHit, + edm4hep::SimTrackerHit& simTrackerHit) const; + void getEndPointsOfWire(unsigned long long cellID,TVector3& end0,TVector3& end1)const; void getTrackFromEDMTrack(const edm4hep::Track& edm4HepTrack, double& charge, TVectorD& trackParam, TMatrixDSym& cov) const; void getTrackFromMCPartile(const edm4hep::MCParticle mcParticle, diff --git a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp deleted file mode 100644 index 8dc13f65..00000000 --- a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.cpp +++ /dev/null @@ -1,409 +0,0 @@ -#include "RecGenfitAlgDC.h" -#include "GenfitTrack.h" -#include "GenfitFitter.h" -#include "GenfitField.h" - -//genfit -#include "EventDisplay.h" - -//cepcsw -#include "DetInterface/IGeomSvc.h" -#include "DataHelper/HelixClass.h" -#include "DetSegmentation/GridDriftChamber.h" - -//externals -#include "edm4hep/EventHeaderCollection.h" -#include "edm4hep/MCParticle.h" -#include "edm4hep/MCParticleCollection.h" -#include "edm4hep/SimTrackerHitCollection.h" -#include "edm4hep/TrackerHitCollection.h" -#include "edm4hep/TrackCollection.h" -#include "edm4hep/MCRecoTrackerAssociationCollection.h" -#include "edm4hep/ReconstructedParticle.h" -#include "edm4hep/ReconstructedParticleCollection.h" -#include "edm4hep/Track.h" -#include "edm4hep/TrackCollection.h" -#include "DD4hep/DD4hepUnits.h" -#include "DD4hep/Detector.h" -#include "UTIL/BitField64.h" -#include "DDSegmentation/Segmentation.h" -#include "TRandom.h" -#include "TLorentzVector.h" - -//stl -#include "time.h" - - -DECLARE_COMPONENT( RecGenfitAlgDC ) - -///////////////////////////////////////////////////////////////////// -RecGenfitAlgDC::RecGenfitAlgDC(const std::string& name, ISvcLocator* pSvcLocator): - GaudiAlgorithm(name, pSvcLocator),m_nPDG(5),m_dd4hep(nullptr), - m_gridDriftChamber(nullptr),m_decoder(nullptr) -{ - //declareProperty("EventHeaderCol", _headerCol); - declareProperty("MCParticle", m_mcParticleCol, - "Handle of the input MCParticle collection"); - declareProperty("DriftChamberHitsCollection", m_simDCHitCol, - "Handle of the input SimHit collection"); - declareProperty("DigiDCHitCollection", m_digiDCHitsCol, - "Handle of digi DCHit collection"); - declareProperty("DCTrackCollection", m_dcTrackCol, - "Handle of DC track collection"); - declareProperty("DCHitAssociationCollection", m_dcHitAssociationCol, - "Handle of simTrackerHit and TrackerHit association collection"); - declareProperty("DCRecParticleCollection", m_dcRecParticleCol, - "Handle of drift chamber reconstructed particle collection"); -} - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -StatusCode RecGenfitAlgDC::initialize() -{ - MsgStream log(msgSvc(), name()); - info()<<"RecGenfitAlgDC initialize()"<<endmsg; - - ///Get GeomSvc - m_geomSvc=Gaudi::svcLocator()->service("GeomSvc"); - if (nullptr==m_geomSvc) { - std::cout<<"Failed to find GeomSvc"<<std::endl; - return StatusCode::FAILURE; - } - ///Get Detector - m_dd4hep = m_geomSvc->lcdd(); - ///Get Field - m_dd4hepField=m_geomSvc->lcdd()->field(); - - /// New a genfit fitter - m_genfitFitter=new GenfitFitter(m_fitterType.toString().c_str()); - m_genfitField=new GenfitField(m_dd4hepField); - m_genfitFitter->setField(m_genfitField); - m_genfitFitter->setGeoMaterial(m_geomSvc->lcdd()); - m_genfitFitter->setEnergyLossBrems(m_correctBremsstrahlung); - m_genfitFitter->setNoiseBrems(m_correctBremsstrahlung); - if(m_debug>10) m_genfitFitter->setDebug(m_debug-10); - if(m_noMaterialEffects) m_genfitFitter->setNoEffects(true); - if(-1==m_debugPid) m_genfitFitter->setNoEffects(true); - if(-1==m_debugPid) m_debugPid=0;//charged geantino with electron pid - if(m_fitterType=="DAF"||m_fitterType=="DafRef"){ - m_genfitFitter->setMaxIterationsBetas(m_bStart,m_bFinal,m_maxIteration); - } else { - m_genfitFitter->setMaxIterations(m_maxIteration); - } - //print genfit parameters - if(m_debug) m_genfitFitter->print(); - if(""!=m_genfitHistRootName) m_genfitFitter->initHist(m_genfitHistRootName); - - //initialize member vairables - for(int i=0;i<5;i++) m_fitSuccess[i]=0; - m_nDCTrack=0; - ///Get Readout - dd4hep::Readout readout=m_dd4hep->readout(m_readout_name); - ///Get Segmentation - m_gridDriftChamber=dynamic_cast<dd4hep::DDSegmentation::GridDriftChamber*> - (readout.segmentation().segmentation()); - if(nullptr==m_gridDriftChamber){ - error() << "Failed to get the GridDriftChamber" << endmsg; - return StatusCode::FAILURE; - } - ///Get Decoder - m_decoder = m_geomSvc->getDecoder(m_readout_name); - if (nullptr==m_decoder) { - error() << "Failed to get the decoder" << endmsg; - return StatusCode::FAILURE; - } - - - ///book tuple - NTuplePtr nt(ntupleSvc(), "RecGenfitAlgDC/recGenfitAlgDC"); - if(nt){ - m_tuple=nt; - }else{ - m_tuple=ntupleSvc()->book("RecGenfitAlgDC/recGenfitAlgDC", - CLID_ColumnWiseTuple,"RecGenfitAlgDC"); - if(m_tuple){ - StatusCode sc; - sc=m_tuple->addItem("run",m_run); - sc=m_tuple->addItem("evt",m_evt); - sc=m_tuple->addItem("tkId",m_tkId); - sc=m_tuple->addItem("mcIndex",m_mcIndex,0,100);//max. 100 particles - sc=m_tuple->addItem("truthPocaMc",m_mcIndex,m_truthPocaMc,3); - sc=m_tuple->addItem("pocaPosMc",m_mcIndex,m_pocaPosMc,3); - sc=m_tuple->addItem("pocaMomMc",m_mcIndex,m_pocaMomMc,3); - sc=m_tuple->addItem("pocaMomMcP",m_mcIndex,m_pocaMomMcP); - sc=m_tuple->addItem("pocaMomMcPt",m_mcIndex,m_pocaMomMcPt); - sc=m_tuple->addItem("pocaPosMdc",3,m_pocaPosMdc); - sc=m_tuple->addItem("pocaMomMdc",3,m_pocaMomMdc); - sc=m_tuple->addItem("index",m_pidIndex, 0, 5); - sc=m_tuple->addItem("firstPosKalP",5,3,m_firstPosKal); - sc=m_tuple->addItem("firstMomKalP",5,m_firstMomKalP); - sc=m_tuple->addItem("firstMomKalPt",5,m_firstMomKalPt); - sc=m_tuple->addItem("pocaPosKal",5,3,m_pocaPosKal); - sc=m_tuple->addItem("pocaMomKal",5,3,m_pocaMomKal); - sc=m_tuple->addItem("pocaMomKalP",5,m_pocaMomKalP); - sc=m_tuple->addItem("pocaMomKalPt",5,m_pocaMomKalPt); - sc=m_tuple->addItem("chargeKal",5,m_chargeKal); - sc=m_tuple->addItem("nDofKal",5,m_nDofKal); - sc=m_tuple->addItem("chi2Kal",5,m_chi2Kal); - sc=m_tuple->addItem("isFitted",5,m_isFitted); - sc=m_tuple->addItem("isFitConverged",5,m_isFitConverged); - sc=m_tuple->addItem("isFitConvergedFully",5, - m_isFitConvergedFully); - sc=m_tuple->addItem("nHitFailedKal",5,m_nHitFailedKal); - sc=m_tuple->addItem("nHitFitted",5,m_nHitFitted); - sc=m_tuple->addItem("nDigi",m_nDigi); - sc=m_tuple->addItem("nHitMc",m_nHitMc); - sc=m_tuple->addItem("nHitKalInput",m_nHitKalInput); - sc=m_tuple->addItem("nHitWithFitInfo",5,m_nHitWithFitInfo); - sc=m_tuple->addItem("nSimDCHit",m_nSimDCHit,0,50000); - sc=m_tuple->addItem("mdcHitDriftT",m_nSimDCHit,m_mdcHitDriftT); - sc=m_tuple->addItem("mdcHitDriftDl",m_nSimDCHit,m_mdcHitDriftDl); - sc=m_tuple->addItem("mdcHitDriftDr",m_nSimDCHit,m_mdcHitDriftDr); - sc=m_tuple->addItem("mdcHitLr",m_nSimDCHit,m_mdcHitLr); - sc=m_tuple->addItem("mdcHitLayer",m_nSimDCHit,m_mdcHitLayer); - sc=m_tuple->addItem("mdcHitWire",m_nSimDCHit,m_mdcHitWire); - sc=m_tuple->addItem("mdcHitExpDoca",m_nSimDCHit,m_mdcHitExpDoca); - sc=m_tuple->addItem("mdcHitExpMcDoca",m_nSimDCHit,m_mdcHitExpMcDoca); - sc=m_tuple->addItem("mdcHitErr",m_nSimDCHit,m_mdcHitErr); - sc=m_tuple->addItem("time",5,m_time); - sc=m_tuple->addItem("mdcHitMcTkId",m_nSimDCHit,m_mdcHitMcTkId); - sc=m_tuple->addItem("mdcHitMcLr",m_nSimDCHit,m_mdcHitMcLr); - sc=m_tuple->addItem("mdcHitMcDrift",m_nSimDCHit,m_mdcHitMcDrift); - sc=m_tuple->addItem("mdcHitMcX",m_nSimDCHit,m_mdcHitMcX); - sc=m_tuple->addItem("mdcHitMcY",m_nSimDCHit,m_mdcHitMcY); - sc=m_tuple->addItem("mdcHitMcZ",m_nSimDCHit,m_mdcHitMcZ); - sc=m_tuple->addItem("mcPocaX",m_nSimDCHit,m_mdcHitExpMcPocaX); - sc=m_tuple->addItem("mcPocaY",m_nSimDCHit,m_mdcHitExpMcPocaY); - sc=m_tuple->addItem("mcPocaZ",m_nSimDCHit,m_mdcHitExpMcPocaZ); - sc=m_tuple->addItem("mcPocaWireX",m_nSimDCHit,m_mdcHitExpMcPocaWireX); - sc=m_tuple->addItem("mcPocaWireY",m_nSimDCHit,m_mdcHitExpMcPocaWireY); - sc=m_tuple->addItem("mcPocaWireZ",m_nSimDCHit,m_mdcHitExpMcPocaWireZ); - debug()<< "Book tuple RecGenfitAlgDC/genfit" << endmsg; - }else{ - error()<< "Cannot book tuple RecGenfitAlgDC/genfit" << endmsg; - } - }//end of book tuple - - //init genfit event display - //if(m_showDisplay) m_genfitDisplay = genfit::EventDisplay::getInstance(); - - return StatusCode::SUCCESS; -} - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -StatusCode RecGenfitAlgDC::execute() -{ - StatusCode sc; - m_timer=clock(); - info()<<"RecGenfitAlgDC in execute()"<<endmsg; - - /////retrieve EventHeader - //auto header = _headerCol.get()->at(0); - //int evtNo = header.getEventNumber(); - //int runNo = header.getRunNumber(); - - //std::cout<<"run "<<header.getEventNumber() - // <<" "<<header.getRunNumber()<<std::endl; - - ///retrieve Track and TrackHits - const edm4hep::TrackCollection* dcTrackCol=nullptr; - dcTrackCol=m_dcTrackCol.get(); - if(nullptr==dcTrackCol) { - debug()<<"TrackCollection not found"<<endmsg; - return StatusCode::SUCCESS; - } - const edm4hep::TrackerHitCollection* didiDCHitsCol=nullptr; - didiDCHitsCol=m_digiDCHitsCol.get(); - if(nullptr==didiDCHitsCol) { - debug()<<"DigiDCHitCollection not found"<<endmsg; - return StatusCode::SUCCESS; - } - ///retrieve DC Hit Association - auto assoDCHitsCol=m_dcHitAssociationCol.get(); - - edm4hep::ReconstructedParticleCollection* dcRecParticleCol= - m_dcRecParticleCol.createAndPut(); - - ///---------------------------------------------------- - ///Loop over Track and do fitting for each track - ///---------------------------------------------------- - debug()<<"DCTrackCol size="<<dcTrackCol->size()<<endmsg; - for(auto dcTrack: *dcTrackCol){ - ///Loop over 5 particle hypothesis(0-4): e,mu,pi,K,p - ///-1 for chargedgeantino - for(unsigned int pidType=0;pidType<m_nPDG;pidType++){ - if((m_debugPid>=0) && (m_debugPid!=pidType)) continue; - ///----------------------------------- - ///Create a GenFit track - ///----------------------------------- - GenfitTrack* genfitTrack=new GenfitTrack(m_genfitField, - m_gridDriftChamber); - genfitTrack->setDebug(m_debug); - double eventStartTime=0; - if(!genfitTrack->createGenfitTrackFromEDM4HepTrack(pidType,dcTrack, - eventStartTime)){ - debug()<<"createGenfitTrackFromEDM4HepTrack failed!"<<endmsg; - return StatusCode::SUCCESS; - } - if(m_useTruthHit){ - if(0==genfitTrack->addSimTrackerHits(dcTrack,assoDCHitsCol, - m_sigmaHit.value(),m_smearHit)){ - debug()<<"addSimTrackerHits failed!"<<endmsg; - return StatusCode::FAILURE; - } - }else{ - if(0==genfitTrack->addWireMeasurementOnTrack(dcTrack, - m_sigmaHit.value())){ - debug()<<"addWireMeasurementOnTrack failed!"<<endmsg; - return StatusCode::FAILURE; - } - } - if(m_debug) genfitTrack->printSeed(); - - ///----------------------------------- - ///call genfit fitting procedure - ///----------------------------------- - m_genfitFitter->processTrack(genfitTrack,m_resortHits); - m_genfitFitter->setDebug(m_debug); - - ///----------------------------------- - ///Store track - ///----------------------------------- - auto dcRecParticle=dcRecParticleCol->create(); - genfitTrack->storeTrack(dcRecParticle,pidType,m_ndfCut, - m_chi2Cut); - if(m_debug) genfitTrack->printSeed(); - - if(m_tuple) debugTrack(pidType,genfitTrack); - if(m_showDisplay) { - //m_genfitDisplay->addEvent(genfitTrack->getTrack()); - //m_genfitDisplay->open(); - }else{ - delete genfitTrack; - } - ++m_fitSuccess[pidType]; - }//end loop over particle type - }//end loop over a track - - if(m_tuple) debugEvent(); - - - //if(m_genfitDisplay) while(1){ - // std::cout<<"Press any key to finish..."<<std::endl; - // //system ("pause"); - //} - - if(m_tuple) sc=m_tuple->write(); - - return StatusCode::SUCCESS; -} - -// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - -StatusCode RecGenfitAlgDC::finalize() -{ - MsgStream log(msgSvc(), name()); - info()<< "RecGenfitAlgDC in finalize()" << endmsg; - - m_genfitFitter->writeHist(); - delete m_genfitFitter; - info()<<"RecGenfitAlgDC nRecTrack="<<m_nDCTrack<<" success e " - <<m_fitSuccess[0]<<" mu "<<m_fitSuccess[1]<<" pi "<<m_fitSuccess[2] - <<" K "<<m_fitSuccess[3]<<" p "<<m_fitSuccess[4]<<std::endl; - if(m_nDCTrack>0){ - std::cout<<"RecGenfitAlgDC Success rate = "<<std::endl; - for (int i=0;i<5;i++){ - std::cout<<Form("%d %2.2f",i,((float) m_fitSuccess[i])/m_nDCTrack) - <<std::endl; - } - } - return StatusCode::SUCCESS; -} - -void RecGenfitAlgDC::debugTrack(int pidType,const GenfitTrack* genfitTrack) -{ - /// Get fit status - const genfit::FitStatus* fitState = genfitTrack->getFitStatus(); - int charge= fitState->getCharge(); - - m_chargeKal[pidType]= charge; - m_nHitWithFitInfo[pidType]=genfitTrack->getNumPointsWithFittedInfo(); - m_chi2Kal[pidType]=fitState->getChi2(); - m_nDofKal[pidType]=fitState->getNdf(); - m_isFitted[pidType]=(int)fitState->isFitted(); - m_isFitConverged[pidType]=(int) fitState->isFitConverged(); - m_isFitConvergedFully[pidType]=(int) fitState->isFitConvergedFully(); - - ///get fitted state of track - TMatrixDSym fittedCov; - TLorentzVector fittedPos; - TVector3 fittedMom; - int fittedState=genfitTrack->getFittedState(fittedPos,fittedMom,fittedCov); - HelixClass helix;//mm and GeV - float pos[3]={float(fittedPos.X()/dd4hep::mm),float(fittedPos.Y()/dd4hep::mm), - float(fittedPos.Z()/dd4hep::mm)}; - float mom[3]={float(fittedMom.X()),float(fittedMom.Y()),float(fittedMom.Z())}; - helix.Initialize_VP(pos,mom,charge,m_genfitField->getBz(fittedPos.Vect())); - m_pocaMomKalP[pidType]=fittedMom.Mag(); - - if(m_debug>0){ - /// Get fit status - debug()<<"evt "<<m_evt<<" fit result: get status OK? pidType " - <<pidType<<" fittedState "<<fittedState<<" isFitted " - <<m_isFitted[pidType]<<" isConverged "<<m_isFitConverged[pidType] - <<" isFitConvergedFully "<<m_isFitConvergedFully[pidType] - <<" ndf "<<m_nDofKal[pidType] - <<" chi2 "<<m_chi2Kal[pidType]<<endmsg; - if((0!=fittedState)||(!m_isFitted[pidType])||(m_nDofKal[pidType]<m_ndfCut)){ - debug()<<"fitting failed"<<endmsg; - }else{ - debug()<<"evt "<<m_evt<<" fit result: Pos("<< - fittedPos.X()<<" "<< - fittedPos.Y()<<" "<< - fittedPos.Z()<<") mom("<< - fittedMom.X()<<" "<< - fittedMom.Y()<<" "<< - fittedMom.Z()<<") p_tot "<< - fittedMom.Mag()<<" pt "<< - fittedMom.Perp()<<endmsg; - } - } - -} - -void RecGenfitAlgDC::debugEvent() -{ - const edm4hep::MCParticleCollection* mcParticleCol = nullptr; - const edm4hep::SimTrackerHitCollection* simDCHitCol=nullptr; - - m_pidIndex=5; - - mcParticleCol=m_mcParticleCol.get(); - simDCHitCol=m_simDCHitCol.get(); - m_nSimDCHit=simDCHitCol->size(); - int iHit=0; - for(auto simDCHit: *simDCHitCol){ - edm4hep::Vector3d pos=simDCHit.getPosition(); - TVectorD p(3); - p[0]=pos.x;//no unit conversion here - p[1]=pos.y; - p[2]=pos.z; - m_mdcHitMcX[iHit]=pos.x; - m_mdcHitMcY[iHit]=pos.y; - m_mdcHitMcZ[iHit]=pos.z; - iHit++; - } - m_mcIndex=iHit; - int iMcParticle=0; - for(auto mcParticle : *mcParticleCol){ - const auto& mcPocaMom = mcParticle.getMomentum();//GeV - float px=mcPocaMom.x; - float py=mcPocaMom.y; - float pz=mcPocaMom.z; - debug()<<" "<<px<<" "<<py<<" "<<pz<<endmsg; - m_pocaMomMcP[iMcParticle]=sqrt(px*px+py*py+pz*pz); - iMcParticle++; - } - -} diff --git a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.h b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.h deleted file mode 100644 index 14922bc6..00000000 --- a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgDC.h +++ /dev/null @@ -1,190 +0,0 @@ -////////////////////////////////////////////////////////////////////// -/// -/// This is an algorithm for track fitting for CEPC track with genfit. -/// -/// In this file, including: -/// An algorithm for drift chamber track fitting with genfit with 5 hypothesis -/// -/// Units are following DD4hepUnits -/// -/// Authors: -/// Yao ZHANG(zhangyao@ihep.ac.cn) -/// -///////////////////////////////////////////////////////////////////// - -#ifndef RECGENFITALG_RECGENFITALGDC_H -#define RECGENFITALG_RECGENFITALGDC_H - -#include "GaudiAlg/GaudiAlgorithm.h" -#include "GaudiKernel/NTuple.h" -#include "k4FWCore/DataHandle.h" -#include "DD4hep/Fields.h" -#include <string> - -class GenfitFitter; -class GenfitField; -class GenfitTrack; -class IGeomSvc; -class time; -namespace genfit{ - class EventDisplay; -} -namespace dd4hep { - class Detector; - //class rec::CellIDPositionConverter; - namespace DDSegmentation{ - class GridDriftChamber; - class BitFieldCoder; - } -} -namespace edm4hep{ - class EventHeaderCollection; - class MCParticleCollection; - class SimTrackerHitCollection; - class TrackCollection; - class TrackerHitCollection; - class MCRecoTrackerAssociationCollection; - class ReconstructedParticle; - class ReconstructedParticleCollection; -} - -///////////////////////////////////////////////////////////////////////////// - -class RecGenfitAlgDC:public GaudiAlgorithm { - public: - RecGenfitAlgDC (const std::string& name, ISvcLocator* pSvcLocator); - StatusCode initialize() override; - StatusCode execute() override; - StatusCode finalize() override; - - private: - GenfitFitter* m_genfitFitter;//The pointer to a GenfitFitter - const GenfitField* m_genfitField;//The pointer to a GenfitField - - void debugTrack(int pidType,const GenfitTrack* genfitTrack); - void debugEvent(); - - DataHandle<edm4hep::EventHeaderCollection> _headerCol{ - "EventHeaderCol", Gaudi::DataHandle::Reader, this}; - //Drift chamber rec hit and trac - DataHandle<edm4hep::TrackerHitCollection> m_digiDCHitsCol{ - "DigiDCHitCollection", Gaudi::DataHandle::Reader, this}; - DataHandle<edm4hep::TrackCollection> m_dcTrackCol{ - "DCTrackCollection", Gaudi::DataHandle::Reader, this}; - //Mc truth - DataHandle<edm4hep::MCParticleCollection> m_mcParticleCol{ - "MCParticle", Gaudi::DataHandle::Reader, this}; - DataHandle<edm4hep::SimTrackerHitCollection> m_simDCHitCol{ - "DriftChamberHitsCollection" , Gaudi::DataHandle::Reader, this}; - - DataHandle<edm4hep::MCRecoTrackerAssociationCollection> - m_dcHitAssociationCol{"DCHitAssociationCollection", - Gaudi::DataHandle::Reader, this}; - //output hits and particles - DataHandle<edm4hep::TrackerHitCollection> m_dcFitRecHitCol{ - "DCFitRecHitsCollection", Gaudi::DataHandle::Writer, this}; - DataHandle<edm4hep::ReconstructedParticleCollection> m_dcRecParticleCol{ - "DCRecParticleCollection", Gaudi::DataHandle::Writer, this}; - - const unsigned int m_nPDG;//5:e,mu,pi,K,proton - SmartIF<IGeomSvc> m_geomSvc; - dd4hep::OverlayedField m_dd4hepField; - dd4hep::Detector* m_dd4hep; - dd4hep::DDSegmentation::GridDriftChamber* m_gridDriftChamber; - dd4hep::DDSegmentation::BitFieldCoder* m_decoder; - Gaudi::Property<std::string> m_readout_name{this, - "readout", "DriftChamberHitsCollection"}; - Gaudi::Property<int> m_debug{this,"debug",false}; - Gaudi::Property<bool> m_smearHit{this,"smearHit",true}; - Gaudi::Property<float> m_sigmaHit{this,"sigmaHit",0.11};//mm - Gaudi::Property<float> m_nSigmaHit{this,"nSigmaHit",5}; - Gaudi::Property<double> m_initCovResPos{this,"initCovResPos",1}; - Gaudi::Property<double> m_initCovResMom{this,"initCovResMom",0.1}; - //Fitter type default is DAFRef. - //Candidates are DAF,DAFRef,KalmanFitter and KalmanFitterRefTrack. - Gaudi::Property<std::string> m_fitterType{this,"fitterTyep","DAFRef"}; - Gaudi::Property<bool> m_correctBremsstrahlung{this, - "correctBremsstrahlung",false}; - Gaudi::Property<bool> m_noMaterialEffects{this, - "noMaterialEffects",false}; - Gaudi::Property<int> m_maxIteration{this,"maxIteration",20}; - Gaudi::Property<int> m_resortHits{this,"resortHits",true}; - Gaudi::Property<double> m_bStart{this,"bStart",100}; - Gaudi::Property<double> m_bFinal{this,"bFinal",0.01}; - Gaudi::Property<double> m_dcCornerCuts{this,"dcCornerCuts",-999}; - Gaudi::Property<double> m_ndfCut{this,"ndfCut",1}; - Gaudi::Property<double> m_chi2Cut{this,"chi2Cut",1000}; - //-1,chargedGeantino;0,1,2,3,4:e,mu,pi,K,proton - Gaudi::Property<int> m_debugPid{this,"debugPid",-99}; - Gaudi::Property<bool> m_useTruthTrack{this,"useTruthTrack",true}; - Gaudi::Property<bool> m_useTruthHit{this,"useTruthHit",true}; - Gaudi::Property<std::string> m_genfitHistRootName{this, - "genfitHistRootName",""}; - Gaudi::Property<bool> m_showDisplay{this,"showDisplay",false}; - int m_fitSuccess[5]; - int m_nDCTrack; - //bool m_useRecLRAmbig; - - genfit::EventDisplay* m_genfitDisplay; - clock_t m_timer; - - /// tuples - NTuple::Tuple* m_tuple; - NTuple::Item<int> m_run; - NTuple::Item<int> m_evt; - NTuple::Item<int> m_tkId; - NTuple::Item<int> m_mcIndex;//number of navigated mcParicle - NTuple::Matrix<double> m_truthPocaMc;//2 dim matched particle and 3 pos. - NTuple::Matrix<double> m_pocaPosMc;//2 dim matched particle and 3 pos. - NTuple::Matrix<double> m_pocaMomMc;//2 dim matched particle and 3 mom. - NTuple::Array<double> m_pocaMomMcP;//2 dim matched particle and p - NTuple::Array<double> m_pocaMomMcPt;//2 dim matched particle and pt - NTuple::Array<double> m_pocaPosMdc;//pos 0:x,1:y,2:z - NTuple::Array<double> m_pocaMomMdc;//mom. 0:px,1:py,2:pz - NTuple::Item<int> m_pidIndex; - NTuple::Matrix<double> m_firstPosKal;//5 hyposis and pos. at first - NTuple::Array<double> m_firstMomKalP;//5 hyposis and mom. at first - NTuple::Array<double> m_firstMomKalPt;//5 hyposis and mom. at first - NTuple::Matrix<double> m_pocaPosKal;//5 hyposis and 3 mom. - NTuple::Matrix<double> m_pocaMomKal;//5 hyposis and 3 mom. - NTuple::Array<double> m_pocaMomKalP;//5 hyposis and p - NTuple::Array<double> m_pocaMomKalPt;//5 hyposis and pt - NTuple::Array<int> m_chargeKal; - NTuple::Array<double> m_chi2Kal; - NTuple::Array<double> m_nDofKal; - NTuple::Array<int> m_isFitConverged; - NTuple::Array<int> m_isFitConvergedFully; - NTuple::Array<int> m_isFitted; - NTuple::Item<int> m_nDigi; - NTuple::Item<int> m_nHitMc; - NTuple::Item<int> m_nSimDCHit; - NTuple::Array<int> m_nHitWithFitInfo; - NTuple::Item<int> m_nHitKalInput; - NTuple::Array<double> m_mdcHitDriftT; - NTuple::Array<double> m_mdcHitDriftDl; - NTuple::Array<double> m_mdcHitDriftDr; - NTuple::Array<int> m_mdcHitLr; - NTuple::Array<int> m_mdcHitLayer; - NTuple::Array<int> m_mdcHitWire; - NTuple::Array<double> m_mdcHitExpDoca; - NTuple::Array<double> m_mdcHitExpMcDoca; - NTuple::Array<double> m_mdcHitErr; - NTuple::Array<int> m_nHitFailedKal; - NTuple::Array<int> m_nHitFitted; - NTuple::Array<double> m_time; - //truth - NTuple::Array<int> m_mdcHitMcLr; - NTuple::Array<int> m_mdcHitMcTkId; - NTuple::Array<double> m_mdcHitMcDrift; - NTuple::Array<double> m_mdcHitMcX; - NTuple::Array<double> m_mdcHitMcY; - NTuple::Array<double> m_mdcHitMcZ; - NTuple::Array<double> m_mdcHitExpMcPocaX; - NTuple::Array<double> m_mdcHitExpMcPocaY; - NTuple::Array<double> m_mdcHitExpMcPocaZ; - NTuple::Array<double> m_mdcHitExpMcPocaWireX; - NTuple::Array<double> m_mdcHitExpMcPocaWireY; - NTuple::Array<double> m_mdcHitExpMcPocaWireZ; - -}; -#endif diff --git a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.cpp b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.cpp index c15dee5e..f83653a9 100644 --- a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.cpp +++ b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.cpp @@ -35,6 +35,12 @@ #include "TRandom.h" #include "TLorentzVector.h" +//DD4hep +#include "DD4hep/DetElement.h" +#include "DDRec/DetectorData.h" +#include "DD4hep/DD4hepUnits.h" +#include "CLHEP/Units/SystemOfUnits.h" + //stl #include <chrono> #include "time.h" @@ -62,10 +68,14 @@ DECLARE_COMPONENT( RecGenfitAlgSDT ) "Handle of the input MCParticle collection"); declareProperty("DigiDCHitCollection", m_DCDigiCol, "Handle of DC digi(TrakerHit) collection"); + declareProperty("SignalDigiDCHitCollection", m_SignalDCDigiCol, + "Handle of Signal DC digi(TrakerHit) collection"); declareProperty("DCHitAssociationCollection", m_DCHitAssociationCol, "Handle of DCsimTrackerHit and DCTrackerHit association collection"); declareProperty("SDTTrackCollection", m_SDTTrackCol, "Handle of input silicon track collection"); + declareProperty("SDTTrackFindCollection", m_SDTTrackFindCol, + "Handle of input silicon track finding collection"); declareProperty("SDTRecTrackCollection",m_SDTRecTrackCol, "Handle of input silicon rec. track collection"); declareProperty("DCTrackCollection", m_dcTrackCol, @@ -74,22 +84,21 @@ DECLARE_COMPONENT( RecGenfitAlgSDT ) "Handle of silicon+drift chamber rec. particle collection"); declareProperty("SimTrackerHitCollection",m_simVXDHitCol, - "Handle of the VXDsimTrackerHit collection"); + "Handle of the VXDsimTrackerHit collection"); declareProperty("SimTrackerHitCollection",m_simSETHitCol, - "Handle of the SETsimTrackerHit collection"); + "Handle of the SETsimTrackerHit collection"); + declareProperty("TrackerHitCollection",m_SETHitCol, + "Handle of the SETTrackerHit collection"); + declareProperty("MCRecoTrackerAssociationCollection",m_SETHitAssociationCol, + "Handle of the SETTrackerHitAssociation collection"); declareProperty("SimTrackerHitCollection",m_simSITHitCol, - "Handle of the SITsimTrackerHit collection"); + "Handle of the SITsimTrackerHit collection"); declareProperty("SimTrackerHitCollection",m_simFTDHitCol, - "Handle of the FTDsimTrackerHit collection"); + "Handle of the FTDsimTrackerHit collection"); declareProperty("SimTrackerHitCollection",m_simDCHitCol, - "Handle of the DCsimTrackerHit collection"); + "Handle of the DCsimTrackerHit collection"); declareProperty("SimTrackerHitCollection",m_simVXDHitCol, "Handle of the VXDsimTrackerHit collection"); - declareProperty("NoiseDCHitAssociationCollection",r_NoiseAssociationCol, - "Handle of the DCSimTrackerHits and Noise TrackerHit collection"); - - declareProperty("SmearDCHitAssociationCollection", r_SmearAssociationCol, - "Handle of output smear simulationhit and TrackerHit collection"); declareProperty("DCTrackFindingHitCollection", m_DCTrackFindingCol, "Handle of output TrackFinding TrackerHit collection"); @@ -125,7 +134,6 @@ StatusCode RecGenfitAlgSDT::initialize() m_skipWireMaterial); m_genfitFitter->setEnergyLossBrems(m_correctBremsstrahlung); m_genfitFitter->setNoiseBrems(m_correctBremsstrahlung); - //genfit::eMultipleMeasurementHandling(m_multipleMeasurementHandling.value())); if(m_debug>10) m_genfitFitter->setDebug(m_debug-10); if(m_noMaterialEffects) m_genfitFitter->setNoEffects(true); if(-1==m_debugPid) m_genfitFitter->setNoEffects(true); @@ -196,9 +204,6 @@ StatusCode RecGenfitAlgSDT::initialize() sc=m_tuple->addItem("pocaPosMdc",m_mcIndex,m_pocaPosMdc,3); sc=m_tuple->addItem("pocaMomMdc",m_mcIndex,m_pocaMomMdc,3); sc=m_tuple->addItem("index",m_pidIndex, 0, 5); - //sc=m_tuple->addItem("firstPosKalP",5,3,m_firstPosKal); - //sc=m_tuple->addItem("firstMomKalP",5,m_firstMomKalP); - //sc=m_tuple->addItem("firstMomKalPt",5,m_firstMomKalPt); sc=m_tuple->addItem("ErrorcovMatrix6",m_mcIndex,m_ErrorcovMatrix6,6); sc=m_tuple->addItem("McErrCov",m_mcIndex,m_McErrCov,6); @@ -210,6 +215,10 @@ StatusCode RecGenfitAlgSDT::initialize() sc=m_tuple->addItem("momy",m_mcIndex,m_momy); sc=m_tuple->addItem("momz",m_mcIndex,m_momz); + sc=m_tuple->addItem("fittedXc",m_mcIndex,m_fittedXc); + sc=m_tuple->addItem("fittedYc",m_mcIndex,m_fittedYc); + sc=m_tuple->addItem("fittedR",m_mcIndex,m_fittedR); + sc=m_tuple->addItem("PosMcX",m_mcIndex,m_PosMcX); sc=m_tuple->addItem("PosMcY",m_mcIndex,m_PosMcY); sc=m_tuple->addItem("PosMcZ",m_mcIndex,m_PosMcZ); @@ -235,6 +244,10 @@ StatusCode RecGenfitAlgSDT::initialize() sc=m_tuple->addItem("Z0",m_mcIndex,m_Z0); sc=m_tuple->addItem("tanLambda",m_mcIndex,m_tanLambda); + sc=m_tuple->addItem("trackXc",m_mcIndex,m_trackXc); + sc=m_tuple->addItem("trackYc",m_mcIndex,m_trackYc); + sc=m_tuple->addItem("trackR",m_mcIndex,m_trackR); + sc=m_tuple->addItem("ErrorcovMatrix_Origin",m_mcIndex,m_ErrorcovMatrix_Origin,15); sc=m_tuple->addItem("D0_Origin",m_mcIndex,m_D0_Origin); sc=m_tuple->addItem("phi_Origin",m_mcIndex,m_phi_Origin); @@ -248,6 +261,10 @@ StatusCode RecGenfitAlgSDT::initialize() sc=m_tuple->addItem("mcP_Z0",m_mcIndex,mcP_Z0); sc=m_tuple->addItem("mcP_tanLambda",m_mcIndex,mcP_tanLambda); + sc=m_tuple->addItem("mcP_Xc",m_mcIndex,mcP_Xc); + sc=m_tuple->addItem("mcP_Yc",m_mcIndex,mcP_Yc); + sc=m_tuple->addItem("mcP_R",m_mcIndex,mcP_R); + sc=m_tuple->addItem("pocaPosKal",5,3,m_pocaPosKal); sc=m_tuple->addItem("pocaMomKal",5,3,m_pocaMomKal); sc=m_tuple->addItem("pocaMomKalP",m_mcIndex,m_pocaMomKalP,5); @@ -256,6 +273,10 @@ StatusCode RecGenfitAlgSDT::initialize() sc=m_tuple->addItem("nDofKal",m_mcIndex,m_nDofKal,5); sc=m_tuple->addItem("chi2Kal",m_mcIndex,m_chi2Kal,5); sc=m_tuple->addItem("isFitted",m_mcIndex,m_isFitted,5); + sc=m_tuple->addItem("PDG",m_mcIndex,m_PDG); + sc=m_tuple->addItem("numDCOnTrack",m_mcIndex,m_numDCOnTrack); + sc=m_tuple->addItem("salDCHits",m_mcIndex,m_salDCHits); + sc=m_tuple->addItem("DCHitsCol",m_mcIndex,m_DCHitsCol); sc=m_tuple->addItem("isFitConverged",m_mcIndex,m_isFitConverged,5); sc=m_tuple->addItem("isFitConvergedFully",m_mcIndex, m_isFitConvergedFully,5); @@ -263,33 +284,11 @@ StatusCode RecGenfitAlgSDT::initialize() sc=m_tuple->addItem("nHitFailedKal",m_mcIndex,m_nHitFailedKal,5); sc=m_tuple->addItem("nHitFitted",m_mcIndex,m_nHitFitted,5); sc=m_tuple->addItem("nDCDigi",m_nDCDigi,0,50000); - sc=m_tuple->addItem("nTruthDCDigi",m_nTruthDCDigi,0,50000); + sc=m_tuple->addItem("nSignalDCDigi",m_nSignalDCDigi,0,50000); sc=m_tuple->addItem("nHitKalInput",m_nHitKalInput,0,300000); //10 is greater than # of tracking detectors sc=m_tuple->addItem("hitDetID",10,m_nHitDetType); sc=m_tuple->addItem("nHitWithFitInfo",m_mcIndex,m_nHitWithFitInfo,5); - sc=m_tuple->addItem("nSimDCHit",m_nSimDCHit,0,10000000); - sc=m_tuple->addItem("mdcHitDriftT",m_nSimDCHit,m_mdcHitDriftT); - sc=m_tuple->addItem("mdcHitDriftDl",m_nSimDCHit,m_mdcHitDriftDl); - sc=m_tuple->addItem("mdcHitDriftDr",m_nSimDCHit,m_mdcHitDriftDr); - sc=m_tuple->addItem("mdcHitLr",m_nSimDCHit,m_mdcHitLr); - sc=m_tuple->addItem("mdcHitLayer",m_nSimDCHit,m_mdcHitLayer); - sc=m_tuple->addItem("mdcHitWire",m_nSimDCHit,m_mdcHitWire); - sc=m_tuple->addItem("mdcHitExpDoca",m_nSimDCHit,m_mdcHitExpDoca); - sc=m_tuple->addItem("mdcHitExpMcDoca",m_nSimDCHit,m_mdcHitExpMcDoca); - sc=m_tuple->addItem("mdcHitErr",m_nSimDCHit,m_mdcHitErr); - sc=m_tuple->addItem("exeTime",m_exeTime); - sc=m_tuple->addItem("mdcHitMcTkId",m_nSimDCHit,m_mdcHitMcTkId); - sc=m_tuple->addItem("mdcHitMcLr",m_nSimDCHit,m_mdcHitMcLr); - sc=m_tuple->addItem("mdcHitMcDrift",m_nSimDCHit,m_mdcHitMcDrift); - sc=m_tuple->addItem("mdcHitMcX",m_nSimDCHit,m_mdcHitMcX); - sc=m_tuple->addItem("mdcHitMcY",m_nSimDCHit,m_mdcHitMcY); - sc=m_tuple->addItem("mdcHitMcZ",m_nSimDCHit,m_mdcHitMcZ); - sc=m_tuple->addItem("mcPocaX",m_nSimDCHit,m_mdcHitExpMcPocaX); - sc=m_tuple->addItem("mcPocaY",m_nSimDCHit,m_mdcHitExpMcPocaY); - sc=m_tuple->addItem("mcPocaZ",m_nSimDCHit,m_mdcHitExpMcPocaZ); - sc=m_tuple->addItem("mcPocaWireY",m_nSimDCHit,m_mdcHitExpMcPocaWireY); - sc=m_tuple->addItem("mcPocaWireZ",m_nSimDCHit,m_mdcHitExpMcPocaWireZ); sc=m_tuple->addItem("dcDigiChamber",m_nDCDigi,m_dcDigiChamber); sc=m_tuple->addItem("dcDigiLayer",m_nDCDigi,m_dcDigiLayer); @@ -311,6 +310,8 @@ StatusCode RecGenfitAlgSDT::initialize() sc=m_tuple->addItem("dcDigiMcPosX",m_nDCDigi,m_dcDigiMcPosX); sc=m_tuple->addItem("dcDigiMcPosY",m_nDCDigi,m_dcDigiMcPosY); sc=m_tuple->addItem("dcDigiMcPosZ",m_nDCDigi,m_dcDigiMcPosZ); + sc=m_tuple->addItem("docaTrack",m_nDCDigi,m_docaTrack); + sc=m_tuple->addItem("isNoise",m_nDCDigi,m_isNoise); sc=m_tuple->addItem("firstMomMc",m_firstMomMc); sc=m_tuple->addItem("dcDigiDocaExt",m_nDCDigi,m_dcDigiDocaExt); @@ -318,17 +319,9 @@ StatusCode RecGenfitAlgSDT::initialize() sc=m_tuple->addItem("dcDigiPocaExtY",m_nDCDigi,m_dcDigiPocaExtY); sc=m_tuple->addItem("dcDigiPocaExtZ",m_nDCDigi,m_dcDigiPocaExtZ); - sc=m_tuple->addItem("nTrackerHitDC",m_nTrackerHitDC,0,1000); - sc=m_tuple->addItem("trackLength",m_nTrackerHitDC,m_trackLength); - sc=m_tuple->addItem("hitMomEdep",m_nTrackerHitDC,m_hitMomEdep); - sc=m_tuple->addItem("truthMomedep",m_nTrackerHitDC,m_truthMomEdep); - sc=m_tuple->addItem("driftDis",m_nTrackerHitDC,m_driftDis); - sc=m_tuple->addItem("FittedDoca",m_nTrackerHitDC,m_FittedDoca); - sc=m_tuple->addItem("truthDoca",m_nTrackerHitDC,m_truthDoca); - sc=m_tuple->addItem("Res",m_nTrackerHitDC,m_Res); - sc=m_tuple->addItem("truthRes",m_nTrackerHitDC,m_truthRes); - sc=m_tuple->addItem("nTrackerHitSDT",m_nTrackerHitSDT); - sc=m_tuple->addItem("nGenFitTrackerHit",m_nGenFitTrackerHit); + sc=m_tuple->addItem("nTrackerHitDC",100,m_nTrackerHitDC); + sc=m_tuple->addItem("nTrackerFitHitDC",100,m_nTrackerFitHitDC); + sc=m_tuple->addItem("nTrackerHitSDT",100,m_nTrackerHitSDT); debug()<< "Book tuple RecGenfitAlgSDT/recGenfitAlgSDT" << endmsg; }else{ warning()<<"Tuple RecGenfitAlgSDT/recGenfitAlgSDT not booked"<<endmsg; @@ -355,19 +348,21 @@ StatusCode RecGenfitAlgSDT::execute() StatusCode sc=StatusCode::SUCCESS; - std::cout<<" RecGenfitAlgSDT execute eventNo "<<m_eventNo<<std::endl; if(m_debug&&(abs(m_eventNoSelection)<1e8)&&m_eventNo!=m_eventNoSelection){ ++m_eventNo; return sc; } - ++m_eventNo; std::chrono::time_point<std::chrono::high_resolution_clock> start; if(m_tuple) start=std::chrono::high_resolution_clock::now(); ///retrieve silicon Track and TrackHits const edm4hep::TrackCollection* sdtTrackCol=nullptr; - if(m_SDTTrackCol.exist())sdtTrackCol=m_SDTTrackCol.get(); + if(!m_useTrackFinding){ + if(m_SDTTrackCol.exist())sdtTrackCol=m_SDTTrackCol.get(); + } else { + if(m_SDTTrackFindCol.exist())sdtTrackCol=m_SDTTrackFindCol.get(); + } if(nullptr==sdtTrackCol || sdtTrackCol->size()<=0) { debug()<<"TrackCollection not found or sdtTrackCol size=0"<<endmsg; return StatusCode::SUCCESS; @@ -387,18 +382,21 @@ StatusCode RecGenfitAlgSDT::execute() } const edm4hep::MCParticleCollection* mcParticleCol=nullptr; mcParticleCol=m_mcParticleCol.get();//FIXME get error when call exist() - std::cout << " MCParticleCol size = " << mcParticleCol->size() << std::endl; if(nullptr==mcParticleCol){ debug()<<"MCParticleCollection not found"<<endmsg; return StatusCode::SUCCESS; } + + //SET SimTrackerHits + const edm4hep::TrackerHitCollection* SETHits = m_SETHitCol.get(); + ///---------------------------------------------------- ///Loop over Track and do fitting for each track ///---------------------------------------------------- m_firstTuple=true; debug()<<"SDTTrackCol size="<<sdtTrackCol->size()<<endmsg; int iSdtTrack = 0; - int nFittedSDT,nFittedDC,ngenfitHit; + int nDC,nSDT,nFittedSDT,nFittedDC,ngenfitHit; std::vector<double> trackL; std::vector<double> hitMom; std::vector<float> truthMomEdep; @@ -407,16 +405,31 @@ StatusCode RecGenfitAlgSDT::execute() std::vector<double> truthDoca; std::vector<double> Res; std::vector<double> truthRes; + std::vector<int> isRecNoise; + std::vector<int> isRecFitNoise; + std::vector<int> layerFit; + std::vector<int> wireIDFit; + std::vector<int> layerIDRec; + std::vector<int> wireIDRec; + std::vector<double> extrapoLen; + + std::vector<double> docaTrack; + std::vector<int> isNoise; for(auto sdtTrack: *sdtTrackCol) { if(sdtTrack.trackerHits_size()<1e-9) continue; + + //------------------------------------ + //Add SET hit + //------------------------------------ + if(m_addSET) addSETHitsToTk(sdtTrack,m_SETHitAssociationCol.get(),SETHits); + ///Loop over 5 particle hypothesis(0-4): e,mu,pi,K,p ///-1 for chargedgeantino for(unsigned int pidType=0;pidType<m_nPDG;pidType++) { if((m_debugPid>=0) && (m_debugPid!=pidType)) continue; debug()<<"processing pidType "<<pidType<<endmsg; - std::cout<<"processing pidType "<<pidType<<std::endl; ///----------------------------------- ///Create a GenFit track ///----------------------------------- @@ -430,7 +443,6 @@ StatusCode RecGenfitAlgSDT::execute() delete genfitTrack; continue; } - //} ///----------------------------------- ///Add hits on track @@ -460,15 +472,9 @@ StatusCode RecGenfitAlgSDT::execute() std::vector<edm4hep::TrackerHit*> tmp; selectedHits.swap(tmp); }else{ - if(m_useNoiseDCHit){ - nHitAdded+=genfitTrack->addWireMeasurementsOnTrack(sdtTrack, - m_sigmaHitU[0],r_NoiseAssociationCol.get(),m_sortMethod,m_truthAmbig, - m_skipCorner,m_skipNear);//mm - } else { - nHitAdded+=genfitTrack->addWireMeasurementsOnTrack(sdtTrack, - m_sigmaHitU[0],r_SmearAssociationCol.get(),m_sortMethod,m_truthAmbig, - m_skipCorner,m_skipNear);//mm - } + nHitAdded+=genfitTrack->addWireMeasurementsOnTrack(sdtTrack, + m_sigmaHitU[0],assoDCHitsCol,m_sortMethod,m_truthAmbig, + m_skipCorner,m_skipNear);//mm } } @@ -488,6 +494,36 @@ StatusCode RecGenfitAlgSDT::execute() m_genfitFitter->setDebugGenfit(m_debugGenfit); m_genfitFitter->processTrack(genfitTrack,m_resortHits.value()); + //------ + //salvage hits + //single particle + //------ + int nAddHits = 0; + int pdg = genfitTrack->getPDG(); + m_PDG[iSdtTrack] = pdg; + int numDC; + + if(m_useSalHits){ + nAddHits = genfitTrack->salvageHits(pdg,mcParticleCol,dCDigiCol, + assoDCHitsCol,m_sigmaHitU[0],m_truthAmbig,m_skipCorner,m_skipNear, + m_extraCut,m_extraDocaCut,docaTrack,isNoise,numDC); + bool status = genfitTrack->sortedHitOnTrack(pdg); + m_genfitFitter->processTrackWithRep(genfitTrack,0,m_resortHits); + + int iFiter =0; + int dcFitNum; + while(iFiter<m_iterFit){ + double chi2Fit = genfitTrack->checkGenfitTrack(dcFitNum); + if(chi2Fit<m_chi2FitCut && dcFitNum > m_dcFitNum) break; + m_genfitFitter->processTrackWithRep(genfitTrack,0,m_resortHits); + iFiter++; + } + } + + m_numDCOnTrack[iSdtTrack] = numDC; + m_salDCHits[iSdtTrack] = nAddHits; + m_DCHitsCol[iSdtTrack] = dCDigiCol->size(); + ///----------------------------------- ///Store track ///----------------------------------- @@ -499,9 +535,10 @@ StatusCode RecGenfitAlgSDT::execute() edm4hep::TrackState pocaToOrigin_trackState; if(!genfitTrack->storeTrack(dcRecParticle,dcRecTrack, pocaToOrigin_pos,pocaToOrigin_mom,pocaToOrigin_cov, - pidType,m_ndfCut,m_chi2Cut,nFittedDC,nFittedSDT, + pidType,m_ndfCut,m_chi2Cut,nDC,nSDT,nFittedDC,nFittedSDT, ngenfitHit,trackL,hitMom,truthMomEdep,assoDCHitsCol, - driftDis,FittedDoca,truthDoca,Res,truthRes)){ + driftDis,FittedDoca,truthDoca,Res,truthRes,isRecNoise,isRecFitNoise, + layerFit,wireIDFit,layerIDRec,wireIDRec,extrapoLen)){ debug()<<"Fitting failed!"<<std::endl; }else{ ++m_fitSuccess[pidType]; @@ -520,31 +557,25 @@ StatusCode RecGenfitAlgSDT::execute() delete genfitTrack; } }//end loop over particle type + if(m_tuple) { + m_nTrackerHitDC[iSdtTrack] = nDC; + m_nTrackerFitHitDC[iSdtTrack] = nFittedDC; + m_nTrackerHitSDT[iSdtTrack] = nSDT; + } ++iSdtTrack; }//end loop over a track m_nRecTrack++; - + if(m_tuple) { - m_nTrackerHitDC = nFittedDC; - m_nTrackerHitSDT = nFittedSDT; - m_nGenFitTrackerHit = ngenfitHit; - for(int i=0;i<trackL.size();i++) m_trackLength[i] = trackL[i]; - for(int i=0;i<hitMom.size();i++) m_hitMomEdep[i] = hitMom[i]; - for(int i=0;i<truthMomEdep.size();i++) m_truthMomEdep[i] = truthMomEdep[i]; - for(int i=0;i<driftDis.size();i++) m_driftDis[i] = driftDis[i]; - for(int i=0;i<FittedDoca.size();i++) m_FittedDoca[i] = FittedDoca[i]; - for(int i=0;i<truthDoca.size();i++) m_truthDoca[i] = truthDoca[i]; - for(int i=0;i<Res.size();i++) m_Res[i] = Res[i]; - for(int i=0;i<truthRes.size();i++) m_truthRes[i] = truthRes[i]; auto finish = std::chrono::high_resolution_clock::now(); std::chrono::duration<double> elapsed = finish - start; debug() << "Elapsed time: " << elapsed.count() << " s"<<endmsg; - m_exeTime=elapsed.count(); debugEvent(sdtTrackCol,sdtRecTrackCol,eventStartTime,nFittedSDT); } - + if(m_tuple) sc=m_tuple->write(); - + + ++m_eventNo; return StatusCode::SUCCESS; } @@ -657,6 +688,7 @@ void RecGenfitAlgSDT::debugTrack(int iStrack,int pidType,const GenfitTrack* genf helix.Initialize_VP(pos,mom,charge,m_genfitField->getBz(fittedPos.Vect())/GenfitUnit::tesla); helix_origin.Initialize_VP(pocaToOrigin_Pos,pocaToOrigin_Mom,charge,m_genfitField->getBz(pocaToOrigin_POS.Vect())/GenfitUnit::tesla); m_pocaMomKalP[iStrack][pidType]=fittedMom.Mag(); + m_pocaMomKalPt[iStrack][pidType]=fittedMom.Perp(); TMatrixDSym covMatrix_6=pocaToOrigin_cov; for(int i=0;i<5;i++){ @@ -681,6 +713,10 @@ void RecGenfitAlgSDT::debugTrack(int iStrack,int pidType,const GenfitTrack* genf m_Z0_Origin[iStrack] = helix_origin.getZ0(); m_tanLambda_Origin[iStrack] = helix_origin.getTanLambda(); + m_fittedXc[iStrack] = helix.getXC(); + m_fittedYc[iStrack] = helix.getYC(); + m_fittedR[iStrack] = helix.getRadius(); + m_evt=m_eventNo; /// Get fit status if((0!=fittedState)||(!m_isFitted[pidType])||(m_nDofKal[iStrack][pidType]>m_ndfCut)){ @@ -779,6 +815,10 @@ void RecGenfitAlgSDT::debugEvent(const edm4hep::TrackCollection* sdtTrackCol, mcP_Z0[iMcParticle] = helix_mcP.getZ0(); mcP_tanLambda[iMcParticle] = helix_mcP.getTanLambda(); + mcP_Xc[iMcParticle] = helix_mcP.getXC(); + mcP_Yc[iMcParticle] = helix_mcP.getYC(); + mcP_R[iMcParticle] = helix_mcP.getRadius(); + debug()<< "debugEvent Bz " << m_genfitField->getBz(mcPos)/GenfitUnit::tesla << "Tesla mc d0= " << mcP_D0 << " phi0= " << mcP_phi @@ -802,21 +842,6 @@ void RecGenfitAlgSDT::debugEvent(const edm4hep::TrackCollection* sdtTrackCol, m_mcIndex=iMcParticle; } - int iHit=0; - simHitCol=m_simDCHitCol.get(); - for(auto simHit: *simHitCol){ - edm4hep::Vector3d pos=simHit.getPosition(); - TVectorD p(3); - p[0]=pos.x;//no unit conversion here - p[1]=pos.y; - p[2]=pos.z; - m_mdcHitMcX[iHit]=pos.x; - m_mdcHitMcY[iHit]=pos.y; - m_mdcHitMcZ[iHit]=pos.z; - iHit++; - } - m_nSimDCHit=simHitCol->size(); - m_nSdtRecTrack=sdtRecTrackCol->size(); int isdttrack=0; for(auto sdtRecTrack: *sdtRecTrackCol){ @@ -837,10 +862,24 @@ void RecGenfitAlgSDT::debugEvent(const edm4hep::TrackCollection* sdtTrackCol, m_omega[isdttrack] = trackStat.omega; m_Z0[isdttrack] = trackStat.Z0; m_tanLambda[isdttrack] = trackStat.tanLambda; + + HelixClass helix; + helix.Initialize_Canonical(trackStat.phi,trackStat.D0, + trackStat.Z0,trackStat.omega,trackStat.tanLambda, + m_genfitField->getBz({0.,0.,0.})/GenfitUnit::tesla); + + m_trackXc[isdttrack] = helix.getXC(); + m_trackYc[isdttrack] = helix.getYC(); + m_trackR[isdttrack] = helix.getRadius(); + } ++isdttrack; } + //signal digi hit + const edm4hep::TrackerHitCollection* SignaldCDigiCol=m_SignalDCDigiCol.get(); + m_nSignalDCDigi=SignaldCDigiCol->size(); + //debug digi const edm4hep::TrackerHitCollection* dCDigiCol=nullptr; dCDigiCol=m_DCDigiCol.get(); @@ -866,9 +905,7 @@ void RecGenfitAlgSDT::debugEvent(const edm4hep::TrackCollection* sdtTrackCol, //get information from associated simTrackerHit - //edm4hep::SimTrackerHit dcSimTrackerHit; auto dcSimTrackerHit=CEPC::getAssoClosestSimTrackerHit(m_DCHitAssociationCol.get(),dcDigi,m_gridDriftChamber,0); - //const edm4hep::MCRecoTrackerAssociationCollection* assoHits=m_DCHitAssociationCol.get(); m_dcDigiMcMomX[iDCDigi]=dcSimTrackerHit.getMomentum().x*GenfitUnit::GeV; m_dcDigiMcMomY[iDCDigi]=dcSimTrackerHit.getMomentum().y*GenfitUnit::GeV; m_dcDigiMcMomZ[iDCDigi]=dcSimTrackerHit.getMomentum().z*GenfitUnit::GeV; @@ -970,3 +1007,78 @@ void RecGenfitAlgSDT::selectHits(const edm4hep::Track&, }//end loop over track delete genfitTrack; }//end of select hit + +bool RecGenfitAlgSDT::addHitsToTk(edm4hep::TrackerHit hit,edm4hep::Track& track, + const char* msg) const +{ + edm4hep::MutableTrack _track = track.clone(); + _track.addToTrackerHits(hit); + track = _track; + return true; +} + +double RecGenfitAlgSDT::getSETRadius(){ + + dd4hep::DetElement world = m_geomSvc->getDD4HepGeo(); + const std::map<std::string, dd4hep::DetElement>& subs = world.children(); + for(std::map<std::string, dd4hep::DetElement>::const_iterator it=subs.begin();it!=subs.end();it++){ + if(it->first=="SET"){ + dd4hep::DetElement set = it->second; + + dd4hep::rec::ZPlanarData* setData = nullptr; + try{ + setData = set.extension<dd4hep::rec::ZPlanarData>(); + } + catch(std::runtime_error& e){ + warning() << e.what() << " " << setData << endmsg; + return 0; + } + + std::vector<dd4hep::rec::ZPlanarData::LayerLayout>& setlayers = setData->layers; + const int nLayers = setlayers.size()-1; + dd4hep::rec::ZPlanarData::LayerLayout& layout = setlayers[nLayers]; + double supRMin = layout.distanceSupport*CLHEP::cm; + double senRMin = layout.distanceSensitive*CLHEP::cm; + std::cout << " getSETRadius supRMin = " << supRMin << " senRMin = " << senRMin << std::endl; + + return supRMin; + }else continue; + } +} + +void RecGenfitAlgSDT::addSETHitsToTk(edm4hep::Track& track, + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + const edm4hep::TrackerHitCollection* SETHits) +{ + TVector3 SETPos,SETMom; + + edm4hep::TrackState trackStat=track.getTrackStates(0);//FIXME? + edm4hep::TrackerHit trackHit = track.getTrackerHits(0); + HelixClass helixClass; + helixClass.Initialize_Canonical(trackStat.phi,trackStat.D0, + trackStat.Z0,trackStat.omega,trackStat.tanLambda, + m_genfitField->getBz({0.,0.,0.})/GenfitUnit::tesla); + double SETRadius = getSETRadius(); // mm; + float refPos[3],Point[6]; + float helixMom[3]; + helixClass.getPointOnCircle(SETRadius,refPos,Point); //mm + helixClass.getExtrapolatedMomentum(Point,helixMom);//mm + SETPos.SetXYZ(Point[0],Point[1],Point[2]); + SETMom.SetXYZ(helixMom[0],helixMom[1],helixMom[2]); + for(int i=0;i<SETHits->size();i++){ + edm4hep::TrackerHit SETHit = SETHits->at(i); + TVector3 SETHitPos(SETHit.getPosition()[0], + SETHit.getPosition()[1],SETHit.getPosition()[2]); + if(abs(SETPos.X()-SETHitPos.X())<m_cutSETPos && + abs(SETPos.Y()-SETHitPos.Y())<m_cutSETPos && + abs(SETPos.Z()-SETHitPos.Z())<m_cutSETPos ){ + const edm4hep::SimTrackerHit simTrackerhit = + CEPC::getAssoSimTrackerHit(assoHits,SETHit); + if(addHitsToTk(SETHit,track,"SET digi hit")){ + debug()<<"add SET digi hit 1 trackerHit"<<endmsg; + } + + } + } +} + diff --git a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.h b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.h index 60fe9cf8..2fb36e25 100644 --- a/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.h +++ b/Reconstruction/RecGenfitAlg/src/RecGenfitAlgSDT.h @@ -34,7 +34,6 @@ namespace genfit{ } namespace dd4hep { class Detector; - //class rec::CellIDPositionConverter; namespace DDSegmentation{ class GridDriftChamber; class BitFieldCoder; @@ -67,18 +66,25 @@ class RecGenfitAlgSDT:public GaudiAlgorithm { const GenfitField* m_genfitField;//The pointer to a GenfitField void debugTrack(int iStrack,int pidType,const GenfitTrack* genfitTrack, - TVector3 pocaToOrigin_pos,TVector3 pocaToOrigin_mom, - TMatrixDSym pocaToOrigin_cov); + TVector3 pocaToOrigin_pos,TVector3 pocaToOrigin_mom, + TMatrixDSym pocaToOrigin_cov); void debugEvent(const edm4hep::TrackCollection* sdtTrackCol, const edm4hep::TrackCollection* sdtRecTrackCol, double eventStartTime,int nFittedSDT); void selectHits(const edm4hep::Track&, std::vector<edm4hep::TrackerHit*>& dcDigiSelected); + bool addHitsToTk(edm4hep::TrackerHit hit,edm4hep::Track& track,const char* msg) const; + double getSETRadius(); + void addSETHitsToTk(edm4hep::Track& track, + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + const edm4hep::TrackerHitCollection* SETHits); DataHandle<edm4hep::EventHeaderCollection> m_headerCol{ "EventHeaderCol", Gaudi::DataHandle::Reader, this}; DataHandle<edm4hep::TrackerHitCollection> m_DCDigiCol{ "DigiDCHitCollection", Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::TrackerHitCollection> m_SignalDCDigiCol{ + "SignalDigiDCHitCollection", Gaudi::DataHandle::Reader, this}; //Mc truth DataHandle<edm4hep::SimTrackerHitCollection> m_simVXDHitCol{ "VXDCollection", Gaudi::DataHandle::Reader, this}; @@ -110,23 +116,19 @@ class RecGenfitAlgSDT:public GaudiAlgorithm { m_FTDHitAssociationCol{"FTDTrackerHitAssociation", Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::TrackerHitCollection> m_SETHitCol{ + "SETTrackerHits",Gaudi::DataHandle::Reader, this}; + //Track from silicon detectors DataHandle<edm4hep::TrackCollection> m_SDTTrackCol{"SDTTrackCollection", Gaudi::DataHandle::Writer, this}; + DataHandle<edm4hep::TrackCollection> m_SDTTrackFindCol{"SDTTrackFindCollection", + Gaudi::DataHandle::Writer, this}; DataHandle<edm4hep::TrackCollection> m_SDTRecTrackCol{"SDTRecTrackCollection", Gaudi::DataHandle::Writer, this}; DataHandle<edm4hep::TrackCollection> m_SDTDebugRecTrackCol{"SDTDebugRecTrackCollection", Gaudi::DataHandle::Writer, this}; - //Smear - DataHandle<edm4hep::MCRecoTrackerAssociationCollection> r_SmearAssociationCol{ - "SmearDCHitAssociationCollection", Gaudi::DataHandle::Reader, this}; - - - //Noise - DataHandle<edm4hep::MCRecoTrackerAssociationCollection> r_NoiseAssociationCol{ - "NoiseDCHitAssociationCollection", Gaudi::DataHandle::Reader, this}; - //Track Finding DataHandle<edm4hep::TrackerHitCollection> m_DCTrackFindingCol{ "DCTrackFindingHitCollection",Gaudi::DataHandle::Reader, this}; @@ -145,6 +147,7 @@ class RecGenfitAlgSDT:public GaudiAlgorithm { dd4hep::DDSegmentation::BitFieldCoder* m_decoder; Gaudi::Property<std::string> m_readout_name{this, "readout", "DriftChamberHitsCollection"}; + Gaudi::Property<int> m_iterFit{this,"iterFit",3}; Gaudi::Property<int> m_debug{this,"debug",0}; Gaudi::Property<int> m_debugGenfit{this,"debugGenfit",0}; Gaudi::Property<int> m_debugPid{this,"debugPid",-99}; @@ -152,16 +155,17 @@ class RecGenfitAlgSDT:public GaudiAlgorithm { Gaudi::Property<std::vector<float> > m_sigmaHitU{this, "sigmaHitU",{0.11, // DC z mm 0.0028,0.006,0.004,0.004,0.004,0.004, //VXD U - 0.0072, //SIT U 4 layers same resolusion - 0.0072, //SET U - 0.003,0.003,0.0072,0.0072,0.0072,0.0072,0.0072}};//FTD V + 0.0072, //SIT U 4 layers same resolusion + 0.0072, //SET U + 0.003,0.003,0.0072,0.0072,0.0072,0.0072,0.0072}};//FTD V //mm, 0:DC, 1~7:VXD, 8:SIT, 9:SET, FTD:10~16 Gaudi::Property<std::vector<float> > m_sigmaHitV{this, "sigmaHitV",{0.11, // DC z mm 0.0028,0.006,0.004,0.004,0.004,0.004, //VXD V - 0.086, //SIT V - 0.086, //SET V - 0.003,0.003,0.0072,0.0072,0.0072,0.0072,0.0072}};//FTD V + 0.086, //SIT V + 0.086, //SET V + 0.003,0.003,0.0072,0.0072,0.0072,0.0072,0.0072}};//FTD V + Gaudi::Property<float> m_cutSETPos{this,"cutSETPos",0.43}; //mm :2024.01.25之å‰ä¸º50mm Gaudi::Property<int> m_measurementTypeSi{this,"measurementTypeSi",0}; //-1: not use, 0, space point, 1, pixel or planer measurement Gaudi::Property<int> m_measurementTypeDC{this,"measurementTypeDC",0}; @@ -170,10 +174,11 @@ class RecGenfitAlgSDT:public GaudiAlgorithm { //Gaudi::Property<float> m_nSigmaHit{this,"nSigmaHit",5}; Gaudi::Property<int> m_sortMethod{this,"sortMethod",0}; Gaudi::Property<bool> m_truthAmbig{this,"truthAmbig",true}; - Gaudi::Property<float> m_skipCorner{this,"skipCorner",999.}; + Gaudi::Property<bool> m_addSET{this,"addSET",true}; + Gaudi::Property<bool> m_useSalHits{this,"useSalHits",true}; + Gaudi::Property<bool> m_checkGenfitTrack{this,"checkGenfitTrack",false}; + Gaudi::Property<float> m_skipCorner{this,"skipCorner",1200.}; Gaudi::Property<float> m_skipNear{this,"skipNear",0.}; - //Gaudi::Property<double> m_initCovResPos{this,"initCovResPos",1}; - //Gaudi::Property<double> m_initCovResMom{this,"initCovResMom",0.1}; Gaudi::Property<bool> m_isUseCovTrack{this,"isUseCovTrack",false}; //Fitter type default is DAFRef. //Candidates are DAF,DAFRef,KalmanFitter and KalmanFitterRefTrack. @@ -185,7 +190,10 @@ class RecGenfitAlgSDT:public GaudiAlgorithm { Gaudi::Property<bool> m_skipWireMaterial{this, "skipWireMaterial",true}; Gaudi::Property<int> m_maxIteration{this,"maxIteration",20}; + Gaudi::Property<int> m_minIteration{this,"minIteration",4}; Gaudi::Property<int> m_resortHits{this,"resortHits",true}; + Gaudi::Property<int> m_chi2FitCut{this,"chi2FitCut",30}; + Gaudi::Property<int> m_dcFitNum{this,"dcFitNum",5}; Gaudi::Property<double> m_bStart{this,"bStart",100}; Gaudi::Property<double> m_bFinal{this,"bFinal",0.01}; Gaudi::Property<double> m_DCCornerCuts{this,"dcCornerCuts",-999}; @@ -208,10 +216,13 @@ class RecGenfitAlgSDT:public GaudiAlgorithm { Gaudi::Property<bool> m_selectDCHit{this,"selectDCHit",false}; Gaudi::Property<bool> m_useNoiseDCHit{this,"useNoiseDCHit",false}; Gaudi::Property<double> m_docaCut{this,"docaCut",3.3};//mm + + Gaudi::Property<bool> m_useTrackFinding{this,"DCTrackFinding",false}; + Gaudi::Property<double> m_extraCut{this,"extraCut",0.055}; //5*sigma cm + Gaudi::Property<double> m_extraDocaCut{this,"extraDocaCut",1.2}; //cm int m_fitSuccess[5]; int m_nRecTrack; bool m_firstTuple; - //bool m_useRecLRAmbig; genfit::EventDisplay* m_genfitDisplay; @@ -221,159 +232,145 @@ class RecGenfitAlgSDT:public GaudiAlgorithm { NTuple::Item<int> m_evt; NTuple::Item<int> m_tkId; NTuple::Item<int> m_mcIndex;//number of navigated mcParicle - NTuple::Matrix<double> m_truthPocaMc;//2 dim matched particle and 3 pos. - NTuple::Array<double> m_seedMomP;//for some track - NTuple::Array<double> m_seedMomPt; + NTuple::Matrix<float> m_truthPocaMc;//2 dim matched particle and 3 pos. + NTuple::Array<float> m_seedMomP;//for some track + NTuple::Array<float> m_seedMomPt; NTuple::Array<int> m_seedMomQ; - NTuple::Matrix<double> m_seedMom; - NTuple::Matrix<double> m_seedPos; - NTuple::Matrix<double> m_pocaPosMc;//2 dim matched particle and 3 pos. - NTuple::Matrix<double> m_pocaMomMc;//2 dim matched particle and 3 mom. - NTuple::Array<double> m_pocaMomMcP;//2 dim matched particle and p - NTuple::Array<double> m_pocaMomMcPt;//2 dim matched particle and pt - NTuple::Matrix<double> m_pocaPosMdc;//pos 0:x,1:y,2:z - NTuple::Matrix<double> m_pocaMomMdc;//mom. 0:px,1:py,2:pz + NTuple::Matrix<float> m_seedMom; + NTuple::Matrix<float> m_seedPos; + NTuple::Matrix<float> m_pocaPosMc;//2 dim matched particle and 3 pos. + NTuple::Matrix<float> m_pocaMomMc;//2 dim matched particle and 3 mom. + NTuple::Array<float> m_pocaMomMcP;//2 dim matched particle and p + NTuple::Array<float> m_pocaMomMcPt;//2 dim matched particle and pt + NTuple::Matrix<float> m_pocaPosMdc;//pos 0:x,1:y,2:z + NTuple::Matrix<float> m_pocaMomMdc;//mom. 0:px,1:py,2:pz NTuple::Item<int> m_pidIndex; - NTuple::Matrix<double> m_firstPosKal;//5 hyposis and pos. at first - NTuple::Array<double> m_firstMomKalP;//5 hyposis and mom. at first - NTuple::Array<double> m_firstMomKalPt;//5 hyposis and mom. at first - - NTuple::Matrix<double> m_ErrorcovMatrix6; - NTuple::Array<double> m_posx; - NTuple::Array<double> m_posy; - NTuple::Array<double> m_posz; - - NTuple::Array<double> m_momx; - NTuple::Array<double> m_momy; - NTuple::Array<double> m_momz; - - NTuple::Array<double> m_PosMcX; - NTuple::Array<double> m_PosMcY; - NTuple::Array<double> m_PosMcZ; - - NTuple::Array<double> m_MomMcX; - NTuple::Array<double> m_MomMcY; - NTuple::Array<double> m_MomMcZ; - - - NTuple::Array<double> m_PocaPosX; - NTuple::Array<double> m_PocaPosY; - NTuple::Array<double> m_PocaPosZ; - - NTuple::Array<double> m_PocaMomX; - NTuple::Array<double> m_PocaMomY; - NTuple::Array<double> m_PocaMomZ; - - NTuple::Matrix<double> m_McErrCov; - NTuple::Matrix<double> m_PocaErrCov; - - NTuple::Matrix<double> m_ErrorcovMatrix; - NTuple::Array<double> m_D0; - NTuple::Array<double> m_phi; - NTuple::Array<double> m_omega; - NTuple::Array<double> m_Z0; - NTuple::Array<double> m_tanLambda; - - NTuple::Matrix<double> m_ErrorcovMatrix_Origin; - NTuple::Array<double> m_D0_Origin; - NTuple::Array<double> m_phi_Origin; - NTuple::Array<double> m_omega_Origin; - NTuple::Array<double> m_Z0_Origin; - NTuple::Array<double> m_tanLambda_Origin; - - NTuple::Array<double> mcP_D0; - NTuple::Array<double> mcP_phi; - NTuple::Array<double> mcP_omega; - NTuple::Array<double> mcP_Z0; - NTuple::Array<double> mcP_tanLambda; - - NTuple::Matrix<double> m_pocaPosKal;//5 hyposis and 3 mom. - NTuple::Matrix<double> m_pocaMomKal;//5 hyposis and 3 mom. - NTuple::Matrix<double> m_pocaMomKalP;//5 hyposis and p - NTuple::Matrix<double> m_pocaMomKalPt;//5 hyposis and pt + NTuple::Matrix<float> m_firstPosKal;//5 hyposis and pos. at first + NTuple::Array<float> m_firstMomKalP;//5 hyposis and mom. at first + NTuple::Array<float> m_firstMomKalPt;//5 hyposis and mom. at first + + NTuple::Matrix<float> m_ErrorcovMatrix6; + NTuple::Array<float> m_posx; + NTuple::Array<float> m_posy; + NTuple::Array<float> m_posz; + + NTuple::Array<float> m_momx; + NTuple::Array<float> m_momy; + NTuple::Array<float> m_momz; + + NTuple::Array<float> m_fittedXc; + NTuple::Array<float> m_fittedYc; + NTuple::Array<float> m_fittedR; + + NTuple::Array<float> m_PosMcX; + NTuple::Array<float> m_PosMcY; + NTuple::Array<float> m_PosMcZ; + + NTuple::Array<float> m_MomMcX; + NTuple::Array<float> m_MomMcY; + NTuple::Array<float> m_MomMcZ; + + + NTuple::Array<float> m_PocaPosX; + NTuple::Array<float> m_PocaPosY; + NTuple::Array<float> m_PocaPosZ; + + NTuple::Array<float> m_PocaMomX; + NTuple::Array<float> m_PocaMomY; + NTuple::Array<float> m_PocaMomZ; + + NTuple::Matrix<float> m_McErrCov; + NTuple::Matrix<float> m_PocaErrCov; + + NTuple::Matrix<float> m_ErrorcovMatrix; + NTuple::Array<float> m_D0; + NTuple::Array<float> m_phi; + NTuple::Array<float> m_omega; + NTuple::Array<float> m_Z0; + NTuple::Array<float> m_tanLambda; + + NTuple::Array<float> m_trackXc; + NTuple::Array<float> m_trackYc; + NTuple::Array<float> m_trackR; + + NTuple::Matrix<float> m_ErrorcovMatrix_Origin; + NTuple::Array<float> m_D0_Origin; + NTuple::Array<float> m_phi_Origin; + NTuple::Array<float> m_omega_Origin; + NTuple::Array<float> m_Z0_Origin; + NTuple::Array<float> m_tanLambda_Origin; + + NTuple::Array<float> mcP_D0; + NTuple::Array<float> mcP_phi; + NTuple::Array<float> mcP_omega; + NTuple::Array<float> mcP_Z0; + NTuple::Array<float> mcP_tanLambda; + NTuple::Array<float> mcP_Xc; + NTuple::Array<float> mcP_Yc; + NTuple::Array<float> mcP_R; + + NTuple::Matrix<float> m_pocaPosKal;//5 hyposis and 3 mom. + NTuple::Matrix<float> m_pocaMomKal;//5 hyposis and 3 mom. + NTuple::Matrix<float> m_pocaMomKalP;//5 hyposis and p + NTuple::Matrix<float> m_pocaMomKalPt;//5 hyposis and pt NTuple::Matrix<int> m_chargeKal; - NTuple::Matrix<double> m_chi2Kal; - NTuple::Matrix<double> m_nDofKal; + NTuple::Matrix<float> m_chi2Kal; + NTuple::Matrix<float> m_nDofKal; NTuple::Matrix<int> m_isFitConverged; NTuple::Matrix<int> m_isFitConvergedFully; NTuple::Matrix<int> m_isFitted; + NTuple::Array<int> m_PDG;//5 hyposis and mom. at first + NTuple::Array<int> m_numDCOnTrack;//5 hyposis and mom. at first + NTuple::Array<int> m_salDCHits;//5 hyposis and mom. at first + NTuple::Array<int> m_DCHitsCol;//5 hyposis and mom. at first NTuple::Matrix<int> m_fittedState; NTuple::Item<int> m_nDCDigi; - NTuple::Item<int> m_nTruthDCDigi; + NTuple::Item<int> m_nSignalDCDigi; NTuple::Item<int> m_nHitMc; NTuple::Item<int> m_nSdtTrack; NTuple::Item<int> m_nSdtTrackHit; NTuple::Item<int> m_nSdtRecTrack; - NTuple::Item<int> m_nSimDCHit; NTuple::Matrix<int> m_nHitWithFitInfo; NTuple::Item<int> m_nHitKalInput; NTuple::Array<int> m_nHitDetType; - NTuple::Array<double> m_mdcHitDriftT; - NTuple::Array<double> m_mdcHitDriftDl; - NTuple::Array<double> m_mdcHitDriftDr; - NTuple::Array<int> m_mdcHitLr; - NTuple::Array<int> m_mdcHitLayer; - NTuple::Array<int> m_mdcHitWire; - NTuple::Array<double> m_mdcHitExpDoca; - NTuple::Array<double> m_mdcHitExpMcDoca; - NTuple::Array<double> m_mdcHitErr; NTuple::Matrix<int> m_nHitFailedKal; NTuple::Matrix<int> m_nHitFitted; - NTuple::Item<double> m_exeTime; - //truth - NTuple::Array<int> m_mdcHitMcLr; - NTuple::Array<int> m_mdcHitMcTkId; - NTuple::Array<double> m_mdcHitMcDrift; - NTuple::Array<double> m_mdcHitMcX; - NTuple::Array<double> m_mdcHitMcY; - NTuple::Array<double> m_mdcHitMcZ; - NTuple::Array<double> m_mdcHitExpMcPocaX; - NTuple::Array<double> m_mdcHitExpMcPocaY; - NTuple::Array<double> m_mdcHitExpMcPocaZ; - NTuple::Array<double> m_mdcHitExpMcPocaWireX; - NTuple::Array<double> m_mdcHitExpMcPocaWireY; - NTuple::Array<double> m_mdcHitExpMcPocaWireZ; - - NTuple::Array<double> m_dcDigiChamber; - NTuple::Array<double> m_dcDigiLayer; - NTuple::Array<double> m_dcDigiCell; - NTuple::Array<double> m_dcDigiTime; - NTuple::Array<double> m_dcDigiDrift; - NTuple::Array<double> m_dcDigiDocaMC; - NTuple::Array<double> m_dcDigiPocaOnWireMCX; - NTuple::Array<double> m_dcDigiPocaOnWireMCY; - NTuple::Array<double> m_dcDigiWireStartX; - NTuple::Array<double> m_dcDigiWireStartY; - NTuple::Array<double> m_dcDigiWireStartZ; - NTuple::Array<double> m_dcDigiWireEndX; - NTuple::Array<double> m_dcDigiWireEndY; - NTuple::Array<double> m_dcDigiWireEndZ; - NTuple::Array<double> m_dcDigiMcPosX; - NTuple::Array<double> m_dcDigiMcPosY; - NTuple::Array<double> m_dcDigiMcPosZ; - NTuple::Array<double> m_dcDigiMcMomX; - NTuple::Array<double> m_dcDigiMcMomY; - NTuple::Array<double> m_dcDigiMcMomZ; - NTuple::Array<double> m_dcDigiDocaExt; - NTuple::Array<double> m_dcDigiPocaExtX; - NTuple::Array<double> m_dcDigiPocaExtY; - NTuple::Array<double> m_dcDigiPocaExtZ; - NTuple::Item<double> m_firstMomMc; - - NTuple::Item<int> m_nTrackerHitSDT; - NTuple::Item<int> m_nTrackerHitDC; - NTuple::Item<int> m_nGenFitTrackerHit; - - NTuple::Array<double> m_trackLength; - NTuple::Array<double> m_hitMomEdep; - NTuple::Array<float> m_truthMomEdep; - NTuple::Array<float> m_FittedDoca; - NTuple::Array<float> m_truthDoca; - NTuple::Array<float> m_driftDis; - NTuple::Array<float> m_Res; - NTuple::Array<float> m_truthRes; + + NTuple::Array<float> m_dcDigiChamber; + + NTuple::Array<float> m_docaTrack; + NTuple::Array<int> m_isNoise; + + NTuple::Array<float> m_dcDigiLayer; + NTuple::Array<float> m_dcDigiCell; + NTuple::Array<float> m_dcDigiTime; + NTuple::Array<float> m_dcDigiDrift; + NTuple::Array<float> m_dcDigiDocaMC; + NTuple::Array<float> m_dcDigiPocaOnWireMCX; + NTuple::Array<float> m_dcDigiPocaOnWireMCY; + NTuple::Array<float> m_dcDigiWireStartX; + NTuple::Array<float> m_dcDigiWireStartY; + NTuple::Array<float> m_dcDigiWireStartZ; + NTuple::Array<float> m_dcDigiWireEndX; + NTuple::Array<float> m_dcDigiWireEndY; + NTuple::Array<float> m_dcDigiWireEndZ; + NTuple::Array<float> m_dcDigiMcPosX; + NTuple::Array<float> m_dcDigiMcPosY; + NTuple::Array<float> m_dcDigiMcPosZ; + NTuple::Array<float> m_dcDigiMcMomX; + NTuple::Array<float> m_dcDigiMcMomY; + NTuple::Array<float> m_dcDigiMcMomZ; + NTuple::Array<float> m_dcDigiDocaExt; + NTuple::Array<float> m_dcDigiPocaExtX; + NTuple::Array<float> m_dcDigiPocaExtY; + NTuple::Array<float> m_dcDigiPocaExtZ; + NTuple::Item<float> m_firstMomMc; + + NTuple::Array<int> m_nTrackerHitSDT; + NTuple::Array<int> m_nTrackerHitDC; + NTuple::Array<int> m_nTrackerFitHitDC; }; #endif diff --git a/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.cpp b/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.cpp index 0070d7ff..8e26afbd 100644 --- a/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.cpp +++ b/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.cpp @@ -160,17 +160,18 @@ void WireMeasurementDC::print(){ std::cout<<"("<<layer_<<","<<cell_ <<") wire(" <<wireEndPoint1_[0] <<wireEndPoint1_[1] <<wireEndPoint1_[2] <<wireEndPoint2_[0] <<wireEndPoint2_[1] <<wireEndPoint2_[2] - <<")cm dt "<<trackerHit_->getTime() - <<"ns time "<<simTrackerHit_->getTime() + <<")cm ptr: "<< trackerHit_ + << " dt "<<time_ <<"ns dd "<<getRawHitCoords()[0] <<"cm dd err "<< getRawHitCov()(0,0) - <<"cm lr "<<leftRight_; - //<<std::endl; + <<"cm lr "<<leftRight_ + <<std::endl; //<<" ddSm "<<driftDistanceSmeared } WireMeasurementDC::WireMeasurementDC(const GenfitHit* genfitHit,int iHit): + genfitHit_(genfitHit), maxDistance_(genfitHit->getMaxDistance()), leftRight_(genfitHit->getLeftRightAmbig()), trackerHit_(genfitHit->getTrackerHit()), diff --git a/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.h b/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.h index 024ee704..9e29a3c6 100644 --- a/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.h +++ b/Reconstruction/RecGenfitAlg/src/WireMeasurementDC.h @@ -32,6 +32,8 @@ #include "AbsHMatrix.h" #include "GenfitHit.h" + +#include "edm4hep/TrackerHit.h" namespace edm4hep{ class TrackerHit; class SimTrackerHit; @@ -109,10 +111,19 @@ class WireMeasurementDC : public genfit::AbsMeasurement{ virtual bool isLeftRigthMeasurement() const {return true;} double getMaxDistance(){return maxDistance_;} int getLeftRightResolution() const override {return leftRight_;} - void setTrackerHit(const edm4hep::TrackerHit& trackerHit,int l,int c){ + int getWireMeasurementDCLayer(){return layer_;} + void setTrackerHit(const edm4hep::TrackerHit& trackerHit,int l,int c,double t){ trackerHit_=&trackerHit; layer_=l; cell_=c; + time_=t; + } + void setTrackerHitObj(const edm4hep::TrackerHit& trackerHit,int l,int c,double t){ + trackerHit_= nullptr; + trackerHitObj_=trackerHit; + layer_=l; + cell_=c; + time_=t; } void setSimTrackerHit(const edm4hep::SimTrackerHit& simTrackerHit){ simTrackerHit_=&simTrackerHit; @@ -120,6 +131,8 @@ class WireMeasurementDC : public genfit::AbsMeasurement{ void print(); const edm4hep::TrackerHit* getTrackerHit(){return trackerHit_;} + edm4hep::TrackerHit getTrackerHitObj(){return trackerHitObj_;} + const GenfitHit* getGenfitHit(){return genfitHit_;} protected: @@ -130,8 +143,11 @@ class WireMeasurementDC : public genfit::AbsMeasurement{ int layer_; int cell_; + double time_; const edm4hep::SimTrackerHit* simTrackerHit_; const edm4hep::TrackerHit* trackerHit_; + edm4hep::TrackerHit trackerHitObj_; + const GenfitHit* genfitHit_; public: diff --git a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp index 611b7789..2fee8d42 100644 --- a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp +++ b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.cpp @@ -1,5 +1,7 @@ #include "TruthTrackerAlg.h" #include "DataHelper/HelixClass.h" +#include "DataHelper/TrackHelper.h" +#include "DataHelper/TrackerHitHelper.h" #include "DDSegmentation/Segmentation.h" #include "DetSegmentation/GridDriftChamber.h" #include "DetInterface/IGeomSvc.h" @@ -26,12 +28,6 @@ TruthTrackerAlg::TruthTrackerAlg(const std::string& name, ISvcLocator* svcLoc) : GaudiAlgorithm(name, svcLoc),m_dd4hep(nullptr),m_gridDriftChamber(nullptr), m_decoder(nullptr) { - declareProperty("NoiseSimHitsCollection", w_SimNoiseHCol, - "Handle of the output simulation DC Noise hits collection"); - declareProperty("NoiseDCHitsCollection", w_NoiseHitCol, - "Handle of the input DC Noise hits collection"); - declareProperty("NoiseDCHitAssociationCollection", w_NoiseAssociationCol, - "Handle of the simNoiseDCHit and noiseDC Noise hits collection"); declareProperty("MCParticle", m_mcParticleCol, "Handle of the input MCParticle collection"); declareProperty("DriftChamberHitsCollection", m_DCSimTrackerHitCol, @@ -56,12 +52,18 @@ TruthTrackerAlg::TruthTrackerAlg(const std::string& name, ISvcLocator* svcLoc) "Handle of input FTD tracker hit collection"); declareProperty("SITSpacePoints", m_SITSpacePointCol, "Handle of input SIT hit collection"); -// declareProperty("SETSpacePoints", m_SETSpacePointCol, -// "Handle of input SET hit collection"); declareProperty("FTDSpacePoints", m_FTDSpacePointCol, "Handle of input FTD hit collection"); declareProperty("VXDCollection", m_VXDCollection, "Handle of input VXD hit collection"); + declareProperty("VXDTrackerHitAssociation", m_VXDHitAssociationCol, + "Handle of VXD association collection"); + declareProperty("SETTrackerHitAssociation", m_SETHitAssociationCol, + "Handle of SET association collection"); + declareProperty("SITTrackerHitAssociation", m_SITHitAssociationCol, + "Handle of SIT association collection"); + declareProperty("FTDTrackerHitAssociation", m_FTDHitAssociationCol, + "Handle of FTD association collection"); declareProperty("SITCollection", m_SITCollection, "Handle of input SIT hit collection"); declareProperty("SETCollection", m_SETCollection, @@ -70,12 +72,6 @@ TruthTrackerAlg::TruthTrackerAlg(const std::string& name, ISvcLocator* svcLoc) "Handle of input FTD hit collection"); declareProperty("TruthTrackerHitCollection", m_truthTrackerHitCol, "Handle of output truth TrackerHit collection"); - declareProperty("SmearTrackerHitCollection", m_SmeartruthTrackerHitCol, - "Handle of output smear truth TrackerHit collection"); - declareProperty("SmearSimHitsCollection", w_SimSmearHCol, - "Handle of output smear SimTrackerHit collection"); - declareProperty("SmearDCHitAssociationCollection", w_SmearAssociationCol, - "Handle of output smear simulationhit and TrackerHit collection"); } @@ -111,6 +107,8 @@ StatusCode TruthTrackerAlg::initialize() return StatusCode::FAILURE; } + eventNo = 0; + ///book tuple if(m_hist){ NTuplePtr nt(ntupleSvc(), "TruthTrackerAlg/truthTrackerAlg"); @@ -121,20 +119,9 @@ StatusCode TruthTrackerAlg::initialize() CLID_ColumnWiseTuple,"TruthTrackerAlg"); if(m_tuple){ StatusCode sc; - sc=m_tuple->addItem("run",m_run); - sc=m_tuple->addItem("evt",m_evt); - sc=m_tuple->addItem("siMom",3,m_siMom); - sc=m_tuple->addItem("siPos",3,m_siPos); - sc=m_tuple->addItem("mcMom",3,m_mcMom); - - sc=m_tuple->addItem("mcPos",3,m_mcPos); sc=m_tuple->addItem("nDCTrackHit",m_nDCTrackHit,0,100000); - sc=m_tuple->addItem("DriftDistance",m_nDCTrackHit,m_DriftDistance); - sc=m_tuple->addItem("nSmearDCTrackHit",m_nSmearDCTrackHit,0,100000); - sc=m_tuple->addItem("SmearDriftDistance",m_nSmearDCTrackHit,m_SmearDriftDistance); - sc=m_tuple->addItem("nNoiseDCTrackHit",m_nNoiseDCTrackHit,0,100000); - sc=m_tuple->addItem("NoiseDriftDistance",m_nNoiseDCTrackHit,m_NoiseDriftDistance); + sc=m_tuple->addItem("nSDTTrack",m_nSDTTrack,0,100000); sc=m_tuple->addItem("nSimTrackerHitVXD",m_nSimTrackerHitVXD); sc=m_tuple->addItem("nSimTrackerHitSIT",m_nSimTrackerHitSIT); sc=m_tuple->addItem("nSimTrackerHitSET",m_nSimTrackerHitSET); @@ -145,20 +132,19 @@ StatusCode TruthTrackerAlg::initialize() sc=m_tuple->addItem("nTrackerHitSET",m_nTrackerHitSET); sc=m_tuple->addItem("nTrackerHitFTD",m_nTrackerHitFTD); sc=m_tuple->addItem("nTrackerHitDC",m_nTrackerHitDC); - sc=m_tuple->addItem("nSpacePointSIT",m_nSpacePointSIT); - sc=m_tuple->addItem("nSpacePointSET",m_nSpacePointSET); - sc=m_tuple->addItem("nSpacePointFTD",m_nSpacePointFTD); - sc=m_tuple->addItem("nHitOnSiTkXVD",m_nHitOnSiTkVXD); - sc=m_tuple->addItem("nHitOnSiTkSIT",m_nHitOnSiTkSIT); - sc=m_tuple->addItem("nHitOnSiTkSET",m_nHitOnSiTkSET); - sc=m_tuple->addItem("nHitOnSiTkFTD",m_nHitOnSiTkFTD); - sc=m_tuple->addItem("nHitOnSdtTkVXD",m_nHitOnSdtTkVXD); - sc=m_tuple->addItem("nHitOnSdtTkSIT",m_nHitOnSdtTkSIT); - sc=m_tuple->addItem("nHitOnSdtTkSET",m_nHitOnSdtTkSET); - sc=m_tuple->addItem("nHitOnSdtTkFTD",m_nHitOnSdtTkFTD); - sc=m_tuple->addItem("nHitOnSdtTkDC",m_nHitOnSdtTkDC); - sc=m_tuple->addItem("nHitSdt",m_nHitOnSdtTk); - sc=m_tuple->addItem("nNoiseOnSdt",m_nNoiseOnSdtTk); + sc=m_tuple->addItem("nHitOnSiTkXVD",m_nSDTTrack,m_nHitOnSiTkVXD); + sc=m_tuple->addItem("nHitOnSiTkSIT",m_nSDTTrack,m_nHitOnSiTkSIT); + sc=m_tuple->addItem("nHitOnSiTkSET",m_nSDTTrack,m_nHitOnSiTkSET); + sc=m_tuple->addItem("nHitOnSiTkFTD",m_nSDTTrack,m_nHitOnSiTkFTD); + sc=m_tuple->addItem("nHitOnSdtTkVXD",m_nSDTTrack,m_nHitOnSdtTkVXD); + sc=m_tuple->addItem("nHitOnSdtTkSIT",m_nSDTTrack,m_nHitOnSdtTkSIT); + sc=m_tuple->addItem("nHitOnSdtTkSET",m_nSDTTrack,m_nHitOnSdtTkSET); + sc=m_tuple->addItem("nHitOnSdtTkFTD",m_nSDTTrack,m_nHitOnSdtTkFTD); + sc=m_tuple->addItem("nHitOnSdtTkDC",m_nSDTTrack,m_nHitOnSdtTkDC); + sc=m_tuple->addItem("nHitSdt",m_nSDTTrack,m_nHitOnSdtTk); + sc=m_tuple->addItem("siXc",m_nSDTTrack,m_siXc); + sc=m_tuple->addItem("siYc",m_nSDTTrack,m_siYc); + sc=m_tuple->addItem("siR",m_nSDTTrack,m_siR); } } } @@ -170,24 +156,45 @@ StatusCode TruthTrackerAlg::execute() info()<<"In execute()"<<endmsg; ///Output DC Track collection - edm4hep::TrackCollection* dcTrackCol=m_DCTrackCol.createAndPut(); + edm4hep::TrackCollection* dcTrackCol= m_DCTrackCol.createAndPut(); ///Output SDT Track collection - edm4hep::TrackCollection* sdtTkCol=m_SDTTrackCol.createAndPut(); + edm4hep::TrackCollection* sdtTkCol= m_SDTTrackCol.createAndPut(); ///Output Hit collection - auto truthTrackerHitCol=m_truthTrackerHitCol.createAndPut(); + auto truthTrackerHitCol = m_truthTrackerHitCol.createAndPut(); + + //VXD MCRecoTrackerAssociation + const edm4hep::MCRecoTrackerAssociationCollection* VXDAssoVec = m_VXDHitAssociationCol.get(); + //SIT MCRecoTrackerAssociation + const edm4hep::MCRecoTrackerAssociationCollection* SITAssoVec = m_SITHitAssociationCol.get(); + //SET MCRecoTrackerAssociation + const edm4hep::MCRecoTrackerAssociationCollection* SETAssoVec = m_SETHitAssociationCol.get(); + //FTD MCRecoTrackerAssociation + const edm4hep::MCRecoTrackerAssociationCollection* FTDAssoVec = m_FTDHitAssociationCol.get(); ///Retrieve MC particle(s) const edm4hep::MCParticleCollection* mcParticleCol=nullptr; mcParticleCol=m_mcParticleCol.get(); - //if(m_mcParticleCol.exist()){mcParticleCol=m_mcParticleCol.get();} + const int mcPNum = mcParticleCol->size(); + float mcP_Mom[mcPNum]={1e-9}; + if(nullptr==mcParticleCol){ debug()<<"MCParticleCollection not found"<<endmsg; return StatusCode::SUCCESS; } + for(int i=0;i<mcPNum;i++){ + mcP_Mom[i] = sqrt(mcParticleCol->at(i).getMomentum()[0]*mcParticleCol->at(i).getMomentum()[0] + +mcParticleCol->at(i).getMomentum()[1]*mcParticleCol->at(i).getMomentum()[1]); + } + ///Retrieve DC digi const edm4hep::TrackerHitCollection* digiDCHitsCol=nullptr; + digiDCHitsCol=m_DCDigiCol.get(); + if(digiDCHitsCol->size()<1e-9){ + debug() << " TruthTrackerAlg digiDCHitsCol size =0 !!" << endmsg; + return StatusCode::SUCCESS; + } const edm4hep::SimTrackerHitCollection* dcSimHitCol =m_DCSimTrackerHitCol.get(); const edm4hep::MCRecoTrackerAssociationCollection* assoHits @@ -200,8 +207,7 @@ StatusCode TruthTrackerAlg::execute() <<dcSimHitCol->size()<<endmsg; if(m_tuple)m_nSimTrackerHitDC=dcSimHitCol->size(); } - digiDCHitsCol=m_DCDigiCol.get(); - m_nDCTrackHit = digiDCHitsCol->size(); + if(m_tuple) m_nDCTrackHit = digiDCHitsCol->size(); if(nullptr==digiDCHitsCol){ debug()<<"TrackerHitCollection not found"<<endmsg; }else{ @@ -211,61 +217,120 @@ StatusCode TruthTrackerAlg::execute() return StatusCode::SUCCESS; } } - } - // make noise - edm4hep::SimTrackerHitCollection* SimVec = w_SimNoiseHCol.createAndPut(); - edm4hep::MCRecoTrackerAssociationCollection* AssoVec = - w_NoiseAssociationCol.createAndPut(); - edm4hep::TrackerHitCollection* Vec = w_NoiseHitCol.createAndPut(); - - ////TODO - //Output MCRecoTrackerAssociationCollection collection - //const edm4hep::MCRecoTrackerAssociationCollection* - // mcRecoTrackerAssociationCol=nullptr; - //if(nullptr==mcRecoTrackerAssociationCol){ - // log<<MSG::DEBUG<<"MCRecoTrackerAssociationCollection not found" - // <<endmsg; - // return StatusCode::SUCCESS; - //} - //mcRecoTrackerAssociationCol=m_mcRecoParticleAssociation.get(); - - ///New SDT track - edm4hep::MutableTrack sdtTk=sdtTkCol->create(); - - int nVXDHit=0; - int nSITHit=0; - int nSETHit=0; - int nFTDHit=0; - int nDCHitDCTk=0; - int nDCHitSDTTk=0; - - ///Create track with mcParticle - edm4hep::TrackState trackStateMc; - getTrackStateFromMcParticle(mcParticleCol,trackStateMc); - if(m_useTruthTrack.value()||!m_useSi){sdtTk.addToTrackStates(trackStateMc);} + //Test DCHit Mom + if(m_useCutMom){ + const int dchitNum = digiDCHitsCol->size(); + float dchitMom[dchitNum] = {1e-9}; + int nloop =0; + for(auto dcHit:*digiDCHitsCol){ + + edm4hep::SimTrackerHit simDCHit = getAssoSimTrackerHit(assoHits,dcHit); + dchitMom[nloop] = sqrt(simDCHit.getMomentum()[0]*simDCHit.getMomentum()[0]+ + simDCHit.getMomentum()[1]*simDCHit.getMomentum()[1]); + float dchitMomP = sqrt(simDCHit.getMomentum()[0]*simDCHit.getMomentum()[0]+ + simDCHit.getMomentum()[1]*simDCHit.getMomentum()[1]+ + simDCHit.getMomentum()[2]*simDCHit.getMomentum()[2]); + nloop++; + } - if(m_useSi){ - ///Retrieve silicon Track - const edm4hep::TrackCollection* siTrackCol=nullptr; - //if(m_siSubsetTrackCol.exist()){ - siTrackCol=m_siSubsetTrackCol.get(); - if(nullptr==siTrackCol){ - debug()<<"SDTTrackCollection is empty"<<endmsg; - if(!m_useTruthTrack.value()) return StatusCode::SUCCESS; - }else{ - debug()<<"SiSubsetTrackCol size "<<siTrackCol->size()<<endmsg; - if(!m_useTruthTrack.value()&&0==siTrackCol->size()){ + float cutMom = 0; + for(int i=0;i<nloop;i++){ + if(dchitMom[i]>1e-1){ + cutMom = dchitMom[i]; + break; + } + } + float cutMomLast = 0; + for(int i=nloop-1;i>-1;i--){ + if(dchitMom[i]>1e-9){ + cutMomLast = dchitMom[i]; + break; + } + } + if(((std::abs(mcP_Mom[0]-cutMom))/mcP_Mom[0])>m_cutMomHit[m_debugPID]) + return StatusCode::SUCCESS; + if((std::abs(cutMom-cutMomLast)/mcP_Mom[0])>m_cutMomHit[m_debugPID]) + return StatusCode::SUCCESS; + }// end loop of use cutMom + }//end loop of useDC + + ///Retrieve silicon Track + const edm4hep::TrackCollection* siTrackCol=nullptr; + siTrackCol=m_siSubsetTrackCol.get(); + if(nullptr==siTrackCol){ + debug()<<"SDTTrackCollection is empty"<<endmsg; + if(!m_useTruthTrack.value()) return StatusCode::SUCCESS; + }else{ + debug()<<"SiSubsetTrackCol size "<<siTrackCol->size()<<endmsg; + if(!m_useTruthTrack.value()&&0==siTrackCol->size()){ + return StatusCode::SUCCESS; + } + for(int iSitrk=0;iSitrk<siTrackCol->size();iSitrk++){ + auto siTk = siTrackCol->at(iSitrk); + if(nHotsOnTrack(siTk,lcio::ILDDetID::VXD)<1e-9 && + nHotsOnTrack(siTk,lcio::ILDDetID::SIT)<1e-9){ + debug() << " Because siTrack have no VXDHits and SITHits !" << endmsg; + return StatusCode::SUCCESS; + } + if(nHotsOnTrack(siTk,lcio::ILDDetID::FTD)>1e-9){ + debug() << " Because siTrack have FTDHits !" << endmsg; return StatusCode::SUCCESS; } + + } + }//end loop of silicon Track + + m_nSDTTrack = siTrackCol->size(); + for(int iSitrk=0;iSitrk<siTrackCol->size();iSitrk++){ + auto siTk = siTrackCol->at(iSitrk); + ///New SDT track + edm4hep::MutableTrack sdtTk=sdtTkCol->create(); + + int nVXDHit=0; + int nSITHit=0; + int nSETHit=0; + int nFTDHit=0; + int nDCHitDCTk=0; + int nDCHitSDTTk=0; + + ///Create track with mcParticle + edm4hep::TrackerHit trackHit = siTk.getTrackerHits(0); + edm4hep::MCParticle mcParticle; + edm4hep::SimTrackerHit simTrackerHit; + CEPC::getAssoMCParticle(VXDAssoVec,trackHit,mcParticle,simTrackerHit); + edm4hep::TrackState trackStateMc; + getTrackStateFromMcParticle(mcParticle,trackStateMc); + + if(m_useTruthTrack.value()||!m_useSi){ + sdtTk.addToTrackStates(trackStateMc); } - //} - for(auto siTk:*siTrackCol){ + if(m_useSi){ if(!m_useTruthTrack.value()){ debug()<<"siTk: "<<siTk<<endmsg; edm4hep::TrackState siTrackStat=siTk.getTrackStates(0);//FIXME? - sdtTk.addToTrackStates(siTrackStat); + float Bz = 3;//T + + HelixClass helixClass; + helixClass.Initialize_Canonical(siTrackStat.phi,siTrackStat.D0, + siTrackStat.Z0,siTrackStat.omega,siTrackStat.tanLambda,Bz); + m_siXc[iSitrk] = helixClass.getXC(); + m_siYc[iSitrk] = helixClass.getYC(); + m_siR[iSitrk] = helixClass.getRadius(); + + TVector3 siPos,siMom; + TMatrixDSym siCov(6); + double charge_test; + + CEPC::getPosMomFromTrackState(siTrackStat,Bz,siPos,siMom,charge_test,siCov); + + if((0==mcParticle.getCharge()) || (charge_test==mcParticle.getCharge())){ + sdtTk.addToTrackStates(siTrackStat); + }else{ + sdtTk.addToTrackStates(trackStateMc); + } + sdtTk.setType(siTk.getType()); sdtTk.setChi2(siTk.getChi2()); sdtTk.setNdf(siTk.getNdf()); @@ -278,119 +343,77 @@ StatusCode TruthTrackerAlg::execute() debug()<<"use Si hit on track"<<endmsg; nVXDHit=addHotsToTk(siTk,sdtTk,lcio::ILDDetID::VXD,"VXD",nVXDHit); nSITHit=addHotsToTk(siTk,sdtTk,lcio::ILDDetID::SIT,"SIT",nSITHit); - nSETHit=addHotsToTk(siTk,sdtTk,lcio::ILDDetID::SET,"SET",nSETHit); - nFTDHit=addHotsToTk(siTk,sdtTk,lcio::ILDDetID::FTD,"FTD",nFTDHit); - }//end of loop over hits on siTk - }//end of loop over siTk - - if(m_useSiTruthHit){ - ///Add silicon SimTrackerHit - debug()<<"Add silicon SimTrackerHit"<<endmsg; - nVXDHit=addSimHitsToTk(m_VXDCollection,truthTrackerHitCol,sdtTk,"VXD",nVXDHit); - nSITHit=addSimHitsToTk(m_SITCollection,truthTrackerHitCol,sdtTk,"SIT",nSITHit); - nSETHit=addSimHitsToTk(m_SETCollection,truthTrackerHitCol,sdtTk,"SET",nSETHit); - nFTDHit=addSimHitsToTk(m_FTDCollection,truthTrackerHitCol,sdtTk,"FTD",nFTDHit); - }else{ - ///Add reconstructed hit or digi - debug()<<"Add VXD TrackerHit"<<endmsg; - nVXDHit=addHitsToTk(m_VXDTrackerHits,sdtTk,"VXD digi",nVXDHit); - nSITHit=addHitsToTk(m_SITTrackerHits,sdtTk,"SIT digi",nSITHit); - if(m_useSiSpacePoint.value()){ - ///Add silicon SpacePoint - debug()<<"Add silicon SpacePoint"<<endmsg; - if(m_useSiSpacePoint){ - nSITHit=addHitsToTk(m_SITSpacePointCol,sdtTk,"SIT sp",nSITHit); - } - // nSETHit=addHitsToTk(m_SETSpacePointCol,sdtTk,"SET sp",nSETHit); - nFTDHit=addHitsToTk(m_FTDSpacePointCol,sdtTk,"FTD sp",nFTDHit); + //end of loop over hits on siTk }else{ - ///Add silicon TrackerHit - debug()<<"Add silicon TrackerHit"<<endmsg; - nSITHit=addHitsToTk(m_SITTrackerHits,sdtTk,"SIT digi",nSITHit); - nSETHit=addHitsToTk(m_SETTrackerHits,sdtTk,"SET digi",nSETHit); - nFTDHit=addHitsToTk(m_FTDTrackerHits,sdtTk,"FTD digi",nFTDHit); - }//end of use space point - } - }//end of use silicon + if(m_useSiSimHit){ + ///Add silicon SimTrackerHit + debug()<<"Add silicon SimTrackerHit"<<endmsg; + nVXDHit=addSimHitsToTk(m_VXDCollection,truthTrackerHitCol,sdtTk,"VXD",nVXDHit); + nSITHit=addSimHitsToTk(m_SITCollection,truthTrackerHitCol,sdtTk,"SIT",nSITHit); + }else{ + ///Add reconstructed hit or digi + debug()<<"Add VXD TrackerHit"<<endmsg; + nVXDHit=addHitsToTk(m_VXDTrackerHits,sdtTk,"VXD digi",nVXDHit); + nSITHit=addHitsToTk(m_SITTrackerHits,sdtTk,"SIT digi",nSITHit); + if(m_useSiSpacePoint.value()){ + ///Add silicon SpacePoint + debug()<<"Add silicon SpacePoint"<<endmsg; + if(m_useSiSpacePoint){ + nSITHit=addHitsToTk(m_SITSpacePointCol,sdtTk,"SIT sp",nSITHit); + } + }//end of use space point + } // end of Add reconstructed hit or digi + } // end of truth hits + }//end of use silicon + + if(m_useDC){ + ///Create DC Track + edm4hep::MutableTrack dcTrack=dcTrackCol->create(); + + //Create TrackState + edm4hep::TrackState trackStateFirstDCHit; + float charge=trackStateMc.omega/fabs(trackStateMc.omega); + if(m_useFirstHitForDC&&getTrackStateFirstHit(m_DCSimTrackerHitCol, + charge,trackStateFirstDCHit)){ + dcTrack.addToTrackStates(trackStateFirstDCHit); + dcTrack.addToTrackStates(trackStateMc); + }else{ + dcTrack.addToTrackStates(trackStateMc); + dcTrack.addToTrackStates(trackStateFirstDCHit); + } + sdtTk.addToTrackStates(trackStateFirstDCHit); - if(m_useDC){ - ///Create DC Track - edm4hep::MutableTrack dcTrack=dcTrackCol->create(); - - //Create TrackState - edm4hep::TrackState trackStateFirstDCHit; - float charge=trackStateMc.omega/fabs(trackStateMc.omega); - if(m_useFirstHitForDC&&getTrackStateFirstHit(m_DCSimTrackerHitCol, - charge,trackStateFirstDCHit)){ - dcTrack.addToTrackStates(trackStateFirstDCHit); - dcTrack.addToTrackStates(trackStateMc); - }else{ - dcTrack.addToTrackStates(trackStateMc); - dcTrack.addToTrackStates(trackStateFirstDCHit); + ///Add other track properties + dcTrack.setNdf(dcTrack.trackerHits_size()-5); + + if(!m_useTrackFinding){ + if(m_useIdealHit){ + nDCHitDCTk=addIdealHitsToTk(m_DCDigiCol,truthTrackerHitCol,dcTrack, + "DC digi",nDCHitDCTk); + }else{ + nDCHitDCTk=addHitsToTk(m_DCDigiCol,dcTrack,"DC digi(dcTrack)",nDCHitDCTk); + } + debug()<<"dcTrack nHit "<<dcTrack.trackerHits_size()<<dcTrack<<endmsg; + } } - //sdtTk.addToTrackStates(trackStateFirstDCHit); - ///Add other track properties - dcTrack.setNdf(dcTrack.trackerHits_size()-5); + debug()<<"sdtTk nHit "<<sdtTk.trackerHits_size()<<sdtTk<<endmsg; + debug()<<"nVXDHit "<<nVXDHit<<" nSITHit "<<nSITHit<<" nSETHit "<<nSETHit + <<" nFTDHit "<<nFTDHit<<" nDCHitSDTTk "<<nDCHitSDTTk<<endmsg; + std::cout<<"iSitrk = " << iSitrk << " nVXDHit "<<nVXDHit<<" nSITHit "<<nSITHit<<" nSETHit "<<nSETHit + <<" nFTDHit "<<nFTDHit<<" nDCHitSDTTk "<<nDCHitSDTTk<<std::endl;; - ///Add DC hits to tracks after track state set - if(m_useIdealHit){ - nDCHitDCTk=addIdealHitsToTk(m_DCDigiCol,truthTrackerHitCol,dcTrack, - "DC digi",nDCHitDCTk); - }else{ - nDCHitDCTk=addHitsToTk(m_DCDigiCol,dcTrack,"DC digi",nDCHitDCTk); - } -// if(m_useSi) nDCHitSDTTk=addHitsToTk(m_DCDigiCol,sdtTk,"DC digi",nDCHitSDTTk); - // if(m_useSi) - // { - if(m_smearHits){ - m_nSmearDCTrackHit = smearDCTkhit(m_DCDigiCol, - m_SmeartruthTrackerHitCol,m_DCSimTrackerHitCol, - w_SimSmearHCol,m_DCHitAssociationCol, - w_SmearAssociationCol,m_resX,m_resY,m_resZ); + if(m_tuple){ + m_nHitOnSdtTkVXD[iSitrk]=nVXDHit; + m_nHitOnSdtTkSIT[iSitrk]=nSITHit; + m_nHitOnSdtTkDC[iSitrk]=nDCHitSDTTk; + m_nHitOnSdtTk[iSitrk]=sdtTk.trackerHits_size(); + StatusCode sc=m_tuple->write(); } + }//end of loop over siTk - if(!m_useNoiseHits) - { - //nDCHitSDTTk=addHitsToTk(m_DCDigiCol,sdtTk,"DC digi",nDCHitSDTTk); - nDCHitSDTTk=addHitsToTk(m_SmeartruthTrackerHitCol,sdtTk,"DC digi",nDCHitSDTTk); - } else { - m_nNoiseOnSdtTk = makeNoiseHit(SimVec,Vec,AssoVec, - m_SmeartruthTrackerHitCol.get(),w_SmearAssociationCol.get()); - if(debugNoiseHitsCol(Vec))std::cout << " Make noise hits successfully!" << std::endl; - nDCHitSDTTk=addHitsToTk(w_NoiseHitCol,sdtTk, - "DC digi",nDCHitSDTTk); - } - //} - - //track.setType();//TODO - //track.setChi2(gauss(digiDCHitsCol->size-5(),1));//FIXME - //track.setDEdx();//TODO - - debug()<<"dcTrack nHit "<<dcTrack.trackerHits_size()<<dcTrack<<endmsg; - } - - ///Set other track parameters - //sdtTk.setNdf(sdtTk.trackerHits_size()-5); - //double radiusOfInnermostHit=1e9; - //edm4hep::Vector3d digiPos=digiDC.getPosition(); - //double r=sqrt(digiPos.x*digiPos.x+digiPos.y*digiPos.y); - //if(r<radiusOfInnermostHit) radiusOfInnermostHit=r; - - debug()<<"sdtTk nHit "<<sdtTk.trackerHits_size()<<sdtTk<<endmsg; - debug()<<"nVXDHit "<<nVXDHit<<" nSITHit "<<nSITHit<<" nSETHit "<<nSETHit - <<" nFTDHit "<<nFTDHit<<" nDCHitSDTTk "<<nDCHitSDTTk<<endmsg; - - if(m_tuple){ - m_nHitOnSdtTkVXD=nVXDHit; - m_nHitOnSdtTkSIT=nSITHit; - m_nHitOnSdtTkSET=nSETHit; - m_nHitOnSdtTkFTD=nFTDHit; - m_nHitOnSdtTkDC=nDCHitSDTTk; - //m_nHitOnSdtTk=sdtTk.trackerHits_size(); - debugEvent(); - StatusCode sc=m_tuple->write(); - } + debugEvent(); + StatusCode sc=m_tuple->write(); return StatusCode::SUCCESS; } @@ -401,88 +424,71 @@ StatusCode TruthTrackerAlg::finalize() } void TruthTrackerAlg::getTrackStateFromMcParticle( - const edm4hep::MCParticleCollection* mcParticleCol, + edm4hep::MCParticle mcParticle, edm4hep::TrackState& trackState) { ///Convert MCParticle to DC Track and ReconstructedParticle - debug()<<"MCParticleCol size="<<mcParticleCol->size()<<endmsg; - for(auto mcParticle : *mcParticleCol){ - /// skip mcParticleVertex do not have enough associated hits TODO - ///Vertex - const edm4hep::Vector3d mcParticleVertex=mcParticle.getVertex();//mm - edm4hep::Vector3f mcParticleVertexSmeared;//mm - mcParticleVertexSmeared.x= - CLHEP::RandGauss::shoot(mcParticleVertex.x,m_resVertexX); - mcParticleVertexSmeared.y= - CLHEP::RandGauss::shoot(mcParticleVertex.y,m_resVertexY); - mcParticleVertexSmeared.z= - CLHEP::RandGauss::shoot(mcParticleVertex.z,m_resVertexZ); - ///Momentum - - const edm4hep::Vector3f mcParticleMom=mcParticle.getMomentum();//GeV - - double mcParticlePt=sqrt(mcParticleMom.x*mcParticleMom.x+ - mcParticleMom.y*mcParticleMom.y); - //double mcParticlePtSmeared= - // CLHEP::RandGauss::shoot(mcParticlePt,m_resPT); - double mcParticleMomPhi=atan2(mcParticleMom.y,mcParticleMom.x); - double mcParticleMomPhiSmeared= - CLHEP::RandGauss::shoot(mcParticleMomPhi,m_resMomPhi); - edm4hep::Vector3f mcParticleMomSmeared; - mcParticleMomSmeared.x=mcParticlePt*cos(mcParticleMomPhiSmeared); - mcParticleMomSmeared.y=mcParticlePt*sin(mcParticleMomPhiSmeared); - mcParticleMomSmeared.z=CLHEP::RandGauss::shoot(mcParticleMom.z,m_resPz); - - ///Converted to Helix - double B[3]={1e9,1e9,1e9}; - m_dd4hepField.magneticField({0.,0.,0.},B); - HelixClass helix; - //float pos[3]={mcParticleVertexSmeared.x, - // mcParticleVertexSmeared.y,mcParticleVertexSmeared.z}; - //float mom[3]={mcParticleMomSmeared.x,mcParticleMomSmeared.y, - // mcParticleMomSmeared.z}; - ////FIXME DEBUG - double pos[3]={mcParticleVertex.x,mcParticleVertex.y,mcParticleVertex.z};//mm - double mom[3]={mcParticleMom.x,mcParticleMom.y,mcParticleMom.z};//mm - helix.Initialize_VP(pos,mom,mcParticle.getCharge(),B[2]/dd4hep::tesla); - if(m_tuple) { - for(int ii=0;ii<3;ii++) { - m_mcMom[ii]=mom[ii];//GeV - m_mcPos[ii]=pos[ii];//mm - } - } - - ///new Track - trackState.D0=helix.getD0(); - trackState.phi=helix.getPhi0(); - trackState.omega=helix.getOmega(); - trackState.Z0=helix.getZ0(); - trackState.tanLambda=helix.getTanLambda(); - trackState.referencePoint=helix.getReferencePoint(); - - decltype(trackState.covMatrix) covMatrix; - for(int i=0;i<covMatrix.size();i++){covMatrix[i]=999.;}//FIXME - - trackState.covMatrix=covMatrix; - - getCircleFromPosMom(pos,mom,B[2]/dd4hep::tesla,mcParticle.getCharge(),m_helixRadius,m_helixXC,m_helixYC); - - debug()<<"dd4hep::mm "<<dd4hep::mm<<" dd4hep::cm "<<dd4hep::cm<<endmsg; - debug()<<"mcParticle "<<mcParticle - <<" helix radius "<<helix.getRadius()<<" "<<helix.getXC()<<" " - <<helix.getYC()<<" mm " - <<" myhelix radius "<<m_helixRadius<<" "<<m_helixXC<<" " - <<m_helixYC<<" mm " - <<" momMC "<<mom[0]<<" "<<mom[1]<<" "<<mom[2]<<"GeV" - <<" posMC "<<pos[0]<<" "<<pos[1]<<" "<<pos[2]<<"mm" - <<" momPhi "<<mcParticleMomPhi - <<" mcParticleVertex("<<mcParticleVertex<<")mm " - <<" mcParticleVertexSmeared("<<mcParticleVertexSmeared<<")mm " - <<" mcParticleMom("<<mcParticleMom<<")GeV " - <<" mcParticleMomSmeared("<<mcParticleMomSmeared<<")GeV " - <<" Bxyz "<<B[0]/dd4hep::tesla<<" "<<B[1]/dd4hep::tesla - <<" "<<B[2]/dd4hep::tesla<<" tesla"<<endmsg; - }//end loop over MCParticleCol + /// skip mcParticleVertex do not have enough associated hits TODO + ///Vertex + const edm4hep::Vector3d mcParticleVertex=mcParticle.getVertex();//mm + edm4hep::Vector3f mcParticleVertexSmeared;//mm + mcParticleVertexSmeared.x= + CLHEP::RandGauss::shoot(mcParticleVertex.x,m_resVertexX); + mcParticleVertexSmeared.y= + CLHEP::RandGauss::shoot(mcParticleVertex.y,m_resVertexY); + mcParticleVertexSmeared.z= + CLHEP::RandGauss::shoot(mcParticleVertex.z,m_resVertexZ); + ///Momentum + const edm4hep::Vector3f mcParticleMom=mcParticle.getMomentum();//GeV + float mcParticlePt=sqrt(mcParticleMom.x*mcParticleMom.x+ + mcParticleMom.y*mcParticleMom.y); + //float mcParticlePtSmeared= + // CLHEP::RandGauss::shoot(mcParticlePt,m_resPT); + float mcParticleMomPhi=atan2(mcParticleMom.y,mcParticleMom.x); + float mcParticleMomPhiSmeared= + CLHEP::RandGauss::shoot(mcParticleMomPhi,m_resMomPhi); + edm4hep::Vector3f mcParticleMomSmeared; + mcParticleMomSmeared.x=mcParticlePt*cos(mcParticleMomPhiSmeared); + mcParticleMomSmeared.y=mcParticlePt*sin(mcParticleMomPhiSmeared); + mcParticleMomSmeared.z=CLHEP::RandGauss::shoot(mcParticleMom.z,m_resPz); + + ///Converted to Helix + double B[3]={1e9,1e9,1e9}; + m_dd4hepField.magneticField({0.,0.,0.},B); + HelixClass helix; + ////FIXME DEBUG + float pos[3]={mcParticleVertex.x,mcParticleVertex.y,mcParticleVertex.z};//mm + float mom[3]={mcParticleMom.x,mcParticleMom.y,mcParticleMom.z};//mm + helix.Initialize_VP(pos,mom,mcParticle.getCharge(),B[2]/dd4hep::tesla); + + ///new Track + trackState.D0=helix.getD0(); + trackState.phi=helix.getPhi0(); + trackState.omega=helix.getOmega(); + trackState.Z0=helix.getZ0(); + trackState.tanLambda=helix.getTanLambda(); + trackState.referencePoint=helix.getReferencePoint(); + decltype(trackState.covMatrix) covMatrix; + for(int i=0;i<covMatrix.size();i++){covMatrix[i]=999.;}//FIXME + trackState.covMatrix=covMatrix; + + getCircleFromPosMom(pos,mom,B[2]/dd4hep::tesla,mcParticle.getCharge(),m_helixRadius,m_helixXC,m_helixYC); + + debug()<<"dd4hep::mm "<<dd4hep::mm<<" dd4hep::cm "<<dd4hep::cm<<endmsg; + debug()<<"mcParticle "<<mcParticle + <<" helix radius "<<helix.getRadius()<<" "<<helix.getXC()<<" " + <<helix.getYC()<<" mm " + <<" myhelix radius "<<m_helixRadius<<" "<<m_helixXC<<" " + <<m_helixYC<<" mm " + <<" momMC "<<mom[0]<<" "<<mom[1]<<" "<<mom[2]<<"GeV" + <<" posMC "<<pos[0]<<" "<<pos[1]<<" "<<pos[2]<<"mm" + <<" momPhi "<<mcParticleMomPhi + <<" mcParticleVertex("<<mcParticleVertex<<")mm " + <<" mcParticleVertexSmeared("<<mcParticleVertexSmeared<<")mm " + <<" mcParticleMom("<<mcParticleMom<<")GeV " + <<" mcParticleMomSmeared("<<mcParticleMomSmeared<<")GeV " + <<" Bxyz "<<B[0]/dd4hep::tesla<<" "<<B[1]/dd4hep::tesla + <<" "<<B[2]/dd4hep::tesla<<" tesla"<<endmsg; }//end of getTrackStateFromMcParticle bool TruthTrackerAlg::getTrackStateFirstHit( @@ -504,9 +510,6 @@ bool TruthTrackerAlg::getTrackStateFirstHit( minHitTime=dcSimTrackerHit.getTime(); firstHit=dcSimTrackerHit; } - //debug()<<"simTrackerHit time "<<dcSimTrackerHit.getTime() - // <<" pos "<<dcSimTrackerHit.getPosition() - // <<" mom "<<dcSimTrackerHit.getMomentum()<<endmsg; } const edm4hep::Vector3d pos=firstHit.getPosition(); const edm4hep::Vector3f mom=firstHit.getMomentum(); @@ -544,6 +547,7 @@ void TruthTrackerAlg::debugEvent() ///Retrieve silicon Track const edm4hep::TrackCollection* siTrackCol=nullptr; siTrackCol=m_siSubsetTrackCol.get(); + int nSiTrk = 0; if(nullptr!=siTrackCol){ for(auto siTk:*siTrackCol){ debug()<<"siTk: "<<siTk<<endmsg; @@ -555,17 +559,12 @@ void TruthTrackerAlg::debugEvent() trackStat.omega, trackStat.tanLambda, B[2]/dd4hep::tesla); if(m_tuple){ - m_siMom[0]=helix.getMomentum()[0]; - m_siMom[1]=helix.getMomentum()[1]; - m_siMom[2]=helix.getMomentum()[2]; - m_siPos[0]=helix.getReferencePoint()[0]; - m_siPos[1]=helix.getReferencePoint()[1]; - m_siPos[2]=helix.getReferencePoint()[2]; - m_nHitOnSiTkVXD=nHotsOnTrack(siTk,lcio::ILDDetID::VXD); - m_nHitOnSiTkSIT=nHotsOnTrack(siTk,lcio::ILDDetID::SIT); - m_nHitOnSiTkSET=nHotsOnTrack(siTk,lcio::ILDDetID::SET); - m_nHitOnSiTkFTD=nHotsOnTrack(siTk,lcio::ILDDetID::FTD); + m_nHitOnSiTkVXD[nSiTrk]=nHotsOnTrack(siTk,lcio::ILDDetID::VXD); + m_nHitOnSiTkSIT[nSiTrk]=nHotsOnTrack(siTk,lcio::ILDDetID::SIT); + m_nHitOnSiTkSET[nSiTrk]=nHotsOnTrack(siTk,lcio::ILDDetID::SET); + m_nHitOnSiTkFTD[nSiTrk]=nHotsOnTrack(siTk,lcio::ILDDetID::FTD); } + nSiTrk++; }//end of loop over siTk } if(m_tuple){ @@ -581,19 +580,13 @@ void TruthTrackerAlg::debugEvent() m_nTrackerHitSET=trackerHitColSize(m_SETTrackerHits); m_nTrackerHitFTD=trackerHitColSize(m_FTDTrackerHits); m_nTrackerHitDC=trackerHitColSize(m_DCDigiCol); - - //SpacePoints - if(m_useSiSpacePoint){ - m_nSpacePointSIT=trackerHitColSize(m_SITSpacePointCol); - } - //m_nSpacePointSET=trackerHitColSize(m_SETSpacePointCol); - m_nSpacePointFTD=trackerHitColSize(m_FTDSpacePointCol); } } } -int TruthTrackerAlg::addIdealHitsToTk(DataHandle<edm4hep::TrackerHitCollection>& - colHandle, edm4hep::TrackerHitCollection*& truthTrackerHitCol, +int TruthTrackerAlg::addIdealHitsToTk( + DataHandle<edm4hep::TrackerHitCollection>& colHandle, + edm4hep::TrackerHitCollection*& truthTrackerHitCol, edm4hep::MutableTrack& track, const char* msg,int nHitAdded) { if(nHitAdded>0) return nHitAdded; @@ -611,13 +604,14 @@ int TruthTrackerAlg::addIdealHitsToTk(DataHandle<edm4hep::TrackerHitCollection>& //calc. doca of helix to wire TVector3 wire(endPointStart.X()/dd4hep::mm,endPointStart.Y()/dd4hep::mm,0);//to mm TVector3 center(m_helixXC,m_helixYC,0);//mm - double docaIdeal=(center-wire).Mag()-m_helixRadius;//mm + float docaIdeal=(center-wire).Mag()-m_helixRadius;//mm TVector3 centerFirst(m_helixXCFirst,m_helixYCFirst,0);//mm - double docaIdealFirst=(centerFirst-wire).Mag()-m_helixRadiusFirst;//mm + float docaIdealFirst=(centerFirst-wire).Mag()-m_helixRadiusFirst;//mm //add modified hit auto tmpHit = truthTrackerHitCol->create(); tmpHit=hit.clone(); + //tmpHit=hit; tmpHit.setTime(fabs(docaIdeal)*1e3/40.);//40#um/ns, drift time in ns track.addToTrackerHits(tmpHit); @@ -633,182 +627,119 @@ int TruthTrackerAlg::addIdealHitsToTk(DataHandle<edm4hep::TrackerHitCollection>& return nHit; } -bool TruthTrackerAlg::debugNoiseHitsCol(edm4hep::TrackerHitCollection* Vec) +int TruthTrackerAlg::addHitsToTk(DataHandle<edm4hep::TrackerHitCollection>& +colHandle, edm4hep::MutableTrack& track, const char* msg,int nHitAdded) { - m_nNoiseDCTrackHit = Vec->size(); -std::cout << " m_nNoiseDCTrackHit = " << m_nNoiseDCTrackHit << std::endl; - int ihit=0; - for(auto Vechit: *Vec) - { - m_NoiseDriftDistance[ihit] = (Vechit.getTime())*m_driftVelocity*1e-3; - ihit++; + if(nHitAdded>0) return nHitAdded; + int nHit=0; + const edm4hep::TrackerHitCollection* col=colHandle.get(); + debug()<<"add "<<msg<<" "<<col->size()<<" trackerHit"<<endmsg; + //sort,FIXME + for(auto hit:*col){ + track.addToTrackerHits(hit); + ++nHit; } - - return true; + return nHit; } -int TruthTrackerAlg::makeNoiseHit(edm4hep::SimTrackerHitCollection* SimVec, - edm4hep::TrackerHitCollection* Vec, - edm4hep::MCRecoTrackerAssociationCollection* AssoVec, - const edm4hep::TrackerHitCollection* digiDCHitsCol, - const edm4hep::MCRecoTrackerAssociationCollection* assoHits) +int TruthTrackerAlg::addOneLayerHitsToTk(DataHandle<edm4hep::TrackerHitCollection>& +colHandle, edm4hep::MutableTrack& track, const char* msg,int nHitAdded) { - int nNoise = 0; - //loop all hits - for(unsigned int i = 0; i<(digiDCHitsCol->size()); i++) - { - edm4hep::TrackerHit mcHit = digiDCHitsCol->at(i); - unsigned long long wcellid = mcHit.getCellID(); - - float pocaTime = mcHit.getTime(); - - // store trackHit - auto trkHit = Vec->create(); - - trkHit.setCellID(wcellid); - trkHit.setTime(pocaTime); - trkHit.setEDep(mcHit.getEDep()); - //trkHit.setEdx(mcHit.getEdx()); - trkHit.setPosition(mcHit.getPosition()); - trkHit.setCovMatrix(mcHit.getCovMatrix()); - for(int iAsso=0;iAsso<(int) assoHits->size();iAsso++) - { - - if(assoHits->at(iAsso).getRec().getCellID()==wcellid ) - { - auto SimtrkHit = SimVec->create(); - - SimtrkHit.setCellID(assoHits->at(iAsso).getSim().getCellID()); - SimtrkHit.setEDep(assoHits->at(iAsso).getSim().getEDep()); - SimtrkHit.setTime(assoHits->at(iAsso).getSim().getTime()); - SimtrkHit.setPathLength(assoHits->at(iAsso).getSim().getPathLength()); - SimtrkHit.setQuality(assoHits->at(iAsso).getSim().getQuality()); - SimtrkHit.setPosition(assoHits->at(iAsso).getSim().getPosition()); - SimtrkHit.setMomentum(assoHits->at(iAsso).getSim().getMomentum()); - SimtrkHit.setMCParticle(assoHits->at(iAsso).getSim().getMCParticle()); - - auto asso = AssoVec->create(); - asso.setRec(trkHit); - asso.setSim(SimtrkHit); - asso.setWeight(SimtrkHit.getEDep()/trkHit.getEDep()); - } + if(nHitAdded>0) return nHitAdded; + int nHit=0; + const edm4hep::TrackerHitCollection* col=colHandle.get(); + debug()<<"add "<<msg<<" "<<col->size()<<" trackerHit"<<endmsg; + //sort,FIXME + bool isHaveHit[55]={0}; + for(auto hit:*col){ + unsigned long long cellID=hit.getCellID(); + int layer = m_decoder->get(cellID,"layer"); + if(!(isHaveHit[layer])){ + track.addToTrackerHits(hit); + ++nHit; } + isHaveHit[layer] = 1; + } + return nHit; +} - double prob1 = fRandom.Uniform(1.); - if(prob1 > m_fHitPurity) continue; - - float noiseTime = m_pocaTime*fRandom.Uniform(1.); - if(noiseTime>pocaTime) continue; - nNoise++; - trkHit.setTime(noiseTime); - - for(int iAsso=0;iAsso<(int) assoHits->size();iAsso++) +void TruthTrackerAlg::getAssoMCParticle( + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + edm4hep::TrackerHit trackerHit, + edm4hep::MCParticle& mcParticle) const +{ + edm4hep::SimTrackerHit simTrackerHit; + for(auto assoHit: *assoHits){ + if(assoHit.getRec()==trackerHit) { - - if(assoHits->at(iAsso).getRec().getCellID()==wcellid ) - { - - AssoVec->at(iAsso).setRec(trkHit); - - } + simTrackerHit=assoHit.getSim(); + mcParticle = simTrackerHit.getMCParticle(); } - } - -std::cout << " Truth Noise number = " << nNoise << std::endl; - return nNoise; } -int TruthTrackerAlg::smearDCTkhit(DataHandle<edm4hep::TrackerHitCollection>& - colHandle,DataHandle<edm4hep::TrackerHitCollection>& smearCol, - DataHandle<edm4hep::SimTrackerHitCollection>& SimDCHitCol, - DataHandle<edm4hep::SimTrackerHitCollection>& SimSmearDCHitCol, - DataHandle<edm4hep::MCRecoTrackerAssociationCollection>& AssoDCHitCol, - DataHandle<edm4hep::MCRecoTrackerAssociationCollection>& AssoSmearDCHitCol, - double resX, double resY, double resZ) +edm4hep::SimTrackerHit TruthTrackerAlg::getAssoSimTrackerHit( + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + edm4hep::TrackerHit trackerHit) const { - int nHit=0; - const edm4hep::TrackerHitCollection* col=colHandle.get(); - auto smearTrackerHitCol = smearCol.createAndPut(); - - auto simDCCol = SimDCHitCol.get(); - auto SimVec = SimSmearDCHitCol.createAndPut(); - - auto assoHits = AssoDCHitCol.get(); - auto AssoVec = AssoSmearDCHitCol.createAndPut(); - - //sort,FIXME - for(auto hit:*col){ - - auto smearHit=smearTrackerHitCol->create(); - - float truthD = (hit.getTime())*m_driftVelocity*1e-3; - m_DriftDistance[nHit] = truthD; - - truthD+=gRandom->Gaus(0,fabs(m_resX)); - m_SmearDriftDistance[nHit] = truthD; - float smearT = (truthD*1e3)/m_driftVelocity; - - smearHit.setTime(smearT); - smearHit.setCellID(hit.getCellID()); - smearHit.setType(hit.getCellID()); - smearHit.setQuality(hit.getQuality()); - smearHit.setEDep(hit.getEDep()); - smearHit.setEDepError(hit.getEDepError()); - //smearHit.setEdx(hit.getEdx()); - smearHit.setPosition(hit.getPosition()); - smearHit.setCovMatrix(hit.getCovMatrix()); - smearHit.addToRawHits(hit.getObjectID()); - - ++nHit; - for(int iAsso=0;iAsso<(int) assoHits->size();iAsso++) + edm4hep::SimTrackerHit simTrackerHit; + for(auto assoHit: *assoHits){ + if(assoHit.getRec()==trackerHit) { - - if(assoHits->at(iAsso).getRec().getCellID()== smearHit.getCellID()) - { - auto SimtrkHit = SimVec->create(); - - SimtrkHit.setCellID(assoHits->at(iAsso).getSim().getCellID()); - SimtrkHit.setEDep(assoHits->at(iAsso).getSim().getEDep()); - SimtrkHit.setTime(assoHits->at(iAsso).getSim().getTime()); - SimtrkHit.setPathLength(assoHits->at(iAsso).getSim().getPathLength()); - SimtrkHit.setQuality(assoHits->at(iAsso).getSim().getQuality()); - SimtrkHit.setPosition(assoHits->at(iAsso).getSim().getPosition()); - SimtrkHit.setMomentum(assoHits->at(iAsso).getSim().getMomentum()); - SimtrkHit.setMCParticle(assoHits->at(iAsso).getSim().getMCParticle()); - - auto asso = AssoVec->create(); - asso.setRec(smearHit); - asso.setSim(SimtrkHit); - asso.setWeight(SimtrkHit.getEDep()/smearHit.getEDep()); - } + simTrackerHit=assoHit.getSim(); } } - std::cout << " SimSmear size = " << SimVec->size() << " Asso size = " << AssoVec->size() << std::endl; - std::cout << " Sim size = " << simDCCol->size() << " Asso size = " << assoHits->size() << std::endl; - - return nHit; + return simTrackerHit; } -int TruthTrackerAlg::addHitsToTk(DataHandle<edm4hep::TrackerHitCollection>& - colHandle, edm4hep::MutableTrack& track, const char* msg,int nHitAdded) +int TruthTrackerAlg::getSiMCParticle(edm4hep::Track siTrack, + const edm4hep::TrackerHitCollection* dcTrackerHits, + const edm4hep::MCRecoTrackerAssociationCollection* vxdAsso, + const edm4hep::MCRecoTrackerAssociationCollection* sitAsso, + const edm4hep::MCRecoTrackerAssociationCollection* setAsso, + const edm4hep::MCRecoTrackerAssociationCollection* ftdAsso, + const edm4hep::MCRecoTrackerAssociationCollection* dcAsso + ) { - if(nHitAdded>0) return nHitAdded; - int nHit=0; - const edm4hep::TrackerHitCollection* col=colHandle.get(); - debug()<<"add "<<msg<<" "<<col->size()<<" trackerHit"<<endmsg; - //sort,FIXME - for(auto hit:*col){ - track.addToTrackerHits(hit); - ++nHit; + int nDCHit =0; + + edm4hep::TrackerHit trackerHit = siTrack.getTrackerHits(0); + unsigned long long cellID = trackerHit.getCellID(); + UTIL::BitField64 encoder(lcio::ILDCellID0::encoder_string) ; + encoder.setValue(cellID); + int detID=encoder[lcio::ILDCellID0::subdet] ; + edm4hep::MCParticle mcParticle; + if(lcio::ILDDetID::VXD==detID){ + std::cout << "the hit from VXD!!" << std::endl; + getAssoMCParticle(vxdAsso,trackerHit,mcParticle); + }else if(lcio::ILDDetID::SIT==detID){ + getAssoMCParticle(sitAsso,trackerHit,mcParticle); + std::cout << "the hit from SIT!!" << std::endl; + }else if(lcio::ILDDetID::SET==detID){ + getAssoMCParticle(setAsso,trackerHit,mcParticle); + std::cout << "the hit from SET!!" << std::endl; + }else if(lcio::ILDDetID::FTD==detID){ + getAssoMCParticle(ftdAsso,trackerHit,mcParticle); + std::cout << "the hit from FTD!!" << std::endl; + }else{ + std::cout << "the hit from ERROR!!" << std::endl; } - return nHit; + + for(auto dcHit:*dcTrackerHits){ + + edm4hep::SimTrackerHit simDCHit = getAssoSimTrackerHit(dcAsso,dcHit); + + if(mcParticle==simDCHit.getMCParticle()) nDCHit++; + } + return nDCHit; } + int TruthTrackerAlg::addSimHitsToTk( DataHandle<edm4hep::SimTrackerHitCollection>& colHandle, edm4hep::TrackerHitCollection*& truthTrackerHitCol, + //edm4hep::Track& track, const char* msg,int nHitAdded) edm4hep::MutableTrack& track, const char* msg,int nHitAdded) { if(nHitAdded>0) return nHitAdded; @@ -824,7 +755,7 @@ int TruthTrackerAlg::addSimHitsToTk( debug()<<" addSimHitsToTk "<<msg<<" "<<sqrt(pos.x*pos.x+pos.y*pos.y)<<endmsg; UTIL::BitField64 encoder(lcio::ILDCellID0::encoder_string) ; int detID=encoder[lcio::ILDCellID0::subdet] ; - double resolution[3]; + float resolution[3]; if(lcio::ILDDetID::VXD==detID){ for(int i=0;i<3;i++)resolution[i]=m_resVXD[i]; }else if(lcio::ILDDetID::SIT==detID){ @@ -863,10 +794,67 @@ int TruthTrackerAlg::addSimHitsToTk( return nHit; } +bool TruthTrackerAlg::debugVertex(edm4hep::Track sourceTrack, + const edm4hep::MCRecoTrackerAssociationCollection* vxdAsso, + const edm4hep::MCRecoTrackerAssociationCollection* sitAsso, + const edm4hep::MCRecoTrackerAssociationCollection* setAsso, + const edm4hep::MCRecoTrackerAssociationCollection* ftdAsso + ){ + for(unsigned int iHit=0;iHit<sourceTrack.trackerHits_size();iHit++){ + edm4hep::TrackerHit hit=sourceTrack.getTrackerHits(iHit); + edm4hep::Vector3d position = hit.getPosition(); + + unsigned long long cellID = hit.getCellID(); + UTIL::BitField64 encoder(lcio::ILDCellID0::encoder_string) ; + encoder.setValue(cellID); + + int detID=encoder[lcio::ILDCellID0::subdet] ; + + edm4hep::SimTrackerHit simTrackerHit; + edm4hep::MCParticle mcParticle; + if(lcio::ILDDetID::VXD==detID){ + simTrackerHit = getAssoSimTrackerHit(vxdAsso,hit); + getAssoMCParticle(vxdAsso,hit,mcParticle); + }else if(lcio::ILDDetID::SIT==detID){ + simTrackerHit = getAssoSimTrackerHit(sitAsso,hit); + getAssoMCParticle(sitAsso,hit,mcParticle); + }else if(lcio::ILDDetID::SET==detID){ + simTrackerHit = getAssoSimTrackerHit(setAsso,hit); + getAssoMCParticle(setAsso,hit,mcParticle); + }else if(lcio::ILDDetID::FTD==detID){ + simTrackerHit = getAssoSimTrackerHit(ftdAsso,hit); + getAssoMCParticle(ftdAsso,hit,mcParticle); + }else{ + std::cout << __LINE__ <<"the hit from ERROR!!" << std::endl; + } + + edm4hep::Vector3f momentum = simTrackerHit.getMomentum(); + + float pos[3] = {position[0],position[1],position[2]}; + float mom[3] = {momentum[0]*1e-1,momentum[1]*1e-1,momentum[2]*1e-1}; + + float mcPos[3] = {mcParticle.getVertex().x,mcParticle.getVertex().y,mcParticle.getVertex().z}; + float mcMom[3] = {mcParticle.getMomentum().x,mcParticle.getMomentum().y,mcParticle.getMomentum().z}; + + HelixClass helix; + helix.Initialize_VP(pos,mom,mcParticle.getCharge(),3); + + HelixClass mcHelix; + mcHelix.Initialize_VP(mcPos,mcMom,mcParticle.getCharge(),3); + + float deltaD0 = helix.getD0()-mcHelix.getD0(); + float deltaZ0 = helix.getZ0()-mcHelix.getZ0(); + if((1000*deltaD0)>30 || (1000*deltaZ0)>30){ //um + return true; + break; + } + } + return false; +} + int TruthTrackerAlg::addHotsToTk(edm4hep::Track& sourceTrack, - edm4hep::MutableTrack& targetTrack, int hitType,const char* msg,int nHitAdded) + edm4hep::MutableTrack& targetTrack, int hitType,const char* msg,int nHitAdded) { - if(nHitAdded>0) return nHitAdded; int nHit=0; for(unsigned int iHit=0;iHit<sourceTrack.trackerHits_size();iHit++){ edm4hep::TrackerHit hit=sourceTrack.getTrackerHits(iHit); @@ -889,6 +877,7 @@ int TruthTrackerAlg::nHotsOnTrack(edm4hep::Track& track, int hitType) int nHit=0; for(unsigned int iHit=0;iHit<track.trackerHits_size();iHit++){ edm4hep::TrackerHit hit=track.getTrackerHits(iHit); + //edm4hep::ConstTrackerHit hit=track.getTrackerHits(iHit); UTIL::BitField64 encoder(lcio::ILDCellID0::encoder_string); encoder.setValue(hit.getCellID()); if(encoder[lcio::ILDCellID0::subdet]==hitType){ @@ -912,13 +901,13 @@ int TruthTrackerAlg::simTrackerHitColSize(DataHandle<edm4hep::SimTrackerHitColle return 0; } //unit length is mm -void TruthTrackerAlg::getCircleFromPosMom(double pos[3],double mom[3], - double Bz,double q,double& helixRadius,double& helixXC,double& helixYC) +void TruthTrackerAlg::getCircleFromPosMom(float pos[3],float mom[3], + float Bz,float q,float& helixRadius,float& helixXC,float& helixYC) { - double FCT = 2.99792458E-4;//mm - double pxy = sqrt(mom[0]*mom[0]+mom[1]*mom[1]); + float FCT = 2.99792458E-4;//mm + float pxy = sqrt(mom[0]*mom[0]+mom[1]*mom[1]); helixRadius = pxy / (FCT*Bz); - double phiMomRefPoint = atan2(mom[1],mom[0]); + float phiMomRefPoint = atan2(mom[1],mom[0]); helixXC= pos[0] + helixRadius*cos(phiMomRefPoint-M_PI*0.5*q); helixYC= pos[1] + helixRadius*sin(phiMomRefPoint-M_PI*0.5*q); } diff --git a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.h b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.h index 563d9854..d548c840 100644 --- a/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.h +++ b/Reconstruction/Tracking/src/TruthTracker/TruthTrackerAlg.h @@ -18,8 +18,11 @@ namespace dd4hep { } namespace edm4hep { class MCParticleCollection; + class MCParticle; class SimTrackerHitCollection; + class SimTrackerHit; class TrackerHitCollection; + class TrackerHit; class TrackCollection; class Track; class MutableTrack; @@ -39,8 +42,9 @@ class TruthTrackerAlg: public GaudiAlgorithm virtual StatusCode finalize() override; private: - void getTrackStateFromMcParticle(const edm4hep::MCParticleCollection* - mcParticleCol, edm4hep::TrackState& stat); + int eventNo; + void getTrackStateFromMcParticle(edm4hep::MCParticle mcParticleCol, + edm4hep::TrackState& stat); int addSimHitsToTk(DataHandle<edm4hep::SimTrackerHitCollection>& colHandle, edm4hep::TrackerHitCollection*& truthTrackerHitCol, edm4hep::MutableTrack& track, const char* msg,int nHitAdded); @@ -50,9 +54,11 @@ class TruthTrackerAlg: public GaudiAlgorithm DataHandle<edm4hep::SimTrackerHitCollection>& SimSmearDCHitCol, DataHandle<edm4hep::MCRecoTrackerAssociationCollection>& AssoDCHitCol, DataHandle<edm4hep::MCRecoTrackerAssociationCollection>& AssoSmearDCHitCol, - double resX, double resY, double resZ); + float resX, float resY, float resZ); int addHitsToTk(DataHandle<edm4hep::TrackerHitCollection>& colHandle, edm4hep::MutableTrack& track, const char* msg,int nHitAdded); + int addOneLayerHitsToTk(DataHandle<edm4hep::TrackerHitCollection>& + colHandle, edm4hep::MutableTrack& track, const char* msg,int nHitAdded); int addIdealHitsToTk(DataHandle<edm4hep::TrackerHitCollection>& colHandle, edm4hep::TrackerHitCollection*& truthTrackerHitCol, edm4hep::MutableTrack& track, const char* msg,int nHitAdded); @@ -71,15 +77,31 @@ class TruthTrackerAlg: public GaudiAlgorithm dd4hep::DDSegmentation::GridDriftChamber* m_gridDriftChamber; dd4hep::DDSegmentation::BitFieldCoder* m_decoder; void debugEvent(); + bool debugVertex(edm4hep::Track sourceTrack, + const edm4hep::MCRecoTrackerAssociationCollection* vxdAsso, + const edm4hep::MCRecoTrackerAssociationCollection* sitAsso, + const edm4hep::MCRecoTrackerAssociationCollection* setAsso, + const edm4hep::MCRecoTrackerAssociationCollection* ftdAsso); //unit length is mm - void getCircleFromPosMom(double pos[3],double mom[3], - double Bz,double q,double& helixRadius,double& helixXC,double& helixYC); + void getCircleFromPosMom(float pos[3],float mom[3], + float Bz,float q,float& helixRadius,float& helixXC,float& helixYC); int makeNoiseHit(edm4hep::SimTrackerHitCollection* SimVec, edm4hep::TrackerHitCollection* Vec, edm4hep::MCRecoTrackerAssociationCollection* AssoVec, const edm4hep::TrackerHitCollection* digiDCHitsCol, const edm4hep::MCRecoTrackerAssociationCollection* assoHits); bool debugNoiseHitsCol(edm4hep::TrackerHitCollection* Vec); + int getSiMCParticle(edm4hep::Track siTack, + const edm4hep::TrackerHitCollection* dcTrackerHits, + const edm4hep::MCRecoTrackerAssociationCollection* vxdAsso, + const edm4hep::MCRecoTrackerAssociationCollection* sitAsso, + const edm4hep::MCRecoTrackerAssociationCollection* setAsso, + const edm4hep::MCRecoTrackerAssociationCollection* ftdAsso, + const edm4hep::MCRecoTrackerAssociationCollection* dcAsso); + edm4hep::SimTrackerHit getAssoSimTrackerHit(const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + edm4hep::TrackerHit trackerHit) const; + void getAssoMCParticle(const edm4hep::MCRecoTrackerAssociationCollection* assoHits,edm4hep::TrackerHit trackerHit, + edm4hep::MCParticle& mcParticle) const; //reader // DataHandle<edm4hep::TrackerHitCollection> m_NoiseHitCol{ @@ -112,12 +134,24 @@ class TruthTrackerAlg: public GaudiAlgorithm "FTDTrackerHits" , Gaudi::DataHandle::Reader, this}; DataHandle<edm4hep::SimTrackerHitCollection> m_VXDCollection{ "VXDCollection" , Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> + m_VXDHitAssociationCol{ "VXDTrackerHitAssociation", + Gaudi::DataHandle::Reader, this}; DataHandle<edm4hep::SimTrackerHitCollection> m_SETCollection{ "SETCollection" , Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> + m_SETHitAssociationCol{ "SETTrackerHitAssociation", + Gaudi::DataHandle::Reader, this}; DataHandle<edm4hep::SimTrackerHitCollection> m_SITCollection{ "SITCollection" , Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> + m_SITHitAssociationCol{ "SITTrackerHitAssociation", + Gaudi::DataHandle::Reader, this}; DataHandle<edm4hep::SimTrackerHitCollection> m_FTDCollection{ "FTDCollection" , Gaudi::DataHandle::Reader, this}; + DataHandle<edm4hep::MCRecoTrackerAssociationCollection> + m_FTDHitAssociationCol{ "FTDTrackerHitAssociation", + Gaudi::DataHandle::Reader, this}; //writer DataHandle<edm4hep::TrackCollection> m_DCTrackCol{ "DCTrackCollection", Gaudi::DataHandle::Writer, this}; @@ -126,22 +160,6 @@ class TruthTrackerAlg: public GaudiAlgorithm DataHandle<edm4hep::TrackerHitCollection> m_truthTrackerHitCol{ "TruthTrackerHitCollection", Gaudi::DataHandle::Writer, this}; - // Smear hit - DataHandle<edm4hep::SimTrackerHitCollection> w_SimSmearHCol{ - "SmearSimHitsCollection", Gaudi::DataHandle::Writer, this}; - DataHandle<edm4hep::TrackerHitCollection> m_SmeartruthTrackerHitCol{ - "SmearTrackerHitCollection", Gaudi::DataHandle::Writer, this}; - DataHandle<edm4hep::MCRecoTrackerAssociationCollection> w_SmearAssociationCol{ - "SmearDCHitAssociationCollection", Gaudi::DataHandle::Writer, this}; - // make noise hit - DataHandle<edm4hep::SimTrackerHitCollection> w_SimNoiseHCol{ - "NoiseSimHitsCollection", Gaudi::DataHandle::Writer, this}; - DataHandle<edm4hep::TrackerHitCollection> w_NoiseHitCol{ - "NoiseDCHitsCollection", Gaudi::DataHandle::Writer, this}; - DataHandle<edm4hep::MCRecoTrackerAssociationCollection> w_NoiseAssociationCol{ - "NoiseDCHitAssociationCollection", Gaudi::DataHandle::Writer, this}; - - //readout for getting segmentation Gaudi::Property<std::string> m_readout_name{this, "readout", "DriftChamberHitsCollection"}; @@ -150,13 +168,17 @@ class TruthTrackerAlg: public GaudiAlgorithm Gaudi::Property<bool> m_useSi{this,"useSi",true}; Gaudi::Property<bool> m_useTruthTrack{this,"useTruthTrack",false}; Gaudi::Property<bool> m_useSiTruthHit{this,"useSiTruthHit",false}; + Gaudi::Property<bool> m_useSiSimHit{this,"useSiSimHit",false}; Gaudi::Property<bool> m_skipSecondaryHit{this,"skipSecondaryHit",true}; Gaudi::Property<bool> m_useFirstHitForDC{this,"useFirstHitForDC",false}; Gaudi::Property<bool> m_useSiSpacePoint{this,"useSiSpacePoint",false}; Gaudi::Property<bool> m_useIdealHit{this,"useIdealHit",false}; - Gaudi::Property<bool> m_useNoiseHits{this,"useNoiseHits",false}; - Gaudi::Property<bool> m_smearHits{this,"smearHits",false}; + Gaudi::Property<bool> m_useCutMom{this,"useCutMom",false}; + Gaudi::Property<bool> m_setSiTrackConditions{this,"SetSiTrackConditions",true}; + + Gaudi::Property<bool> m_useTrackFinding{this,"DCTrackFinding",false}; + Gaudi::Property<bool> m_useSelectHitsOneLayer{this,"useSelectHitsOneLayer",false}; Gaudi::Property<float> m_momentumCut{this,"momentumCut",0.1};//momentum cut for the first hit Gaudi::Property<float> m_resPT{this,"resPT",0};//ratio @@ -171,33 +193,20 @@ class TruthTrackerAlg: public GaudiAlgorithm Gaudi::Property<float> m_resVertexY{this,"resVertexY",0.003};//3um Gaudi::Property<float> m_resVertexZ{this,"resVertexZ",0.003};//3um Gaudi::Property<int> m_maxDCDigiCut{this,"maxDigiCut",1e6}; + Gaudi::Property<int> m_debugPID{this,"debugPID",0};// {0,1,2,3,4} = {e-,mu-,pi-,K-,p} Gaudi::Property<std::vector<float> > m_resVXD{this,"resVXD",{0.003,0.003,0.003}};//mm Gaudi::Property<std::vector<float> > m_resSIT{this,"resSIT",{0.003,0.003,0.003}};//mm Gaudi::Property<std::vector<float> > m_resSET{this,"resSET",{0.003,0.003,0.003}};//mm Gaudi::Property<std::vector<float> > m_resFTDPixel{this,"resFTDPixel",{0.003,0.003,0.003}};//mm Gaudi::Property<std::vector<float> > m_resFTDStrip{this,"resFTDStrip",{0.003,0.003,0.003}};//mm + Gaudi::Property<std::vector<float> > m_cutMomHit{this,"cutMomHit",{0.65,0.04,0.2,0.05,0.14}};//e,mu,pi,K,p - Gaudi::Property<double> m_fHitPurity{this,"fHitPurity",0.1}; - Gaudi::Property<float> m_pocaTime { this, "pocaTime", 225};// ns - - double m_helixRadius,m_helixXC,m_helixYC; - double m_helixRadiusFirst,m_helixXCFirst,m_helixYCFirst; + float m_helixRadius,m_helixXC,m_helixYC; + float m_helixRadiusFirst,m_helixXCFirst,m_helixYCFirst; NTuple::Tuple* m_tuple; - NTuple::Item<int> m_run; - NTuple::Item<int> m_evt; - NTuple::Array<double> m_siMom; - NTuple::Array<double> m_siPos; - NTuple::Array<double> m_mcMom; - NTuple::Array<double> m_mcPos; - + NTuple::Item<int> m_nSDTTrack; NTuple::Item<int> m_nDCTrackHit; - NTuple::Item<int> m_nSmearDCTrackHit; - NTuple::Item<int> m_nNoiseDCTrackHit; - NTuple::Array<float> m_DriftDistance; - NTuple::Array<float> m_SmearDriftDistance; - NTuple::Array<float> m_NoiseDriftDistance; - NTuple::Item<int> m_nSimTrackerHitVXD; NTuple::Item<int> m_nSimTrackerHitSIT; NTuple::Item<int> m_nSimTrackerHitSET; @@ -208,28 +217,21 @@ class TruthTrackerAlg: public GaudiAlgorithm NTuple::Item<int> m_nTrackerHitSET; NTuple::Item<int> m_nTrackerHitFTD; NTuple::Item<int> m_nTrackerHitDC; - NTuple::Item<int> m_nTrackerHitErrVXD; - NTuple::Item<int> m_nTrackerHitErrSIT; - NTuple::Item<int> m_nTrackerHitErrSET; - NTuple::Item<int> m_nTrackerHitErrFTD; - NTuple::Item<int> m_nSpacePointSIT; - NTuple::Item<int> m_nSpacePointSET; - NTuple::Item<int> m_nSpacePointFTD; - NTuple::Item<int> m_nSpacePointErrVXD; - NTuple::Item<int> m_nSpacePointErrSIT; - NTuple::Item<int> m_nSpacePointErrSET; - NTuple::Item<int> m_nSpacePointErrFTD; - NTuple::Item<int> m_nHitOnSiTkVXD; - NTuple::Item<int> m_nHitOnSiTkSIT; - NTuple::Item<int> m_nHitOnSiTkSET; - NTuple::Item<int> m_nHitOnSiTkFTD; - NTuple::Item<int> m_nHitOnSdtTkVXD; - NTuple::Item<int> m_nHitOnSdtTkSIT; - NTuple::Item<int> m_nHitOnSdtTkSET; - NTuple::Item<int> m_nHitOnSdtTkFTD; - NTuple::Item<int> m_nHitOnSdtTkDC; - NTuple::Item<int> m_nHitOnSdtTk; - NTuple::Item<int> m_nNoiseOnSdtTk; + + NTuple::Array<int> m_nHitOnSiTkVXD; + NTuple::Array<int> m_nHitOnSiTkSIT; + NTuple::Array<int> m_nHitOnSiTkSET; + NTuple::Array<int> m_nHitOnSiTkFTD; + NTuple::Array<int> m_nHitOnSdtTkVXD; + NTuple::Array<int> m_nHitOnSdtTkSIT; + NTuple::Array<int> m_nHitOnSdtTkSET; + NTuple::Array<int> m_nHitOnSdtTkFTD; + NTuple::Array<int> m_nHitOnSdtTkDC; + NTuple::Array<int> m_nHitOnSdtTk; + + NTuple::Array<float> m_siXc; + NTuple::Array<float> m_siYc; + NTuple::Array<float> m_siR; TRandom3 fRandom; }; diff --git a/Utilities/DataHelper/CMakeLists.txt b/Utilities/DataHelper/CMakeLists.txt index 74ec620f..2cc021c0 100644 --- a/Utilities/DataHelper/CMakeLists.txt +++ b/Utilities/DataHelper/CMakeLists.txt @@ -17,12 +17,18 @@ gaudi_add_library(DataHelperLib src/TrackHitPair.cc src/TrackerHitHelper.cpp src/TrackHelper.cc - LINK EDM4HEP::edm4hep - EDM4HEP::edm4hepDict - DetSegmentation - GSL::gsl - ${CLHEP_LIBRARIES} - Identifier + src/GeomeryHelper.cpp + LINK + EDM4HEP::edm4hep + EDM4HEP::edm4hepDict + Gaudi::GaudiAlgLib + Gaudi::GaudiKernel + ${GSL_LIBRARIES} + ${CLHEP_LIBRARIES} + Identifier + DetSegmentation + DetInterface + Identifier ) install(TARGETS DataHelperLib diff --git a/Utilities/DataHelper/include/DataHelper/GeomeryHelper.h b/Utilities/DataHelper/include/DataHelper/GeomeryHelper.h new file mode 100644 index 00000000..0eb94244 --- /dev/null +++ b/Utilities/DataHelper/include/DataHelper/GeomeryHelper.h @@ -0,0 +1,55 @@ +#ifndef GeomeryHelper_H +#define GeomeryHelper_H + + +#include <array> +#include "DDSegmentation/Segmentation.h" +#include "DetSegmentation/GridDriftChamber.h" +#include "TVector3.h" + +#include "GaudiKernel/SmartIF.h" +#include "GaudiKernel/ISvcLocator.h" +#include "GaudiKernel/Kernel.h" +#include "GaudiKernel/Bootstrap.h" +#include "DetInterface/IGeomSvc.h" + +class IGeomSvc; +namespace dd4hep { + class Detector; + namespace DDSegmentation{ + class GridDriftChamber; + } +} +namespace dd4hep { + class Detector; + namespace DDSegmentation{ + class GridDriftChamber; + } + namespace rec{ + class ISurface; + } +} + +class GeomeryWire{ + + public: + static const GeomeryWire* Instance; + static const GeomeryWire* Get(); + + void getWirePos(int layerID,int wireID,TVector3& Wstart,TVector3& Wend) const; + dd4hep::DDSegmentation::GridDriftChamber * getSeg() const; + private: + + GeomeryWire(); + virtual ~GeomeryWire(); + + GeomeryWire(const GeomeryWire&); + GeomeryWire& operator=(const GeomeryWire&); + + SmartIF<IGeomSvc> m_geomsvc; + dd4hep::Detector* m_dd4hepDetector; + dd4hep::DDSegmentation::GridDriftChamber* m_gridDriftChamber; + +}; + +#endif diff --git a/Utilities/DataHelper/include/DataHelper/TrackHelper.h b/Utilities/DataHelper/include/DataHelper/TrackHelper.h index cb76b6be..78f006d5 100644 --- a/Utilities/DataHelper/include/DataHelper/TrackHelper.h +++ b/Utilities/DataHelper/include/DataHelper/TrackHelper.h @@ -1,8 +1,13 @@ #ifndef TRACKHELPER_H #define TRACKHELPER_H #include "edm4hep/TrackState.h" +#include "edm4hep/TrackerHit.h" +#include "edm4hep/MCParticle.h" +#include "edm4hep/SimTrackerHit.h" +#include "edm4hep/MCRecoTrackerAssociationCollection.h" #include "TMatrixDSym.h" #include "TVector3.h" +#include "DataHelper/HelixClass.h" namespace CEPC{ //get track position and momentum from TrackState @@ -14,6 +19,12 @@ namespace CEPC{ void getTrackStateFromPosMom(edm4hep::TrackState& trackState,double Bz, TVector3 pos,TVector3 mom,double charge,TMatrixDSym covMatrix_6); + void getHelixFromPosMom(HelixClass& helix,double& xc,double& yc, + double& R,double Bz,TVector3 seedPos,TVector3 seedMom,double charge); + void getAssoMCParticle( + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + edm4hep::TrackerHit trackerHit, + edm4hep::MCParticle& mcParticle,edm4hep::SimTrackerHit& simTrackerHit); } #endif diff --git a/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h b/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h index 319bbebf..f6d5b319 100644 --- a/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h +++ b/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h @@ -20,11 +20,20 @@ namespace CEPC{ float GetResolutionRPhi(edm4hep::TrackerHit& hit); float GetResolutionZ(edm4hep::TrackerHit& hit); std::array<float, 6> ConvertToCovXYZ(float dU, float thetaU, float phiU, float dV, float thetaV, float phiV, bool useSpacePointBuilderMethod = false); + const edm4hep::SimTrackerHit getAssoClosestSimTrackerHit( + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + const edm4hep::TrackerHit trackerHit, + const dd4hep::DDSegmentation::GridDriftChamber* segmentation, + int docaMehtod); + + const edm4hep::TrackerHit getAssoTrackerHit( + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + edm4hep::SimTrackerHit simTrackerHit); + + const edm4hep::SimTrackerHit getAssoSimTrackerHit( const edm4hep::MCRecoTrackerAssociationCollection* assoHits, - const edm4hep::TrackerHit trackerHit, - const dd4hep::DDSegmentation::GridDriftChamber* segmentation, - int docaMehtod); + edm4hep::TrackerHit trackerHit); } #endif diff --git a/Utilities/DataHelper/src/GeomeryHelper.cpp b/Utilities/DataHelper/src/GeomeryHelper.cpp new file mode 100644 index 00000000..8dbefbb8 --- /dev/null +++ b/Utilities/DataHelper/src/GeomeryHelper.cpp @@ -0,0 +1,58 @@ +#include "DataHelper/GeomeryHelper.h" +#include "Identifier/CEPCConf.h" + + +//Externals +#include "DD4hep/DD4hepUnits.h" +#include "DD4hep/Detector.h" +#include "DD4hep/DetElement.h" +#include "DDRec/ISurface.h" +#include "DDRec/SurfaceManager.h" +#include "DDRec/Vector3D.h" + +#include "TMatrixF.h" +#include "CLHEP/Matrix/SymMatrix.h" +#include "CLHEP/Matrix/Matrix.h" +#include "CLHEP/Vector/ThreeVector.h" +#include "CLHEP/Vector/Rotation.h" +#include <bitset> + +// must initialize before using Get()!!!! +const GeomeryWire* GeomeryWire::Instance = nullptr; +const GeomeryWire* GeomeryWire::Get(){ + if(nullptr==Instance){ + Instance = new GeomeryWire(); + } + return Instance; +} + +GeomeryWire::GeomeryWire() +{ + + //m_geosvc = service<IGeomSvc>("GeomSvc"); + m_geomsvc = Gaudi::svcLocator()->service("GeomSvc"); + + m_dd4hepDetector=m_geomsvc->lcdd(); + dd4hep::Readout readout=m_dd4hepDetector->readout("DriftChamberHitsCollection"); + m_gridDriftChamber=dynamic_cast<dd4hep::DDSegmentation::GridDriftChamber*>(readout.segmentation().segmentation()); + if(nullptr==m_gridDriftChamber){ + std::cout << "Failed to get the GridDriftChamber" << std::endl; + } + Instance = this; +} + +GeomeryWire::~GeomeryWire() +{ +} + +void GeomeryWire::getWirePos(int layerID,int wireID,TVector3& Wstart,TVector3& Wend) const +{ + + assert(m_gridDriftChamber); + m_gridDriftChamber->cellposition2(0,layerID,wireID,Wstart,Wend); +} + +dd4hep::DDSegmentation::GridDriftChamber* GeomeryWire::getSeg() const +{ + return m_gridDriftChamber; +} diff --git a/Utilities/DataHelper/src/TrackHelper.cc b/Utilities/DataHelper/src/TrackHelper.cc index 9e1f437f..72c3935f 100644 --- a/Utilities/DataHelper/src/TrackHelper.cc +++ b/Utilities/DataHelper/src/TrackHelper.cc @@ -58,10 +58,6 @@ void CEPC::getPosMomFromTrackState(const edm4hep::TrackState& trackState, const char* m_name="TrackHelper"; int m_debug=0; if(m_debug>=2){ - //std::cout<<m_name<<" covMatrix_5 " <<std::endl; - //covMatrix_5.Print(); - //std::cout<<m_name<<" mS " <<std::endl; - //mS.Print(); std::cout<<m_name<<" covMatrix_6 " <<std::endl; covMatrix_6.Print(); std::cout<<m_name<<" pos " <<std::endl; @@ -120,7 +116,6 @@ void CEPC::getTrackStateFromPosMom(edm4hep::TrackState& trackState,double Bz, for(int j=0;j<6;j++){ if(i>=j) { k1=k++; - //covMatrix[k++]=covMatrix_5(i,j); if(5==i){ covMatrix[k1]=-999; continue; @@ -132,3 +127,32 @@ void CEPC::getTrackStateFromPosMom(edm4hep::TrackState& trackState,double Bz, trackState.covMatrix = covMatrix; } + +//Set 5 par from position, momentum and charge +void CEPC::getHelixFromPosMom(HelixClass& helix,double& xc,double& yc, + double& R,double Bz,TVector3 seedPos,TVector3 seedMom,double charge){ + //HelixClass helix; + double seedPos_t[3]={seedPos.X(),seedPos.Y(),seedPos.Z()}; + double seedMom_t[3]={seedMom.X(),seedMom.Y(),seedMom.Z()}; + helix.Initialize_VP(seedPos_t,seedMom_t,charge,Bz); //mm GeV + + xc = helix.getXC(); + yc = helix.getYC(); + + R = helix.getRadius(); +} + +void CEPC::getAssoMCParticle( + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + edm4hep::TrackerHit trackerHit, + edm4hep::MCParticle& mcParticle,edm4hep::SimTrackerHit& simTrackerHit) +{ + for(auto assoHit: *assoHits){ + if(assoHit.getRec()==trackerHit) + { + simTrackerHit=assoHit.getSim(); + mcParticle = simTrackerHit.getMCParticle(); + + } + } +} diff --git a/Utilities/DataHelper/src/TrackerHitHelper.cpp b/Utilities/DataHelper/src/TrackerHitHelper.cpp index f12b1687..c3e8a64f 100644 --- a/Utilities/DataHelper/src/TrackerHitHelper.cpp +++ b/Utilities/DataHelper/src/TrackerHitHelper.cpp @@ -148,13 +148,32 @@ const edm4hep::SimTrackerHit CEPC::getAssoClosestSimTrackerHit( if(tmp_distance < min_distance){ min_distance = tmp_distance; - //pos_x = hitPosition.x(); //pos.x(); - //pos_y = hitPosition.y(); //pos.y(); - //pos_z = pos.z(); - //momx = hit.getMomentum()[0]; - //momy = hit.getMomentum()[1]; minSimTrackerHit=hit; } } return minSimTrackerHit; } + +const edm4hep::TrackerHit CEPC::getAssoTrackerHit( + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + edm4hep::SimTrackerHit simTrackerHit){ + edm4hep::TrackerHit trackerHit; + for(auto assoHit: *assoHits){ + if(assoHit.getSim()==simTrackerHit){ + trackerHit = assoHit.getRec(); + } + } + return trackerHit; +} + +const edm4hep::SimTrackerHit CEPC::getAssoSimTrackerHit( + const edm4hep::MCRecoTrackerAssociationCollection* assoHits, + edm4hep::TrackerHit trackerHit){ + edm4hep::SimTrackerHit simTrackerHit; + for(auto assoHit: *assoHits){ + if(assoHit.getRec()==trackerHit){ + simTrackerHit = assoHit.getSim(); + } + } + return simTrackerHit; +} diff --git a/cmake/CEPCSWDependencies.cmake b/cmake/CEPCSWDependencies.cmake index ae896474..d0bafced 100644 --- a/cmake/CEPCSWDependencies.cmake +++ b/cmake/CEPCSWDependencies.cmake @@ -17,6 +17,7 @@ Find all the dependencies here, so in each package user don't need to find the p - PandoraSDK - podio - ROOT +- BelleIICKF #]] find_package(CLHEP REQUIRED;CONFIG) @@ -35,3 +36,4 @@ find_package(PandoraSDK REQUIRED) find_package(podio REQUIRED) find_package(ROOT COMPONENTS EG Graf Graf3d Gpad MathCore Net RIO Tree TreePlayer REQUIRED) find_package(GenFit) +find_package(BelleIICKF) -- GitLab