81 std::vector<TrigL2MuonSA::TrackPattern>& v_trackPatterns)
const
87 for(
unsigned int i_hit=0; i_hit<v_trackPatterns.back().stgcSegment.size(); i_hit++) {
88 ATH_MSG_DEBUG(
"PatternFinder: output sTGC hits global eta/phi/r/z/layer/channelType/isOutlier " << v_trackPatterns.back().stgcSegment[i_hit].eta <<
"/" << v_trackPatterns.back().stgcSegment[i_hit].phi <<
"/" << v_trackPatterns.back().stgcSegment[i_hit].r <<
"/" << v_trackPatterns.back().stgcSegment[i_hit].z <<
"/" << v_trackPatterns.back().stgcSegment[i_hit].layerNumber <<
"/" << v_trackPatterns.back().stgcSegment[i_hit].channelType <<
"/" << v_trackPatterns.back().stgcSegment[i_hit].isOutlier);
91 for(
unsigned int i_hit=0; i_hit<v_trackPatterns.back().mmSegment.size(); i_hit++) {
92 ATH_MSG_DEBUG(
"PatternFinder: output MM hits global eta/phi/r/z/layer/isOutlier " << v_trackPatterns.back().mmSegment[i_hit].eta <<
"/" << v_trackPatterns.back().mmSegment[i_hit].phi <<
"/" << v_trackPatterns.back().mmSegment[i_hit].r <<
"/" << v_trackPatterns.back().mmSegment[i_hit].z <<
"/" << v_trackPatterns.back().mmSegment[i_hit].layerNumber <<
"/" << v_trackPatterns.back().mmSegment[i_hit].isOutlier);
95 return StatusCode::SUCCESS;
102 std::vector<TrigL2MuonSA::TrackPattern>& v_trackPatterns)
const
106 v_trackPatterns.clear();
113 const unsigned int MAX_STATION = 11;
114 const unsigned int MAX_LAYER = 12;
118 unsigned int i_layer_max = 0;
119 unsigned int chamber_max = 0;
123 for(
unsigned int i_hit=0; i_hit<mdtHits.size(); i_hit++) {
125 unsigned int chamber = mdtHits[i_hit].Chamber;
126 if( chamber > chamber_max ) chamber_max = chamber;
129 int stationPhi = mdtHits[i_hit].StationPhi;
130 std::string name =
m_idHelperSvc->mdtIdHelper().stationNameString(mdtHits[i_hit].name);
131 int chamber_this = 99;
132 int sector_this = 99;
136 mdtHits[i_hit].isOutlier = 3;
140 double aw = muonRoad.
aw[chamber][0];
141 double bw = muonRoad.
bw[chamber][0];
142 double Z = mdtHits[i_hit].Z;
143 double R = mdtHits[i_hit].R;
146 mdtHits[i_hit].Residual = residual;
147 mdtHits[i_hit].isOutlier = 0;
148 unsigned int i_layer = mdtHits[i_hit].Layer;
149 double rWidth = muonRoad.
rWidth[chamber][i_layer];
152 << chamber <<
"/" << Z <<
"/" << R <<
"/" << aw <<
"/" << bw <<
"/" << residual <<
"/" << rWidth);
154 if( std::abs(residual) > rWidth ) {
155 mdtHits[i_hit].isOutlier = 2;
160 if( mdtHits[i_hit].TubeLayer < 1 || i_layer > (MAX_LAYER-1) ) {
162 return StatusCode::FAILURE;
164 if( i_layer > i_layer_max ) i_layer_max = i_layer;
166 v_mdtLayerHits[chamber][i_layer].
indexes.push_back(i_hit);
167 v_mdtLayerHits[chamber][i_layer].
ndigi++;
168 v_mdtLayerHits[chamber][i_layer].
ndigi_all++;
169 v_mdtLayerHits[chamber][0].
ntot++;
170 v_mdtLayerHits[chamber][0].
ntot_all++;
171 v_mdtLayerHits[chamber][0].
ResSum += residual;
174 const double DeltaMin = 0.025;
176 for(
unsigned int chamber=0; chamber<=chamber_max; chamber++) {
181 if (chamber==9)
break;
182 if (chamber==10)
break;
183 unsigned int layer = 999999;
186 unsigned int i_hit_max = 999999;
187 double ResMed = (v_mdtLayerHits[chamber][0].
ntot!=0) ? v_mdtLayerHits[chamber][0].ResSum/v_mdtLayerHits[chamber][0].ntot : 0.;
189 for(
unsigned int i_layer=0; i_layer<=i_layer_max; i_layer++) {
190 for(
unsigned int idigi=0; idigi<v_mdtLayerHits[chamber][i_layer].
ndigi_all;idigi++) {
192 unsigned int i_hit = v_mdtLayerHits[chamber][i_layer].
indexes[idigi];
193 if(mdtHits[i_hit].isOutlier > 0)
continue;
194 double DistMed = std::abs(mdtHits[i_hit].
Residual - ResMed);
195 if(DistMed>=DistMax) {
203 ATH_MSG_DEBUG(
"ResMed=" << ResMed <<
": DistMax/layer/i_hit_max/ntot="
204 << DistMax <<
"/" << layer <<
"/" << i_hit_max <<
"/" << v_mdtLayerHits[chamber][0].ntot);
207 if(layer == 999999)
break;
208 if(v_mdtLayerHits[chamber][layer].ndigi==1)
break;
210 double Mednew = (v_mdtLayerHits[chamber][0].
ResSum -
Residual)/(v_mdtLayerHits[chamber][0].ntot - 1);
211 double Delta = 2.*std::abs((ResMed - Mednew)/(ResMed + Mednew));
212 ATH_MSG_DEBUG(
"Mednew/Delta/DeltaMin=" << Mednew <<
"/" << Delta <<
"/" << DeltaMin);
213 if(Delta<=DeltaMin)
break;
217 v_mdtLayerHits[chamber][0].
ntot--;
218 v_mdtLayerHits[chamber][layer].
ndigi--;
219 mdtHits[i_hit_max].isOutlier = 2;
222 ATH_MSG_DEBUG(
"choosing one at each layer, and record it in segment...");
227 for(
unsigned int i_layer=0; i_layer<=i_layer_max; i_layer++) {
229 ATH_MSG_DEBUG(
"i_layer=" << i_layer <<
": ndigi=" << v_mdtLayerHits[chamber][i_layer].ndigi);
232 while( v_mdtLayerHits[chamber][i_layer].ndigi>=2 ) {
234 unsigned int i_hit_max = 999999;
235 for(
unsigned int idigi=0;idigi<v_mdtLayerHits[chamber][i_layer].
ndigi_all;idigi++) {
236 unsigned int i_hit = v_mdtLayerHits[chamber][i_layer].
indexes[idigi];
237 if( mdtHits[i_hit].isOutlier > 0 )
continue;
238 if( std::abs(mdtHits[i_hit].
Residual) >= ResMax ) {
239 ResMax = std::abs(mdtHits[i_hit].
Residual);
243 ATH_MSG_DEBUG(
"ResMax=" << ResMax <<
": i_hit_max=" << i_hit_max);
244 if( i_hit_max == 999999 )
break;
245 v_mdtLayerHits[chamber][0].
ResSum -= ResMax;
246 v_mdtLayerHits[chamber][0].
ntot--;
247 v_mdtLayerHits[chamber][i_layer].
ndigi--;
248 mdtHits[i_hit_max].isOutlier = 1;
252 for(
unsigned int i_digi=0; i_digi< v_mdtLayerHits[chamber][i_layer].
ndigi_all; i_digi++) {
253 unsigned int i_hit = v_mdtLayerHits[chamber][i_layer].
indexes[i_digi];
254 if (i_layer==0) phi0 = mdtHits[i_hit].cPhi0;
256 if (mdtHits[i_hit].isOutlier > 1)
continue;
257 mdtSegment.push_back(mdtHits[i_hit]);
260 ATH_MSG_DEBUG(
"nr of hits in segment=" << mdtSegment.size());
263 v_trackPatterns.push_back(trackPattern);
265 return StatusCode::SUCCESS;