Go to the documentation of this file.00001
00009
00010 #include "RecoLocalMuon/DTSegment/src/DTSegmentCand.h"
00011
00012 #include "Geometry/DTGeometry/interface/DTSuperLayer.h"
00013 #include "DataFormats/DTRecHit/interface/DTSLRecSegment2D.h"
00014 #include "DataFormats/DTRecHit/interface/DTChamberRecSegment2D.h"
00015
00016
00017
00018
00019
00020
00021 double DTSegmentCand::chi2max=20.;
00022 unsigned int DTSegmentCand::nHitsMin=3;
00023
00025 DTSegmentCand::DTSegmentCand(AssPointCont& hits,
00026 const DTSuperLayer* sl) :
00027 theSL(sl), theChi2(-1.) , theHits(hits){
00028 }
00029
00030 DTSegmentCand::DTSegmentCand(AssPointCont hits,
00031 LocalPoint& position,
00032 LocalVector& direction,
00033 double chi2,
00034 AlgebraicSymMatrix covMat,
00035 const DTSuperLayer* sl) :
00036 theSL(sl), thePosition(position), theDirection(direction), theChi2(chi2),
00037 theCovMatrix( covMat), theHits(hits) {
00038 }
00039
00041 DTSegmentCand::~DTSegmentCand() {
00042 }
00043
00044
00045 bool DTSegmentCand::operator==(const DTSegmentCand& seg){
00046 static const double epsilon=0.00001;
00047 if (nHits()!=seg.nHits()) return false;
00048 if (fabs(chi2()-seg.chi2())>epsilon) return false;
00049 if (fabs(position().x()-seg.position().x())>epsilon ||
00050 fabs(position().y()-seg.position().y())>epsilon ||
00051 fabs(position().z()-seg.position().z())>epsilon) return false;
00052 if (fabs(direction().x()-seg.direction().x())>epsilon ||
00053 fabs(direction().y()-seg.direction().y())>epsilon ||
00054 fabs(direction().z()-seg.direction().z())>epsilon) return false;
00055 return true;
00056 }
00057
00058 bool DTSegmentCand::operator<(const DTSegmentCand& seg){
00059 if (nHits()==seg.nHits()) return (chi2()>seg.chi2());
00060 return (nHits()<seg.nHits());
00061 }
00062
00063 void DTSegmentCand::add(DTHitPairForFit* hit, DTEnums::DTCellSide code) {
00064 theHits.insert(AssPoint(hit,code));
00065 }
00066
00067 void DTSegmentCand::removeHit(AssPoint badHit) {
00068 theHits.erase(badHit);
00069 }
00070
00071 int DTSegmentCand::nSharedHitPairs(const DTSegmentCand& seg) const{
00072 int result=0;
00073 AssPointCont hitsCont = seg.hits();
00074
00075 for (AssPointCont::const_iterator hit=theHits.begin();
00076 hit!=theHits.end() ; ++hit) {
00077 for (AssPointCont::const_iterator hit2=hitsCont.begin();
00078 hit2!=hitsCont.end() ; ++hit2) {
00079
00080 if ((*(*hit).first)==(*(*hit2).first)) {
00081 ++result;
00082 continue;
00083 }
00084 }
00085 }
00086 return result;
00087 }
00088
00089 DTSegmentCand::AssPointCont
00090 DTSegmentCand::conflictingHitPairs(const DTSegmentCand& seg) const{
00091 AssPointCont result;
00092 const AssPointCont & hits2 = seg.theHits;
00093
00094
00095
00096 AssPointCont::const_iterator hitBegin2 = hits2.begin(), hitEnd2 = hits2.end();
00097 for (AssPointCont::const_iterator hit = theHits.begin(), hitEnd = theHits.end();
00098 hit != hitEnd ; ++hit) {
00099 for (AssPointCont::const_iterator hit2 = hitBegin2; hit2 != hitEnd2; ++hit2) {
00100 if ((*(*hit).first)==(*(*hit2).first) &&
00101 (*hit).second != (*hit2).second) {
00102 result.insert(*hit);
00103 continue;
00104 }
00105 }
00106 }
00107 return result;
00108 }
00109
00110 bool DTSegmentCand::good() const
00111 {
00112 if(NDOF() == 0) return false;
00113 if(chi2()/NDOF() > chi2max || nHits() < nHitsMin) return false;
00114
00115 if(nHits() == nHitsMin && hitsShareLayer()) return false ;
00116
00117 return true;
00118 }
00119
00120 bool DTSegmentCand::hitsShareLayer() const
00121 {
00122 std::vector<int> layerN;
00123
00124 for(DTSegmentCand::AssPointCont::iterator assHit=theHits.begin();
00125 assHit!=theHits.end(); ++assHit) {
00126 layerN.push_back((*assHit).first->id().layerId().layer());
00127
00128
00129 }
00130
00131 for(int i=0;i<(int)layerN.size();i++){
00132 for(int j=i+1;j<(int)layerN.size();j++){
00133 if(layerN[i] == layerN[j]) return true;
00134 }
00135 }
00136
00137 return false;
00138 }
00139
00140 int DTSegmentCand::nLayers() const {
00141
00142 return 0;
00143 }
00144
00145 DTSegmentCand::operator DTSLRecSegment2D*() const{
00146
00147 LocalPoint seg2Dposition = position();
00148 LocalVector seg2DDirection = direction();
00149 double seg2DChi2 = chi2();
00150 AlgebraicSymMatrix seg2DCovMatrix = covMatrix();
00151
00152 std::vector<DTRecHit1D> hits1D;
00153 for(DTSegmentCand::AssPointCont::iterator assHit=theHits.begin();
00154 assHit!=theHits.end(); ++assHit) {
00155
00156 GlobalPoint hitGlobalPos =
00157 theSL->toGlobal( (*assHit).first->localPosition((*assHit).second) );
00158
00159 LocalPoint hitPosInLayer =
00160 theSL->layer( (*assHit).first->id().layerId() )->toLocal(hitGlobalPos);
00161
00162 DTRecHit1D hit( ((*assHit).first)->id(),
00163 (*assHit).second,
00164 ((*assHit).first)->digiTime(),
00165 hitPosInLayer,
00166 ((*assHit).first)->localPositionError() );
00167 hits1D.push_back(hit);
00168 }
00169
00170 return new DTSLRecSegment2D(theSL->id(),
00171 seg2Dposition,seg2DDirection,seg2DCovMatrix,
00172 seg2DChi2,hits1D);
00173 }
00174
00175 DTSegmentCand::operator DTChamberRecSegment2D*() const{
00176
00177
00178
00179
00180
00181 LocalPoint posInCh = theSL->chamber()->toLocal(theSL->toGlobal( position() ));
00182 LocalVector dirInCh= theSL->chamber()->toLocal(theSL->toGlobal( direction() ));
00183
00184 LocalPoint pos=posInCh + dirInCh * posInCh.z()/cos(dirInCh.theta());
00185
00186 double seg2DChi2 = chi2();
00187 AlgebraicSymMatrix seg2DCovMatrix = covMatrix();
00188
00189 std::vector<DTRecHit1D> hits1D;
00190 for(DTSegmentCand::AssPointCont::iterator assHit=theHits.begin();
00191 assHit!=theHits.end(); ++assHit) {
00192
00193 GlobalPoint hitGlobalPos =
00194 theSL->toGlobal( (*assHit).first->localPosition((*assHit).second) );
00195
00196 LocalPoint hitPosInLayer =
00197 theSL->chamber()
00198 ->superLayer((*assHit).first->id().superlayerId())
00199 ->layer( (*assHit).first->id().layerId() )->toLocal(hitGlobalPos);
00200
00201 DTRecHit1D hit( ((*assHit).first)->id(),
00202 (*assHit).second,
00203 ((*assHit).first)->digiTime(),
00204 hitPosInLayer,
00205 ((*assHit).first)->localPositionError() );
00206 hits1D.push_back(hit);
00207 }
00208
00209 return new DTChamberRecSegment2D(theSL->chamber()->id(),
00210 pos,dirInCh,seg2DCovMatrix,
00211 seg2DChi2,hits1D);
00212
00213
00214
00215 }
00216
00217
00218 bool DTSegmentCand::AssPointLessZ::operator()(const AssPoint& pt1,
00219 const AssPoint& pt2) const {
00220 return *(pt1.first) < *(pt2.first);
00221 }
00222
00223 std::ostream& operator<<(std::ostream& out, const DTSegmentCand& seg) {
00224 out << " pos: " << seg.position() << " dir: " << seg.direction()
00225 << " chi2/nHits: " << seg.chi2() << "/" << seg.DTSegmentCand::nHits() << "/" << seg.nHits();
00226 return out;
00227 }
00228
00229 std::ostream& operator<<(std::ostream& out, const DTSegmentCand::AssPoint& hit) {
00230
00231
00232 return out;
00233 }