56 #include <boost/range.hpp>
57 #include <boost/foreach.hpp>
58 #include "boost/multi_array.hpp"
128 track(aTrack), state(aState) {}
134 template<
typename Cluster>
175 return test.
cluster == toFind_ || equalClusters<Cluster>(*test.
cluster, *toFind_);
185 template<
typename Cluster>
191 template<
typename Cluster>
192 std::auto_ptr<edmNew::DetSetVector<Cluster> >
193 splitClusters(
const std::map<uint32_t,
197 template<
typename Cluster>
216 void TrackClusterSplitter::splitCluster<SiPixelCluster> (
const SiPixelClusterWithTracks &cluster,
225 void TrackClusterSplitter::splitCluster<SiStripCluster> (
const SiStripClusterWithTracks &cluster,
232 #define foreach BOOST_FOREACH
235 useTrajectories_(iConfig.getParameter<bool>(
"useTrajectories"))
248 produces< edmNew::DetSetVector<SiPixelCluster> >();
250 produces< edmNew::DetSetVector<SiStripCluster> >();
303 if (
typeid(*
hit) ==
typeid(SiStripRecHit2D) )
305 return (static_cast<const SiStripRecHit2D &>(*
hit)).cluster().get();
307 else if (
typeid(*
hit) ==
typeid(SiStripRecHit1D) )
309 return (static_cast<const SiStripRecHit1D &>(*
hit)).cluster().get();
312 throw cms::Exception(
"Unsupported") <<
"Detid of type " <<
typeid(*hit).name() <<
" not supported.\n";
321 return (static_cast<const SiPixelRecHit&>(*
hit)).cluster().get();
324 throw cms::Exception(
"Unsupported") <<
"Detid of type " <<
typeid(*hit).name() <<
" not supported.\n";
389 ed = trajectories->end(); it != ed; ++it )
402 size_t i_hit = 0, last_hit = tms.size()-1;
404 bool first =
true, reversed =
false;
406 for (; it_hit != ed_hit; ++it_hit, ++i_hit)
410 if ((*it_hit)->geographicalId().rawId() == 0)
420 if ((*it_hit)->geographicalId() == tms[i_hit].recHit()->hit()->geographicalId())
424 else if ((*it_hit)->geographicalId() == tms[last_hit-i_hit].recHit()->hit()->geographicalId())
430 throw cms::Exception(
"Aargh") <<
"DetIDs don't match either way :-( \n";
435 if ( hit == 0 || !hit->
isValid() )
442 markClusters<SiStripCluster>(
siStripDetsWithClusters, hit, tk, tms[reversed ? last_hit-i_hit : i_hit].updatedState());
444 else if (subdet >= 1)
446 markClusters<SiPixelCluster>(
siPixelDetsWithClusters, hit, tk, tms[reversed ? last_hit-i_hit : i_hit].updatedState());
450 edm::LogWarning(
"HitNotFound") <<
"Hit of type " <<
typeid(*hit).name() <<
", detid "
467 for (; it_hit != ed_hit; ++it_hit)
470 if ( hit == 0 || !hit->
isValid() )
491 else if (subdet >= 1)
497 edm::LogWarning(
"HitNotFound") <<
"Hit of type " <<
typeid(*hit).name() <<
", detid "
522 iEvent.
put(newPixelClusters);
523 iEvent.
put(newStripClusters);
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::auto_ptr<edmNew::DetSetVector<Cluster> >
558 typedef std::pair<uint32_t, boost::sub_range<std::vector<ClusterWithTracks<Cluster> > > > pair;
560 foreach(
const pair &
p,
input)
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;
614 size_t splittableClusterSize = 0;
615 splittableClusterSize = associatedIdpr.size();
616 std::vector<uint8_t> amp = clust->
amplitudes();
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();
680 currentAmpl = rawAmpl;
684 thisTrackID = linkiter->SimTrackId();
687 bool newTrack =
true;
688 int thisTrackIdx = 9999;
690 for (
size_t i=0;
i<trackID.size(); ++
i)
692 if ( trackID[
i] == thisTrackID )
701 trackInStrip.push_back(
false);
702 trackID.push_back(thisTrackID);
703 firstStrip.push_back(currentChannel);
704 std::vector<uint16_t> ampTmp;
705 trackAmp.push_back(ampTmp);
706 trackFraction.push_back(0);
707 thisTrackIdx = trackID.size()-1;
710 trackInStrip[thisTrackIdx] =
true;
711 trackFraction[thisTrackIdx] += linkiter->fraction();
712 currentAmpl = rawAmpl;
720 std::vector<SiStripCluster> newCluster;
724 for (
size_t i=0;
i < trackID.size(); ++
i)
726 if ( trackInStrip[
i] )
728 if ( ( thisAmpl=rawAmpl ) < 254 )
729 thisAmpl =
min(uint16_t(253),
max(uint16_t(0), (uint16_t)(rawAmpl*trackFraction[i]+0.5)));
732 trackAmp[
i].push_back( thisAmpl );
740 trackAmp[i].
end() ) );
745 for (
size_t i=0;
i<newCluster.size(); ++
i )
749 float clusterAmp = 0.0;
750 for (
size_t j=0;
j<trackAmp[
i].size(); ++
j )
751 clusterAmp += (
float)(trackAmp[
i])[
j];
753 if ( clusterAmp > 0.0 && firstStrip[
i] != 9999 && trackAmp[
i].
size() > 0 )
756 output.push_back( newCluster[
i] );
763 cluster_was_successfully_split =
true;
782 if ( !cluster_was_successfully_split )
783 output.push_back( *
c.cluster );
789 bool cluster_was_successfully_split =
false;
793 if ( theStripCluster )
801 if ( (
int)theStripCluster->
amplitudes().size() <= 1 ||
802 ( (int)ssdid.moduleGeometry() != 1 &&
803 (int)ssdid.moduleGeometry() != 2 &&
804 (int)ssdid.moduleGeometry() != 3 &&
805 (int)ssdid.moduleGeometry() != 4 ) )
822 int is_stereo = (int)( ssdid.stereo() );
824 if ( ssdid.moduleGeometry() == 1 )
831 else if ( ssdid.moduleGeometry() == 2 )
835 else if ( ssdid.moduleGeometry() == 3 )
839 else if ( ssdid.moduleGeometry() == 4 )
849 <<
"\nERROR: Wrong strip teplate ID. Should only use templates for IB1, IB2, OB1 and OB2 !!!" <<
"\n\n";
857 float cotalpha_ = -99999.9;
858 float cotbeta_ = -99999.9;
864 float xcenter = theStripCluster->
barycenter();
872 <<
"\nERROR: Wrong stripDet !!! " <<
"\n\n";
889 GlobalPoint gp(gp0.
x()-vtx.x(), gp0.
y()-vtx.y(), gp0.
z()-vtx.z() );
892 float gp_mod =
sqrt( gp.x()*gp.x() + gp.y()*gp.y() + gp.z()*gp.z() );
893 float gpx = gp.x()/gp_mod;
894 float gpy = gp.y()/gp_mod;
895 float gpz = gp.z()/gp_mod;
907 float gv_dot_gvx = gv.
x()*gvx.
x() + gv.
y()*gvx.
y() + gv.
z()*gvx.
z();
908 float gv_dot_gvy = gv.
x()*gvy.
x() + gv.
y()*gvy.
y() + gv.
z()*gvy.
z();
909 float gv_dot_gvz = gv.
x()*gvz.
x() + gv.
y()*gvz.
y() + gv.
z()*gvz.
z();
915 cotalpha_ = gv_dot_gvx / gv_dot_gvz;
916 cotbeta_ = gv_dot_gvy / gv_dot_gvz;
928 std::vector<TrackAndState> vec_tracks_states =
c.tracks;
930 if ( (
int)vec_tracks_states.size() > 0 )
935 int index_max_pt = -99999;
936 float max_pt = -99999.9;
938 for (
int i=0;
i<(int)vec_tracks_states.size(); ++
i )
940 const reco::Track* one_track = vec_tracks_states[
i].track;
942 if ( one_track->
pt() > max_pt )
945 max_pt = one_track->
pt();
957 float locx = localDir.
x();
958 float locy = localDir.
y();
959 float locz = localDir.
z();
964 cotalpha_ = locx/locz;
965 cotbeta_ = locy/locz;
980 float strip_cluster_charge = 0.0;
981 std::vector<float> vec_cluster_charge;
982 vec_cluster_charge.clear();
983 int cluster_size = (int)( (theStripCluster->
amplitudes()).
size() );
985 int cluster_charge = 0;
986 for (
int i=0;
i<cluster_size; ++
i)
988 float current_strip_charge = (float)( (theStripCluster->
amplitudes())[
i] );
990 strip_cluster_charge += current_strip_charge;
991 vec_cluster_charge.push_back( current_strip_charge );
993 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_,
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);
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 )
1175 if ( (
int)cl1.amplitudes().size() <= 0 )
1178 <<
"\nERROR: (1) Wrong split cluster of size = " << (int)cl1.amplitudes().size() <<
"\n\n";
1183 if ( SiStripDigiIterBegin2 != SiStripDigiIterEnd2 )
1187 cl2.setSplitClusterError( stripTemplSigmaX_ );
1190 if ( (
int)
cl2.amplitudes().size() <= 0 )
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();
1393 GlobalPoint gp(gp0.
x()-vtx.x(), gp0.
y()-vtx.y(), gp0.
z()-vtx.z() );
1396 float gp_mod =
sqrt( gp.x()*gp.x() + gp.y()*gp.y() + gp.z()*gp.z() );
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;
1483 int templQbin_ =
templ_.
qbin( ID, cotalpha_, cotbeta_, thePixelCluster->
charge() );
1485 if ( templQbin_ < 0 || templQbin_ > 5 )
1496 if ( templQbin_ != 0 )
1512 const std::vector<SiPixelCluster::Pixel> & pixVec = thePixelCluster->
pixels();
1513 std::vector<SiPixelCluster::Pixel>::const_iterator pixIter = pixVec.begin(), pixEnd = pixVec.end();
1518 boost::multi_array<float, 2> clust_array_2d(boost::extents[cluster_matrix_size_x][cluster_matrix_size_y]);
1525 for ( ; pixIter != pixEnd; ++pixIter )
1527 int irow = int(pixIter->x) - row_offset;
1528 int icol = int(pixIter->y) - col_offset;
1530 if ( irow<cluster_matrix_size_x && icol<cluster_matrix_size_y )
1532 clust_array_2d[irow][icol] = (float)pixIter->adc;
1537 std::vector<bool> ydouble(cluster_matrix_size_y), xdouble(cluster_matrix_size_x);
1552 float templYrec1_ = -99999.9;
1553 float templYrec2_ = -99999.9;
1554 float templSigmaY_ = -99999.9;
1555 float templProbY_ = -99999.9;
1556 float templXrec1_ = -99999.9;
1557 float templXrec2_ = -99999.9;
1558 float templSigmaX_ = -99999.9;
1559 float templProbX_ = -99999.9;
1560 float dchisq = -99999.9;
1561 float templProbQ_ = -99999.9;
1565 cotalpha_, cotbeta_,
1569 templYrec1_, templYrec2_, templSigmaY_, templProbY_,
1570 templXrec1_, templXrec2_, templSigmaX_, templProbX_,
1594 float yrecp1 = -99999.9;
1595 float yrecp2 = -99999.9;
1596 float xrecp1 = -99999.9;
1597 float xrecp2 = -99999.9;
1601 yrecp1 = templYrec1_ + ysize;
1602 yrecp2 = templYrec2_ + ysize;
1606 yrecp1 = templYrec1_ + ysize/2.0;
1607 yrecp2 = templYrec2_ + ysize/2.0;
1612 xrecp1 = templXrec1_ + xsize;
1613 xrecp2 = templXrec2_ + xsize;
1617 xrecp1 = templXrec1_ + xsize/2.0;
1618 xrecp2 = templXrec2_ + xsize/2.0;
1630 template2d1[
j][
i] = 0.0;
1631 template2d2[
j][
i] = 0.0;
1658 template2d1[
j][
i] = 0.0;
1659 template2d2[
j][
i] = 0.0;
1667 cluster_was_successfully_split =
false;
1674 cluster_was_successfully_split =
false;
1680 cluster_was_successfully_split =
true;
1695 cluster1[
j][
i] = template2d1[
j+1][
i+1];
1697 if ( cluster1[
j][
i] < q50 )
1698 cluster1[
j][
i] = 0.0;
1700 cluster2[
j][
i] = template2d2[
j+1][
i+1];
1702 if ( cluster2[
j][
i] < q50 )
1703 cluster2[
j][
i] = 0.0;
1717 bool done_searching =
false;
1718 for (
int i=0;
i<13 && !done_searching; ++
i)
1720 for (
int j=0;
j<21 && !done_searching; ++
j)
1722 if ( cluster1[
i][
j] > 0 )
1726 done_searching =
true;
1731 done_searching =
false;
1732 for (
int i=0;
i<13 && !done_searching; ++
i)
1734 for (
int j=0;
j<21 && !done_searching; ++
j)
1736 if ( cluster2[
i][
j] > 0 )
1740 done_searching =
true;
1757 for (
int i=0;
i<13; ++
i)
1759 for (
int j=0;
j<21; ++
j)
1762 if ( cluster1[
i][
j] > 0.0 && (
i!=i1 ||
j!=j1 ) )
1771 if ( cluster2[
i][
j] > 0.0 && (
i!=i2 ||
j!=j2 ) )
1800 if ( (
int)cl1.
size() <= 0 )
1803 <<
"1) Cluster of size = " << (int)cl1.
size() <<
" !!! " << endl;
1806 if ( (
int)cl2.
size() <= 0 )
1809 <<
"2) Cluster of size = " << (int)cl2.
size() <<
" !!! " << endl;
1815 <<
"1) Cluster of charge = " << (int)cl1.
charge() <<
" !!! " << endl;
1822 <<
"2) Cluster of charge = " << (int)cl2.
charge() <<
" !!!!!!!!!!!!!!!!!!!!!!!!!! " << endl;
1836 if ( !cluster_was_successfully_split )
1843 <<
"This is not a SiPixelCluster !!! " <<
"\n";
1850 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)
tuple start
Check for commandline option errors.
void setSplitClusterErrorY(float erry)
TrackAndState(const reco::Track *aTrack, TrajectoryStateOnSurface aState)
virtual LocalPoint localPosition(const MeasurementPoint &) const =0
const LocalTrajectoryParameters & localParameters() const
friend struct const_iterator
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
int qbin(int id, float cotalpha, float cotbeta, float locBz, 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)
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)
SiStripTemplate strip_templ_
double y() const
y coordinate
std::auto_ptr< edmNew::DetSetVector< Cluster > > splitClusters(const std::map< uint32_t, boost::sub_range< std::vector< ClusterWithTracks< Cluster > > > > &input, const reco::Vertex &vtx) const
uint16_t firstStrip() const
int qbin(int id, float cotalpha, float cotbeta, float qclus)
LocalVector toLocal(const reco::Track::Vector &v, const Surface &s)
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
bool xytemp(int id, float cotalpha, float cotbeta, float locBz, float xhit, float yhit, std::vector< bool > &ydouble, std::vector< bool > &xdouble, float template2d[BXM2][BYM2])
uint32_t rawId() const
get the raw id
edm::EDGetTokenT< edmNew::DetSetVector< SiPixelCluster > > pixelClusters_
DataContainer const & measurements() const
edm::ESHandle< MagneticField > magfield_
bool simpletemplate2D(float xhitp, float yhitp, std::vector< bool > &ydouble, std::vector< bool > &xdouble, float template2d[BXM2][BYM2])
Make simple 2-D templates from track angles set in interpolate and hit position.
Measurement2DPoint MeasurementPoint
Measurement points are two-dimensional by default.
std::vector< TrajectoryMeasurement > DataContainer
bool pushfile(int filenum)
const T & max(const T &a, const T &b)
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
std::string propagatorName_
double pt() const
track transverse momentum
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
y 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) ...
boost::sub_range< std::vector< SiStripClusterWithTracks > > SiStripClustersWithTracks
FindCluster(const TrackingRecHit *hit)
float s50()
1/2 of the pixel threshold signal in electrons
TrackerHitAssociator * hitAssociator
void associateSimpleRecHitCluster(const SiStripCluster *clust, const uint32_t &detID, std::vector< SimHitIdpr > &simtrackid)
virtual bool isItBigPixelInX(const int ixbin) const =0
edm::Handle< edm::DetSetVector< StripDigiSimLink > > stripdigisimlink
Detector identifier class for the strip tracker.
void setSplitClusterErrorX(float errx)
std::map< uint32_t, SiStripClustersWithTracks > siStripDetsWithClusters
bool pushfile(int filenum)
double x() const
x coordinate
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.
const int cluster_matrix_size_y
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
edm::EDGetTokenT< std::vector< reco::Track > > tracks_
virtual LocalPoint localPosition(float strip) const =0
bool pushfile(int filenum)
const int cluster_matrix_size_x
TrajectoryStateOnSurface state
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
DetId geographicalId() const
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)
const PositionType & position() const
float ysize()
pixel y-size (microns)
ClusterWithTracks< SiPixelCluster > SiPixelClusterWithTracks
SiPixelTemplate2D templ2D_
tuple size
Write out results.
const std::vector< uint8_t > & amplitudes() const
const std::vector< Pixel > pixels() const
trackingRecHit_iterator recHitsEnd() const
Iterator to last hit on the track.
TrackClusterSplitter(const edm::ParameterSet &iConfig)
virtual bool isItBigPixelInY(const int iybin) const =0