38 edm::LogVerbatim(
"ME0SegmentAlgorithm") <<
"[ME0SegmentAlgorithm::ctor] Parameters to build segments :: " 39 <<
"preClustering = "<<preClustering<<
" preClustering_useChaining = "<<preClustering_useChaining
40 <<
" dPhiChainBoxMax = "<<dPhiChainBoxMax<<
" dEtaChainBoxMax = "<<dEtaChainBoxMax<<
" dTimeChainBoxMax = "<<dTimeChainBoxMax
41 <<
" minHitsPerSegment = "<<minHitsPerSegment<<
" maxRecHitsInCluster = "<<
maxRecHitsInCluster;
53 #ifdef EDM_ML_DEBUG // have lines below only compiled when in debug mode 54 ME0DetId chId((ensemble.first)->id());
55 edm::LogVerbatim(
"ME0SegAlgoMM") <<
"[ME0SegmentAlgorithm::run] build segments in chamber " << chId <<
" which contains "<<rechits.size()<<
" rechits";
56 for (
auto rh=rechits.begin(); rh!=rechits.end(); ++rh){
57 auto me0id = (*rh)->me0Id();
58 auto rhLP = (*rh)->localPosition();
59 edm::LogVerbatim(
"ME0SegmentAlgorithm") <<
"[RecHit :: Loc x = "<<std::showpos<<std::setw(9)<<rhLP.x()<<
" Loc y = "<<std::showpos<<std::setw(9)<<rhLP.y()<<
" Time = "<<std::showpos<<(*rh)->tof()<<
" -- "<<me0id.rawId()<<
" = "<<me0id<<
" ]";
64 std::vector<ME0Segment> segments_temp;
65 std::vector<ME0Segment> segments;
73 rechits_clusters = this->
chainHits(ensemble, rechits );
80 for(
auto sub_rechits = rechits_clusters.begin(); sub_rechits != rechits_clusters.end(); ++sub_rechits ) {
82 segments_temp.clear();
84 this->
buildSegments(ensemble, (*sub_rechits), segments_temp );
86 segments.insert( segments.end(), segments_temp.begin(), segments_temp.end() );
103 float dXclus_box = 0.0;
104 float dYclus_box = 0.0;
108 std::vector<float> running_meanX; running_meanX.reserve(rechits.size());
109 std::vector<float> running_meanY; running_meanY.reserve(rechits.size());
111 std::vector<float> seed_minX; seed_minX.reserve(rechits.size());
112 std::vector<float> seed_maxX; seed_maxX.reserve(rechits.size());
113 std::vector<float> seed_minY; seed_minY.reserve(rechits.size());
114 std::vector<float> seed_maxY; seed_maxY.reserve(rechits.size());
119 for(
unsigned int i = 0;
i < rechits.size(); ++
i) {
125 running_meanX.push_back( rechits[i]->localPosition().
x() );
126 running_meanY.push_back( rechits[i]->localPosition().
y() );
129 seed_minX.push_back( rechits[i]->localPosition().
x() );
130 seed_maxX.push_back( rechits[i]->localPosition().
x() );
131 seed_minY.push_back( rechits[i]->localPosition().
y() );
132 seed_maxY.push_back( rechits[i]->localPosition().
y() );
137 for(
size_t NNN = 0; NNN < seeds.size(); ++NNN) {
138 for(
size_t MMM = NNN+1; MMM < seeds.size(); ++MMM) {
140 LogDebug(
"ME0SegmentAlgorithm") <<
"[ME0SegmentAlgorithm::clusterHits]: ALARM! Skipping used seeds, this should not happen - inform developers!";
148 if ( running_meanX[NNN] > running_meanX[MMM] ) dXclus_box = seed_minX[NNN] - seed_maxX[MMM];
149 else dXclus_box = seed_minX[MMM] - seed_maxX[NNN];
150 if ( running_meanY[NNN] > running_meanY[MMM] ) dYclus_box = seed_minY[NNN] - seed_maxY[MMM];
151 else dYclus_box = seed_minY[MMM] - seed_maxY[NNN];
159 if(seeds[NNN].
size()+seeds[MMM].
size() != 0) {
160 running_meanX[MMM] = (running_meanX[NNN]*seeds[NNN].size() + running_meanX[MMM]*seeds[MMM].size()) / (seeds[NNN].
size()+seeds[MMM].size());
161 running_meanY[MMM] = (running_meanY[NNN]*seeds[NNN].size() + running_meanY[MMM]*seeds[MMM].size()) / (seeds[NNN].
size()+seeds[MMM].size());
165 if ( seed_minX[NNN] < seed_minX[MMM] ) seed_minX[MMM] = seed_minX[NNN];
166 if ( seed_maxX[NNN] > seed_maxX[MMM] ) seed_maxX[MMM] = seed_maxX[NNN];
167 if ( seed_minY[NNN] < seed_minY[MMM] ) seed_minY[MMM] = seed_minY[NNN];
168 if ( seed_maxY[NNN] > seed_maxY[MMM] ) seed_maxY[MMM] = seed_maxY[NNN];
171 seeds[MMM].insert(seeds[MMM].
end(),seeds[NNN].
begin(),seeds[NNN].
end());
186 for(
size_t NNN = 0; NNN < seeds.size(); ++NNN) {
188 rechits_clusters.push_back(seeds[NNN]);
191 return rechits_clusters;
200 seeds.reserve(rechits.size());
201 std::vector<bool> usedCluster(rechits.size(),
false);
206 for (
unsigned int i=0;
i<rechits.size(); ++
i){
212 for(
size_t NNN = 0; NNN < seeds.size(); ++NNN) {
213 for(
size_t MMM = NNN+1; MMM < seeds.size(); ++MMM) {
214 if(usedCluster[MMM] || usedCluster[NNN]){
228 bool goodToMerge =
isGoodToMerge(ensemble, seeds[NNN], seeds[MMM]);
234 seeds[MMM].insert(seeds[MMM].
end(),seeds[NNN].
begin(),seeds[NNN].
end());
237 usedCluster[NNN] =
true;
250 for(
size_t NNN = 0; NNN < seeds.size(); ++NNN) {
251 if(usedCluster[NNN])
continue;
252 rechits_chains.push_back(seeds[NNN]);
257 return rechits_chains;
261 for(
size_t iRH_new = 0;iRH_new<newChain.size();++iRH_new){
262 GlobalPoint pos_new = ensemble.first->toGlobal(newChain[iRH_new]->localPosition());
264 for(
size_t iRH_old = 0;iRH_old<oldChain.size();++iRH_old){
265 GlobalPoint pos_old = ensemble.first->toGlobal(oldChain[iRH_old]->localPosition());
278 if (
std::abs(newChain[iRH_new]->me0Id().layer() - oldChain[iRH_old]->me0Id().layer()) >= (ensemble.first->id().nlayers()-1))
continue;
292 #ifdef EDM_ML_DEBUG // have lines below only compiled when in debug mode 293 edm::LogVerbatim(
"ME0SegmentAlgorithm") <<
"[ME0SegmentAlgorithm::buildSegments] will now try to fit a ME0Segment from collection of "<<rechits.size()<<
" ME0 RecHits";
294 for (
auto rh=rechits.begin(); rh!=rechits.end(); ++rh){
295 auto me0id = (*rh)->me0Id();
296 auto rhLP = (*rh)->localPosition();
297 edm::LogVerbatim(
"ME0SegmentAlgorithm") <<
"[RecHit :: Loc x = "<<std::showpos<<std::setw(9)<<rhLP.x()<<
" Loc y = "<<std::showpos<<std::setw(9)<<rhLP.y()<<
" Time = "<<std::showpos<<(*rh)->tof()<<
" -- "<<me0id.rawId()<<
" = "<<me0id<<
" ]";
306 for (
auto rh=rechits.begin(); rh!=rechits.end();rh++){
309 const ME0EtaPartition * thePartition = (ensemble.second.find((*rh)->me0Id()))->second;
316 muonRecHits.push_back(trkRecHit);
320 sfit_ = std::make_unique<MuonSegFit>(muonRecHits);
321 bool goodfit =
sfit_->fit();
322 edm::LogVerbatim(
"ME0SegmentAlgorithm") <<
"[ME0SegmentAlgorithm::buildSegments] ME0Segment fit done";
326 for (
auto rh:muonRecHits) rh.reset();
334 double protoChi2 =
sfit_->chi2();
336 float averageTime=0.;
337 for (
auto rh=rechits.begin(); rh!=rechits.end(); ++rh){
338 averageTime += (*rh)->tof();
340 if(rechits.size() != 0) averageTime=averageTime/(rechits.size());
342 for (
auto rh=rechits.begin(); rh!=rechits.end(); ++rh){
343 timeUncrt +=
pow((*rh)->tof()-averageTime,2);
345 if(rechits.size() > 1) timeUncrt=timeUncrt/(rechits.size()-1);
346 timeUncrt =
sqrt(timeUncrt);
349 edm::LogVerbatim(
"ME0SegmentAlgorithm") <<
"[ME0SegmentAlgorithm::buildSegments] will now try to make ME0Segment from collection of "<<rechits.size()<<
" ME0 RecHits";
352 edm::LogVerbatim(
"ME0SegmentAlgorithm") <<
"[ME0SegmentAlgorithm::buildSegments] ME0Segment made";
355 for (
auto rh:muonRecHits) rh.reset();
356 me0segs.push_back(tmp);
std::shared_ptr< TrackingRecHit > MuonRecHitPtr
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
bool isGoodToMerge(const ME0Ensemble &ensemble, const EnsembleHitContainer &newChain, const EnsembleHitContainer &oldChain)
virtual ME0RecHit * clone() const
void setPosition(LocalPoint pos)
Set local position.
std::vector< const ME0RecHit * > EnsembleHitContainer
Typedefs.
GlobalPoint toGlobal(const Local2DPoint &lp) const
Conversion to the global R.F. from the R.F. of the GeomDet.
std::pair< const ME0Chamber *, std::map< uint32_t, const ME0EtaPartition * > > ME0Ensemble
unsigned int minHitsPerSegment
Geom::Phi< T > phi() const
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
bool preClustering_useChaining
std::unique_ptr< MuonSegFit > sfit_
ProtoSegments clusterHits(const EnsembleHitContainer &rechits)
Utility functions.
std::vector< MuonRecHitPtr > MuonRecHitContainer
Abs< T >::type abs(const T &t)
EnsembleHitContainer proto_segment
void buildSegments(const ME0Ensemble &ensemble, const EnsembleHitContainer &rechits, std::vector< ME0Segment > &me0segs)
double deltaPhi(double phi1, double phi2)
std::vector< std::vector< double > > tmp
std::vector< EnsembleHitContainer > ProtoSegments
CLHEP::HepSymMatrix AlgebraicSymMatrix
std::vector< ME0Segment > run(const ME0Ensemble &ensemble, const EnsembleHitContainer &rechits)
virtual ~ME0SegmentAlgorithm()
Destructor.
Power< A, B >::type pow(const A &a, const B &b)
ProtoSegments chainHits(const ME0Ensemble &ensemble, const EnsembleHitContainer &rechits)
ME0SegmentAlgorithm(const edm::ParameterSet &ps)
Constructor.