14 return StatusCode::SUCCESS;
22 int StationName = mdtHit.
name;
27 int Tube = mdtHit.
Tube;
29 ATH_MSG_DEBUG(
"...StationName/StationEta/StationPhi/Multilayer/Layer/Tube="
30 << StationName <<
"/" << StationEta <<
"/" << StationPhi <<
"/" << Multilayer <<
"/"
31 <<
Layer <<
"/" << Tube);
33 Identifier id = ( mdtHit.
Id.
is_valid() ) ? mdtHit.
Id : m_idHelperSvc->mdtIdHelper().channelID(StationName,StationEta,
34 StationPhi,Multilayer,
Layer,Tube);
36 int adcCounts = mdtHit.
Adc;
40 double InCo = cosDphi ? 1./ cosDphi: 0;
48 ATH_MSG_DEBUG(
"... MDT hit raw digit tdcCounts/adcCounts=" << tdcCounts <<
"/" << adcCounts);
50 ATH_MSG_DEBUG(
"... MDT hit position X/Y/Z/track_phi/Multilayer/Layer/Tube="
51 <<
Amg::toString(point, 2) <<
"/" << track_phi <<
"/" << Multilayer <<
"/" <<
Layer <<
"/" << Tube);
53 MdtCalibOutput calibOut = m_mdtCalibrationTool->calibrate(ctx, calHit,
false);
57 ATH_MSG_DEBUG(
"... MDT hit calibrated driftSpace/driftSigma=" << driftSpace <<
"/" << driftSigma);
81 std::vector<TrigL2MuonSA::TrackPattern>& v_trackPatterns)
const
83 ATH_CHECK( findPatterns(ctx, muonRoad, mdtHits, v_trackPatterns) );
84 ATH_CHECK( m_nswPatternFinder->findPatterns(muonRoad, stgcHits, mmHits, v_trackPatterns.back()) );
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;
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;
142 double Z = mdtHits[i_hit].Z;
143 double R = mdtHits[i_hit].R;
144 double residual = calc_residual(aw,bw,Z,R);
147 mdtHits[i_hit].isOutlier = 0;
148 unsigned int i_layer = mdtHits[i_hit].Layer;
152 <<
chamber <<
"/" << Z <<
"/" << R <<
"/" << aw <<
"/" << bw <<
"/" <<
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++;
174 const double DeltaMin = 0.025;
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;
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--;
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++) {
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;
255 doMdtCalibration(ctx, mdtHits[i_hit], trigger_phi,
phi0, muonRoad.
isEndcap);
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;
277 double dz =
x - (
y-bw)*ia;
278 return dz/std::sqrt(1.+iaq);