56 #include <boost/range.hpp> 57 #include <boost/foreach.hpp> 58 #include "boost/multi_array.hpp" 129 track(aTrack), state(aState) {}
135 template<
typename Cluster>
177 return test.
cluster == toFind_ || equalClusters<Cluster>(*test.
cluster, *toFind_);
187 template<
typename Cluster>
193 template<
typename Cluster>
194 std::unique_ptr<edmNew::DetSetVector<Cluster> >
195 splitClusters(
const std::map<uint32_t,
199 template<
typename Cluster>
234 #define foreach BOOST_FOREACH 237 useTrajectories_(iConfig.getParameter<
bool>(
"useTrajectories")),
238 trackerHitAssociatorConfig_(consumesCollector())
251 produces< edmNew::DetSetVector<SiPixelCluster> >();
253 produces< edmNew::DetSetVector<SiStripCluster> >();
308 return (static_cast<const SiStripRecHit2D &>(*
hit)).cluster().get();
312 return (static_cast<const SiStripRecHit1D &>(*
hit)).cluster().get();
315 throw cms::Exception(
"Unsupported") <<
"Detid of type " <<
typeid(*hit).name() <<
" not supported.\n";
324 return (static_cast<const SiPixelRecHit&>(*
hit)).cluster().get();
327 throw cms::Exception(
"Unsupported") <<
"Detid of type " <<
typeid(*hit).name() <<
" not supported.\n";
392 ed = trajectories->
end(); it != ed; ++it )
405 size_t i_hit = 0, last_hit = tms.size()-1;
407 bool first =
true, reversed =
false;
409 for (; it_hit != ed_hit; ++it_hit, ++i_hit)
413 if ((*it_hit)->geographicalId().rawId() == 0)
423 if ((*it_hit)->geographicalId() == tms[i_hit].recHit()->hit()->geographicalId())
427 else if ((*it_hit)->geographicalId() == tms[last_hit-i_hit].recHit()->hit()->geographicalId())
433 throw cms::Exception(
"Aargh") <<
"DetIDs don't match either way :-( \n";
438 if ( hit ==
nullptr || !hit->
isValid() )
445 markClusters<SiStripCluster>(
siStripDetsWithClusters, hit, tk, tms[reversed ? last_hit-i_hit : i_hit].updatedState());
447 else if (subdet >= 1)
449 markClusters<SiPixelCluster>(
siPixelDetsWithClusters, hit, tk, tms[reversed ? last_hit-i_hit : i_hit].updatedState());
453 edm::LogWarning(
"HitNotFound") <<
"Hit of type " <<
typeid(*hit).name() <<
", detid " 470 for (; it_hit != ed_hit; ++it_hit)
473 if ( hit ==
nullptr || !hit->
isValid() )
483 if ( det ==
nullptr )
494 else if (subdet >= 1)
500 edm::LogWarning(
"HitNotFound") <<
"Hit of type " <<
typeid(*hit).name() <<
", detid " 530 template<
typename Cluster>
538 typedef typename std::vector<ClusterWithTracks<Cluster> >::iterator
IT;
541 if ( match != range.end() )
547 edm::LogWarning(
"ClusterNotFound") <<
"Cluster of type " <<
typeid(Cluster).
name() <<
" on detid " 552 template<
typename Cluster>
553 std::unique_ptr<edmNew::DetSetVector<Cluster> >
557 auto output = std::make_unique<edmNew::DetSetVector<Cluster>>();
558 typedef std::pair<uint32_t, boost::sub_range<std::vector<ClusterWithTracks<Cluster> > > > pair;
560 foreach(
const pair &
p,
input)
564 if ( det ==
nullptr )
566 edm::LogError(
"MissingDetId") <<
"DetIDs " << p.first <<
" is not in geometry.\n";
587 template<
typename Cluster>
606 bool cluster_was_successfully_split =
false;
610 std::vector<SimHitIdpr> associatedIdpr;
612 hitAssociator->associateSimpleRecHitCluster(clust, detId, associatedIdpr);
614 size_t splittableClusterSize = 0;
615 splittableClusterSize = associatedIdpr.size();
617 int clusiz = amp.size();
618 associatedIdpr.clear();
624 if ( ( splittableClusterSize > 1 && amp.size() > 2 ) &&
634 int last = first + clusiz;
635 uint16_t rawAmpl = 0, currentAmpl = 0;
637 std::vector<uint16_t> tmp1, tmp2;
639 std::vector<int> firstStrip;
640 std::vector<bool> trackInStrip;
641 std::vector<unsigned int> trackID;
642 std::vector<float> trackFraction;
643 std::vector< std::vector<uint16_t> > trackAmp;
644 unsigned int currentChannel( 9999 );
645 unsigned int thisTrackID = 0;
652 linkiter != link_detset.
data.end(); linkiter++)
654 if ( (
int)(linkiter->channel()) >= first && (
int)(linkiter->channel()) < last )
656 int stripIdx = (
int)linkiter->channel()-
first;
657 rawAmpl = (uint16_t)(amp[stripIdx]);
661 if ( linkiter->channel() != currentChannel )
666 for (
size_t i=0;
i<trackID.size(); ++
i)
668 if ( trackInStrip[
i] )
670 if ( ( thisAmpl=currentAmpl ) < 254 )
671 thisAmpl =
min( uint16_t(253),
max(uint16_t(0), (uint16_t)(currentAmpl*trackFraction[i]+0.5)) );
672 trackAmp[
i].push_back( thisAmpl );
675 trackFraction[
i] = 0;
676 trackInStrip[
i] =
false;
679 currentChannel = linkiter->channel();
683 thisTrackID = linkiter->SimTrackId();
686 bool newTrack =
true;
687 int thisTrackIdx = 9999;
689 for (
size_t i=0;
i<trackID.size(); ++
i)
691 if ( trackID[
i] == thisTrackID )
700 trackInStrip.push_back(
false);
701 trackID.push_back(thisTrackID);
702 firstStrip.push_back(currentChannel);
703 std::vector<uint16_t> ampTmp;
704 trackAmp.push_back(ampTmp);
705 trackFraction.push_back(0);
706 thisTrackIdx = trackID.size()-1;
709 trackInStrip[thisTrackIdx] =
true;
710 trackFraction[thisTrackIdx] += linkiter->fraction();
711 currentAmpl = rawAmpl;
719 std::vector<SiStripCluster> newCluster;
723 for (
size_t i=0;
i < trackID.size(); ++
i)
725 if ( trackInStrip[
i] )
727 if ( ( thisAmpl=rawAmpl ) < 254 )
728 thisAmpl =
min(uint16_t(253),
max(uint16_t(0), (uint16_t)(rawAmpl*trackFraction[i]+0.5)));
731 trackAmp[
i].push_back( thisAmpl );
739 trackAmp[i].
end() ) );
744 for (
size_t i=0;
i<newCluster.size(); ++
i )
748 float clusterAmp = 0.0;
749 for (
size_t j=0; j<trackAmp[
i].size(); ++j )
750 clusterAmp += (
float)(trackAmp[
i])[j];
752 if ( clusterAmp > 0.0 && firstStrip[
i] != 9999 && !trackAmp[
i].
empty() )
755 output.push_back( newCluster[
i] );
762 cluster_was_successfully_split =
true;
781 if ( !cluster_was_successfully_split )
782 output.push_back( *
c.cluster );
788 bool cluster_was_successfully_split =
false;
792 if ( theStripCluster )
800 if ( (
int)theStripCluster->
amplitudes().size() <= 1 ||
801 ( (
int)ssdid.moduleGeometry() != 1 &&
802 (
int)ssdid.moduleGeometry() != 2 &&
803 (
int)ssdid.moduleGeometry() != 3 &&
804 (
int)ssdid.moduleGeometry() != 4 ) )
821 int is_stereo = (
int)( ssdid.stereo() );
823 if ( ssdid.moduleGeometry() == 1 )
830 else if ( ssdid.moduleGeometry() == 2 )
834 else if ( ssdid.moduleGeometry() == 3 )
838 else if ( ssdid.moduleGeometry() == 4 )
848 <<
"\nERROR: Wrong strip teplate ID. Should only use templates for IB1, IB2, OB1 and OB2 !!!" <<
"\n\n";
856 float cotalpha_ = -99999.9;
857 float cotbeta_ = -99999.9;
863 float xcenter = theStripCluster->
barycenter();
871 <<
"\nERROR: Wrong stripDet !!! " <<
"\n\n";
892 float gpx =
gp.x()/gp_mod;
893 float gpy =
gp.y()/gp_mod;
894 float gpz =
gp.z()/gp_mod;
906 float gv_dot_gvx = gv.
x()*gvx.
x() + gv.
y()*gvx.
y() + gv.
z()*gvx.
z();
907 float gv_dot_gvy = gv.
x()*gvy.
x() + gv.
y()*gvy.
y() + gv.
z()*gvy.
z();
908 float gv_dot_gvz = gv.
x()*gvz.
x() + gv.
y()*gvz.
y() + gv.
z()*gvz.
z();
914 cotalpha_ = gv_dot_gvx / gv_dot_gvz;
915 cotbeta_ = gv_dot_gvy / gv_dot_gvz;
927 std::vector<TrackAndState> vec_tracks_states =
c.tracks;
929 if ( (
int)vec_tracks_states.size() > 0 )
934 int index_max_pt = -99999;
935 float max_pt = -99999.9;
937 for (
int i=0;
i<(
int)vec_tracks_states.size(); ++
i )
939 const reco::Track* one_track = vec_tracks_states[
i].track;
941 if ( one_track->
pt() > max_pt )
944 max_pt = one_track->
pt();
956 float locx = localDir.
x();
957 float locy = localDir.
y();
958 float locz = localDir.
z();
963 cotalpha_ = locx/locz;
964 cotbeta_ = locy/locz;
979 float strip_cluster_charge = 0.0;
980 std::vector<float> vec_cluster_charge;
981 vec_cluster_charge.clear();
984 int cluster_charge = 0;
985 for (
int i=0;
i<cluster_size; ++
i)
989 strip_cluster_charge += current_strip_charge;
990 vec_cluster_charge.push_back( current_strip_charge );
992 cluster_charge +=current_strip_charge;
999 int strip_templQbin_ = strip_templ_.
qbin( ID, cotalpha_, cotbeta_, strip_cluster_charge );
1001 if ( strip_templQbin_ < 0 || strip_templQbin_ > 5 )
1008 if ( strip_templQbin_ != 0 )
1021 uint16_t first_strip = theStripCluster->
firstStrip();
1024 float locBy = lbfield.
y();
1027 float stripTemplXrec1_ = -99999.9;
1028 float stripTemplXrec2_ = -99999.9;
1029 float stripTemplSigmaX_ = -99999.9;
1030 float stripTemplProbX_ = -99999.9;
1031 int stripTemplQbin_ = -99999;
1032 float stripTemplProbQ_ = -99999.9;
1052 cotalpha_, cotbeta_,
1065 stripTemplXrec1_ += 2*strip_templ_.
xsize();
1066 stripTemplXrec2_ += 2*strip_templ_.
xsize();
1083 cluster_was_successfully_split =
true;
1085 std::vector<float> strip_cluster1;
1086 std::vector<float> strip_cluster2;
1088 strip_cluster1.clear();
1089 strip_cluster2.clear();
1094 strip_cluster1.push_back(0.0);
1095 strip_cluster2.push_back(0.0);
1101 strip_templ_.
interpolate(ID, cotalpha_, cotbeta_, locBy);
1102 strip_templ_.
sxtemp(stripTemplXrec1_, strip_cluster1);
1103 strip_templ_.
sxtemp(stripTemplXrec2_, strip_cluster2);
1107 vector<SiStripDigi> vecSiStripDigi1;
1108 vecSiStripDigi1.clear();
1109 int strip_cluster1_size = (
int)strip_cluster1.size();
1110 for (
int i=2;
i<strip_cluster1_size; ++
i)
1112 if ( strip_cluster1[
i] > 0.0 )
1114 SiStripDigi current_digi1( first_strip +
i-2, strip_cluster1[
i] );
1116 vecSiStripDigi1.push_back( current_digi1 );
1122 vector<SiStripDigi> vecSiStripDigi2;
1123 vecSiStripDigi2.clear();
1124 int strip_cluster2_size = (
int)strip_cluster2.size();
1125 for (
int i=2;
i<strip_cluster2_size; ++
i)
1127 if ( strip_cluster2[
i] > 0.0 )
1129 SiStripDigi current_digi2( first_strip +
i-2, strip_cluster2[
i] );
1131 vecSiStripDigi2.push_back( current_digi2 );
1138 std::vector<SiStripDigi>::const_iterator SiStripDigiIterBegin1 = vecSiStripDigi1.begin();
1139 std::vector<SiStripDigi>::const_iterator SiStripDigiIterEnd1 = vecSiStripDigi1.end();
1140 std::pair<std::vector<SiStripDigi>::const_iterator,
1141 std::vector<SiStripDigi>::const_iterator> SiStripDigiRange1
1142 = make_pair(SiStripDigiIterBegin1, SiStripDigiIterEnd1);
1150 std::vector<SiStripDigi>::const_iterator SiStripDigiIterBegin2 = vecSiStripDigi2.begin();
1151 std::vector<SiStripDigi>::const_iterator SiStripDigiIterEnd2 = vecSiStripDigi2.end();
1152 std::pair<std::vector<SiStripDigi>::const_iterator,
1153 std::vector<SiStripDigi>::const_iterator> SiStripDigiRange2
1154 = make_pair(SiStripDigiIterBegin2, SiStripDigiIterEnd2);
1166 if ( SiStripDigiIterBegin1 != SiStripDigiIterEnd1 )
1178 <<
"\nERROR: (1) Wrong split cluster of size = " << (
int)cl1.
amplitudes().size() <<
"\n\n";
1183 if ( SiStripDigiIterBegin2 != SiStripDigiIterEnd2 )
1193 <<
"\nERROR: (2) Wrong split cluster of size = " << (
int)cl2.
amplitudes().size() <<
"\n\n";
1209 if ( !cluster_was_successfully_split )
1210 output.push_back( *
c.cluster );
1216 <<
"\nERROR: This is not a SiStripCluster !!!" <<
"\n\n";
1223 output.push_back( *
c.cluster );
1239 int minPixelRow = (*
c.cluster).minPixelRow();
1240 int maxPixelRow = (*
c.cluster).maxPixelRow();
1241 int minPixelCol = (*
c.cluster).minPixelCol();
1242 int maxPixelCol = (*
c.cluster).maxPixelCol();
1251 std::vector<int> simTrackIdV;
1252 simTrackIdV.clear();
1254 std::vector<SiPixelCluster> splittedCluster;
1255 splittedCluster.clear();
1257 for ( ; linkiter != digiLink.
data.end(); linkiter++)
1263 if ( pixel_coord.first <= maxPixelRow &&
1264 pixel_coord.first >= minPixelRow &&
1265 pixel_coord.second <= maxPixelCol &&
1266 pixel_coord.second >= minPixelCol )
1268 bool inStock(
false);
1273 int newPixelCharge(0);
1275 const std::vector<SiPixelCluster::Pixel>& pixvector = (*
c.cluster).pixels();
1277 for(std::vector<SiPixelCluster::Pixel>::const_iterator itPix = pixvector.begin(); itPix != pixvector.end(); itPix++)
1279 if (((
int) itPix->x) == ((
int) pixel_coord.first)&&(((
int) itPix->y) == ((
int) pixel_coord.second)))
1281 newPixelCharge = (
int) (linkiter->fraction()*itPix->adc);
1285 if ( newPixelCharge < 2500 )
1290 std::vector<int>::const_iterator sTIter = simTrackIdV.begin();
1292 for ( ; sTIter < simTrackIdV.end(); sTIter++)
1294 if (((*sTIter)== (
int) linkiter->SimTrackId()))
1299 splittedCluster.at(clusVecPos).add(newPixelPos,newPixelCharge);
1309 simTrackIdV.push_back(linkiter->SimTrackId());
1310 splittedCluster.push_back(
SiPixelCluster(newPixelPos,newPixelCharge));
1317 if ( ( ( (
int)simTrackIdV.size() ) == 1 ) || ( *
c.cluster).
size()==1 )
1320 output.push_back(*
c.cluster );
1325 for (std::vector<SiPixelCluster>::const_iterator cIter = splittedCluster.begin(); cIter != splittedCluster.end(); cIter++ )
1327 output.push_back( (*cIter) );
1331 simTrackIdV.clear();
1332 splittedCluster.clear();
1337 bool cluster_was_successfully_split =
false;
1341 if ( thePixelCluster )
1344 if ( (
int)thePixelCluster->
size() <= 1 )
1372 float cotalpha_ = -99999.9;
1373 float cotbeta_ = -99999.9;
1378 float xcenter = thePixelCluster->
x();
1379 float ycenter = thePixelCluster->
y();
1397 float gpx =
gp.x()/gp_mod;
1398 float gpy =
gp.y()/gp_mod;
1399 float gpz =
gp.z()/gp_mod;
1411 float gv_dot_gvx = gv.
x()*gvx.
x() + gv.
y()*gvx.
y() + gv.
z()*gvx.
z();
1412 float gv_dot_gvy = gv.
x()*gvy.
x() + gv.
y()*gvy.
y() + gv.
z()*gvy.
z();
1413 float gv_dot_gvz = gv.
x()*gvz.
x() + gv.
y()*gvz.
y() + gv.
z()*gvz.
z();
1418 cotalpha_ = gv_dot_gvx / gv_dot_gvz;
1419 cotbeta_ = gv_dot_gvy / gv_dot_gvz;
1431 std::vector<TrackAndState> vec_tracks_states =
c.tracks;
1435 if ( (
int)vec_tracks_states.size() > 0 )
1440 int index_max_pt = -99999;
1441 float max_pt = -99999.9;
1443 for (
int i=0;
i<(
int)vec_tracks_states.size(); ++
i )
1445 const reco::Track* one_track = vec_tracks_states[
i].track;
1447 if ( one_track->
pt() > max_pt )
1450 max_pt = one_track->
pt();
1462 float locx = localDir.
x();
1463 float locy = localDir.
y();
1464 float locz = localDir.
z();
1469 cotalpha_ = locx/locz;
1470 cotbeta_ = locy/locz;
1485 int templQbin_ = templ_.
qbin( ID, cotalpha_, cotbeta_, thePixelCluster->
charge() );
1487 if ( templQbin_ < 0 || templQbin_ > 5 )
1498 if ( templQbin_ != 0 )
1514 const std::vector<SiPixelCluster::Pixel> & pixVec = thePixelCluster->
pixels();
1515 std::vector<SiPixelCluster::Pixel>::const_iterator pixIter = pixVec.begin(), pixEnd = pixVec.end();
1517 const int cluster_matrix_size_x = 13;
1518 const int cluster_matrix_size_y = 21;
1520 boost::multi_array<float, 2> clust_array_2d(boost::extents[cluster_matrix_size_x][cluster_matrix_size_y]);
1527 for ( ; pixIter != pixEnd; ++pixIter )
1529 int irow =
int(pixIter->x) - row_offset;
1530 int icol =
int(pixIter->y) - col_offset;
1532 if ( irow<cluster_matrix_size_x && icol<cluster_matrix_size_y )
1534 clust_array_2d[irow][icol] = (
float)pixIter->adc;
1539 std::vector<bool> ydouble(cluster_matrix_size_y), xdouble(cluster_matrix_size_x);
1542 for (
int irow = 0; irow < cluster_matrix_size_x; ++irow)
1548 for (
int icol = 0; icol < cluster_matrix_size_y; ++icol)
1554 float templYrec1_ = -99999.9;
1555 float templYrec2_ = -99999.9;
1556 float templSigmaY_ = -99999.9;
1557 float templProbY_ = -99999.9;
1558 float templXrec1_ = -99999.9;
1559 float templXrec2_ = -99999.9;
1560 float templSigmaX_ = -99999.9;
1561 float templProbX_ = -99999.9;
1562 float dchisq = -99999.9;
1563 float templProbQ_ = -99999.9;
1567 cotalpha_, cotbeta_,
1571 templYrec1_, templYrec2_, templSigmaY_, templProbY_,
1572 templXrec1_, templXrec2_, templSigmaX_, templProbX_,
1596 float yrecp1 = -99999.9;
1597 float yrecp2 = -99999.9;
1598 float xrecp1 = -99999.9;
1599 float xrecp2 = -99999.9;
1603 yrecp1 = templYrec1_ +
ysize;
1604 yrecp2 = templYrec2_ +
ysize;
1608 yrecp1 = templYrec1_ + ysize/2.0;
1609 yrecp2 = templYrec2_ + ysize/2.0;
1614 xrecp1 = templXrec1_ +
xsize;
1615 xrecp2 = templXrec2_ +
xsize;
1619 xrecp1 = templXrec1_ + xsize/2.0;
1620 xrecp2 = templXrec2_ + xsize/2.0;
1628 for (
int j=0; j<
BXM2; ++j )
1632 template2d1[j][
i] = 0.0;
1633 template2d2[j][
i] = 0.0;
1639 = templ2D_.
xytemp(ID, cotalpha_, cotbeta_,
1646 templ2D_.
xytemp(ID, cotalpha_, cotbeta_,
1656 for (
int j=0; j<
BXM2; ++j )
1660 template2d1[j][
i] = 0.0;
1661 template2d2[j][
i] = 0.0;
1669 cluster_was_successfully_split =
false;
1676 cluster_was_successfully_split =
false;
1682 cluster_was_successfully_split =
true;
1687 float q50 = templ_.
s50();
1693 for (
int j=0; j<
TXSIZE; ++j )
1697 cluster1[j][
i] = template2d1[j+1][
i+1];
1699 if ( cluster1[j][
i] < q50 )
1700 cluster1[j][
i] = 0.0;
1702 cluster2[j][
i] = template2d2[j+1][
i+1];
1704 if ( cluster2[j][
i] < q50 )
1705 cluster2[j][
i] = 0.0;
1719 bool done_searching =
false;
1720 for (
int i=0;
i<13 && !done_searching; ++
i)
1722 for (
int j=0; j<21 && !done_searching; ++j)
1724 if ( cluster1[
i][j] > 0 )
1728 done_searching =
true;
1733 done_searching =
false;
1734 for (
int i=0;
i<13 && !done_searching; ++
i)
1736 for (
int j=0; j<21 && !done_searching; ++j)
1738 if ( cluster2[
i][j] > 0 )
1742 done_searching =
true;
1759 for (
int i=0;
i<13; ++
i)
1761 for (
int j=0; j<21; ++j)
1764 if ( cluster1[
i][j] > 0.0 && (
i!=i1 || j!=j1 ) )
1773 if ( cluster2[
i][j] > 0.0 && (
i!=i2 || j!=j2 ) )
1802 if ( (
int)cl1.
size() <= 0 )
1805 <<
"1) Cluster of size = " << (
int)cl1.
size() <<
" !!! " << endl;
1808 if ( (
int)cl2.
size() <= 0 )
1811 <<
"2) Cluster of size = " << (
int)cl2.
size() <<
" !!! " << endl;
1817 <<
"1) Cluster of charge = " << (
int)cl1.
charge() <<
" !!! " << endl;
1824 <<
"2) Cluster of charge = " << (
int)cl2.
charge() <<
" !!!!!!!!!!!!!!!!!!!!!!!!!! " << endl;
1838 if ( !cluster_was_successfully_split )
1845 <<
"This is not a SiPixelCluster !!! " <<
"\n";
1852 output.push_back( *
c.cluster );
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
T getParameter(std::string const &) const
edm::ESHandle< Propagator > propagator_
edm::EDGetTokenT< edm::DetSetVector< StripDigiSimLink > > stripdigisimlinkToken
bool operator()(const ClusterWithTracks< Cluster > &test) const
edm::EDGetTokenT< TrajTrackAssociationCollection > trajTrackAssociations_
static const C * equalClusters(const C &c1, const C &c2)
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
TrackerHitAssociator::Config trackerHitAssociatorConfig_
void setSplitClusterErrorY(float erry)
TrackAndState(const reco::Track *aTrack, TrajectoryStateOnSurface aState)
const LocalTrajectoryParameters & localParameters() const
friend struct const_iterator
const_iterator end() const
last iterator over the map (read only)
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
void markClusters(std::map< uint32_t, boost::sub_range< std::vector< ClusterWithTracks< Cluster > > > > &map, const TrackingRecHit *hit, const reco::Track *track, const TrajectoryStateOnSurface &tsos) const
bool getByToken(EDGetToken token, Handle< PROD > &result) const
edm::EDGetTokenT< edmNew::DetSetVector< SiStripCluster > > stripClusters_
#define DEFINE_FWK_MODULE(type)
size_t recHitsSize() const
Get number of RecHits. (Warning, this includes invalid hits, which are not physical hits)...
float xsize()
strip x-size (microns)
double y() const
y coordinate
static bool pushfile(int filenum, std::vector< SiPixelTemplateStore2D > &thePixelTemp_)
static bool pushfile(int filenum, std::vector< SiPixelTemplateStore > &thePixelTemp_)
bool simpletemplate2D(float xhitp, float yhitp, std::vector< bool > &ydouble, std::vector< bool > &xdouble, float template2d[13+2][21+2])
Make simple 2-D templates from track angles set in interpolate and hit position.
std::vector< SiPixelTemplateStore > thePixelTemp_
uint16_t firstStrip() const
int qbin(int id, float cotalpha, float cotbeta, float qclus)
LocalVector toLocal(const reco::Track::Vector &v, const Surface &s)
virtual bool isItBigPixelInX(int ixbin) const =0
edm::Handle< edm::DetSetVector< PixelDigiSimLink > > pixeldigisimlink
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
const Plane & surface() const
The nominal surface of the GeomDet.
static std::string const input
uint32_t rawId() const
get the raw id
std::vector< SiPixelTemplateStore2D > thePixelTemp2D_
edm::EDGetTokenT< edmNew::DetSetVector< SiPixelCluster > > pixelClusters_
DataContainer const & measurements() const
edm::ESHandle< MagneticField > magfield_
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
std::vector< TrajectoryMeasurement > DataContainer
virtual LocalPoint localPosition(float strip) const =0
std::string propagatorName_
double pt() const
track transverse momentum
virtual bool isItBigPixelInY(int iybin) const =0
int PixelTempSplit(int id, float cotalpha, float cotbeta, array_2d &cluster, std::vector< bool > &ydouble, std::vector< bool > &xdouble, SiPixelTemplate &templ, float &yrec1, float &yrec2, float &sigmay, float &prob2y, float &xrec1, float &xrec2, float &sigmax, float &prob2x, int &q2bin, float &prob2Q, bool resolve, int speed, float &dchisq, bool deadpix, std::vector< std::pair< int, int > > &zeropix, SiPixelTemplate2D &templ2D)
edm::EDGetTokenT< edm::DetSetVector< PixelDigiSimLink > > pixeldigisimlinkToken
edm::EDGetTokenT< std::vector< reco::Vertex > > vertices_
std::vector< SiPixelClusterWithTracks > allSiPixelClusters
working data
ClusterWithTracks(const Cluster &c)
double z() const
z coordinate
edm::ESHandle< GlobalTrackingGeometry > geometry_
float xsize()
pixel x-size (microns)
void add(const PixelPos &pix, int adc)
LocalVector momentum() const
Momentum vector in the local frame.
A Digi for the silicon strip detector, containing both strip and adc information, and suitable for st...
trackingRecHit_iterator recHitsBegin() const
Iterator to first hit on the track.
std::pair< uint32_t, EncodedEventId > SimHitIdpr
std::vector< LinkConnSpec >::const_iterator IT
boost::sub_range< std::vector< SiPixelClusterWithTracks > > SiPixelClustersWithTracks
std::vector< SiStripClusterWithTracks > allSiStripClusters
int subdetId() const
get the contents of the subdetector field (not cast into any detector's numbering enum) ...
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
boost::sub_range< std::vector< SiStripClusterWithTracks > > SiStripClustersWithTracks
FindCluster(const TrackingRecHit *hit)
float s50()
1/2 of the pixel threshold signal in electrons
bool xytemp(int id, float cotalpha, float cotbeta, float locBz, float xhit, float yhit, std::vector< bool > &ydouble, std::vector< bool > &xdouble, float template2d[13+2][21+2])
edm::Handle< edm::DetSetVector< StripDigiSimLink > > stripdigisimlink
Detector identifier class for the strip tracker.
void setSplitClusterErrorX(float errx)
std::map< uint32_t, SiStripClustersWithTracks > siStripDetsWithClusters
std::vector< SiStripTemplateStore > theStripTemp_
double x() const
x coordinate
const GeomDet * idToDetUnit(DetId) const override
Return the pointer to the GeomDetUnit corresponding to a given DetId.
void sxtemp(float xhit, std::vector< float > &cluster)
static std::pair< int, int > channelToPixel(int ch)
virtual const PixelTopology & specificTopology() const
Returns a reference to the pixel proxy topology.
TrajectoryStateOnSurface propagate(STA const &state, SUR const &surface) const
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
int StripTempSplit(int id, float cotalpha, float cotbeta, float locBy, int speed, std::vector< float > &cluster, SiStripTemplate &templ, float &xrec1, float &xrec2, float &sigmax, float &prob2x, int &q2bin, float &prob2Q)
void setSplitClusterError(float errx)
std::map< uint32_t, SiPixelClustersWithTracks > siPixelDetsWithClusters
Pixel cluster – collection of neighboring pixels above threshold.
std::vector< TrackAndState > tracks
const reco::Track * track
const GeomDet * idToDet(DetId) const override
edm::EDGetTokenT< std::vector< reco::Track > > tracks_
std::unique_ptr< TrackerHitAssociator > hitAssociator
TrajectoryStateOnSurface state
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
const_iterator begin() const
first iterator over the map (read only)
int qbin(int id, float cotalpha, float cotbeta, float locBz, float locBx, float qclus, float &pixmx, float &sigmay, float &deltay, float &sigmax, float &deltax, float &sy1, float &dy1, float &sy2, float &dy2, float &sx1, float &dx1, float &sx2, float &dx2)
DetId geographicalId() const
~TrackClusterSplitter() override
ModuleGeometry moduleGeometry() const
collection_type::const_iterator const_iterator
void splitCluster(const ClusterWithTracks< Cluster > &cluster, const GlobalVector &dir, typename edmNew::DetSetVector< Cluster >::FastFiller &output, DetId detId) const
collection_type::const_iterator const_iterator
ClusterWithTracks< SiStripCluster > SiStripClusterWithTracks
bool interpolate(int id, float cotalpha, float cotbeta, float locBy)
std::unique_ptr< edmNew::DetSetVector< Cluster > > splitClusters(const std::map< uint32_t, boost::sub_range< std::vector< ClusterWithTracks< Cluster > > > > &input, const reco::Vertex &vtx) const
const PositionType & position() const
float ysize()
pixel y-size (microns)
ClusterWithTracks< SiPixelCluster > SiPixelClusterWithTracks
const std::vector< uint8_t > & amplitudes() const
const std::vector< Pixel > pixels() const
static bool pushfile(int filenum, std::vector< SiStripTemplateStore > &theStripTemp_)
TrackingRecHitCollection::base::const_iterator trackingRecHit_iterator
iterator over a vector of reference to TrackingRecHit in the same collection
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
TrackClusterSplitter(const edm::ParameterSet &iConfig)