diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
index 482082a064e982a0452b93e4a945b5e2d35d13f7..4a5b1f311a48586f0388d67ed9d5d956ab1b0fdc 100644
--- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
+++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.cpp
@@ -1,5 +1,6 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
#include "PlanarDigiAlg.h"
+#include "DataHelper/TrackerHitHelper.h"
#include "GearSvc/IGearSvc.h"
#include "EventSeeder/IEventSeeder.h"
#include "TrackSystemSvc/ITrackSystemSvc.h"
@@ -16,7 +17,7 @@
#include "UTIL/CellIDEncoder.h"
#include <UTIL/Operators.h>
*/
-
+#include "Identifier/CEPCConf.h"
#include "UTIL/ILDConf.h"
// STUFF needed for GEAR
@@ -174,7 +175,7 @@ StatusCode PlanarDigiAlg::execute()
int module = encoder[lcio::ILDCellID0::module];
int sensor = encoder[lcio::ILDCellID0::sensor];
- debug() << "Hit = "<< i << " has celId " << celId << endmsg;
+ debug() << "Hit = " << i << " has celId " << celId << endmsg;
debug() << "side = " << side << endmsg;
debug() << "layerNumber = " << layer << endmsg;
debug() << "moduleNumber = " << module << endmsg;
@@ -307,15 +308,16 @@ StatusCode PlanarDigiAlg::execute()
debug() << " U[0] = "<< u_direction[0] << " U[1] = "<< u_direction[1]
<< " V[0] = "<< v_direction[0] << " V[1] = "<< v_direction[1]
<< endmsg ;
- // fucd
- std::array<float, 6> cov;
- cov[0] = u_direction[0];
- cov[1] = u_direction[1];
- cov[2] = resU;
- cov[3] = v_direction[0];
- cov[4] = v_direction[1];
- cov[5] = resV;
- trkHit.setCovMatrix(cov);
+ // fucd: next TODO: cov[0] = resU*reU, cov[2] = resV*resV, cov[5] = 0
+ if(_usePlanarTag){
+ std::array<float, 6> cov;
+ cov[0] = u_direction[0];
+ cov[1] = u_direction[1];
+ cov[2] = resU;
+ cov[3] = v_direction[0];
+ cov[4] = v_direction[1];
+ cov[5] = resV;
+ trkHit.setCovMatrix(cov);
/* zoujh: TODO - generate TrackerHitPlane with podio
trkHit->setU( u_direction ) ;
trkHit->setV( v_direction ) ;
@@ -325,11 +327,17 @@ StatusCode PlanarDigiAlg::execute()
if( _isStrip ) trkHit->setdV( 0 ); // no error in v direction for strip hits as there is no meesurement information in v direction
else trkHit->setdV( resV ) ;
*/
- trkHit.setType(8);
- if( _isStrip || (resU!=0&&resV==0) ){
- trkHit.setType( UTIL::set_bit( trkHit.getType() , UTIL::ILDTrkHitTypeBit::ONE_DIMENSIONAL ) ) ;
+ std::bitset<32> type;
+ type.set(CEPCConf::TrkHitTypeBit::PLANAR);
+ trkHit.setType((int)type.to_ulong());
+ }
+ else{
+ trkHit.setCovMatrix(CEPC::ConvertToCovXYZ(resU, u_direction[0], u_direction[1], resV, v_direction[0], v_direction[1]));
}
+ if( _isStrip || (resU!=0&&resV==0) ){
+ trkHit.setType( UTIL::set_bit( trkHit.getType() , UTIL::ILDTrkHitTypeBit::ONE_DIMENSIONAL ) ) ;
+ }
trkHit.setEDep( SimTHit.getEDep() );
// make the relation
diff --git a/Digitisers/SimpleDigi/src/PlanarDigiAlg.h b/Digitisers/SimpleDigi/src/PlanarDigiAlg.h
index 668333f29db62fadc13ed8619c212ef0c2ab9d0c..10ddd9dd4bc3216348518ea0df14ebe9cb000684 100644
--- a/Digitisers/SimpleDigi/src/PlanarDigiAlg.h
+++ b/Digitisers/SimpleDigi/src/PlanarDigiAlg.h
@@ -79,6 +79,9 @@ protected:
Gaudi::Property<FloatVec> _resV{ this, "ResolutionV", {0.0040} };
// whether hits are 1D strip hits
Gaudi::Property<bool> _isStrip{ this, "IsStrip", false };
+ // whether use Planar tag for type and cov, if true, CEPCConf::TrkHitTypeBit::PLANAR bit is set as true
+ // cov[0]=thetaU, cov[1]=phiU, cov[2]=resU, cov[0]=thetaV, cov[1]=phiV, cov[2]=resV
+ Gaudi::Property<bool> _usePlanarTag{ this, "UsePlanarTag", true };
// Input collections
DataHandle<edm4hep::EventHeaderCollection> _headerCol{"EventHeaderCol", Gaudi::DataHandle::Reader, this};
diff --git a/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h b/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h
index 60057adaf9afac84541b4a770bfa8a879658617a..fcd9dd146b9268b581eb2246f89b1615fc3fb6db 100644
--- a/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h
+++ b/Utilities/DataHelper/include/DataHelper/TrackerHitHelper.h
@@ -8,6 +8,7 @@ namespace CEPC{
std::array<float, 6> GetCovMatrix(edm4hep::TrackerHit& hit, bool useSpacePointerBuilderMethod = false);
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);
}
#endif
diff --git a/Utilities/DataHelper/src/TrackerHitHelper.cpp b/Utilities/DataHelper/src/TrackerHitHelper.cpp
index 58f5278d6e3beefcf7b2986e0a25c59713bb259e..e12eb886c5aa7863f320b1157d278948cf21c880 100644
--- a/Utilities/DataHelper/src/TrackerHitHelper.cpp
+++ b/Utilities/DataHelper/src/TrackerHitHelper.cpp
@@ -2,7 +2,6 @@
#include "Identifier/CEPCConf.h"
#include "TMatrixF.h"
-#include "TMatrixFSym.h"
#include "CLHEP/Matrix/SymMatrix.h"
#include "CLHEP/Matrix/Matrix.h"
#include "CLHEP/Vector/ThreeVector.h"
@@ -16,60 +15,13 @@ std::array<float,6> CEPC::GetCovMatrix(edm4hep::TrackerHit& hit, bool useSpacePo
return hit.getCovMatrix();
}
else if(std::bitset<32>(type)[CEPCConf::TrkHitTypeBit::PLANAR]){
- std::array<float,6> cov{0.,0.,0.,0.,0.,0.};
float thetaU = hit.getCovMatrix(0);
float phiU = hit.getCovMatrix(1);
float dU = hit.getCovMatrix(2);
float thetaV = hit.getCovMatrix(3);
float phiV = hit.getCovMatrix(4);
float dV = hit.getCovMatrix(5);
-
- if(!useSpacePointBuilderMethod){
- TMatrixF diffs(2,3);
- TMatrixF diffsT(3,2);
- diffs(0,0) = sin(thetaU)*cos(phiU);
- diffs(0,1) = sin(thetaU)*sin(phiU);
- diffs(0,2) = cos(thetaU);
- diffs(1,0) = sin(thetaV)*cos(phiV);
- diffs(1,1) = sin(thetaV)*sin(phiV);
- diffs(1,2) = cos(thetaV);
-
- diffsT.Transpose(diffs);
-
- TMatrixF covMatrixUV(2,2);
- covMatrixUV(0,0) = dU*dU;
- covMatrixUV(0,1) = 0;
- covMatrixUV(1,0) = 0;
- covMatrixUV(1,1) = dV*dV;
-
- TMatrixF covMatrixXYZ(3,3);
- covMatrixXYZ = diffsT*covMatrixUV*diffs;
- cov[0] = covMatrixXYZ(0,0);
- cov[1] = covMatrixXYZ(1,0);
- cov[2] = covMatrixXYZ(1,1);
- cov[3] = covMatrixXYZ(2,0);
- cov[4] = covMatrixXYZ(2,1);
- cov[5] = covMatrixXYZ(2,2);
- }
- else{ // Method used in SpacePointBuilder, results are almost same with above
- CLHEP::Hep3Vector u_sensor(sin(thetaU)*cos(phiU), sin(thetaU)*sin(phiU), cos(thetaU));
- CLHEP::Hep3Vector v_sensor(sin(thetaV)*cos(phiV), sin(thetaV)*sin(phiV), cos(thetaV));
- CLHEP::Hep3Vector w_sensor = u_sensor.cross(v_sensor);
- CLHEP::HepRotation rot_sensor(u_sensor, v_sensor, w_sensor);
- CLHEP::HepMatrix rot_sensor_matrix;
- rot_sensor_matrix = rot_sensor;
- CLHEP::HepSymMatrix cov_plane(3,0);
- cov_plane(1,1) = dU*dU;
- cov_plane(2,2) = dV*dV;
- CLHEP::HepSymMatrix cov_xyz= cov_plane.similarity(rot_sensor_matrix);
- cov[0] = cov_xyz[0][0];
- cov[1] = cov_xyz[1][0];
- cov[2] = cov_xyz[1][1];
- cov[3] = cov_xyz[2][0];
- cov[4] = cov_xyz[2][1];
- cov[5] = cov_xyz[2][2];
- }
- return cov;
+ return ConvertToCovXYZ(dU, thetaU, phiU, dV, thetaV, phiV, useSpacePointBuilderMethod);
}
else{
std::cout << "Warning: not SpacePoint and Planar, return original cov matrix preliminaryly." << std::endl;
@@ -113,3 +65,53 @@ float CEPC::GetResolutionZ(edm4hep::TrackerHit& hit){
}
return 0.;
}
+
+std::array<float, 6> CEPC::ConvertToCovXYZ(float dU, float thetaU, float phiU, float dV, float thetaV, float phiV, bool useSpacePointBuilderMethod){
+ std::array<float,6> cov{0.,0.,0.,0.,0.,0.};
+ if(!useSpacePointBuilderMethod){
+ TMatrixF diffs(2,3);
+ TMatrixF diffsT(3,2);
+ diffs(0,0) = sin(thetaU)*cos(phiU);
+ diffs(0,1) = sin(thetaU)*sin(phiU);
+ diffs(0,2) = cos(thetaU);
+ diffs(1,0) = sin(thetaV)*cos(phiV);
+ diffs(1,1) = sin(thetaV)*sin(phiV);
+ diffs(1,2) = cos(thetaV);
+
+ diffsT.Transpose(diffs);
+
+ TMatrixF covMatrixUV(2,2);
+ covMatrixUV(0,0) = dU*dU;
+ covMatrixUV(0,1) = 0;
+ covMatrixUV(1,0) = 0;
+ covMatrixUV(1,1) = dV*dV;
+
+ TMatrixF covMatrixXYZ(3,3);
+ covMatrixXYZ = diffsT*covMatrixUV*diffs;
+ cov[0] = covMatrixXYZ(0,0);
+ cov[1] = covMatrixXYZ(1,0);
+ cov[2] = covMatrixXYZ(1,1);
+ cov[3] = covMatrixXYZ(2,0);
+ cov[4] = covMatrixXYZ(2,1);
+ cov[5] = covMatrixXYZ(2,2);
+ }
+ else{ // Method used in SpacePointBuilder, results are almost same with above
+ CLHEP::Hep3Vector u_sensor(sin(thetaU)*cos(phiU), sin(thetaU)*sin(phiU), cos(thetaU));
+ CLHEP::Hep3Vector v_sensor(sin(thetaV)*cos(phiV), sin(thetaV)*sin(phiV), cos(thetaV));
+ CLHEP::Hep3Vector w_sensor = u_sensor.cross(v_sensor);
+ CLHEP::HepRotation rot_sensor(u_sensor, v_sensor, w_sensor);
+ CLHEP::HepMatrix rot_sensor_matrix;
+ rot_sensor_matrix = rot_sensor;
+ CLHEP::HepSymMatrix cov_plane(3,0);
+ cov_plane(1,1) = dU*dU;
+ cov_plane(2,2) = dV*dV;
+ CLHEP::HepSymMatrix cov_xyz= cov_plane.similarity(rot_sensor_matrix);
+ cov[0] = cov_xyz[0][0];
+ cov[1] = cov_xyz[1][0];
+ cov[2] = cov_xyz[1][1];
+ cov[3] = cov_xyz[2][0];
+ cov[4] = cov_xyz[2][1];
+ cov[5] = cov_xyz[2][2];
+ }
+ return cov;
+}