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 ) &&
625 ( (
int)ssdid.moduleGeometry() == 1 ||
626 (
int)ssdid.moduleGeometry() == 2 ||
627 (
int)ssdid.moduleGeometry() == 3 ||
628 (
int)ssdid.moduleGeometry() == 4 ) )
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].
size() > 0 )
762 cluster_was_successfully_split =
true;
781 if ( !cluster_was_successfully_split )
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)
987 float current_strip_charge = (
float)( (theStripCluster->
amplitudes())[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 )
1171 cl1.setSplitClusterError( stripTemplSigmaX_ );
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 )
1216 <<
"\nERROR: This is not a SiStripCluster !!!" <<
"\n\n";
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
void push_back(data_type const &d)
const LocalTrajectoryParameters & localParameters() const
uint16_t firstStrip() const
LocalVector toLocal(const reco::Track::Vector &v, const Surface &s)
virtual const StripTopology & specificTopology() const
Returns a reference to the strip proxy topology.
const Plane & surface() const
The nominal surface of the GeomDet.
uint32_t rawId() const
get the raw id
edm::ESHandle< MagneticField > magfield_
virtual const GeomDetUnit * idToDetUnit(DetId) const
Return the pointer to the GeomDetUnit corresponding to a given DetId.
virtual LocalPoint localPosition(float strip) const =0
double pt() const
track transverse momentum
edm::ESHandle< GlobalTrackingGeometry > geometry_
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...
virtual GlobalVector inTesla(const GlobalPoint &gp) const =0
Field value ad specified global point, in Tesla.
edm::Handle< edm::DetSetVector< StripDigiSimLink > > stripdigisimlink
Detector identifier class for the strip tracker.
std::vector< SiStripTemplateStore > theStripTemp_
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)
std::unique_ptr< TrackerHitAssociator > hitAssociator
collection_type::const_iterator const_iterator
collection_type::const_iterator const_iterator
const PositionType & position() const
const std::vector< uint8_t > & amplitudes() const