16 #include "GaudiKernel/ListItem.h"
17 #include "GaudiKernel/ITHistSvc.h"
43 m_compareOutliers(true),
46 m_writeCompetingROT(false),
59 m_driftCircleSignFlips{},
70 m_compIsMeasurement{},
84 m_PRD_MismatchesSum{},
86 declareInterface<ITrackDiff>(
this);
90 declareProperty(
"NtupleDirectoryName", m_ntupleDirName =
"TrackValidation");
114 sc = service(
"THistSvc", tHistSvc);
115 if (
sc.isFailure()) {
122 m_nt =
new TTree(TString(m_ntupleTreeName),
"Track diff output");
124 std::string fullNtupleName =
"/"+m_ntupleFileName+
"/"+m_ntupleDirName+
"/"+m_ntupleTreeName;
125 sc = tHistSvc->regTree(fullNtupleName, m_nt);
126 if (
sc.isFailure()) {
127 ATH_MSG_ERROR (
"Unable to register TTree : " << fullNtupleName);
134 m_nt->Branch(
"EventNumber", &m_eventNumber );
135 m_nt->Branch(
"RefTrackPhi0", &m_trackPhi );
136 m_nt->Branch(
"RefTrackEta0", &m_trackEta );
138 m_nt->Branch(
"nRefStates", &m_nRefStates,
"nRefStates[8]/I");
139 m_nt->Branch(
"nCompareStates", &m_nCompStates,
"nRefStates[8]/I");
140 m_nt->Branch(
"nFakeStates", &m_fakes,
"nFakeStates[8]/I");
141 m_nt->Branch(
"nMissedStates", &m_missed,
"nMissedStates[8]/I");
142 m_nt->Branch(
"nWrongType", &m_wrongType,
"nWrongType[8]/I");
143 m_nt->Branch(
"nPRD_Mismatches", &m_PRD_Mismatches,
"nPRD_Mismatches[8]/I");
144 m_nt->Branch(
"nDriftCircleSignFlips", &m_driftCircleSignFlips );
145 m_nt->Branch(
"nNoDriftTime", &m_noDriftTime );
146 m_nt->Branch(
"nRefTypes", &m_refType,
"nRefTypes[8]/I");
147 m_nt->Branch(
"nCompareTypes", &m_compareType,
"nCompareTypes[8]/I");
148 m_nt->Branch(
"nMissedTypes", &m_missingType,
"nMissedTypes[8]/I");
149 m_nt->Branch(
"nFakeTypes", &m_fakeType,
"nFakeTypes[8]/I");
151 m_nt->Branch(
"nDiffs", &m_nDiffs );
152 m_detectorType =
new std::vector<int>();
153 m_isFake =
new std::vector<int>();
154 m_isMissing =
new std::vector<int>();
155 m_isPRD_Mismatch =
new std::vector<int>();
156 m_isFlippedSign =
new std::vector<int>();
157 m_isNoDriftTime =
new std::vector<int>();
158 m_refIsMeasurement =
new std::vector<int>();
159 m_refIsOutlier =
new std::vector<int>();
160 m_compIsMeasurement =
new std::vector<int>();
161 m_compIsOutlier =
new std::vector<int>();
162 m_surfX =
new std::vector<float>();
163 m_surfY =
new std::vector<float>();
164 m_surfZ =
new std::vector<float>();
166 m_nt->Branch(
"DetectorType", &m_detectorType);
167 m_nt->Branch(
"IsFake", &m_isFake);
168 m_nt->Branch(
"IsMissing", &m_isMissing);
169 m_nt->Branch(
"IsPRD_Mismatch", &m_isPRD_Mismatch);
170 m_nt->Branch(
"IsFlippedSign", &m_isFlippedSign);
171 m_nt->Branch(
"IsNoDriftTime", &m_isNoDriftTime);
172 m_nt->Branch(
"RefIsMeasurement", &m_refIsMeasurement);
173 m_nt->Branch(
"RefIsOutlier", &m_refIsOutlier);
174 m_nt->Branch(
"ComparedIsMeasurement", &m_compIsMeasurement);
175 m_nt->Branch(
"ComparedIsOutlier", &m_compIsOutlier);
176 m_nt->Branch(
"SurfaceX" , &m_surfX);
177 m_nt->Branch(
"SurfaceY" , &m_surfY);
178 m_nt->Branch(
"SurfaceZ" , &m_surfZ);
180 if (m_writeCompetingROT) {
181 m_maxAssignProb =
new std::vector<float>();
182 m_sumAssignProb =
new std::vector<float>();
183 m_nt->Branch(
"MaxAssgnProb", &m_maxAssignProb);
184 m_nt->Branch(
"SumAssgnProb", &m_sumAssignProb);
191 return StatusCode::FAILURE;
195 m_fakesSum[detType] = 0;
196 m_missedSum[detType] = 0;
197 m_PRD_MismatchesSum[detType] = 0;
198 m_nRefStatesSum[detType] = 0;
199 m_nCompStatesSum[detType] = 0;
200 m_wrongTypeSum[detType] = 0;
201 m_fakes[detType] = 0;
202 m_missed[detType] = 0;
203 m_PRD_Mismatches[detType] = 0;
204 m_nRefStates[detType] = 0;
205 m_nCompStates[detType] = 0;
206 m_wrongType[detType] = 0;
209 return StatusCode::SUCCESS;
216 ATH_MSG_INFO (
"sums for " << m_trackSum <<
" compared tracks" );
225 return StatusCode::SUCCESS;
241 if (!
evt.isValid()) {
243 return StatusCode::FAILURE;
246 m_eventNumber =
evt->eventNumber();
261 refTrackStateData = extractDataFromTrack(referenceTrack);
262 compareTrackStateData = extractDataFromTrack(comparedTrack);
264 ATH_MSG_VERBOSE (
"number of track states: ref=" << refTrackStateData->
size() <<
", compare=" << compareTrackStateData->
size() );
265 ATH_MSG_VERBOSE (
"reference track: eta_0 = " << m_trackEta <<
", phi_0 = " << m_trackPhi );
273 for (; refIter != refTrackStateData->
end(); ++refIter) {
278 bool foundMatchingState =
false;
282 if ((*refIter)->rot()) {
283 refPRD = (*refIter)->rot()->prepRawData();
285 compIter = compareTrackStateData->
begin();
286 for ( ; compIter != compareTrackStateData->
end(); ++compIter ) {
288 if ( (*compIter)->surface() == (*refIter)->surface() ) {
290 foundMatchingState =
true;
298 }
else if ( refPRD && (*compIter)->rot() ) {
302 if ( refPRD == ((*compIter)->rot()->prepRawData()) ) {
304 foundMatchingState =
true;
312 if (!foundMatchingState) {
315 diffStateInfo((*refIter),
nullptr);
317 diffStateInfo((*refIter), (*compIter));
319 compareTrackStateData->
erase(compIter);
325 compIter = compareTrackStateData->
begin();
326 for (; compIter != compareTrackStateData->
end(); ++compIter) {
327 diffStateInfo(
nullptr, (*compIter));
347 delete refTrackStateData;
348 delete compareTrackStateData;
349 return StatusCode::SUCCESS;
358 ATH_MSG_ERROR (
"track containes no track states, diff impossible" );
369 for (; iter != trackStates->
end(); ++iter) {
376 if (m_compareOutliers) {
390 if (!measurement && !m_compareAll) {
391 ATH_MSG_ERROR (
"measurementOnTrack == Null for a TrackStateOnSurface "
392 <<
"of type Measurement or Outlier" );
415 if ( !ROT && !m_compareAll ) {
419 std::string detTypeName =
"unidentified";
422 detType = detectorType(*ROT, detTypeName);
434 return trackStateData;
443 m_driftCircleSignFlips = 0;
447 m_fakesSum[detType] += m_fakes[detType];
448 m_fakes[detType] = 0;
449 m_missedSum[detType] += m_missed[detType];
450 m_missed[detType] = 0;
451 m_PRD_MismatchesSum[detType] += m_PRD_Mismatches[detType];
452 m_PRD_Mismatches[detType] = 0;
453 m_nRefStatesSum[detType] += m_nRefStates[detType];
454 m_nRefStates[detType] = 0;
455 m_nCompStatesSum[detType] += m_nCompStates[detType];
456 m_nCompStates[detType] = 0;
457 m_wrongType[detType] += m_wrongType[detType];
458 m_wrongType[detType] = 0;
461 m_missingType[TSoSType] = 0;
462 m_fakeType[TSoSType] = 0;
463 m_refType[TSoSType] = 0;
464 m_compareType[TSoSType] = 0;
473 m_detectorType->clear();
475 m_isMissing->clear();
476 m_isPRD_Mismatch->clear();
477 m_isFlippedSign->clear();
478 m_isNoDriftTime->clear();
479 m_refIsMeasurement->clear();
480 m_refIsOutlier->clear();
481 m_compIsMeasurement->clear();
482 m_compIsOutlier->clear();
487 if (m_writeCompetingROT) {
488 m_maxAssignProb->clear();
489 m_sumAssignProb->clear();
497 std::string &detTypeName )
const {
502 if (
id.is_valid()) {
503 if (m_idHelper->is_pixel(
id) ) {
504 detTypeName =
"Pixel";
506 }
else if (m_idHelper->is_sct(
id)) {
509 }
else if (m_idHelper->is_trt(
id)) {
512 }
else if (m_idHelper->is_mdt(
id)) {
515 }
else if (m_idHelper->is_csc(
id)) {
518 }
else if (m_idHelper->is_rpc(
id)) {
521 }
else if (m_idHelper->is_tgc(
id)) {
526 detTypeName =
"unidentified";
534 bool foundDiff =
false;
537 bool isMissing =
false;
538 bool isPRD_Mismatch =
false;
539 bool isFlippedSign =
false;
540 bool isNoDriftTime =
false;
541 bool refIsMeasurement =
false;
542 bool refIsOutlier =
false;
543 bool compIsMeasurement =
false;
544 bool compIsOutlier =
false;
545 bool wrongType =
false;
546 std::string detTypeName =
"unidentified";
556 if (!compareTrackState) {
560 m_missed[ refTrackState->
detType() ]++;
563 m_nRefStates[ refTrackState->
detType() ]++;
564 detType = refTrackState->
detType();
571 m_fakes[ compareTrackState->
detType() ]++;
572 detType = compareTrackState->
detType();
575 if (compareTrackState){
579 m_nCompStates[ compareTrackState->
detType() ]++;
583 if (refTrackState && compareTrackState) {
589 if (m_compareOutliers && (refIsOutlier != compIsOutlier)) {
598 if (refIsMeasurement != compIsMeasurement ) {
601 if (refIsMeasurement) {
612 if (refROT && compareROT) {
614 isPRD_Mismatch =
true;
615 (m_PRD_Mismatches[detType])++;
619 if (isFlippedSign) m_driftCircleSignFlips++;
621 if (isNoDriftTime) m_noDriftTime++;
623 foundDiff = (foundDiff || isPRD_Mismatch || isFlippedSign || isNoDriftTime );
633 else {
msg(
MSG::DEBUG) << (refIsOutlier ?
" O" :
" ") << (refIsMeasurement ?
"M " :
" ");}
635 else {
msg(
MSG::DEBUG) << (compIsOutlier ?
" O" :
" ") << (compIsMeasurement ?
"M " :
" ");}
637 << (isMissing ?
" MissingState " :
"")
638 << (wrongType ?
" Wrong TSoS type" :
"")
639 << (isPRD_Mismatch ?
" PRD mismatch " :
"")
640 << (isFlippedSign ?
" Flipped Sign " :
"")
641 << (isNoDriftTime ?
" NoDriftTime " :
"")
642 <<
" in " << detTypeName
643 <<
" detector at surface with center " <<
endmsg;
653 ATH_MSG_DEBUG (
"(" << surfX <<
", " << surfY <<
"," << surfZ <<
")");
655 if (m_writeCompetingROT) {
657 float maxAssgnProb = -1.;
658 float sumAssgnProb = -1.;
659 if (compareTrackState) {
670 m_maxAssignProb->push_back(maxAssgnProb);
671 m_sumAssignProb->push_back(sumAssgnProb);
675 m_isFake->push_back(
isFake?1:0);
676 m_isMissing->push_back(isMissing?1:0);
677 m_detectorType->push_back(detType);
678 m_isPRD_Mismatch->push_back(isPRD_Mismatch?1:0);
679 m_isFlippedSign->push_back(isFlippedSign?1:0);
680 m_isNoDriftTime->push_back(isNoDriftTime?1:0);
681 m_refIsOutlier->push_back(refIsOutlier?1:0);
682 m_refIsMeasurement->push_back(refIsMeasurement?1:0);
683 m_compIsOutlier->push_back(compIsOutlier?1:0);
684 m_compIsMeasurement->push_back(compIsMeasurement?1:0);
685 m_surfX->push_back(surfX);
686 m_surfY->push_back(surfY);
687 m_surfZ->push_back(surfZ);