-
Notifications
You must be signed in to change notification settings - Fork 244
/
RPixRoadFinder.cc
122 lines (86 loc) · 4.08 KB
/
RPixRoadFinder.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include "RecoCTPPS/PixelLocal/interface/RPixRoadFinder.h"
// user include files
#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/EDProducer.h"
#include "FWCore/Framework/interface/Event.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
//needed for the geometry:
#include "FWCore/Framework/interface/EventSetup.h"
#include "FWCore/Framework/interface/ESHandle.h"
#include "TMath.h"
#include "DataFormats/Math/interface/Error.h"
#include "DataFormats/Math/interface/AlgebraicROOTObjects.h"
#include <vector>
#include <memory>
#include <string>
#include <iostream>
//------------------------------------------------------------------------------------------------//
RPixRoadFinder::RPixRoadFinder(edm::ParameterSet const& parameterSet) :
RPixDetPatternFinder(parameterSet){
verbosity_ = parameterSet.getUntrackedParameter<int> ("verbosity");
roadRadius_ = parameterSet.getParameter<double>("roadRadius");
minRoadSize_ = parameterSet.getParameter<int>("minRoadSize");
maxRoadSize_ = parameterSet.getParameter<int>("maxRoadSize");
}
//------------------------------------------------------------------------------------------------//
RPixRoadFinder::~RPixRoadFinder(){
}
//------------------------------------------------------------------------------------------------//
void RPixRoadFinder::findPattern(){
Road temp_all_hits;
temp_all_hits.clear();
// convert local hit sto global and push them to a vector
for(const auto & ds_rh2 : *hitVector_){
const auto myid = CTPPSPixelDetId(ds_rh2.id);
for (const auto & it_rh : ds_rh2.data){
CLHEP::Hep3Vector localV(it_rh.getPoint().x(),it_rh.getPoint().y(),it_rh.getPoint().z() );
CLHEP::Hep3Vector globalV = geometry_->localToGlobal(ds_rh2.id,localV);
math::Error<3>::type localError;
localError[0][0] = it_rh.getError().xx();
localError[0][1] = it_rh.getError().xy();
localError[0][2] = 0.;
localError[1][0] = it_rh.getError().xy();
localError[1][1] = it_rh.getError().yy();
localError[1][2] = 0.;
localError[2][0] = 0.;
localError[2][1] = 0.;
localError[2][2] = 0.;
if(verbosity_>2) edm::LogInfo("RPixRoadFinder")<<"Hits = "<<ds_rh2.data.size();
DDRotationMatrix theRotationMatrix = geometry_->getSensor(myid)->rotation();
AlgebraicMatrix33 theRotationTMatrix;
theRotationMatrix.GetComponents(theRotationTMatrix(0, 0), theRotationTMatrix(0, 1), theRotationTMatrix(0, 2),
theRotationTMatrix(1, 0), theRotationTMatrix(1, 1), theRotationTMatrix(1, 2),
theRotationTMatrix(2, 0), theRotationTMatrix(2, 1), theRotationTMatrix(2, 2));
math::Error<3>::type globalError = ROOT::Math::SimilarityT(theRotationTMatrix, localError);
PointInPlane thePointAndRecHit = {globalV,globalError,it_rh,myid};
temp_all_hits.push_back(thePointAndRecHit);
}
}
Road::iterator it_gh1 = temp_all_hits.begin();
Road::iterator it_gh2;
patternVector_.clear();
//look for points near wrt each other
// starting algorithm
while( it_gh1 != temp_all_hits.end() && temp_all_hits.size() >= minRoadSize_){
Road temp_road;
it_gh2 = it_gh1;
CLHEP::Hep3Vector currPoint = it_gh1->globalPoint;
CTPPSPixelDetId currDet = CTPPSPixelDetId(it_gh1->detId);
while( it_gh2 != temp_all_hits.end()){
bool same_pot = false;
CTPPSPixelDetId tmpGh2Id = CTPPSPixelDetId(it_gh2->detId);
if ( currDet.getRPId() == tmpGh2Id.getRPId() ) same_pot = true;
CLHEP::Hep3Vector subtraction = currPoint - it_gh2->globalPoint;
if(subtraction.perp() < roadRadius_ && same_pot) { /// 1mm
temp_road.push_back(*it_gh2);
temp_all_hits.erase(it_gh2);
}else{
++it_gh2;
}
}
if(temp_road.size() >= minRoadSize_ && temp_road.size() < maxRoadSize_ )patternVector_.push_back(temp_road);
}
// end of algorithm
}