10 #include <Eigen/Dense> 14 const edm::ValueMap<std::pair<float, float>> &layerClustersTime,
18 LogDebug(
"TrackstersPCA_Eigen") <<
"------- Eigen -------" << std::endl;
20 for (
auto &trackster : tracksters) {
24 barycenter << 0., 0., 0.;
33 trackster.setRawEnergy(0.
f);
34 trackster.setRawEmEnergy(0.
f);
35 trackster.setRawPt(0.
f);
36 trackster.setRawEmPt(0.
f);
38 size_t N = trackster.vertices().size();
42 float weights2_sum = 0.f;
44 for (
size_t i = 0;
i <
N; ++
i) {
45 auto fraction = 1.f / trackster.vertex_multiplicity(
i);
54 for (
size_t j = 0;
j < 3; ++
j)
57 float raw_energy = trackster.raw_energy();
58 float inv_raw_energy = 1.f / raw_energy;
60 barycenter *= inv_raw_energy;
62 std::pair<float, float> timeTrackster;
68 trackster.setTimeAndError(timeTrackster.first, timeTrackster.second);
69 LogDebug(
"TrackstersPCA") <<
"Use energy weighting: " << energyWeight << std::endl;
70 LogDebug(
"TrackstersPCA") <<
"\nTrackster characteristics: " << std::endl;
71 LogDebug(
"TrackstersPCA") <<
"Size: " <<
N << std::endl;
72 LogDebug(
"TrackstersPCA") <<
"Energy: " << trackster.raw_energy() << std::endl;
73 LogDebug(
"TrackstersPCA") <<
"raw_pt: " << trackster.raw_pt() << std::endl;
74 LogDebug(
"TrackstersPCA") <<
"Means: " << barycenter[0] <<
", " << barycenter[1] <<
", " << barycenter[2]
76 LogDebug(
"TrackstersPCA") <<
"Time: " << trackster.time() <<
" +/- " << trackster.timeError() << std::endl;
82 sigmasEigen << 0., 0., 0.;
87 for (
size_t i = 0;
i <
N; ++
i) {
89 if (energyWeight && trackster.raw_energy())
90 weight = (
layerClusters[trackster.vertices(
i)].energy() / trackster.vertex_multiplicity(
i)) * inv_raw_energy;
92 for (
size_t x = 0;
x < 3; ++
x)
93 for (
size_t y = 0;
y <=
x; ++
y) {
95 covM(
y,
x) = covM(
x,
y);
98 covM *= 1.f / (1.f - weights2_sum);
101 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d>::RealVectorType eigenvalues_fromEigen;
102 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d>::EigenvectorsType eigenvectors_fromEigen;
103 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigensolver(covM);
105 eigenvalues_fromEigen = eigenvalues_fromEigen.Zero();
106 eigenvectors_fromEigen = eigenvectors_fromEigen.Zero();
108 eigenvalues_fromEigen = eigensolver.eigenvalues();
109 eigenvectors_fromEigen = eigensolver.eigenvectors();
113 for (
size_t i = 0;
i <
N; ++
i) {
115 sigmas +=
weight * (
point - barycenter).cwiseAbs2();
117 if (energyWeight && raw_energy)
118 weight = (
layerClusters[trackster.vertices(
i)].energy() / trackster.vertex_multiplicity(
i)) * inv_raw_energy;
119 sigmasEigen +=
weight * (point_transformed.cwiseAbs2());
121 sigmas /= (1.f - weights2_sum);
122 sigmasEigen /= (1.f - weights2_sum);
124 trackster.fillPCAVariables(eigenvalues_fromEigen,
125 eigenvectors_fromEigen,
131 LogDebug(
"TrackstersPCA") <<
"EigenValues from Eigen/Tr(cov): " << eigenvalues_fromEigen[2] / covM.trace() <<
", " 132 << eigenvalues_fromEigen[1] / covM.trace() <<
", " 133 << eigenvalues_fromEigen[0] / covM.trace() << std::endl;
134 LogDebug(
"TrackstersPCA") <<
"EigenValues from Eigen: " << eigenvalues_fromEigen[2] <<
", " 135 << eigenvalues_fromEigen[1] <<
", " << eigenvalues_fromEigen[0] << std::endl;
136 LogDebug(
"TrackstersPCA") <<
"EigenVector 3 from Eigen: " << eigenvectors_fromEigen(0, 2) <<
", " 137 << eigenvectors_fromEigen(1, 2) <<
", " << eigenvectors_fromEigen(2, 2) << std::endl;
138 LogDebug(
"TrackstersPCA") <<
"EigenVector 2 from Eigen: " << eigenvectors_fromEigen(0, 1) <<
", " 139 << eigenvectors_fromEigen(1, 1) <<
", " << eigenvectors_fromEigen(2, 1) << std::endl;
140 LogDebug(
"TrackstersPCA") <<
"EigenVector 1 from Eigen: " << eigenvectors_fromEigen(0, 0) <<
", " 141 << eigenvectors_fromEigen(1, 0) <<
", " << eigenvectors_fromEigen(2, 0) << std::endl;
142 LogDebug(
"TrackstersPCA") <<
"Original sigmas: " << sigmas[0] <<
", " << sigmas[1] <<
", " << sigmas[2]
144 LogDebug(
"TrackstersPCA") <<
"SigmasEigen in PCA space: " << sigmasEigen[2] <<
", " << sigmasEigen[1] <<
", " 145 << sigmasEigen[0] << std::endl;
146 LogDebug(
"TrackstersPCA") <<
"covM: \n" << covM << std::endl;
153 const edm::ValueMap<std::pair<float, float>> &layerClustersTime,
156 float tracksterTime = 0.;
157 float tracksterTimeErr = 0.;
158 std::set<uint32_t> usedLC;
160 auto project_lc_to_pca = [](
const std::vector<double> &
point,
const std::vector<double> &segment_end) {
161 double dot_product = 0.0;
162 double segment_dot = 0.0;
164 for (
int i = 0;
i < 3; ++
i) {
165 dot_product +=
point[
i] * segment_end[
i];
166 segment_dot += segment_end[
i] * segment_end[
i];
169 double projection = 0.0;
170 if (segment_dot != 0.0) {
171 projection = dot_product / segment_dot;
174 std::vector<double> closest_point(3);
175 for (
int i = 0;
i < 3; ++
i) {
176 closest_point[
i] = projection * segment_end[
i];
180 for (
int i = 0;
i < 3; ++
i) {
188 for (
size_t i = 0;
i <
N; ++
i) {
190 if ((usedLC.insert(trackster.
vertices(
i))).second) {
194 timeE = 1.f /
pow(timeE, 2);
199 if (project_lc_to_pca({
x,
y,
z}, {barycenter[0], barycenter[1], barycenter[2]}) < 3) {
200 float deltaT = 1.f /
c *
201 std::sqrt(((barycenter[2] /
z - 1.
f) *
x) * ((barycenter[2] /
z - 1.
f) *
x) +
202 ((barycenter[2] /
z - 1.
f) *
y) * ((barycenter[2] /
z - 1.
f) *
y) +
203 (barycenter[2] -
z) * (barycenter[2] -
z));
206 tracksterTime +=
time * timeE;
207 tracksterTimeErr += timeE;
212 if (tracksterTimeErr > 0.
f)
213 return {tracksterTime / tracksterTimeErr, 1.f /
std::sqrt(tracksterTimeErr)};
215 return {-99.f, -1.f};
219 const edm::ValueMap<std::pair<float, float>> &layerClustersTime,
221 std::vector<float> times;
222 std::vector<float> timeErrors;
223 std::set<uint32_t> usedLC;
225 for (
size_t i = 0;
i <
N; ++
i) {
227 if ((usedLC.insert(trackster.
vertices(
i))).second) {
230 times.push_back(layerClustersTime.get(trackster.
vertices(
i)).
first);
231 timeErrors.push_back(1.
f /
pow(timeE, 2));
std::pair< float, float > computeLocalTracksterTime(const Trackster &trackster, const std::vector< reco::CaloCluster > &layerClusters, const edm::ValueMap< std::pair< float, float >> &layerClustersTime, const Eigen::Vector3d &barycenter, size_t N)
U second(std::pair< T, U > const &p)
std::pair< float, float > fixSizeHighestDensity(std::vector< float > &time, std::vector< float > weight=std::vector< float >(), unsigned int minNhits=3, float deltaT=0.210, float timeWidthBy=0.5)
Abs< T >::type abs(const T &t)
std::pair< float, float > computeTracksterTime(const Trackster &trackster, const edm::ValueMap< std::pair< float, float >> &layerClustersTime, size_t N)
std::vector< unsigned int > & vertices()
void assignPCAtoTracksters(std::vector< Trackster > &, const std::vector< reco::CaloCluster > &, const edm::ValueMap< std::pair< float, float >> &, double, bool computeLocalTime=false, bool energyWeight=true)
Power< A, B >::type pow(const A &a, const B &b)
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point