14 const std::string&
name,
25 ATH_CHECK( m_nswPatternFinder.retrieve() );
27 return StatusCode::SUCCESS;
35 int StationName = mdtHit.
name;
40 int Tube = mdtHit.
Tube;
42 ATH_MSG_DEBUG(
"...StationName/StationEta/StationPhi/Multilayer/Layer/Tube="
43 << StationName <<
"/" << StationEta <<
"/" << StationPhi <<
"/" << Multilayer <<
"/"
44 <<
Layer <<
"/" << Tube);
46 Identifier id = ( mdtHit.
Id.
is_valid() ) ? mdtHit.
Id : m_idHelperSvc->mdtIdHelper().channelID(StationName,StationEta,
47 StationPhi,Multilayer,
Layer,Tube);
50 int adcCounts = mdtHit.
Adc;
54 const double cosDphi =
std::cos(std::abs(track_phi -
phi0));
55 double InCo = cosDphi ? 1./ cosDphi: 0;
62 ATH_MSG_DEBUG(
"... MDT hit raw digit tdcCounts/adcCounts=" << tdcCounts <<
"/" << adcCounts);
64 ATH_MSG_DEBUG(
"... MDT hit position X/Y/Z/track_phi/Multilayer/Layer/Tube="
65 <<
Amg::toString(point, 2) <<
"/" << track_phi <<
"/" << Multilayer <<
"/" <<
Layer <<
"/" << Tube);
67 MdtCalibOutput calibOut = m_mdtCalibrationTool->calibrate(Gaudi::Hive::currentContext(), calHit,
false);
71 ATH_MSG_DEBUG(
"... MDT hit calibrated driftSpace/driftSigma=" << driftSpace <<
"/" << driftSigma);
94 std::vector<TrigL2MuonSA::TrackPattern>& v_trackPatterns)
const
96 ATH_CHECK( findPatterns(muonRoad, mdtHits, v_trackPatterns) );
97 ATH_CHECK( m_nswPatternFinder->findPatterns(muonRoad, stgcHits, mmHits, v_trackPatterns.back()) );
99 for(
unsigned int i_hit=0; i_hit<v_trackPatterns.back().stgcSegment.size(); i_hit++) {
100 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);
103 for(
unsigned int i_hit=0; i_hit<v_trackPatterns.back().mmSegment.size(); i_hit++) {
104 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);
107 return StatusCode::SUCCESS;
114 std::vector<TrigL2MuonSA::TrackPattern>& v_trackPatterns)
const
118 v_trackPatterns.clear();
125 const unsigned int MAX_STATION = 11;
126 const unsigned int MAX_LAYER = 12;
130 for(
unsigned int i_station=0; i_station<MAX_STATION; i_station++) {
131 for(
unsigned int i_layer=0; i_layer<MAX_LAYER; i_layer++) {
132 v_mdtLayerHits[i_station][i_layer].
ntot = 0;
133 v_mdtLayerHits[i_station][i_layer].ntot_all = 0;
134 v_mdtLayerHits[i_station][i_layer].ndigi = 0;
135 v_mdtLayerHits[i_station][i_layer].ndigi_all = 0;
136 v_mdtLayerHits[i_station][i_layer].ResSum = 0.;
140 unsigned int i_layer_max = 0;
141 unsigned int chamber_max = 0;
146 for(
unsigned int i_hit=0; i_hit<mdtHits.size(); i_hit++) {
148 unsigned int chamber = mdtHits[i_hit].Chamber;
155 double Z = mdtHits[i_hit].Z;
156 double R = mdtHits[i_hit].R;
158 double residual = calc_residual(aw,bw,Z,R);
159 mdtHits[i_hit].R = R;
161 mdtHits[i_hit].isOutlier = 0;
162 unsigned int i_layer = mdtHits[i_hit].Layer;
166 <<
chamber <<
"/" << Z <<
"/" << R <<
"/" << aw <<
"/" << bw <<
"/" <<
residual <<
"/" << rWidth);
168 int stationPhi = mdtHits[i_hit].StationPhi;
169 std::string
name = m_idHelperSvc->mdtIdHelper().stationNameString(mdtHits[i_hit].
name);
170 int chamber_this = 99;
171 int sector_this = 99;
175 mdtHits[i_hit].isOutlier = 3;
180 mdtHits[i_hit].isOutlier = 2;
185 if( mdtHits[i_hit].TubeLayer < 1 || i_layer > (MAX_LAYER-1) ) {
187 return StatusCode::FAILURE;
189 if( i_layer > i_layer_max ) i_layer_max = i_layer;
191 v_mdtLayerHits[
chamber][i_layer].indexes.push_back(i_hit);
192 v_mdtLayerHits[
chamber][i_layer].ndigi++;
193 v_mdtLayerHits[
chamber][i_layer].ndigi_all++;
194 v_mdtLayerHits[
chamber][0].ntot++;
195 v_mdtLayerHits[
chamber][0].ntot_all++;
200 const double DeltaMin = 0.025;
214 unsigned int layer = 999999;
217 unsigned int i_hit_max = 999999;
218 ResMed = (v_mdtLayerHits[
chamber][0].ntot!=0)?
219 v_mdtLayerHits[
chamber][0].ResSum/v_mdtLayerHits[
chamber][0].ntot : 0.;
220 for(
unsigned int i_layer=0; i_layer<=i_layer_max; i_layer++) {
221 for(
unsigned int idigi=0; idigi<v_mdtLayerHits[
chamber][i_layer].ndigi_all;idigi++) {
223 unsigned int i_hit = v_mdtLayerHits[
chamber][i_layer].indexes[idigi];
224 if(mdtHits[i_hit].isOutlier > 0)
continue;
225 double DistMed = std::abs(mdtHits[i_hit].
Residual - ResMed);
226 if(DistMed>=DistMax) {
234 ATH_MSG_DEBUG(
"ResMed=" << ResMed <<
": DistMax/layer/i_hit_max/ntot="
235 << DistMax <<
"/" <<
layer <<
"/" << i_hit_max <<
"/" << v_mdtLayerHits[
chamber][0].ntot);
237 if(
layer == 999999)
break;
240 double Delta = 2.*std::abs((ResMed - Mednew)/(ResMed + Mednew));
241 ATH_MSG_DEBUG(
"Mednew/Delta/DeltaMin=" << Mednew <<
"/" << Delta <<
"/" << DeltaMin);
242 if(Delta<=DeltaMin)
break;
246 v_mdtLayerHits[
chamber][0].ntot--;
248 mdtHits[i_hit_max].isOutlier = 2;
258 for(
unsigned int i_layer=0; i_layer<=i_layer_max; i_layer++) {
263 while( v_mdtLayerHits[
chamber][i_layer].ndigi>=2 ) {
265 unsigned int i_hit_max = 999999;
266 for(
unsigned int idigi=0;idigi<v_mdtLayerHits[
chamber][i_layer].ndigi_all;idigi++) {
267 unsigned int i_hit = v_mdtLayerHits[
chamber][i_layer].indexes[idigi];
268 if( mdtHits[i_hit].isOutlier > 0 )
continue;
269 if( std::abs(mdtHits[i_hit].
Residual) >= ResMax ) {
270 ResMax = std::abs(mdtHits[i_hit].
Residual);
274 ATH_MSG_DEBUG(
"ResMax=" << ResMax <<
": i_hit_max=" << i_hit_max);
275 if( i_hit_max == 999999 )
break;
276 v_mdtLayerHits[
chamber][0].ResSum = v_mdtLayerHits[
chamber][0].ResSum - ResMax;
277 v_mdtLayerHits[
chamber][0].ntot--;
278 v_mdtLayerHits[
chamber][i_layer].ndigi--;
279 mdtHits[i_hit_max].isOutlier = 1;
283 for(
unsigned int i_digi=0; i_digi< v_mdtLayerHits[
chamber][i_layer].ndigi_all; i_digi++) {
284 unsigned int i_hit = v_mdtLayerHits[
chamber][i_layer].indexes[i_digi];
285 if (i_layer==0)
phi0 = mdtHits[i_hit].cPhi0;
286 doMdtCalibration(mdtHits[i_hit], trigger_phi,
phi0, muonRoad.
isEndcap);
287 if (mdtHits[i_hit].isOutlier > 1)
continue;
288 mdtSegment.push_back(mdtHits[i_hit]);
293 ATH_MSG_DEBUG(
"nr of hits in segment=" << mdtSegment.size());
298 v_trackPatterns.push_back(trackPattern);
300 return StatusCode::SUCCESS;
312 double dz =
x - (
y-bw)*ia;
313 return dz/std::sqrt(1.+iaq);