diff --git a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/src/TRT_StrawStatus.cxx b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/src/TRT_StrawStatus.cxx index cf21c217211f20680e7682a9a2e5fddd94d94a7e..e517001ec5b8b773e029bbefbb950028dd48bfdb 100644 --- a/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/src/TRT_StrawStatus.cxx +++ b/InnerDetector/InDetCalibAlgs/TRT_CalibAlgs/src/TRT_StrawStatus.cxx @@ -50,16 +50,16 @@ m_accumulateHits(0), m_TRTHelper(0), m_mapSvc("TRT_HWMappingSvc",name), m_DCSSvc("TRT_DCS_ConditionsSvc",name), -m_TRTStrawNeighbourSvc("TRT_StrawNeighbourSvc", name), // use this service to retrieve barrel and end-cap straw number later on, as well as DTMROC,.. +m_TRTStrawNeighbourSvc("TRT_StrawNeighbourSvc", name), // use this service to retrieve barrel and end-cap straw number later on, as well as DTMROC,.. m_TRTStrawStatusSummaryTool("TRT_StrawStatusSummaryTool", this), m_trt_hole_finder("TRTTrackHoleSearchTool"), m_locR_cut(1.4), m_fileName("TRT_StrawStatusOutput"), m_skipBusyEvents(0), // for cosmics - reject events that are either showers or noise bursts -m_printDetailedInformation(0) // print the information on mapping as well as which straws are declared dead etc. +m_printDetailedInformation(0) // print the information on mapping as well as which straws are declared dead etc. { declareProperty("outputFileName", m_fileName); - declareProperty("skipBusyEvents", m_skipBusyEvents); + declareProperty("skipBusyEvents", m_skipBusyEvents); declareProperty("trt_hole_finder", m_trt_hole_finder); declareProperty("HWMapSvc", m_mapSvc); declareProperty("InDetTRT_DCS_ConditionsSvc",m_DCSSvc); @@ -82,7 +82,7 @@ StatusCode InDet::TRT_StrawStatus::initialize() m_accumulateHits = new ACCHITS_t; assert( (*m_accumulateHits)[0][0].size() == nAllStraws ); clear(); - + // Code entered here will be executed once at program start. // Initialize ReadHandleKey ATH_CHECK(m_eventInfoKey.initialize()); @@ -112,21 +112,21 @@ StatusCode InDet::TRT_StrawStatus::finalize(){ //================ Execution ==================================================== StatusCode InDet::TRT_StrawStatus::execute(){ - + SG::ReadHandle<xAOD::EventInfo> eventInfo(m_eventInfoKey); StatusCode sc = StatusCode::SUCCESS; if (not eventInfo.isValid()) { ATH_MSG_ERROR( "Unable to retrieve Event Info " ); return StatusCode::FAILURE; - } - int runNumber = (int) eventInfo->runNumber(); + } + int runNumber = (int) eventInfo->runNumber(); if (runNumber != m_runNumber) { if (m_nEvents) { reportResults(); clear(); } m_runNumber = runNumber; - } + } int lumiBlock0 =eventInfo->lumiBlock(); SG::ReadHandle<TRT_RDO_Container> rdoContainer(m_rdoContainerKey); - + if (not rdoContainer.isValid()) { ATH_MSG_ERROR( "no TRT_RDO container available " ); return StatusCode::FAILURE; @@ -135,12 +135,12 @@ StatusCode InDet::TRT_StrawStatus::execute(){ if (not trkCollection.isValid()) { ATH_MSG_ERROR( "Could not find Tracks Collection: " << m_tracksName ); return StatusCode::FAILURE; - } - - //================ Event selection - + } + + //================ Event selection + SG::ReadHandle<VxContainer> vxContainer(m_vxContainerKey); - if (not vxContainer.isValid()) { + if (not vxContainer.isValid()) { ATH_MSG_ERROR( "vertex container missing!" ); sc = StatusCode::FAILURE; } else { @@ -148,9 +148,9 @@ StatusCode InDet::TRT_StrawStatus::execute(){ for (VxContainer::const_iterator it = vxContainer->begin() ; it != vxContainer->end() ; ++it ) { if ( (*it)->vxTrackAtVertex()->size() >= 3 ) countVertices++; } - if (countVertices < 1) return StatusCode::FAILURE; + if (countVertices < 1) return StatusCode::FAILURE; } - + if (m_skipBusyEvents) { // cosmic running int countRDOhitsInEvent(0); for (TRT_RDO_Container::const_iterator rdoIt = rdoContainer->begin(); rdoIt != rdoContainer->end(); ++rdoIt) { @@ -164,17 +164,17 @@ StatusCode InDet::TRT_StrawStatus::execute(){ ATH_MSG_INFO( "N RDO hits in event greater than 100000: " << countRDOhitsInEvent << ", exiting" ); return sc; } - + if (trkCollection->size() > 10) { ATH_MSG_INFO( "N tracks greater than 10: " << trkCollection->size() << ", exiting" ); return sc; } } - - //================ End event selection - + + //================ End event selection + //================ Loop over all tracks, accumulate hits on track, also find holes on track - + std::vector<Identifier> holeIdentifiers; std::vector<Identifier> holeIdentifiersWithHits; // holes on straws that have hits, it is just that the hit was not associalted to a track for ( DataVector<Trk::Track>::const_iterator trackIt = trkCollection->begin(); trackIt != trkCollection->end(); trackIt++ ) { @@ -183,120 +183,122 @@ StatusCode InDet::TRT_StrawStatus::execute(){ const Trk::Perigee* perigee = (*trackIt)->perigeeParameters(); if ( not perigee ) { ATH_MSG_ERROR( "Trk::Perigee missing" ); continue; } if ( std::fabs(perigee->pT())/CLHEP::GeV < 1. ) continue; // 1 GeV pT cut - + const DataVector<const Trk::TrackStateOnSurface>* trackStates = (**trackIt).trackStateOnSurfaces(); if ( not trackStates ) { ATH_MSG_ERROR( "Trk::TrackStateOnSurface empty" ); continue; } - - int n_pixel_hits(0), n_sct_hits(0), n_trt_hits(0); // count hits, require minimal number of all hits + + int n_pixel_hits(0), n_sct_hits(0), n_trt_hits(0); // count hits, require minimal number of all hits for ( DataVector<const Trk::TrackStateOnSurface>::const_iterator trackStatesIt = trackStates->begin(); trackStatesIt != trackStates->end(); trackStatesIt++ ) { if ( *trackStatesIt == 0 ) { ATH_MSG_ERROR( "*trackStatesIt == 0" ); continue; } if ( !((*trackStatesIt)->type(Trk::TrackStateOnSurface::Measurement)) ) continue; // this skips outliers - + if ( dynamic_cast<const InDet::TRT_DriftCircleOnTrack*> ( (*trackStatesIt)->measurementOnTrack() ) ) n_trt_hits++; else if ( dynamic_cast<const InDet::SCT_ClusterOnTrack*> ( (*trackStatesIt)->measurementOnTrack() ) ) n_sct_hits++; else if( dynamic_cast<const InDet::PixelClusterOnTrack*> ( (*trackStatesIt)->measurementOnTrack() ) ) n_pixel_hits++; - } - if (n_pixel_hits<2 || n_sct_hits < 6 || n_trt_hits<15) continue; // end count hits - + } + if (n_pixel_hits<2 || n_sct_hits < 6 || n_trt_hits<15) continue; // end count hits + //=== end select track - + //=== loop over all hits on track, accumulate them - + for ( DataVector<const Trk::TrackStateOnSurface>::const_iterator trackStatesIt = trackStates->begin(); trackStatesIt != trackStates->end(); trackStatesIt++ ) { - + if ( *trackStatesIt == 0 ) { ATH_MSG_ERROR( "*trackStatesIt == 0" ); continue; } if ( !((*trackStatesIt)->type(Trk::TrackStateOnSurface::Measurement)) ) continue; // this skips outliers const InDet::TRT_DriftCircleOnTrack *driftCircleOnTrack = dynamic_cast<const InDet::TRT_DriftCircleOnTrack *>( (*trackStatesIt)->measurementOnTrack() ); if ( not driftCircleOnTrack ) continue; // not TRT measurement - this way, keep both hits and outliers - + const Trk::TrackStateOnSurface& hit = **trackStatesIt; - - const Trk::TrackParameters* unbiased_track_parameters = m_updator->removeFromState( *(hit.trackParameters()), hit.measurementOnTrack()->localParameters(), hit.measurementOnTrack()->localCovariance()); - + + const Trk::TrackParameters* unbiased_track_parameters = m_updator->removeFromState( *(hit.trackParameters()), + hit.measurementOnTrack()->localParameters(), + hit.measurementOnTrack()->localCovariance()).release(); + double unbiased_locR = unbiased_track_parameters->parameters()[Trk::locR]; if ( fabs(unbiased_locR) > m_locR_cut ) continue; // same cut as the default hole search cut - + const InDet::TRT_DriftCircle *driftCircle = driftCircleOnTrack->prepRawData(); if ( driftCircle == 0 ) { ATH_MSG_ERROR( "driftCircle == 0" ); continue; } - + Identifier id = driftCircle->identify(); int index[6]; myStrawIndex(id, index); // side, layer, phi, straw_layer, straw_within_layer, straw_index (*m_accumulateHits)[(index[0]>0)?0:1][index[2]][index[5]][1]++; // accumulate hits on track if (driftCircle->highLevel()) (*m_accumulateHits)[(index[0]>0)?0:1][index[2]][index[5]][3]++; // accumulate hits on track - + } // end trackStatesIt loop - + // add holeIdentifiers - fill vector - + const DataVector<const Trk::TrackStateOnSurface>* holes = m_trt_hole_finder->getHolesOnTrack( *track ); if ( holes==0 ) continue; // no holes found for ( DataVector<const Trk::TrackStateOnSurface>::const_iterator trackStatesIt = holes->begin(); trackStatesIt != holes->end(); trackStatesIt++ ) { - + if ( !(*trackStatesIt)->type( Trk::TrackStateOnSurface::Hole ) ) { ATH_MSG_ERROR( "m_trt_hole_finder returned something that is not a hole" ); continue; } - + const Trk::TrackParameters* track_parameters = (*trackStatesIt)->trackParameters(); if (!track_parameters) { ATH_MSG_WARNING( "m_trt_hole_finder track_parameters missing" ); continue; } - + Identifier id = track_parameters->associatedSurface().associatedDetectorElementIdentifier(); if ( !(m_TRTHelper->is_trt(id)) ) { ATH_MSG_ERROR( "m_trt_hole_finder returned something that is not a TRT hole" ); continue; } - // add se same 1.4 mm locR selection, in case it is not on by default + // add se same 1.4 mm locR selection, in case it is not on by default if ( std::fabs( track_parameters->parameters()[Trk::locR] ) > m_locR_cut ) continue; - + holeIdentifiers.push_back( id ); } // end add holeIdentifiers - - } // end trackIt loop - + + } // end trackIt loop + //================ End loop over all tracks - + //================ Loop over all hits - it includes hits from dead straws that are masked off in drift circle creation - + for (TRT_RDO_Container::const_iterator rdoIt = rdoContainer->begin(); rdoIt != rdoContainer->end(); ++rdoIt) { const InDetRawDataCollection<TRT_RDORawData>* TRTCollection(*rdoIt); if (TRTCollection==0) continue; for (DataVector<TRT_RDORawData>::const_iterator trtIt = TRTCollection->begin(); trtIt != TRTCollection->end(); trtIt++) { Identifier id = (*trtIt)->identify(); int index[6]; myStrawIndex(id, index); // side, layer, phi, straw_layer, straw_within_layer, straw_index - (*m_accumulateHits)[(index[0]>0)?0:1][index[2]][index[5]][0]++; // accumulate all hits + (*m_accumulateHits)[(index[0]>0)?0:1][index[2]][index[5]][0]++; // accumulate all hits if ((*trtIt)->highLevel()) (*m_accumulateHits)[(index[0]>0)?0:1][index[2]][index[5]][2]++; // accumulate TR hits - + if (std::find(holeIdentifiers.begin(), holeIdentifiers.end(), id) != holeIdentifiers.end()) // a hole was found on the same straw, but hits is there - holeIdentifiersWithHits.push_back( id ); - } + holeIdentifiersWithHits.push_back( id ); + } } - - //================ End loop over all hits + + //================ End loop over all hits //================ End loop over all holes, each time also save whether the straw with a hole had a hit - + for (unsigned int i=0; i<holeIdentifiers.size(); i++) { - + Identifier id = holeIdentifiers[i]; int index[6]; myStrawIndex(id, index); // side, layer, phi, straw_layer, straw_within_layer, straw_index - + (*m_accumulateHits)[(index[0]>0)?0:1][index[2]][index[5]][4]++; - + if (std::find(holeIdentifiersWithHits.begin(), holeIdentifiersWithHits.end(), id) != holeIdentifiersWithHits.end()) (*m_accumulateHits)[(index[0]>0)?0:1][index[2]][index[5]][5]++; } - - //================ End loop over all hits + + //================ End loop over all hits //===== searching for HV lines with voltage < 1490 V if (lumiBlock0 != last_lumiBlock0){ float theValue; int chanNum; - char fileName_mapping[300]; + char fileName_mapping[300]; snprintf(fileName_mapping, 299,"%s.%07d_Voltage_trips.txt", m_fileName.c_str(), m_runNumber); FILE *fmapping = fopen(fileName_mapping, "a"); - //StatusCode + //StatusCode sc = StatusCode::SUCCESS;//for compatibility with Rel 17 - + //===== Loop over all HV lines for (chanNum=1;chanNum<1281;chanNum++){ theValue = 9999.; @@ -329,7 +331,7 @@ void InDet::TRT_StrawStatus::clear() { void InDet::TRT_StrawStatus::reportResults() { ATH_MSG_INFO( "InDet::TRT_StrawStatus::reportResults() for " << m_nEvents << " events." ); - char fileName[300]; + char fileName[300]; snprintf(fileName, 299,"%s.%07d_newFormat.txt", m_fileName.c_str(), m_runNumber); FILE *f = fopen(fileName, "w"); fprintf(f, "%d %d %d %d %d %d %d %d %d \n", 0, 0, 0, 0, 0, 0, 0, 0, m_nEvents); @@ -338,15 +340,15 @@ void InDet::TRT_StrawStatus::reportResults() { if (k>=1642) side *= 2; fprintf(f, "%d %zu %zu", side, j, k); for (int m=0; m<6; m++) fprintf(f, " %d", (*m_accumulateHits)[i][j][k][m]); - fprintf(f, "\n"); + fprintf(f, "\n"); } fclose(f); return; -} +} void InDet::TRT_StrawStatus::printDetailedInformation() { ATH_MSG_INFO( "InDet::TRT_StrawStatus::printDetailedInformation() " ); - char fileName[300]; + char fileName[300]; snprintf(fileName, 299,"%s.%07d_printDetailedInformation.txt", m_fileName.c_str(), m_runNumber); FILE *f = fopen(fileName, "w"); for (std::vector<Identifier>::const_iterator it = m_TRTHelper->straw_layer_begin(); it != m_TRTHelper->straw_layer_end(); it++ ) { @@ -354,37 +356,37 @@ void InDet::TRT_StrawStatus::printDetailedInformation() { Identifier id = m_TRTHelper->straw_id( *it, i); int index[6]; myStrawIndex(id, index); - int chip, HVpad; + int chip, HVpad; m_TRTStrawNeighbourSvc->getChip(id, chip); m_TRTStrawNeighbourSvc->getPad(id, HVpad); if (!m_printStatusCount) { ATH_MSG_INFO( "if the code crashes on the next line, there is a problem with m_TRTStrawStatusSummarySvc not being loaded " ); ATH_MSG_INFO( "in that case, running with reco turned on normally solves the problem, know of no better solution at the moment" ); - ATH_MSG_INFO( "if you do not need the detailed print information, you can also just set printDetailedInformation to 0 to avoid this crash" ); + ATH_MSG_INFO( "if you do not need the detailed print information, you can also just set printDetailedInformation to 0 to avoid this crash" ); m_printStatusCount++; } - int status = m_TRTStrawStatusSummaryTool->get_status( id ); + int status = m_TRTStrawStatusSummaryTool->get_status( id ); int statusTemporary = m_TRTStrawStatusSummaryTool->getStatus( id ); - int statusPermanent = m_TRTStrawStatusSummaryTool->getStatusPermanent( id ); + int statusPermanent = m_TRTStrawStatusSummaryTool->getStatusPermanent( id ); for (int j=0; j<6; j++) fprintf(f, "%d ", index[j]); fprintf(f, "%d %d %d %d %d\n", chip, HVpad, status, statusTemporary, statusPermanent); } - } + } fclose(f); - return; + return; } void InDet::TRT_StrawStatus::myStrawIndex(Identifier id, int *index) { int side = m_TRTHelper->barrel_ec(id); int layerNumber = m_TRTHelper->layer_or_wheel(id); int strawLayerNumber = m_TRTHelper->straw_layer(id); - int strawNumber = m_TRTHelper->straw(id); + int strawNumber = m_TRTHelper->straw(id); int straw(0); - + const int numberOfStraws[74] = { 0, 15, 31, 47, 63, 79, 96, 113, 130, 147, 164, 182, 200, 218, 236, 254, 273, 292, 311, 329, // layer 0, 329 straws, strawlayers 0-18 348, 368, 388, 408, 428, 448, 469, 490, 511, 532, 553, 575, 597, 619, 641, 663, 686, 709, 732, 755, 778, 802, 826, 849, // layer 1, 520 straws, strawLayers 0-23 872, 896, 920, 944, 968, 993, 1018, 1043, 1068, 1093, 1119, 1145, 1171, 1197, 1223, 1250, 1277, 1304, 1331, 1358, 1386, 1414, 1442, 1470, 1498, 1527, 1556, 1585, 1614, 1642 }; // layer 2 - + if (abs(side)==1) { // barrel unique straw number if (layerNumber==1) strawLayerNumber+= 19; else if (layerNumber==2) strawLayerNumber+= 43; @@ -394,13 +396,13 @@ void InDet::TRT_StrawStatus::myStrawIndex(Identifier id, int *index) { if (board<6) { board *= 2; if (strawLayerNumber>7) board++; } else { board += 6; } straw = board * 192 + strawNumber * 8 + strawLayerNumber % 8 ; - straw += 1642; + straw += 1642; } index[0] = side; index[1] = layerNumber; index[2] = m_TRTHelper->phi_module(id); index[3] = strawLayerNumber; index[4] = strawNumber; - index[5] = straw; + index[5] = straw; return; } diff --git a/InnerDetector/InDetCalibTools/TRT_CalibTools/src/FillAlignTRTHits.cxx b/InnerDetector/InDetCalibTools/TRT_CalibTools/src/FillAlignTRTHits.cxx index ebb9ea397e5adec83640e984a8e1c20481d3d357..1393b373b7f4cfa52bc58404e1bd5e80ac2ebba1 100755 --- a/InnerDetector/InDetCalibTools/TRT_CalibTools/src/FillAlignTRTHits.cxx +++ b/InnerDetector/InDetCalibTools/TRT_CalibTools/src/FillAlignTRTHits.cxx @@ -352,7 +352,7 @@ bool FillAlignTRTHits::fill(const Trk::Track* aTrack, TRT::TrackInfo* output, if(HitOnTrackToRemove){ unbiasedTrkParameters = m_updator->removeFromState(*(HitOnTrackToRemove->trackParameters()), HitOnTrackToRemove->measurementOnTrack()->localParameters(), - HitOnTrackToRemove->measurementOnTrack()->localCovariance()); + HitOnTrackToRemove->measurementOnTrack()->localCovariance()).release(); ATH_MSG_DEBUG ("TrackParameters 1: " << *(HitOnTrackToRemove->trackParameters())); } else if (msgLvl(MSG::DEBUG)) { diff --git a/InnerDetector/InDetMonitoring/InDetAlignmentMonitoring/src/IDAlignMonNtuple.cxx b/InnerDetector/InDetMonitoring/InDetAlignmentMonitoring/src/IDAlignMonNtuple.cxx index 57922b976c974e61d9e8d0b071501a488910b30e..45439f14ae2f8f354793e7966bb733e40a3ba2ee 100644 --- a/InnerDetector/InDetMonitoring/InDetAlignmentMonitoring/src/IDAlignMonNtuple.cxx +++ b/InnerDetector/InDetMonitoring/InDetAlignmentMonitoring/src/IDAlignMonNtuple.cxx @@ -77,23 +77,23 @@ IDAlignMonNtuple::~IDAlignMonNtuple() { } StatusCode IDAlignMonNtuple::initialize() { - + //initialize tools and services if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Calling initialize() to setup tools/services" << endmsg; StatusCode sc = setupTools(); if (sc.isFailure()) { msg(MSG::FATAL) << "Failed to initialize tools/services!" << endmsg; return StatusCode::FAILURE; - } + } else if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Successfully initialized tools/services" << endmsg; if(m_unbiasedSCT) msg(MSG::INFO) << "Using Truly unbiased SCT residuals" << endmsg; - if(m_usePRD) msg(MSG::INFO) << "Using PrepRawData for hits information" << endmsg; + if(m_usePRD) msg(MSG::INFO) << "Using PrepRawData for hits information" << endmsg; ATH_CHECK(m_tracksName.initialize()); ATH_CHECK(m_tracksTruthName.initialize()); ATH_CHECK(m_VxPrimContainerName.initialize()); - + return StatusCode::SUCCESS; } @@ -105,32 +105,32 @@ StatusCode IDAlignMonNtuple::bookHistograms() //if ( newLowStatFlag() ) { } //if ( newLumiBlockFlag() ) { } if ( newRunFlag() ) { } - + std::string directoryStructure = "/NTUPLES/ALIGNMONITOR"; //std::string fullNtuplePath = "/NTUPLES/ALIGNMONITOR/Alignment/tree"; std::string fullNtuplePath = "/NTUPLES/ALIGNMONITOR/" + m_tracksName.key() + "/tree"; //NTupleFilePtr file( m_ntupleSvc, directoryStructure ); NTuplePtr nt(m_ntupleSvc, fullNtuplePath ); - + //booking m_ntuple if (!nt) { // Check if already booked - + nt = m_ntupleSvc->book(fullNtuplePath, CLID_ColumnWiseTuple,"tree" ); if(nt) { - + m_ntuple=nt; msg(MSG::INFO) << "Alignment monitoring m_ntuple booked." << endmsg; - + //information per event - sc = m_ntuple->addItem("event_ntracks",m_nt_ntrks,0,s_n_maxTracks); + sc = m_ntuple->addItem("event_ntracks",m_nt_ntrks,0,s_n_maxTracks); sc = m_ntuple->addItem("event_nhits",m_nt_nhits,0,s_n_maxEventHits); - sc = m_ntuple->addItem("event_nvtx",m_nt_nvtx,0,1000); - sc = m_ntuple->addItem("event_goodvtxfound",m_nt_goodvtx,0,1000); - sc = m_ntuple->addItem("event_vtxntrks",m_nt_vtxntrks,0,s_n_maxTracks); - sc = m_ntuple->addItem("event_vtxX",m_nt_vtxX,-1000,1000); - sc = m_ntuple->addItem("event_vtxY",m_nt_vtxY,-1000,1000); - sc = m_ntuple->addItem("event_vtxZ",m_nt_vtxZ,-1000,1000); - + sc = m_ntuple->addItem("event_nvtx",m_nt_nvtx,0,1000); + sc = m_ntuple->addItem("event_goodvtxfound",m_nt_goodvtx,0,1000); + sc = m_ntuple->addItem("event_vtxntrks",m_nt_vtxntrks,0,s_n_maxTracks); + sc = m_ntuple->addItem("event_vtxX",m_nt_vtxX,-1000,1000); + sc = m_ntuple->addItem("event_vtxY",m_nt_vtxY,-1000,1000); + sc = m_ntuple->addItem("event_vtxZ",m_nt_vtxZ,-1000,1000); + //information per track sc = m_ntuple->addIndexedItem("track_nhits",m_nt_ntrks,m_nt_trknhits); sc = m_ntuple->addIndexedItem("track_qoverpt",m_nt_ntrks,m_nt_trkqoverpt); @@ -151,7 +151,7 @@ StatusCode IDAlignMonNtuple::bookHistograms() sc = m_ntuple->addIndexedItem("track_truthphi",m_nt_ntrks,m_nt_trktruthphi); sc = m_ntuple->addIndexedItem("track_trutheta",m_nt_ntrks,m_nt_trktrutheta); sc = m_ntuple->addIndexedItem("track_truthpdg",m_nt_ntrks,m_nt_trktruthpdg); - + sc = m_ntuple->addIndexedItem("track_truthphi0",m_nt_ntrks,m_nt_trktruthphi0); sc = m_ntuple->addIndexedItem("track_truthd0",m_nt_ntrks,m_nt_trktruthd0); sc = m_ntuple->addIndexedItem("track_truthz0",m_nt_ntrks,m_nt_trktruthz0); @@ -166,26 +166,26 @@ StatusCode IDAlignMonNtuple::bookHistograms() //int max_hits = 5000;//do not make this smaller! //information per hit per track - sc = m_ntuple->addItem("hit_dettype",m_nt_ntrks,m_nt_dettype,s_n_maxHits); - sc = m_ntuple->addItem("hit_isbarrel",m_nt_ntrks,m_nt_isbarrel,s_n_maxHits); - sc = m_ntuple->addItem("hit_layer",m_nt_ntrks,m_nt_layer,s_n_maxHits); - sc = m_ntuple->addItem("hit_modphi",m_nt_ntrks,m_nt_hitmodphi,s_n_maxHits); - sc = m_ntuple->addItem("hit_modeta",m_nt_ntrks,m_nt_hitmodeta,s_n_maxHits); - sc = m_ntuple->addItem("hit_hitx",m_nt_ntrks,m_nt_hitx,s_n_maxHits); - sc = m_ntuple->addItem("hit_hity",m_nt_ntrks,m_nt_hity,s_n_maxHits); - sc = m_ntuple->addItem("hit_residualx",m_nt_ntrks,m_nt_residualx,s_n_maxHits); - sc = m_ntuple->addItem("hit_residualy",m_nt_ntrks,m_nt_residualy,s_n_maxHits); - sc = m_ntuple->addItem("hit_biasedresidualx",m_nt_ntrks,m_nt_biasedresidualx,s_n_maxHits); - sc = m_ntuple->addItem("hit_biasedresidualy",m_nt_ntrks,m_nt_biasedresidualy,s_n_maxHits); - sc = m_ntuple->addItem("hit_hittype",m_nt_ntrks,m_nt_hittype,s_n_maxHits); - sc = m_ntuple->addItem("hit_errorx",m_nt_ntrks,m_nt_errorx,s_n_maxHits); - sc = m_ntuple->addItem("hit_errory",m_nt_ntrks,m_nt_errory,s_n_maxHits); - sc = m_ntuple->addItem("hit_hitxwidth",m_nt_ntrks,m_nt_hitxwidth,s_n_maxHits); - sc = m_ntuple->addItem("hit_hitywidth",m_nt_ntrks,m_nt_hitywidth,s_n_maxHits); + sc = m_ntuple->addItem("hit_dettype",m_nt_ntrks,m_nt_dettype,s_n_maxHits); + sc = m_ntuple->addItem("hit_isbarrel",m_nt_ntrks,m_nt_isbarrel,s_n_maxHits); + sc = m_ntuple->addItem("hit_layer",m_nt_ntrks,m_nt_layer,s_n_maxHits); + sc = m_ntuple->addItem("hit_modphi",m_nt_ntrks,m_nt_hitmodphi,s_n_maxHits); + sc = m_ntuple->addItem("hit_modeta",m_nt_ntrks,m_nt_hitmodeta,s_n_maxHits); + sc = m_ntuple->addItem("hit_hitx",m_nt_ntrks,m_nt_hitx,s_n_maxHits); + sc = m_ntuple->addItem("hit_hity",m_nt_ntrks,m_nt_hity,s_n_maxHits); + sc = m_ntuple->addItem("hit_residualx",m_nt_ntrks,m_nt_residualx,s_n_maxHits); + sc = m_ntuple->addItem("hit_residualy",m_nt_ntrks,m_nt_residualy,s_n_maxHits); + sc = m_ntuple->addItem("hit_biasedresidualx",m_nt_ntrks,m_nt_biasedresidualx,s_n_maxHits); + sc = m_ntuple->addItem("hit_biasedresidualy",m_nt_ntrks,m_nt_biasedresidualy,s_n_maxHits); + sc = m_ntuple->addItem("hit_hittype",m_nt_ntrks,m_nt_hittype,s_n_maxHits); + sc = m_ntuple->addItem("hit_errorx",m_nt_ntrks,m_nt_errorx,s_n_maxHits); + sc = m_ntuple->addItem("hit_errory",m_nt_ntrks,m_nt_errory,s_n_maxHits); + sc = m_ntuple->addItem("hit_hitxwidth",m_nt_ntrks,m_nt_hitxwidth,s_n_maxHits); + sc = m_ntuple->addItem("hit_hitywidth",m_nt_ntrks,m_nt_hitywidth,s_n_maxHits); sc = m_ntuple->addItem("hit_hitolegwidth",m_nt_ntrks,m_nt_hitolegwidth,s_n_maxHits); sc = m_ntuple->addItem("hit_incidangle",m_nt_ntrks,m_nt_hitincidangle,s_n_maxHits); - } else { + } else { msg(MSG::ERROR) << "Failed to book Alignment monitoring m_ntuple." << endmsg; } } @@ -197,7 +197,7 @@ StatusCode IDAlignMonNtuple::bookHistograms() StatusCode IDAlignMonNtuple::fillHistograms() { - + //------------------------------------------------------------- //looking at vertex reconstruction @@ -214,9 +214,9 @@ StatusCode IDAlignMonNtuple::fillHistograms() return StatusCode::SUCCESS; } else { if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Collection with name "<<m_VxPrimContainerName.key()<< " with size " << vertices->size() <<" found in StoreGate" << endmsg; - + VxContainer::const_iterator vxItr = vertices->begin(); - VxContainer::const_iterator vxItrE = vertices->end(); + VxContainer::const_iterator vxItrE = vertices->end(); nVtx = vertices->size(); for (; vxItr != vxItrE; ++vxItr) { int numTracksPerVertex = (*vxItr)->vxTrackAtVertex()->size(); @@ -228,7 +228,7 @@ StatusCode IDAlignMonNtuple::fillHistograms() } } } - + if (xv==-999 || yv==-999 || zv==-999) { if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No vertex found => setting it to 0"<<endmsg; @@ -271,7 +271,7 @@ StatusCode IDAlignMonNtuple::fillHistograms() if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Collection with name "<< m_tracksTruthName.key() <<" found in StoreGate" << endmsg; if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Retrieved "<< truthMap->size() <<" truth tracks from StoreGate" << endmsg; } - + int nTracks = 0; int nHitsEvent = 0; @@ -282,10 +282,10 @@ StatusCode IDAlignMonNtuple::fillHistograms() //Rec::TrackParticleContainer::const_iterator trackItrE = tracks->end(); for (; trackItr != trackItrE && nTracks < s_n_maxTracks; ++trackItr) { //looping over tracks - + //need to get the Trk::Track object from which the TrackParticle object was created //this has the hit information - + //const Trk::Track* track = (*trackItr)->originalTrack(); const Trk::Track* track = *trackItr; if(track == NULL){ @@ -297,7 +297,7 @@ StatusCode IDAlignMonNtuple::fillHistograms() //variables will be overwritten later if can be defined setTrackErrorValues(nTracks); - //trackStateOnSurfaces is a vector of Trk::TrackStateOnSurface objects which contain information + //trackStateOnSurfaces is a vector of Trk::TrackStateOnSurface objects which contain information //on track at each (inner)detector surface it crosses eg hit used to fit track if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Track = " << nTracks << endmsg; if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Found " << track->trackStateOnSurfaces()->size() << " TrkSurfaces " << endmsg; @@ -310,14 +310,14 @@ StatusCode IDAlignMonNtuple::fillHistograms() float residualX = s_n_ERRORVALUE; float residualY = s_n_ERRORVALUE; float biasedResidualX = s_n_ERRORVALUE; float biasedResidualY = s_n_ERRORVALUE; float errorX = s_n_ERRORVALUE; float errorY = s_n_ERRORVALUE; - float hitX = s_n_ERRORVALUE; float hitY = s_n_ERRORVALUE; + float hitX = s_n_ERRORVALUE; float hitY = s_n_ERRORVALUE; int detType = s_n_ERRORVALUE; int barrelEC = s_n_ERRORVALUE; int layerDisk = s_n_ERRORVALUE; int modEta = s_n_ERRORVALUE; int modPhi = s_n_ERRORVALUE; int hitType = s_n_ERRORVALUE; int phiWidth = s_n_ERRORVALUE; int zWidth = s_n_ERRORVALUE; int olegWidth = s_n_ERRORVALUE; float trkIncidAngle = s_n_ERRORVALUE; - if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "TSOS (hit) = " << nHits << endmsg; + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "TSOS (hit) = " << nHits << endmsg; if (tsos == nullptr) continue; @@ -359,22 +359,22 @@ StatusCode IDAlignMonNtuple::fillHistograms() const Trk::MeasurementBase* mesh =tsos->measurementOnTrack(); if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Defined hit MeasurementBase " << endmsg; - + //Trk::RIO_OnTrack object contains information on the hit used to fit the track at this surface const Trk::RIO_OnTrack* hit = dynamic_cast <const Trk::RIO_OnTrack*>(mesh); - if (hit== NULL) { + if (hit== NULL) { //for some reason the first tsos has no associated hit - maybe because this contains the defining parameters? - if (nHits > 0) if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No hit associated with TrkSurface - probably a hole"<< nHits << endmsg; + if (nHits > 0) if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No hit associated with TrkSurface - probably a hole"<< nHits << endmsg; continue; } - + //if desired we can use PrepRawData hits information i.e. before insitu calibration of hits const InDet::SiCluster* hitPRD; if(m_usePRD){ hitPRD = dynamic_cast <const InDet::SiCluster*>(hit->prepRawData()); } else {hitPRD = NULL;} - + const Identifier & hitId = hit->identify(); if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Defined hit Identifier " << endmsg; if (m_idHelper->is_pixel(hitId)) { @@ -389,7 +389,7 @@ StatusCode IDAlignMonNtuple::fillHistograms() detType = 2; if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "This is a TRT Hit" << endmsg; } - + //finding local error on hit if(m_usePRD && hitPRD != NULL){ errorX = Amg::error(hitPRD->localCovariance(),Trk::locX); @@ -399,7 +399,7 @@ StatusCode IDAlignMonNtuple::fillHistograms() errorX = Amg::error(hit->localCovariance(),Trk::locX); errorY = Amg::error(hit->localCovariance(),Trk::locY); } - + if (detType==0) {//getting pixel hit information if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " This is a PIXEL hit " << hitId << endmsg; @@ -419,9 +419,9 @@ StatusCode IDAlignMonNtuple::fillHistograms() if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Pixel hit z cluster width = " << zWidth << endmsg; } } - - - if (detType==1) {//getting SCT hit information + + + if (detType==1) {//getting SCT hit information if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " This is an SCT hit " << hitId << endmsg; const Identifier& id = m_sctID->wafer_id(hitId); @@ -438,9 +438,9 @@ StatusCode IDAlignMonNtuple::fillHistograms() if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "SCT hit phi cluster width = " << phiWidth << endmsg; } } - + if (detType==0 || detType==1) {//have identified pixel or SCT hit - + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Hit is pixel or SCT, finding residuals... " << endmsg; const Trk::TrackParameters* trackParameter = tsos->trackParameters(); @@ -453,11 +453,11 @@ StatusCode IDAlignMonNtuple::fillHistograms() //finding residuals if(trackParameter){ - if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Found Trk::TrackParameters" << endmsg; + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Found Trk::TrackParameters" << endmsg; //finding track incidence angle (taken from InDetAlignTools/InDetAlignHitQualSelectTool) const InDetDD::SiDetectorElement *detEle = dynamic_cast<const InDetDD::SiDetectorElement*>( hit->detectorElement() ) ; - + if ( detEle != NULL ){ Amg::Vector3D trkDir = trackParameter->momentum() ; Amg::Vector3D detElePhi = detEle->phiAxis() ; //!< local x axis in global frame @@ -477,7 +477,7 @@ StatusCode IDAlignMonNtuple::fillHistograms() double unbiasedResXY[4] = {9999.0,9999.0,9999.0,9999.0}; double biasedResXY[4] = {9999.0,9999.0,9999.0,9999.0}; - + //finding unbiased single residuals StatusCode sc; sc = getSiResiduals(track,tsos,true,unbiasedResXY); @@ -492,7 +492,7 @@ StatusCode IDAlignMonNtuple::fillHistograms() // float pullX = (float)unbiasedResXY[2]; // float pullY = (float)unbiasedResXY[3]; - + //finding biased single residuals (for interest) sc = getSiResiduals(track,tsos,false,biasedResXY); if (sc.isFailure()) { @@ -503,9 +503,9 @@ StatusCode IDAlignMonNtuple::fillHistograms() else if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "biased residuals found ok" << endmsg; biasedResidualX = biasedResXY[0]; biasedResidualY = biasedResXY[1]; - + } - else if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No TrackParameters associated with TrkSurface "<< nHits << ", hit type = " << hitType << endmsg; + else if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No TrackParameters associated with TrkSurface "<< nHits << ", hit type = " << hitType << endmsg; } //filling m_ntuple @@ -528,23 +528,23 @@ StatusCode IDAlignMonNtuple::fillHistograms() m_nt_hitolegwidth[nTracks][nHits] = olegWidth; m_nt_hitincidangle[nTracks][nHits] = trkIncidAngle; - nHits++; + nHits++; nHitsEvent++; - + }//end of loop on track surfaces - + //bounds checking if (nHits >= s_n_maxHits) { msg(MSG::ERROR) << "WATCH OUT: There are more HITS in this events than fit in the ntuples hits matrix!" << endmsg; msg(MSG::ERROR) << "Set max hits per track = " << s_n_maxHits << ", current track has " << nHits << " or more hits!" << endmsg; return StatusCode::FAILURE; } - - m_nt_trknhits[nTracks] = nHits; - + + m_nt_trknhits[nTracks] = nHits; + //filling m_ntuple with some track parameters const Trk::Perigee* startPerigee = track->perigeeParameters(); - float theta = startPerigee->parameters()[Trk::theta]; + float theta = startPerigee->parameters()[Trk::theta]; float d0 = startPerigee->parameters()[Trk::d0]; float phi0 = startPerigee->parameters()[Trk::phi0]; m_nt_trktheta[nTracks] = theta; @@ -554,7 +554,7 @@ StatusCode IDAlignMonNtuple::fillHistograms() m_nt_trkd0[nTracks] = d0; m_nt_trkz0[nTracks] = startPerigee->parameters()[Trk::z0]; m_nt_trkcharge[nTracks] = startPerigee->charge(); - + //finding d0 wrt the primary vertex if one is well-defined if(!(xv==0.0 && yv==0.0 && zv==0.0)){ //if we found a decent vertex @@ -568,21 +568,21 @@ StatusCode IDAlignMonNtuple::fillHistograms() int DoF = (fit) ? fit->numberDoF() : -1; m_nt_trkchi2[nTracks] = chiSquared; m_nt_trkdof[nTracks] = DoF; - + //tracktruth stuff (put in separate method) if (truthMap.get()) { - + //the key for the truth std::map is an ElementLink<TrackCollection> object //comprises a pointer to the track and reconstructed track collection ElementLink<TrackCollection> trackLink; trackLink.setElement(const_cast<Trk::Track*>(track)); trackLink.setStorableObject(*tracks); const ElementLink<TrackCollection> trackLink2=trackLink; - + //trying to find the std::map entry for this reconstructed track TrackTruthCollection::const_iterator found = truthMap->find(trackLink2); - + if (found != truthMap->end()) { TrackTruth trkTruth = found->second;//getting the TrackTruth object - the map element @@ -591,11 +591,11 @@ StatusCode IDAlignMonNtuple::fillHistograms() if ( HMPL.isValid()) { #ifdef HEPMC3 - HepMC::ConstGenParticlePtr genParticle = HMPL.scptr(); + HepMC::ConstGenParticlePtr genParticle = HMPL.scptr(); #else - const HepMC::GenParticle *genParticle = HMPL.cptr(); + const HepMC::GenParticle *genParticle = HMPL.cptr(); #endif - + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " Particle with PDG "<< genParticle->pdg_id() << " Status "<< genParticle->status()<<" mass "<< genParticle->momentum().m() <<" pt "<<genParticle->momentum().perp()<<" eta "<<genParticle->momentum().eta()<<" phi "<<genParticle->momentum().phi()<<endmsg; m_nt_trkistruth[nTracks] = 1; @@ -612,13 +612,13 @@ StatusCode IDAlignMonNtuple::fillHistograms() else if(!genParticle->production_vertex()) {if(msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "No GenVertex (generator level) production vertex found!" << endmsg;} else{ //currently cannot configure the TruthToTrack tool properly - + const Trk::TrackParameters* generatedTrackPerigee = m_truthToTrack->makePerigeeParameters(genParticle); if (!generatedTrackPerigee) if(msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Unable to extrapolate genParticle to perigee!" << endmsg; - + if ( generatedTrackPerigee) { - + float phi0 = generatedTrackPerigee->parameters()[Trk::phi0]; float d0 = generatedTrackPerigee->parameters()[Trk::d0]; float z0 = generatedTrackPerigee->parameters()[Trk::z0]; @@ -627,7 +627,7 @@ StatusCode IDAlignMonNtuple::fillHistograms() float charge = generatedTrackPerigee->charge(); float qoverpt = generatedTrackPerigee->parameters()[Trk::qOverP]/(sin(theta)); float pt = (1/qoverpt)*(charge); - + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Extrapolated genParticle perigee parameters: q/Pt = " << qoverpt << " d0 = " << d0 << " z0 = " << z0 << " phi0 = " << phi0 << " pt = " << pt << endmsg; m_nt_trktruthphi0[nTracks] = phi0; @@ -640,8 +640,8 @@ StatusCode IDAlignMonNtuple::fillHistograms() m_nt_trktruthvtxX[nTracks] = genParticle->production_vertex()->position().x(); m_nt_trktruthvtxY[nTracks] = genParticle->production_vertex()->position().y(); m_nt_trktruthvtxZ[nTracks] = genParticle->production_vertex()->position().z(); - - delete generatedTrackPerigee; + + delete generatedTrackPerigee; } } } @@ -649,7 +649,7 @@ StatusCode IDAlignMonNtuple::fillHistograms() } nTracks++; - + } // end of loop on tracks @@ -660,9 +660,9 @@ StatusCode IDAlignMonNtuple::fillHistograms() return StatusCode::FAILURE; } else m_nt_ntrks = nTracks; - + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Number of tracks : "<< nTracks << endmsg; - + //bounds checking if (nHitsEvent >= s_n_maxEventHits) { msg(MSG::ERROR) << "WATCH OUT: There are more EVENTHITS in this event than fit in the ntuples eventhits!" << endmsg; @@ -670,8 +670,8 @@ StatusCode IDAlignMonNtuple::fillHistograms() return StatusCode::FAILURE; } else m_nt_nhits = nHitsEvent; - - //write the m_ntuple record + + //write the m_ntuple record if (!(m_ntupleSvc->writeRecord(m_ntuple)).isSuccess()) { msg(MSG::ERROR) << "problems writing m_ntuple record" << endmsg; } @@ -688,7 +688,7 @@ StatusCode IDAlignMonNtuple::procHistograms() //if( endOfLowStatFlag() ) { } //if( endOfLumiBlockFlag() ) { } //if( endOfRunFlag() ) {} - + return StatusCode::SUCCESS; } @@ -703,15 +703,15 @@ StatusCode IDAlignMonNtuple::getSiResiduals(const Trk::Track* track, const Trk: double residualY = -9999.0; double pullX = -9999.0; double pullY = -9999.0; - + //extract the hit object from the tsos const Trk::MeasurementBase* mesh =tsos->measurementOnTrack(); const Trk::RIO_OnTrack* hit = dynamic_cast <const Trk::RIO_OnTrack*>(mesh); - + //get the unbiased track parameters (can fail if no MeasuredTrackParameters exists) const Trk::TrackParameters* trackParameterUnbiased = NULL; if(unBias) trackParameterUnbiased = getUnbiasedTrackParameters(track,tsos); - + //updator can fail in defining unbiased parameters, in which case we use biased const Trk::TrackParameters* trackParameterForResiduals = NULL; if(trackParameterUnbiased) trackParameterForResiduals = trackParameterUnbiased; @@ -721,9 +721,9 @@ StatusCode IDAlignMonNtuple::getSiResiduals(const Trk::Track* track, const Trk: } if (!m_residualPullCalculator.empty() && !m_residualPullCalculator.retrieve().isFailure()) { - + if (hit && trackParameterForResiduals) { - + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) <<" got hit and track parameters " << endmsg; //const Trk::ResidualPull* residualPull = m_residualPullCalculator->residualPull(hit, trackParameterForResiduals, unBias); @@ -747,14 +747,14 @@ StatusCode IDAlignMonNtuple::getSiResiduals(const Trk::Track* track, const Trk: if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " residualPull dim >= 2" << endmsg; residualY = residualPull->residual()[Trk::loc2]; - if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " residual Y = " << residualY << endmsg; + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " residual Y = " << residualY << endmsg; if(residualPull->isPullValid()) pullY = residualPull->pull()[Trk::loc2]; else { if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "ResidualPullCalculator finds invalid Y Pull!!!" << endmsg; sc = StatusCode::FAILURE; } } - + delete residualPull; } @@ -769,7 +769,7 @@ StatusCode IDAlignMonNtuple::getSiResiduals(const Trk::Track* track, const Trk: // for each of the SCT sides; residualPull->dimension()==1 always. //std::pair <double, double> result(residualX, residualY); - results[0] = residualX; + results[0] = residualX; results[1] = residualY; results[2] = pullX; results[3] = pullY; @@ -778,19 +778,19 @@ StatusCode IDAlignMonNtuple::getSiResiduals(const Trk::Track* track, const Trk: if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "ResidualPullCalculator finds Pull=NAN!!!" << endmsg; sc = StatusCode::FAILURE; } - + //delete these TrackParameters which are newly created in the getUnbiasedTrackParameters(track,tsos) method delete trackParameterUnbiased; return sc; - + } //__________________________________________________________________________ const Trk::TrackParameters* IDAlignMonNtuple::getUnbiasedTrackParameters(const Trk::Track* trkPnt, const Trk::TrackStateOnSurface* tsos) { - + const Trk::TrackParameters* TrackParams; const Trk::TrackParameters* UnbiasedTrackParams(0); const Trk::TrackParameters* PropagatedTrackParams(0); @@ -800,15 +800,15 @@ const Trk::TrackParameters* IDAlignMonNtuple::getUnbiasedTrackParameters(const T bool trueUnbiased = true; Identifier surfaceID; - + if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "original track parameters: " << *(tsos->trackParameters()) <<endmsg; - + if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Trying to unbias track parameters." << endmsg; const Trk::RIO_OnTrack* hitOnTrack = dynamic_cast <const Trk::RIO_OnTrack*>(tsos->measurementOnTrack()); - + if (hitOnTrack == NULL) return NULL; @@ -824,9 +824,9 @@ const Trk::TrackParameters* IDAlignMonNtuple::getUnbiasedTrackParameters(const T IdentifierHash otherSideHash; m_sctID->get_other_side(waferHash, otherSideHash); const Identifier OtherModuleSideID = m_sctID->wafer_id(otherSideHash); - + for (const Trk::TrackStateOnSurface* TempTsos : *trkPnt->trackStateOnSurfaces()) { - + const Trk::RIO_OnTrack* hitOnTrack = dynamic_cast <const Trk::RIO_OnTrack*>(TempTsos->measurementOnTrack()); if (hitOnTrack != 0) { const Identifier& trkID = hitOnTrack->identify(); @@ -839,28 +839,29 @@ const Trk::TrackParameters* IDAlignMonNtuple::getUnbiasedTrackParameters(const T if (OtherModuleSideHit) { - + const Trk::TrackParameters* OMSHmeasuredTrackParameter = OtherModuleSideHit->trackParameters(); - + // check that the hit on the other module side has measuredtrackparameters, otherwise it cannot be removed from the track const AmgSymMatrix(5)* covariance = OMSHmeasuredTrackParameter->covariance(); if (covariance) { - + if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "OtherSideTrackParameters: " << *(OtherModuleSideHit->trackParameters()) << endmsg; - OtherSideUnbiasedTrackParams = m_iUpdator->removeFromState(*(OtherModuleSideHit->trackParameters()), - OtherModuleSideHit->measurementOnTrack()->localParameters(), - OtherModuleSideHit->measurementOnTrack()->localCovariance()); + OtherSideUnbiasedTrackParams = m_iUpdator->removeFromState( + *(OtherModuleSideHit->trackParameters()), + OtherModuleSideHit->measurementOnTrack()->localParameters(), + OtherModuleSideHit->measurementOnTrack()->localCovariance()).release(); - if (OtherSideUnbiasedTrackParams) { + if (OtherSideUnbiasedTrackParams) { if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Unbiased OtherSideTrackParameters: " << *OtherSideUnbiasedTrackParams << endmsg; const Trk::Surface& TempSurface = OtherModuleSideHit->measurementOnTrack()->associatedSurface(); const Trk::MagneticFieldProperties* TempField = 0; - - + + if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "After OtherSide surface call. Surface exists" << endmsg; if (TempSurface.associatedLayer()) { @@ -868,29 +869,29 @@ const Trk::TrackParameters* IDAlignMonNtuple::getUnbiasedTrackParameters(const T if(TempSurface.associatedLayer()->enclosingTrackingVolume()) { if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "TempSurface->associatedLayer()->enclosingTrackingVolume exists" << endmsg; - + TempField = dynamic_cast <const Trk::MagneticFieldProperties*>(TempSurface.associatedLayer()->enclosingTrackingVolume()); if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "After MagneticFieldProperties cast" << endmsg; - + } else { if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "TempSurface->associatedLayer()->enclosingTrackingVolume does not exist" << endmsg; } } else { if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "TempSurface->associatedLayer() does not exist" << endmsg; } - - - - - - + + + + + + if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Before other side unbiased propagation" << endmsg; if (TempSurface.associatedLayer() && TempField) PropagatedTrackParams = m_propagator->propagate(*OtherSideUnbiasedTrackParams, tsos->measurementOnTrack()->associatedSurface(), Trk::anyDirection, false, *TempField, Trk::nonInteracting).release(); - + if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "After other side unbiased propagation" << endmsg; delete OtherSideUnbiasedTrackParams; if (PropagatedTrackParams) { @@ -914,8 +915,12 @@ const Trk::TrackParameters* IDAlignMonNtuple::getUnbiasedTrackParameters(const T PropagatedTrackParams = tsos->trackParameters()->clone(); } - - UnbiasedTrackParams = m_iUpdator->removeFromState(*PropagatedTrackParams, tsos->measurementOnTrack()->localParameters(), tsos->measurementOnTrack()->localCovariance()); + UnbiasedTrackParams = + m_iUpdator + ->removeFromState(*PropagatedTrackParams, + tsos->measurementOnTrack()->localParameters(), + tsos->measurementOnTrack()->localCovariance()) + .release(); delete PropagatedTrackParams; @@ -929,14 +934,14 @@ const Trk::TrackParameters* IDAlignMonNtuple::getUnbiasedTrackParameters(const T if(msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "RemoveFromState did not work, using original TrackParameters" << endmsg; TrackParams = tsos->trackParameters()->clone(); } - - delete UnbiasedTrackParams; + + delete UnbiasedTrackParams; return TrackParams; - + } - - + + //--------------------------------------------------------------------------------------- StatusCode IDAlignMonNtuple::setupTools() @@ -951,7 +956,7 @@ StatusCode IDAlignMonNtuple::setupTools() if ( sc.isFailure() ){ msg(MSG::FATAL) << "Cannot retrieve the NTuple service... Exiting" << endmsg; return StatusCode::FAILURE; - } + } if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Defined detector service" << endmsg; @@ -977,7 +982,7 @@ StatusCode IDAlignMonNtuple::setupTools() }else{ if (msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Found AtlasDetectorID" << endmsg; } - + if (m_iUpdator.retrieve().isFailure() ) { msg(MSG::FATAL) << "Failed to retrieve tool " << m_iUpdator << endmsg; @@ -1002,20 +1007,20 @@ StatusCode IDAlignMonNtuple::setupTools() } if (m_residualPullCalculator.empty()) { - if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No residual/pull calculator for general hit residuals configured." << endmsg; - if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "It is recommended to give R/P calculators to the det-specific tool" << " handle lists then." << endmsg; m_doPulls = false; } else if (m_residualPullCalculator.retrieve().isFailure()) { - if(msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not retrieve "<< m_residualPullCalculator + if(msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Could not retrieve "<< m_residualPullCalculator <<" (to calculate residuals and pulls) "<< endmsg; m_doPulls = false; - + } else { - if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Generic hit residuals&pulls will be calculated in one or both " << "available local coordinates" << endmsg; m_doPulls = true; @@ -1030,11 +1035,11 @@ StatusCode IDAlignMonNtuple::setupTools() void IDAlignMonNtuple::setTrackErrorValues(int nTracks) { - //for each track ensures that the variable is set to + //for each track ensures that the variable is set to //a defined errorvalue in case it can't be defined m_nt_trknhits[nTracks] = s_n_ERRORVALUE; - + m_nt_trktheta[nTracks] = s_n_ERRORVALUE; m_nt_trkqoverpt[nTracks] = s_n_ERRORVALUE; m_nt_trketa[nTracks] = s_n_ERRORVALUE; @@ -1052,7 +1057,7 @@ void IDAlignMonNtuple::setTrackErrorValues(int nTracks) m_nt_trktruthpt[nTracks] = s_n_ERRORVALUE; m_nt_trktrutheta[nTracks] = s_n_ERRORVALUE; m_nt_trktruthphi[nTracks] = s_n_ERRORVALUE; - + m_nt_trktruthphi0[nTracks] = s_n_ERRORVALUE; m_nt_trktruthd0[nTracks] = s_n_ERRORVALUE; m_nt_trktruthz0[nTracks] = s_n_ERRORVALUE; diff --git a/InnerDetector/InDetMonitoring/InDetAlignmentMonitoring/src/IDAlignMonResiduals.cxx b/InnerDetector/InDetMonitoring/InDetAlignmentMonitoring/src/IDAlignMonResiduals.cxx index cf522fff3522451d2d1167e2561b3467bfea3320..0356f2fd294f33480d347acb0e6dac42cd4121b3 100755 --- a/InnerDetector/InDetMonitoring/InDetAlignmentMonitoring/src/IDAlignMonResiduals.cxx +++ b/InnerDetector/InDetMonitoring/InDetAlignmentMonitoring/src/IDAlignMonResiduals.cxx @@ -188,7 +188,7 @@ struct IDAlignMonResiduals::TRTEndcapHistograms{ TH2F* aveResVsRadiusWheelNeg[2]{}; TH2F* rmsResVsRadiusWheelNeg[2]{}; - // Residual vs pt and vs wheel in the endcap + // Residual vs pt and vs wheel in the endcap TH3F* resVsqPtWheel[2]{}; }; @@ -207,7 +207,7 @@ IDAlignMonResiduals::IDAlignMonResiduals( const std::string & type, const std::s m_hitQualityTool = ToolHandle<IInDetAlignHitQualSelTool>(""); m_trt_b_hist = new TRTBarrelHistograms(); m_trt_ec_hist = new TRTEndcapHistograms(); - + m_triggerChainName = "NoTriggerSelection"; m_z_fix = 366.5; // IBL Stave fixing screw position [mm] m_NLumiBlocksMon = 1; @@ -232,7 +232,7 @@ IDAlignMonResiduals::IDAlignMonResiduals( const std::string & type, const std::s m_IncidentPhiRange = 0.8; m_RangeOfPullHistos = 6.; m_PtRange = 40.; - m_xHitErrorRange = 0.08; + m_xHitErrorRange = 0.08; m_yHitErrorRange = 0.12; m_mu = 0.; m_nBinsMuRange = 101.; @@ -246,8 +246,8 @@ IDAlignMonResiduals::IDAlignMonResiduals( const std::string & type, const std::s m_FinerBinningFactor = 1; m_LBGranularity = 1; m_LBRangeMin = -0.5; - m_LBRangeMax = 2599.5; - m_nBinsLB = 52; + m_LBRangeMax = 2599.5; + m_nBinsLB = 52; m_gap_pix = 4; m_gap_sct = 4; m_nIBLHitsPerLB = 0; @@ -861,16 +861,16 @@ StatusCode IDAlignMonResiduals::bookHistograms() //All modules m_pix_b0_resXvsetaLumiBlock = new TProfile2D("pix_b0_resXvsetaLumiBlock","2D profile of X unbiased residuals vs IBL eta module per Lumi Block; LumiBlock;Module Eta", - m_nBinsLB, m_LBRangeMin, m_LBRangeMax, - 20, -10.5, 9.5, + m_nBinsLB, m_LBRangeMin, m_LBRangeMax, + 20, -10.5, 9.5, m_minPIXResXFillRange, m_maxPIXResXFillRange); RegisterHisto(al_mon,m_pix_b0_resXvsetaLumiBlock); //Only planars m_pix_b0_resXvsetaLumiBlock_planars = new TProfile2D("pix_b0_resXvsetaLumiBlock_planars","2D profile of X unbiased residuals vs IBL eta module per Lumi Block;LumiBlock; Module Eta", - m_nBinsLB,m_LBRangeMin,m_LBRangeMax, - 12, -6.5, 5.5, + m_nBinsLB,m_LBRangeMin,m_LBRangeMax, + 12, -6.5, 5.5, m_minPIXResXFillRange, m_maxPIXResXFillRange); RegisterHisto(al_mon,m_pix_b0_resXvsetaLumiBlock_planars); @@ -1095,8 +1095,8 @@ StatusCode IDAlignMonResiduals::fillHistograms() else { m_mu = -999; } - ATH_MSG_DEBUG ("IDAlignMonResiduals::fillHistograms ** run number: " << eventInfo->runNumber() - << " event number: " << eventInfo->eventNumber() + ATH_MSG_DEBUG ("IDAlignMonResiduals::fillHistograms ** run number: " << eventInfo->runNumber() + << " event number: " << eventInfo->eventNumber() << " lumiblock: " << m_lumiblock << " mu: " << m_mu); if (m_extendedPlots){ @@ -1130,7 +1130,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() << " LB: " << m_lumiblock << " --> Track collection " << m_tracksName.key() << " has size =" << tracks->size()); - + int nTracks = 0; int nHitsEvent = 0; @@ -1145,7 +1145,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() } //check that all TSOS of track have track parameters defined (required to compute residuals/pulls) - if (trackRequiresRefit(track)) { + if (trackRequiresRefit(track)) { ATH_MSG_DEBUG ("** IDAlignMonResiduals::fillHistograms ** Not all TSOS contain track parameters - will be missing residuals/pulls "); } else { @@ -1165,7 +1165,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() float trkqoverp2 = -999; float trketa_w = -999; bool countedTrack = false; - + if(m_extendedPlots) { trkqoverp2 = track->perigeeParameters()->parameters()[Trk::qOverP]*fabs(track->perigeeParameters()->parameters()[Trk::qOverP])*1000000.; } @@ -1179,9 +1179,9 @@ StatusCode IDAlignMonResiduals::fillHistograms() hweight = m_etapTWeight->GetBinContent( binNumber ); } //looping over the hits of this track - ATH_MSG_DEBUG ("** track " << nTracks << "/" << tracks->size() - << " pt: " << trkpt - << " eta: " << trketa_w + ATH_MSG_DEBUG ("** track " << nTracks << "/" << tracks->size() + << " pt: " << trkpt + << " eta: " << trketa_w << " weight: " << hweight << " ** start looping on hits/TSOS ** "); for (const Trk::TrackStateOnSurface* tsos : *track->trackStateOnSurfaces()) { @@ -1190,7 +1190,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() if (tsos == nullptr) { ATH_MSG_DEBUG (" TSOS (hit) = " << nTSOS << " is NULL "); continue; - } + } //skipping outliers ATH_MSG_DEBUG (" --> testing hit " << nTSOS << "/" << track->trackStateOnSurfaces()->size() << " to be measurement type"); @@ -1208,7 +1208,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() } //Trk::RIO_OnTrack object contains information on the hit used to fit the track at this surface - ATH_MSG_DEBUG (" --> Going to retrive the Trk::RIO_OnTrack for hit " << nTSOS); + ATH_MSG_DEBUG (" --> Going to retrive the Trk::RIO_OnTrack for hit " << nTSOS); const Trk::RIO_OnTrack* hit = dynamic_cast <const Trk::RIO_OnTrack*>(mesh); if (hit == nullptr) { //for some reason the first tsos has no associated hit - maybe because this contains the defining parameters? @@ -1216,7 +1216,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() continue; } - ATH_MSG_DEBUG (" --> Going to retrive the track parameters of this TSOS: " << nTSOS); + ATH_MSG_DEBUG (" --> Going to retrive the track parameters of this TSOS: " << nTSOS); const Trk::TrackParameters* trackParameter = tsos->trackParameters(); if(trackParameter== nullptr) { //if no TrackParameters for TSOS we cannot define residuals @@ -1298,41 +1298,41 @@ StatusCode IDAlignMonResiduals::fillHistograms() else detType = 0; // TRT hits: detType = 2 - if(detType==2){ + if(detType==2){ ATH_MSG_DEBUG ("** IDAlignMonResiduals::fillHistograms() ** Hit is from the TRT, finding residuals... "); bool isTubeHit = (mesh->localCovariance()(Trk::locX,Trk::locX) > 1.0) ? 1 : 0; const Trk::TrackParameters* trackParameter = tsos->trackParameters(); float hitR = hit->localParameters()[Trk::driftRadius]; float trketa = tsos->trackParameters()->eta(); float pullR = -9.9; - + const Identifier& id = m_trtID->layer_id(hitId); int barrel_ec = m_trtID->barrel_ec(id); int layer_or_wheel = m_trtID->layer_or_wheel(id); int phi_module = m_trtID->phi_module(id); int straw_layer = m_trtID->straw_layer(id); - + //finding residuals if(!trackParameter){ if(msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "No TrackParameters associated with TRT TrkSurface "<<nTSOS<< endmsg; continue; } ATH_MSG_DEBUG ("Found Trk::TrackParameters for hit " << nTSOS << " --> TRT hit (detType= "<< detType <<")"); - + //getting unbiased track parameters by removing the hit from the track and refitting const Trk::TrackParameters* trackParameterUnbiased = getUnbiasedTrackParameters(track,tsos); - + if(!trackParameterUnbiased){//updator can fail if(msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "Cannot define unbiased parameters for hit, skipping it." << endmsg; continue; } ATH_MSG_DEBUG (" --> TRT UnBiased TrackParameters of hit " << nTSOS << " FOUND"); - + float perdictR = trackParameterUnbiased->parameters()[Trk::locR]; - + //Theoretically there should be no difference in the pull, but in practice, there can be differences bool isPullUnbiased = true; - + const Trk::MeasurementBase* mesh =tsos->measurementOnTrack(); //This has been defined in line 869. Should be safe to keep it without redefinition //Not clear to me here. isPullUnbiased is set to true. Why inside the Function I am checking if it is true or not? Useless I would say. const Trk::ResidualPull* residualPull = m_residualPullCalculator->residualPull(mesh, @@ -1340,23 +1340,23 @@ StatusCode IDAlignMonResiduals::fillHistograms() (isPullUnbiased) ? Trk::ResidualPull::Unbiased : Trk::ResidualPull::Biased); - + if (residualPull) { pullR = residualPull->pull()[Trk::locR]; } else { ATH_MSG_DEBUG (" no covariance of the track parameters given, can not calculate pull!"); } - + delete trackParameterUnbiased; delete residualPull; - + float residualR = hitR - perdictR; - + const InDet::TRT_DriftCircleOnTrack *trtCircle = dynamic_cast<const InDet::TRT_DriftCircleOnTrack*>(tsos->measurementOnTrack()); - + const InDet::TRT_DriftCircle *RawDriftCircle(NULL); - + if (trtCircle!=NULL) { ATH_MSG_DEBUG(" --> Getting TRT RawDriftCircle"); RawDriftCircle = dynamic_cast<const InDet::TRT_DriftCircle*>(trtCircle->prepRawData()); @@ -1364,7 +1364,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() else { ATH_MSG_DEBUG("trtCircle is a NULL pointer"); } - + if ( trtCircle != nullptr){ bool isValid; float leadingEdge = -999; @@ -1374,11 +1374,11 @@ StatusCode IDAlignMonResiduals::fillHistograms() else { ATH_MSG_DEBUG("RawDriftCircles are NULL pointer"); } - + Identifier DCoTId = trtCircle->identify(); float t0 = m_trtcaldbTool->getT0(DCoTId, TRTCond::ExpandedIdentifier::STRAW); ATH_MSG_DEBUG("** fillHistograms() ** Filling TRT HISTOS for hit/tsos " << nTSOS); - + // Global positions float trkz0 = track->perigeeParameters()->parameters()[Trk::z0]; float theta = track->perigeeParameters()->parameters()[Trk::theta]; @@ -1388,7 +1388,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() Amg::Vector3D center(-9999.,-9999.,-9999); if (RawDriftCircle!=NULL) center = RawDriftCircle->detectorElement()->surface( id ).center() ; - + if( fabs(barrel_ec) == 1 && RawDriftCircle!=NULL){ hitZ = sqrt(center.x()*center.x()+center.y()*center.y())*tan(M_PI/2. - theta) + trkz0; } @@ -1400,9 +1400,9 @@ StatusCode IDAlignMonResiduals::fillHistograms() hitGlobalR = (center_z - trkz0) / tan(M_PI/2. - theta); ATH_MSG_DEBUG("** fillHistograms() ** TRT endcap hit in layer_or_wheel: " << layer_or_wheel << " hitGlobalR: " << hitGlobalR); } - - ATH_MSG_DEBUG(" fillHistograms() ** filling TRT histos:" - << " Barrel/EndCap: " << barrel_ec + + ATH_MSG_DEBUG(" fillHistograms() ** filling TRT histos:" + << " Barrel/EndCap: " << barrel_ec << " layer/wheel: " << layer_or_wheel << " phi: " << phi_module << " Residual: " << residualR); @@ -1425,7 +1425,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() ,trkpt, hweight); } }//if detType ==2 // TRT - + //if (detType==0 || detType==1) else {//have identified pixel or SCT hit ATH_MSG_DEBUG ("** fillHistograms() ** Hit is pixel or SCT, type: " << detType); @@ -1493,15 +1493,15 @@ StatusCode IDAlignMonResiduals::fillHistograms() } //const Trk::TrackParameters* trackParameter = tsos->trackParameters(); // Already defined before in line 880. Should be safe here to take the one up since there are the continues. - + //finding residuals if(trackParameter){//should always have TrackParameters since we now skip tracks with no MeasuredTrackParameters - + if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Found Trk::TrackParameters " << trackParameter << endmsg; - + double unbiasedResXY[4] = {9999.0,9999.0,9999.0,9999.0}; double biasedResXY[4] = {9999.0,9999.0,9999.0,9999.0}; - + //finding unbiased single residuals StatusCode sc; sc = getSiResiduals(track,tsos,true,unbiasedResXY); @@ -1515,7 +1515,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() residualY = (float)unbiasedResXY[1]; pullX = (float)unbiasedResXY[2]; pullY = (float)unbiasedResXY[3]; - + //finding biased single residuals (for interest) sc = getSiResiduals(track,tsos,false,biasedResXY); if (sc.isFailure()) { @@ -1535,17 +1535,17 @@ StatusCode IDAlignMonResiduals::fillHistograms() hitErrorX = (float)sqrt(fabs(mesh->localCovariance()(Trk::loc1,Trk::loc1))); hitErrorY = (float)sqrt(fabs(mesh->localCovariance()(Trk::loc2,Trk::loc2))); //globR = (float)sqrt(mesh->globalPosition().x()*mesh->globalPosition().x()+mesh->globalPosition().y()*mesh->globalPosition().y()); - + if (detType==1 && barrelEC!=0){ // Hit error calculation for the SCT Endcaps const InDetDD::SiDetectorElement *siDet = dynamic_cast<const InDetDD::SiDetectorElement*>(hit->detectorElement()); - + // MeasurementBase --> virtual const Amg::Vector3D& globalPosition() const = 0; /// Angle of strip in local frame with respect to the etaAxis. /// Zero for all elements except trapezoidal detectors (ie SCT forward modules). ////SiDetectorElement -->double sinStereoLocal(const Amg::Vector2D &localPos) const; /// See previous method ////SiDetectorElement -->double sinStereoLocal(const HepGeom::Point3D<double> &globalPos) const; - + if (siDet != NULL) { double sinAlpha = siDet->sinStereoLocal(siDet->localPosition(mesh->globalPosition())); @@ -1556,24 +1556,24 @@ StatusCode IDAlignMonResiduals::fillHistograms() RotMat(0,1) = sinAlpha; RotMat(1,0) = -sinAlpha; RotMat(1,1) = cosAlpha; - + AmgSymMatrix(2) transformedROTCov = mesh->localCovariance().similarity(RotMat); hitErrorX = sqrt(transformedROTCov(0,0)); } } } - - + + //looking for an overlapping module in the X,Y direction //double counting is avoided by requiring that the overlap is at greater radius if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "looking for overlaps hits..." << endmsg; std::pair<const Trk::TrackStateOnSurface*,const Trk::TrackStateOnSurface*> overlap = findOverlapHit(track,hit); const Trk::TrackStateOnSurface* xOverlap = overlap.first;//will be NULL if no overlap found const Trk::TrackStateOnSurface* yOverlap = overlap.second;//will be NULL if no overlap found - + //find residuals for overlapping modules (if any) and calculate overlap residual if(xOverlap){//identified outer module overlapping in localX direction - + foundXOverlap = true; //float overlapXResX = 9999.0; //float overlapXResY = 9999.0; @@ -1588,18 +1588,18 @@ StatusCode IDAlignMonResiduals::fillHistograms() /* overlapXResX = (float)unbiasedOverlapRes[0]; overlapXResY = (float)unbiasedOverlapRes[1]; - + //finally computing the overlap residuals overlapXResidualX = overlapXResX - residualX; overlapXResidualY = overlapXResY - residualY; */ overlapXResidualX = (float)unbiasedOverlapRes[0] - residualX; overlapXResidualY = (float)unbiasedOverlapRes[1] - residualY; - + } - + if(yOverlap){//identified outer module overlapping in localY direction - + foundYOverlap = true; //float overlapYResX = 9999.0; //float overlapYResY = 9999.0; @@ -1611,29 +1611,29 @@ StatusCode IDAlignMonResiduals::fillHistograms() //return StatusCode::SUCCESS; continue; } else if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "unbiasedOverlapRes found ok" << endmsg; - + overlapYResidualX = (float)unbiasedOverlapRes[0] - residualX; overlapYResidualY = (float)unbiasedOverlapRes[1] - residualY; } } else if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "No TrackParameters associated with Si TrkSurface "<< nTSOS << " - Hit is probably an outlier" << endmsg; } - + //-------------------------------------------- // // Filling Residual Histograms for different subsystems // //-------------------------------------------- - - + + if (detType==0) {//filling pixel histograms m_si_residualx -> Fill(residualX, hweight); if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " This is a PIXEL hit " << hitId << " - filling histograms" << endmsg; - + if(barrelEC==0){//filling pixel barrel histograms - + if (layerDisk==0) m_nIBLHitsPerLB++; - + m_si_b_residualx -> Fill(residualX, hweight); int layerModEtaShift[4] = {10,30,48,65}; //HARDCODED! int layerModPhiShift[4] = {0,18,44,86}; @@ -1649,17 +1649,17 @@ StatusCode IDAlignMonResiduals::fillHistograms() m_pix_b_residualsy[layerDisk]-> Fill(residualY, hweight); m_pix_b_pullsx[layerDisk] -> Fill(pullX , hweight); m_pix_b_pullsy[layerDisk] -> Fill(pullY , hweight); - - + + m_pix_b_xresvsmodetaphi_3ds[layerDisk] -> Fill(modEta, modPhi, residualX, hweight); m_pix_b_yresvsmodetaphi_3ds[layerDisk] -> Fill(modEta, modPhi, residualY, hweight); - + if (layerDisk == 0) { m_pix_b0_resXvsetaLumiBlock->Fill(float(m_lumiblock), modEta, residualX, hweight); - + if (modEta<=6 && modEta>=-6) m_pix_b0_resXvsetaLumiBlock_planars->Fill(float(m_lumiblock),modEta,residualX,hweight); - + if (m_doIBLLBPlots) { m_pix_b0_resXvsetaLumiBlock_3d->Fill(float(m_lumiblock), modEta, residualX, hweight); if (modEta<=6 && modEta>=-6) m_pix_b0_resXvsetaLumiBlock_planars->Fill(float(m_lumiblock),modEta,residualX,hweight); @@ -1679,7 +1679,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() if (modPhi==13) m_pix_b0_resXvsetaLumiBlock_stave13->Fill(float(m_lumiblock),modEta,residualX,hweight); } } - + if (foundXOverlap) { m_pix_bec_Oxresx_mean -> Fill(layerDisk+1.1,overlapXResidualX, hweight); m_pix_bec_Oxresy_mean -> Fill(layerDisk+1.1,overlapXResidualY, hweight); @@ -1701,7 +1701,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() } }//fYO } - + else if(barrelEC==2){//three Pixel endcap disks from 0-2 int ModPhiShift[3] = {0,55,110}; m_si_eca_pullX-> Fill(layerDisk,pullX , hweight); @@ -1712,20 +1712,20 @@ StatusCode IDAlignMonResiduals::fillHistograms() m_pix_eca_residualy -> Fill(residualY, hweight); m_pix_eca_pullx -> Fill(pullX , hweight); m_pix_eca_pully -> Fill(pullY , hweight); - + float disk = layerDisk + 0.1; if(foundXOverlap) { m_pix_bec_Oxresx_mean -> Fill(disk+5.0,overlapXResidualX, hweight); m_pix_bec_Oxresy_mean -> Fill(disk+5.0,overlapXResidualY, hweight); m_pix_eca_Oxresxvsmodphi -> Fill(modPhi+ModPhiShift[layerDisk],overlapXResidualX, hweight); } - + if(foundYOverlap) { m_pix_bec_Oyresx_mean -> Fill(disk+5.0,overlapYResidualX, hweight); m_pix_bec_Oyresy_mean -> Fill(disk+5.0,overlapYResidualY, hweight); m_pix_eca_Oyresyvsmodphi -> Fill(modPhi+ModPhiShift[layerDisk],overlapYResidualY, hweight); } - + m_pix_eca_xresvsmodphi_2d -> Fill(modPhi+ModPhiShift[layerDisk],residualX, hweight); m_pix_eca_yresvsmodphi_2d -> Fill(modPhi+ModPhiShift[layerDisk],residualY, hweight); m_pix_eca_unbiased_xresvsmodphi_disks[layerDisk] -> Fill(modPhi,residualX, hweight); @@ -1737,7 +1737,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() m_si_ecc_pullY-> Fill(layerDisk,pullY , hweight); m_si_ecc_resX -> Fill(layerDisk,residualX, hweight); m_si_ecc_resY -> Fill(layerDisk,residualY, hweight); - + float disk = (float)layerDisk; disk = -1.0*(disk + 0.1); m_pix_ecc_residualx -> Fill(residualX, hweight); @@ -1760,36 +1760,36 @@ StatusCode IDAlignMonResiduals::fillHistograms() //m_pix_ecc_unbiased_yresvsmodphi -> Fill(modPhi+ModPhiShift[layerDisk],residualY,hweight); m_pix_ecc_unbiased_xresvsmodphi_disks[layerDisk] -> Fill(modPhi,residualX, hweight); m_pix_ecc_unbiased_yresvsmodphi_disks[layerDisk] -> Fill(modPhi,residualY, hweight); - + } - + } else if (detType==1) {//filling SCT histograms m_si_residualx -> Fill(residualX, hweight); if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << " This is an SCT hit " << hitId << " - filling histograms" << endmsg; - + if(barrelEC==0){//filling SCT barrel histograms m_si_b_residualx -> Fill(residualX, hweight); int ModPhiShift[4] = {0,37,82,135}; int ModEtaShift[4] = {6,24,42,60}; m_si_barrel_pullX->Fill(m_NPixLayers + 2*(layerDisk) + sctSide, pullX, hweight); //m_si_barrel_pullY->Fill(3 + 2*(layerDisk) + sctSide, pullY);//no SCT Y residuals yet - + m_si_barrel_resX->Fill(m_NPixLayers + 2*(layerDisk) + sctSide, residualX, hweight); //m_si_barrel_resY->Fill(3 + 2*(layerDisk) + sctSide, residualY);//no SCT Y residuals yet - + m_sct_b_residualx -> Fill(residualX , hweight); m_sct_b_biasedresidualx-> Fill(biasedResidualX, hweight); - + if(foundXOverlap) m_sct_bec_Oxresx_mean -> Fill(layerDisk+1.1,overlapXResidualX, hweight); if(foundYOverlap) m_sct_bec_Oyresx_mean -> Fill(layerDisk+1.1,overlapYResidualX, hweight); - + m_sct_b_residualsx[layerDisk]-> Fill(residualX, hweight); m_sct_b_pullsx[layerDisk] -> Fill(pullX , hweight); - + m_sct_b_xresvsmodetaphi_3ds[layerDisk] -> Fill(modEta,modPhi,residualX, hweight); - + if(foundXOverlap) { m_sct_b_xoverlapresidualsx[layerDisk]-> Fill(overlapXResidualX , hweight); m_sct_b_Oxresxvsmodeta -> Fill(modEta+ModEtaShift[layerDisk],overlapXResidualX, hweight); @@ -1806,7 +1806,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() } // if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Unexpected SCT layer number "<< layerDisk << endmsg; } - + else if(barrelEC==2){//nine SCT endcap disks from 0-8 //ASSUMPTION: the outer rings of the SCT endcap disks have the same number of modules. WARNING! hardcoded! int Nmods = 52; @@ -1815,21 +1815,21 @@ StatusCode IDAlignMonResiduals::fillHistograms() //m_si_eca_pullY->Fill(3 + 2*(layerDisk) + sctSide, pullY);//no SCT Y residuals yet m_si_eca_resX->Fill(3 + 2*(layerDisk) + sctSide, residualX, hweight); //m_si_eca_resY->Fill(3 + 2*(layerDisk) + sctSide, residualY);//no SCT Y residuals yet - + float disk = layerDisk + 0.1; m_sct_eca_residualx -> Fill(residualX, hweight); m_sct_eca_pullx -> Fill(pullX , hweight); - + m_sct_eca_xresvsmodphi_2d -> Fill(modPhi+(layerDisk - 1)* (m_gap_sct + Nmods),residualX, hweight); - + if(foundXOverlap) { m_sct_bec_Oxresx_mean->Fill(disk+6.0,overlapXResidualX); m_sct_eca_Oxresxvsmodphi -> Fill(modPhi+ (layerDisk - 1)* (m_gap_sct + Nmods),overlapXResidualX,hweight); // modPhi+ ModPhiShift[layerDisk],overlapXResidualX , hweight); } - + } - + else if(barrelEC==-2){ int Nmods = 52; @@ -1837,12 +1837,12 @@ StatusCode IDAlignMonResiduals::fillHistograms() //m_si_ecc_pullY->Fill(3 + 2*(layerDisk) + sctSide, pullY);//no SCT Y residuals yet m_si_ecc_resX->Fill(3 + 2*(layerDisk) + sctSide, residualX, hweight); //m_si_ecc_resY->Fill(3 + 2*(layerDisk) + sctSide, residualY);//no SCT Y residuals yet - + float disk = (float)layerDisk; disk = -1.0*(disk + 0.1); m_sct_ecc_residualx ->Fill(residualX, hweight); m_sct_ecc_pullx ->Fill(pullX , hweight); - + m_sct_ecc_xresvsmodphi_2d -> Fill(modPhi+(layerDisk - 1)* (m_gap_sct + Nmods) ,residualX, hweight); if(foundXOverlap) { m_sct_bec_Oxresx_mean->Fill(disk,overlapXResidualX); @@ -1881,12 +1881,12 @@ StatusCode IDAlignMonResiduals::fillHistograms() m_hiterror_x_ibl_b_WideRange ->Fill(hitErrorX,hweight); m_hiterror_y_ibl_b_WideRange ->Fill(hitErrorX,hweight); } - + if(mlocalY > m_PixelBarrelYSize / 2.05 ) mlocalY = m_PixelBarrelYSize/2.05; if(mlocalY < -m_PixelBarrelYSize / 2.05 ) mlocalY = -m_PixelBarrelYSize/2.05; if(mlocalX > m_PixelBarrelXSize / 2.05 ) mlocalX = m_PixelBarrelXSize/2.05; if(mlocalX < -m_PixelBarrelXSize / 2.05 ) mlocalX = -m_PixelBarrelXSize/2.05; - + m_pix_b_residualsx_incitheta[layerDisk] ->Fill(incidenceTheta,residualX,hweight); m_pix_b_residualsy_incitheta[layerDisk] ->Fill(incidenceTheta,residualY,hweight); m_pix_b_residualsx_inciphi[layerDisk] ->Fill(incidencePhi,residualX,hweight); @@ -1907,7 +1907,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() m_pix_b_xoverlapresidualsx[layerDisk]-> Fill(overlapXResidualX , hweight); m_pix_b_xoverlapresidualsy[layerDisk]-> Fill(overlapXResidualY , hweight); } - + if(foundYOverlap) { m_pix_b_yoverlapresidualsx[layerDisk]-> Fill(overlapYResidualX , hweight); m_pix_b_yoverlapresidualsy[layerDisk]-> Fill(overlapYResidualY , hweight); @@ -1915,7 +1915,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() // int modoffset = 6.5; // default for old pixel layers m_PixelBarrelXSize = 16.44; // mm m_PixelBarrelYSize = 60.2; // mm - + if (layerDisk == 0) { // in case of IBL m_PixelBarrelXSize = 18.75; // Extracted from: arXiv:1209.1906v1, Figure 2 m_PixelBarrelYSize = 41.32; @@ -1925,10 +1925,10 @@ StatusCode IDAlignMonResiduals::fillHistograms() m_PixelBarrelYSize = 19.20 ; } } - + float xValueForHist = modEta + mlocalY / m_PixelBarrelYSize; float yValueForHist = modPhi + mlocalX / m_PixelBarrelXSize; - + ATH_MSG_VERBOSE (" -- filling detailed pixel maps -- layer = " << layerDisk << " eta: " << modEta << " phi " << modPhi @@ -1943,7 +1943,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() //m_pix_b_biased_yresvsmodetaphi_3ds[layerDisk] -> Fill(ModCenterPosX+mlocalY, ModCenterPosY+mlocalX, residualY, hweight); m_pix_b_detailed_xresvsmodetaphi_3ds[layerDisk] -> Fill( xValueForHist, yValueForHist, residualX, hweight); m_pix_b_detailed_yresvsmodetaphi_3ds[layerDisk] -> Fill( xValueForHist, yValueForHist, residualY, hweight); - + // pixel B-layer halfshell phi identifier association // Layer 0 Layer 1 Layer 2 // top: 1-10 0-19 0-22 49-51 @@ -2013,10 +2013,10 @@ StatusCode IDAlignMonResiduals::fillHistograms() m_pix_eca_pullx_pt -> Fill(trkpt, pullX , hweight); m_pix_eca_pully_pt -> Fill(trkpt, pullY , hweight); - m_hiterror_x_pix_ec -> Fill(hitErrorX , hweight); + m_hiterror_x_pix_ec -> Fill(hitErrorX , hweight); m_hiterror_y_pix_ec -> Fill(hitErrorY , hweight); - m_hiterror_x_pix_eca -> Fill(hitErrorX , hweight); - m_hiterror_y_pix_eca -> Fill(hitErrorY , hweight); + m_hiterror_x_pix_eca -> Fill(hitErrorX , hweight); + m_hiterror_y_pix_eca -> Fill(hitErrorY , hweight); m_hiterror_x_pix_ec_WideRange-> Fill(hitErrorX , hweight); m_hiterror_y_pix_ec_WideRange-> Fill(hitErrorY , hweight); @@ -2076,10 +2076,10 @@ StatusCode IDAlignMonResiduals::fillHistograms() m_pix_ecc_pullx_pt -> Fill(trkpt, pullX , hweight); m_pix_ecc_pully_pt -> Fill(trkpt, pullY , hweight); - m_hiterror_x_pix_ec -> Fill(hitErrorX , hweight); - m_hiterror_y_pix_ec -> Fill(hitErrorY , hweight); - m_hiterror_x_pix_ecc -> Fill(hitErrorX , hweight); - m_hiterror_y_pix_ecc -> Fill(hitErrorY , hweight); + m_hiterror_x_pix_ec -> Fill(hitErrorX , hweight); + m_hiterror_y_pix_ec -> Fill(hitErrorY , hweight); + m_hiterror_x_pix_ecc -> Fill(hitErrorX , hweight); + m_hiterror_y_pix_ecc -> Fill(hitErrorY , hweight); m_hiterror_x_pix_ec_WideRange-> Fill(hitErrorX , hweight); m_hiterror_y_pix_ec_WideRange-> Fill(hitErrorY , hweight); @@ -2356,7 +2356,7 @@ StatusCode IDAlignMonResiduals::fillHistograms() ATH_MSG_DEBUG("Fit IBL Shape for LumiBlock : "<< m_lumiblock<<" disabled because of too few entries in planars! "<<projection_lumiblock_planars->GetEntries() << " This block has: " << m_nIBLHitsPerLB << " total entries"); } - + delete projection_lumiblock; delete projection_lumiblock_planars; } @@ -2890,7 +2890,7 @@ const Trk::TrackParameters* IDAlignMonResiduals::getUnbiasedTrackParameters(cons if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "OtherSideTrackParameters: " << *(OtherModuleSideHit->trackParameters()) << endmsg; OtherSideUnbiasedTrackParams = m_iUpdator->removeFromState(*(OtherModuleSideHit->trackParameters()), OtherModuleSideHit->measurementOnTrack()->localParameters(), - OtherModuleSideHit->measurementOnTrack()->localCovariance()); + OtherModuleSideHit->measurementOnTrack()->localCovariance()).release(); if (OtherSideUnbiasedTrackParams) { if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << "Unbiased OtherSideTrackParameters: " << *OtherSideUnbiasedTrackParams << endmsg; @@ -2955,8 +2955,12 @@ const Trk::TrackParameters* IDAlignMonResiduals::getUnbiasedTrackParameters(cons PropagatedTrackParams = tsos->trackParameters()->clone(); } - - UnbiasedTrackParams = m_iUpdator->removeFromState(*PropagatedTrackParams, tsos->measurementOnTrack()->localParameters(), tsos->measurementOnTrack()->localCovariance()); + UnbiasedTrackParams = + m_iUpdator + ->removeFromState(*PropagatedTrackParams, + tsos->measurementOnTrack()->localParameters(), + tsos->measurementOnTrack()->localCovariance()) + .release(); delete PropagatedTrackParams; @@ -3132,7 +3136,7 @@ bool IDAlignMonResiduals::trackRequiresRefit(const Trk::Track* track) ATH_MSG_DEBUG ("** IDAlignMonResiduals::trackRequiresRefit ** does track requires a refit to access the residuals? " << refitTrack << " (hits on track: " << nHits << " hits without params: " << nHitsNoParams << " ) "); - + return refitTrack; } @@ -4097,7 +4101,7 @@ void IDAlignMonResiduals::MakePIXEndCapsHistograms(MonGroup& al_mon){ //unbiased vs pt m_pix_eca_residualx_pt = new TH2F("pix_eca_residualx_pt","X Residual Vs P_{T}: Pixel EndCap A;Track p_{T} [GeV];Local x res [mm]",m_nBinsPtRange, -m_PtRange, m_PtRange, - 100*m_FinerBinningFactor, m_minPIXResXFillRange, m_maxPIXResXFillRange); + 100*m_FinerBinningFactor, m_minPIXResXFillRange, m_maxPIXResXFillRange); RegisterHisto(al_mon,m_pix_eca_residualx_pt); m_pix_eca_residualy_pt = new TH2F("pix_eca_residualy_pt","Y Residual Vs p_{T}: Pixel EndCap A;Track p_{T} [GeV];Local y res [mm]",m_nBinsPtRange, -m_PtRange, m_PtRange, 100*m_FinerBinningFactor, m_minPIXResYFillRange, m_maxPIXResYFillRange); @@ -4109,7 +4113,7 @@ void IDAlignMonResiduals::MakePIXEndCapsHistograms(MonGroup& al_mon){ m_pix_ecc_residualy_pt = new TH2F("pix_ecc_residualy_pt","Y Residual Vs p_{T} Pixel EndCap C;Track p_{T} [GeV];Local y residual [mm]", m_nBinsPtRange, -m_PtRange, m_PtRange, 100*m_FinerBinningFactor, m_minPIXResXFillRange, m_maxPIXResXFillRange); RegisterHisto(al_mon,m_pix_ecc_residualy_pt); - + //biased pt m_pix_eca_biased_residualx_pt = new TH2F("pix_eca_biased_residualx_pt","Biased X Residual Vs Pt Pixel EndCap A;Track pT (GeV); Res (mm)",m_nBinsPtRange,-m_PtRange,m_PtRange,100*m_FinerBinningFactor,m_minPIXResXFillRange,m_maxPIXResXFillRange); RegisterHisto(al_mon,m_pix_eca_biased_residualx_pt); @@ -4711,9 +4715,9 @@ void IDAlignMonResiduals::MakeTRTBarrelHistograms(MonGroup& al_mon){ for(unsigned int side = 0; side<3; ++side){ /** Residual in the TRT Barrel */ m_trt_b_hist->residualR[side] = MakeHist("trt_b_residualR"+sideName[side],"UnBiased Residual for the TRT Barrel "+sideName[side], - 100*m_FinerBinningFactor, m_minTRTResWindow, m_maxTRTResWindow, "Residual [mm]","Entries"); + 100*m_FinerBinningFactor, m_minTRTResWindow, m_maxTRTResWindow, "Residual [mm]","Entries"); RegisterHisto(al_mon,m_trt_b_hist->residualR[side]); - + m_trt_b_hist->residualR_notube[side] = MakeHist("trt_b_residualR"+sideName[side]+"_notube","UnBiased Residual (notube) for the TRT Barrel "+sideName[side], 100*m_FinerBinningFactor, m_minTRTResWindow, m_maxTRTResWindow, "Residual [mm]","Entries"); RegisterHisto(al_mon,m_trt_b_hist->residualR_notube[side]); @@ -4730,7 +4734,7 @@ void IDAlignMonResiduals::MakeTRTBarrelHistograms(MonGroup& al_mon){ /** Measured drift radius */ m_trt_b_hist->MeasuredR[side] = MakeHist("trt_b_MeasuredR"+sideName[side],"Measured at drift radius for TRT Barrel "+sideName[side], - 100, -strawRadius, strawRadius, "Measured Drift Radius (mm)", "Entries"); + 100, -strawRadius, strawRadius, "Measured Drift Radius (mm)", "Entries"); RegisterHisto(al_mon,m_trt_b_hist->MeasuredR[side]); /** Drift radius from track fit */ @@ -4756,7 +4760,7 @@ void IDAlignMonResiduals::MakeTRTBarrelHistograms(MonGroup& al_mon){ 100, -m_RangeOfPullHistos, m_RangeOfPullHistos, "#mu","Pull"); RegisterHisto(al_mon,m_trt_b_hist->pullR_notube_mu[side]); - /** Residuals and pulls vs pT*/ + /** Residuals and pulls vs pT*/ m_trt_b_hist->residualR_pt[side] = MakeHist("trt_b_residualR_pt_"+sideName[side], "Unbiased residual vs pT for the TRT Barrel "+sideName[side], m_nBinsPtRange, -m_PtRange, m_PtRange, @@ -4786,7 +4790,7 @@ void IDAlignMonResiduals::MakeTRTBarrelHistograms(MonGroup& al_mon){ m_trt_b_hist->residualR_mu[side] = MakeHist("trt_b_residualR_mu_"+sideName[side],"Unbiased Residual vs mu for TRT Barrel "+sideName[side], m_nBinsMuRange, m_muRangeMin, m_muRangeMax, 100, m_minTRTResWindow, m_maxTRTResWindow, - "#mu","Residual [mm]"); + "#mu","Residual [mm]"); RegisterHisto(al_mon,m_trt_b_hist->residualR_mu[side]); } @@ -4879,7 +4883,7 @@ void IDAlignMonResiduals::MakeTRTBarrelHistograms(MonGroup& al_mon){ m_trt_b_hist->aveResVsStrawLayerStackLevel[side][phiSec] = MakeProfile("trt_b_aveResVsStrawLayerStackLevel_"+intToString(phiSec)+"_"+sideName[side],"Average Residual vs Straw Layer for TRT Barrel Modules in phi sector "+intToString(phiSec)+" "+sideName[side], 73, -0.5, 72.5, m_minTRTResWindow, m_maxTRTResWindow, - "Straw layer","Average Residual [mm]",false); + "Straw layer","Average Residual [mm]",false); RegisterHisto(al_mon,m_trt_b_hist->aveResVsStrawLayerStackLevel[side][phiSec]); /** Residual RMS Vs Strawlayer for the 3 Barrel Layers (A and C, A Only, C Only)*/ @@ -4942,7 +4946,7 @@ void IDAlignMonResiduals::MakeTRTEndcapHistograms(MonGroup& al_mon){ "UnBiased Residual vs pT for the TRT Barrel "+endcapName[endcap], m_nBinsPtRange, -m_PtRange, m_PtRange, 100, m_minTRTResWindow, m_maxTRTResWindow, - "Track p_{T} [GeV]","Residual [mm]"); + "Track p_{T} [GeV]","Residual [mm]"); RegisterHisto(al_mon,m_trt_ec_hist->residualR_pt[endcap]); m_trt_ec_hist->pullR_pt[endcap] = MakeHist("trt_ec_pullR_pt_"+endcapName[endcap],"UnBiased Pull vs pT for the TRT Barrel "+endcapName[endcap], @@ -4959,7 +4963,7 @@ void IDAlignMonResiduals::MakeTRTEndcapHistograms(MonGroup& al_mon){ RegisterHisto(al_mon,m_trt_ec_hist->pullR_notube_pt[endcap]); /** Residuals vs pt per wheel */ - for (int iWheel=0; iWheel < 40; iWheel++) { + for (int iWheel=0; iWheel < 40; iWheel++) { m_trt_ec_hist->residualR_ptwheel[endcap][iWheel] = MakeProfile("trt_ec_resVspt_wheel_"+intToString(iWheel)+"_"+endcapName[endcap], "Residual vs p_{T} for TRT "+endcapName[endcap]+" "+intToString(iWheel), m_nBinsPtRange, -m_PtRange, m_PtRange, @@ -4968,15 +4972,15 @@ void IDAlignMonResiduals::MakeTRTEndcapHistograms(MonGroup& al_mon){ SetMinWindow(m_trt_ec_hist->residualR_ptwheel[endcap][iWheel], -0.025, 0.025); RegisterHisto(al_mon,m_trt_ec_hist->residualR_ptwheel[endcap][iWheel]); } - + /** Residuals and pulls vs mu*/ m_trt_ec_hist->residualR_mu[endcap] = MakeHist("trt_ec_residualR_mu_"+endcapName[endcap], "UnBiased Residual vs mu for TRT "+endcapName[endcap], m_nBinsMuRange, m_muRangeMin, m_muRangeMax, 50, m_minTRTResWindow, m_maxTRTResWindow, - "#mu ","Residual [mm]"); + "#mu ","Residual [mm]"); RegisterHisto(al_mon,m_trt_ec_hist->residualR_mu[endcap]); - + m_trt_ec_hist->pullR_mu[endcap] = MakeHist("trt_ec_pullR_mu_"+endcapName[endcap],"Unbiased residual pull vs mu for TRT "+endcapName[endcap], m_nBinsMuRange, m_muRangeMin, m_muRangeMax, 50, -m_RangeOfPullHistos,m_RangeOfPullHistos, @@ -5023,42 +5027,42 @@ void IDAlignMonResiduals::MakeTRTEndcapHistograms(MonGroup& al_mon){ /** Endcap Residual plots vs Radius & Wheel */ m_trt_ec_hist->resVsRadiusWheelPos[endcap] = new TH3F(("trt_ec_resVsRadiusWheelPos_"+endcapName[endcap]).c_str(), ("Residual Distribution vs Wheel & Radius on Wheel for TRT "+endcapName[endcap]+";Wheel;Radius [mm]; Res [mm]").c_str(), - 40, -0.5, 39.5, + 40, -0.5, 39.5, 10, 644., 1004. /*these are the radius limits in mm according to TRT SW*/, 50, m_minTRTResWindow, m_maxTRTResWindow); RegisterHisto(al_mon,m_trt_ec_hist->resVsRadiusWheelPos[endcap]); m_trt_ec_hist->aveResVsRadiusWheelPos[endcap] = MakeHist("trt_ec_aveResVsRadiusWheelPos_"+endcapName[endcap], "Average Residual vs Wheel & Radius on Wheel for TRT "+endcapName[endcap], - 40, -0.5, 39.5, + 40, -0.5, 39.5, 10, 644., 1004., "Wheel Number","Radius on Wheel [mm]"); RegisterHisto(al_mon,m_trt_ec_hist->aveResVsRadiusWheelPos[endcap]); m_trt_ec_hist->rmsResVsRadiusWheelPos[endcap] = MakeHist("trt_ec_rmsResVsRadiusWheelPos_"+endcapName[endcap], "Residual RMS vs Wheel & Radius on Wheel for TRT "+endcapName[endcap], - 40, -0.5, 39.5, + 40, -0.5, 39.5, 10, 644., 1004., "Wheel Number","Radius on Wheel [mm]"); RegisterHisto(al_mon,m_trt_ec_hist->rmsResVsRadiusWheelPos[endcap]); m_trt_ec_hist->resVsRadiusWheelNeg[endcap] = new TH3F(("trt_ec_resVsRadiusWheelNeg_"+endcapName[endcap]).c_str(), ("Residual Distribution vs Wheel & Radius on Wheel for TRT "+endcapName[endcap]+";Wheel;Radius [mm]; Res [mm]").c_str(), - 40, -0.5, 39.5, + 40, -0.5, 39.5, 10, 644., 1004./*these are the radius limits in mm according to TRT SW*/, 50, m_minTRTResWindow, m_maxTRTResWindow); RegisterHisto(al_mon,m_trt_ec_hist->resVsRadiusWheelNeg[endcap]); m_trt_ec_hist->aveResVsRadiusWheelNeg[endcap] = MakeHist("trt_ec_aveResVsRadiusWheelNeg_"+endcapName[endcap], "Average Residual vs Wheel & Radius on Wheel for TRT "+endcapName[endcap], - 40, -0.5, 39.5, + 40, -0.5, 39.5, 10, 644., 1004., "Wheel Number","Radius on Wheel [mm]"); RegisterHisto(al_mon,m_trt_ec_hist->aveResVsRadiusWheelNeg[endcap]); m_trt_ec_hist->rmsResVsRadiusWheelNeg[endcap] = MakeHist("trt_ec_rmsResVsRadiusWheelNeg_"+endcapName[endcap], "Residual RMS vs Wheel & Radius on Wheel for TRT "+endcapName[endcap], - 40, -0.5, 39.5, + 40, -0.5, 39.5, 10, 644., 1004., "Wheel Number","Radius on Wheel [mm]"); RegisterHisto(al_mon,m_trt_ec_hist->rmsResVsRadiusWheelNeg[endcap]); - /** Endcap residual histograms vs q x pT & Wheel */ + /** Endcap residual histograms vs q x pT & Wheel */ m_trt_ec_hist->resVsqPtWheel[endcap] = new TH3F(("trt_ec_resVsqPtWheel_"+endcapName[endcap]).c_str(), ("Residual Distribution vs Wheel & p_{T} for TRT "+endcapName[endcap]+";Wheel;q#timesp_{T} [GeV]; Res [mm]").c_str(), 40, -0.5, 39.5, @@ -5132,7 +5136,7 @@ void IDAlignMonResiduals::MakeTRTEndcapHistograms(MonGroup& al_mon){ m_trt_ec_hist->rmsResVsPhiSec[endcap] = MakeProfile("trt_ec_rmsResVsPhiSec_"+endcapName[endcap], "Residual RMS vs sector for TRT "+endcapName[endcap], - m_TRTEC_nSectorBins, -0.5 , 31.5, + m_TRTEC_nSectorBins, -0.5 , 31.5, 0, 1.0, "Endcap PhiSec","Residual RMS"); RegisterHisto(al_mon,m_trt_ec_hist->rmsResVsPhiSec[endcap]); diff --git a/InnerDetector/InDetMonitoring/InDetGlobalMonitoring/src/InDetGlobalTrackMonTool.cxx b/InnerDetector/InDetMonitoring/InDetGlobalMonitoring/src/InDetGlobalTrackMonTool.cxx index 5a72a9770ae543e2131cc24593e8055d2035837e..ab007cb8bf0bdc1167659f2cae30880c4f3e9f5c 100644 --- a/InnerDetector/InDetMonitoring/InDetGlobalMonitoring/src/InDetGlobalTrackMonTool.cxx +++ b/InnerDetector/InDetMonitoring/InDetGlobalMonitoring/src/InDetGlobalTrackMonTool.cxx @@ -10,8 +10,8 @@ * Heidi Sandaker <Heidi.Sandaker@cern.ch> @n * Arshak Tonoyan <Arshak.Tonyoan@cern.ch> @n * Thomas Burgess <Thomas.Burgess@cern.ch> @n - * Alex Kastanas <Alex.Kastanas@cern.ch> @n - * Gaetano Barone <Gaetano.Barone@cern.ch> @n + * Alex Kastanas <Alex.Kastanas@cern.ch> @n + * Gaetano Barone <Gaetano.Barone@cern.ch> @n * * $Id: InDetGlobalTrackMonTool.cxx,v 1.33 2009-05-14 22:44:19 kastanas Exp $ * @@ -109,7 +109,7 @@ InDetGlobalTrackMonTool::InDetGlobalTrackMonTool( const std::string & type, m_pixelID(nullptr), m_holes_eta_phi(nullptr), m_holes_eta_pt(nullptr), - m_holes_phi_pt(nullptr), + m_holes_phi_pt(nullptr), m_holes_eta_phi_n(nullptr), m_holes_hits(nullptr), m_holesvshits(nullptr), @@ -140,11 +140,11 @@ InDetGlobalTrackMonTool::InDetGlobalTrackMonTool( const std::string & type, declareProperty("DoHoleSearch",m_DoHoles_Search,"Write hole data?"); declareProperty("DoTide",m_doTide,"Make TIDE plots?"); declareProperty("DoTideResiduals",m_doTideResiduals,"Make TIDE residual plots?"); - declareProperty("HoleSearchTool", m_holes_search_tool,"Tool to search for holes on track"); + declareProperty("HoleSearchTool", m_holes_search_tool,"Tool to search for holes on track"); declareProperty("UpdatorTool" , m_iUpdator); - declareProperty("DoHitMaps", m_doHitMaps,"Produce hit maps?"); - declareProperty("DoForwardTracks", m_doForwardTracks,"Run over forward tracks?"); - declareProperty("DoIBL", m_doIBL,"IBL present?"); + declareProperty("DoHitMaps", m_doHitMaps,"Produce hit maps?"); + declareProperty("DoForwardTracks", m_doForwardTracks,"Run over forward tracks?"); + declareProperty("DoIBL", m_doIBL,"IBL present?"); declareProperty("trackMax",m_trackMax,"Maximum number of tracks in track histograms"); declareProperty("trackBin",m_trackBin,"Number of bins for the track histograms"); declareProperty("ResidualPullCalculatorTool", m_residualPullCalculator); @@ -155,20 +155,20 @@ InDetGlobalTrackMonTool::InDetGlobalTrackMonTool( const std::string & type, StatusCode InDetGlobalTrackMonTool::initialize() { StatusCode sc; - + // If any of the ID helpers are not found then we don't make the hit maps m_trtID = 0; if (detStore()->retrieve(m_trtID, "TRT_ID").isFailure()) { ATH_MSG_DEBUG("Could not get TRT ID helper"); m_doHitMaps = false; } - + m_sctID = 0; if (detStore()->retrieve(m_sctID, "SCT_ID").isFailure()) { ATH_MSG_DEBUG("Could not get SCT ID helper"); m_doHitMaps = false; } - + m_pixelID = 0; if (detStore()->retrieve(m_pixelID, "PixelID").isFailure()) { ATH_MSG_DEBUG("Could not get Pixel ID helper"); @@ -189,15 +189,15 @@ StatusCode InDetGlobalTrackMonTool::initialize() { } else { if(msgLvl(MSG::INFO)) msg(MSG::INFO) << "Retrieved tool " << m_residualPullCalculator << endmsg; } - + ATH_CHECK( m_iUpdator.retrieve() ); - + ATH_CHECK ( m_trackToVertexIPEstimator.retrieve()); - + m_doIBL = m_IBLParameterSvc->containsIBL(); - + ATH_CHECK( m_baseline_selTool.retrieve() ); ATH_CHECK( m_tight_selTool.retrieve() ); if (m_holes_search_tool.empty() && m_DoHoles_Search) { @@ -219,7 +219,7 @@ StatusCode InDetGlobalTrackMonTool::initialize() { StatusCode InDetGlobalTrackMonTool::bookHistograms() { Interval_t detailsInterval = ( AthenaMonManager::environment() != AthenaMonManager::online ) ? lowStat : run; - + registerManHist( m_Trk_Base, "InDetGlobal/Track", detailsInterval, "nCOMBtrks", "Track multiplicity (baseline tracks)", m_trackBin, 0.5, m_trackMax+0.5, @@ -243,24 +243,24 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() m_nBinsEta, -m_c_etaRange, m_c_etaRange, m_nBinsPhi, -M_PI, M_PI, "eta", "#phi_{0}" ).ignore(); - + registerManHist( m_Trk_eta_phi_noTRText_ratio, "InDetGlobal/Track", detailsInterval, "Trk_noTRText_eta_phi_ratio","Distribution of eta vs phi for combined tracks with no TRT extension", - 20, -m_c_etaRangeTRT, m_c_etaRangeTRT, + 20, -m_c_etaRangeTRT, m_c_etaRangeTRT, m_nBinsPhi, -M_PI, M_PI, "eta", "#phi_{0}" ).ignore(); - + registerManHist( m_Trk_eta_phi_noBLhit_ratio, "InDetGlobal/Track", detailsInterval, "Trk_noBLhit_eta_phi_ratio","Eta-phi of tracks with no b-layer hit but a hit is expected, ratio to total tracks", - m_nBinsEta, -m_c_etaRange, m_c_etaRange, + m_nBinsEta, -m_c_etaRange, m_c_etaRange, m_nBinsPhi, -M_PI, M_PI, "#eta", "#phi_{0}").ignore(); - + if ( m_doIBL ) { registerManHist( m_Trk_eta_phi_noIBLhit_ratio, "InDetGlobal/Track", detailsInterval, "Trk_noIBLhit_eta_phi_ratio","Eta-phi of tracks with no IBL hit but a hit is expected, ratio to total tracks", - m_nBinsEta, -m_c_etaRange, m_c_etaRange, + m_nBinsEta, -m_c_etaRange, m_c_etaRange, m_nBinsPhi, -M_PI, M_PI, "#eta", "#phi_{0}").ignore(); } @@ -273,20 +273,20 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() 400,-1100,1100, 400,-1100,1100, "x [mm]", "y [mm]" ).ignore(); - + registerManHist( m_ID_hitmap_x_y_eca, "InDetGlobal/Hits", run, "ID_hitmap_x_y_eca","Map of ID hits (ECA) in x vs y (mm)", 400,-1100,1100, 400,-1100,1100, "x [mm]", "y [mm]" ).ignore(); - + registerManHist( m_ID_hitmap_x_y_ecc, "InDetGlobal/Hits", run, "ID_hitmap_x_y_ecc","Map of ID hits (ECC) in x vs y (mm)", 400,-1100,1100, 400,-1100,1100, "x [mm]", "y [mm]" ).ignore(); } - + for (unsigned int i = ( (m_doIBL) ? 0 : 1) ; i < m_trk_hits_eta_phi.size(); i++ ) { registerManHist( m_trk_hits_eta_phi[i], "InDetGlobal/Hits", detailsInterval, @@ -294,13 +294,13 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() m_nBinsEta, -m_c_etaRange, m_c_etaRange, m_nBinsPhi,-M_PI,M_PI, "#eta", "#phi" ).ignore(); - + registerManHist( m_trk_hits_LB[i], "InDetGlobal/Track", detailsInterval, "trk_n"+m_c_detector_labels[i]+"hits_LB","Average number of " + m_c_detector_labels[i] + " hits by LB", m_c_range_LB,0,m_c_range_LB, "LB #", "Average number of hits in LB").ignore(); } - + for (unsigned int i = 1; i < m_trk_disabled_eta_phi.size(); i++ ) { registerManHist( m_trk_disabled_eta_phi[i], "InDetGlobal/Hits", detailsInterval, @@ -309,7 +309,7 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() m_nBinsPhi,-M_PI,M_PI, "#eta", "#phi" ).ignore(); } - + registerManHist( m_trk_shared_pix_eta_phi, "InDetGlobal/Hits", detailsInterval, "Trk_nPixShared_eta_phi","Number of Pixel shared hits per track, eta-phi profile", m_nBinsEta, -m_c_etaRange, m_c_etaRange, @@ -321,7 +321,7 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() m_nBinsEta, -m_c_etaRange, m_c_etaRange, m_nBinsPhi,-M_PI,M_PI, "#eta", "#phi" ).ignore(); - + registerManHist( m_trk_jetassoc_d0_reso_dr, "InDetGlobal/Hits", detailsInterval, "Trk_jetassoc_d0_dr", "IP resolution per ghost associated track vs #DeltaR of track and jet", 20, 0, 0.4, "#Delta R", "Fraction" ).ignore(); @@ -410,26 +410,26 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() // Forward Pixel tracks if ( m_doForwardTracks ) - { + { registerManHist( m_Trk_FORW_FA_eta_phi, "InDetGlobal/Track", detailsInterval, "Trk_FORW_FA_eta_phi", "Eta-phi for pixel tracklets in the forward region (positive eta)", - 5, m_c_etaTrackletsMin, m_c_etaTrackletsMax, - m_nBinsPhi, -M_PI, M_PI, + 5, m_c_etaTrackletsMin, m_c_etaTrackletsMax, + m_nBinsPhi, -M_PI, M_PI, "#eta", "#phi_{0}" ).ignore(); - + registerManHist( m_Trk_FORW_FC_eta_phi, "InDetGlobal/Track", detailsInterval, "Trk_FORW_FC_eta_phi", "Eta-phi for pixel tracklets in the forward region (negative eta)", - 5, -m_c_etaTrackletsMax, -m_c_etaTrackletsMin, - m_nBinsPhi, -M_PI, M_PI, + 5, -m_c_etaTrackletsMax, -m_c_etaTrackletsMin, + m_nBinsPhi, -M_PI, M_PI, "#eta", "#phi_{0}" ).ignore(); - + registerManHist( m_Trk_FORW_chi2, "InDetGlobal/Track", detailsInterval, "Trk_FORW_chi2", "#chi^{2}/DoF of reconstructed forward tracklets", 80, -0., 20., "#chi^{2}/DoF").ignore(); - + registerManHist( m_Trk_FORW_qoverp, "InDetGlobal/Track", detailsInterval, - "Trk_FORW_qoverp", "Distribution of qoverp (forward Pixel tracklets)", + "Trk_FORW_qoverp", "Distribution of qoverp (forward Pixel tracklets)", 400, -2.5, 2.5, "Inverse momentum [GeV^{-1}]" ).ignore(); @@ -437,7 +437,7 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() "Trk_FORW_nPIXhits_FA","Number of Pixel hits per track (Forward tracks FA)", 5, 0.5, 5.5, "# of hits per track" ).ignore(); - + registerManHist( m_Trk_FORW_FC_nPIXhits, "InDetGlobal/Hits", detailsInterval, "Trk_FORW_nPIXhits_FC","Number of Pixel hits per track (Forward tracks FC)", 5, 0.5, 5.5, @@ -454,7 +454,7 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() "Trk_nTight_LB","Average number of tight tracks per event in LB", m_c_range_LB,0,m_c_range_LB, "LB #", "Average number of tight tracks per event in LB").ignore(); - + if ( m_doIBL ) { registerManHist( m_Trk_noIBLhits_LB, "InDetGlobal/Track", detailsInterval, @@ -466,7 +466,7 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() m_c_range_LB,0,m_c_range_LB, "LB #", "Fraction of tracks with missing IBL hit per event in LB").ignore(); } - + registerManHist( m_Trk_noBLhits_LB, "InDetGlobal/Track", detailsInterval, "Trk_noBLhits_LB","Average number of tracks with missing b-layer hit per event in LB", m_c_range_LB,0,m_c_range_LB, @@ -492,66 +492,66 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() registerManHist( m_sct_holes, "InDetGlobal/Hits", detailsInterval, "sct_holes", "Distribution of SCT Holes ", 104,-3.5,100.5, - "Number of SCT holes").ignore(); - + "Number of SCT holes").ignore(); + registerManHist( m_trt_holes, "InDetGlobal/Hits", detailsInterval, "trt_holes", "Distribution of TRT Holes ", 104,-3.5,100.5, "Number of TRT holes").ignore(); - + registerManHist( m_pixel_holes, "InDetGlobal/Hits", detailsInterval, "pixel_holes", "Distribution of Pixel Holes ", 104,-3.5,100.5, "Number of Pixel holes").ignore(); - + registerManHist( m_comb_holes, "InDetGlobal/Hits", detailsInterval, "comb_holes", "Distribution of Combined Holes ", 104,-3.5,100.5, "Total number of holes").ignore(); - + registerManHist( m_silicon_vs_trt, "InDetGlobal/Hits", detailsInterval, "silicon_vs_trt", "Silicon vs TRT holes ", 104,-3.5,100.5, 104,-3.5,100.5, "Silicon Combined holes", "TRT holes").ignore(); - + registerManHist( m_sct_vs_pixels, "InDetGlobal/Hits", detailsInterval, "sct_vs_pixels", "SCT vs Pixels holes ", 104,-3.5,100.5, 104,-3.5,100.5, "SCT", "Pixels").ignore(); - + registerManHist( m_holes_quality, "InDetGlobal/Hits", detailsInterval, "holes_quality", "Number of holes/track vs #chi^{2}/ndf", 160,-0.5,15.5, 104,-3.5,100.5, - "#chi^{2}/ndf", "Combined Holes").ignore(); - + "#chi^{2}/ndf", "Combined Holes").ignore(); + registerManHist( m_holes_eta_phi, "InDetGlobal/Hits", detailsInterval, "holes_eta_phi", "Holes Map #eta #phi", m_nBinsEta,-m_c_etaRange,m_c_etaRange, m_nBinsPhi,-M_PI,M_PI, "#eta", "#phi").ignore(); - - + + registerManHist( m_holes_eta_pt, "InDetGlobal/Hits", detailsInterval, "holes_eta_pt", "Holes #eta vs p_{t}", m_nBinsEta,-m_c_etaRange,m_c_etaRange, 30,-0.,30., "#eta", "#p_{t}").ignore(); - + registerManHist( m_holes_phi_pt, "InDetGlobal/Hits", detailsInterval, "holes_phi_pt", "Holes #phi vs p_{t}", m_nBinsPhi,-M_PI,M_PI, 30,-0.,30., "#phi", "#p_{t}").ignore(); - + registerManHist( m_holes_eta_phi_n, "InDetGlobal/Hits", detailsInterval, "holes_eta_phi_n", "Holes Map (Norm) #eta #phi", m_nBinsEta,-m_c_etaRange,m_c_etaRange, m_nBinsPhi,-M_PI,M_PI, "#eta", "#phi").ignore(); - + registerManHist( m_holes_quality_profile, "InDetGlobal/Hits", detailsInterval, "holes_quality_profile", "#chi^{2}/ndf vs Number of holes/track profile", 104,-3.5,100.5, @@ -559,8 +559,8 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() m_holes_quality_profile->SetErrorOption("S"); m_holes_quality_profile->SetMaximum( 1000 ); m_holes_quality_profile->SetMinimum( 0 ); - - + + registerManHist( m_holes_hits, "InDetGlobal/Hits", detailsInterval, "holes_hits", "Number of holes vs number of hits per track Combined", 101,-0.5,100.5, @@ -568,43 +568,43 @@ StatusCode InDetGlobalTrackMonTool::bookHistograms() m_holes_hits->SetErrorOption("S"); m_holes_hits->SetMaximum( 1000 ); m_holes_hits->SetMinimum( -10 ); - + registerManHist( m_holesvshits, "InDetGlobal/Hits", detailsInterval, "holesvshits","Number of Holes/track vs Number of Hits/track if holes >0 ", 101,-0.5,100.5, 101,-0.5,100.5, "nb. of hits/track", "nb holes/track").ignore(); - + registerManHist( m_holesvshits_ECA, "InDetGlobal/Hits", detailsInterval, "holesvshits_ECA", "Number of Holes/track vs Number of Hits/track if holes >0 EndCap A", 101,-0.5,100.5, - 101,-0.5,100.5, - "nb. of hits/track", "nb holes/track").ignore(); - + 101,-0.5,100.5, + "nb. of hits/track", "nb holes/track").ignore(); + registerManHist( m_holesvshits_ECC, "InDetGlobal/Hits", detailsInterval, "holesvshits_ECC", "Number of Holes/track vs Number of Hits/track if holes >0 EndCap C", 101,-0.5,100.5, 101,-0.5,100.5, "nb. of hits/track", "nb holes/track").ignore(); - + registerManHist( m_holesvshits_BA, "InDetGlobal/Hits", detailsInterval, "holesvshits_BA", "Number of Holes/track vs Number of Hits/track if holes >0 BARREL", 101,-0.5,100.5, 101,-0.5,100.5, "nb. of hits/track", "nb holes/track").ignore(); - + registerManHist( m_HolesMAP_XY, "InDetGlobal/Hits", detailsInterval, "HolesMAP_XY", "Map of ID holes x vs y (mm)", 400,-1100,1100, 400,-1100,1100, "X [mm]", "Y [mm]").ignore(); - + registerManHist( m_HolesMAP_ZR, "InDetGlobal/Hits", detailsInterval, "HolesMAP_ZR", "Map of ID holes z vs r (mm)", 3000,-3100,3100, 1100,0,1100, - "Z [mm]", "R [mm]").ignore(); - + "Z [mm]", "R [mm]").ignore(); + registerManHist( m_HolesMAP_ZX, "InDetGlobal/Hits", detailsInterval, "HolesMAP_ZX", "Map of ID holes z vs x (mm)", 1000,-3100,3100, @@ -622,8 +622,8 @@ StatusCode InDetGlobalTrackMonTool::bookHistogramsRecurrent() } /*---------------------------------------------------------*/ -StatusCode InDetGlobalTrackMonTool::fillHistograms() -{ +StatusCode InDetGlobalTrackMonTool::fillHistograms() +{ SG::ReadHandle<TrackCollection> combined_tracks(m_CombinedTracksName); if ( !combined_tracks.isValid() ) { @@ -636,7 +636,7 @@ StatusCode InDetGlobalTrackMonTool::fillHistograms() int nNoIBL = 0; int nNoBL = 0; int nNoTRText = 0; - + TrackCollection::const_iterator itrack = combined_tracks->begin(); TrackCollection::const_iterator itrack_end = combined_tracks->end(); for ( ; itrack!= itrack_end; ++itrack) @@ -647,30 +647,30 @@ StatusCode InDetGlobalTrackMonTool::fillHistograms() ATH_MSG_DEBUG( "NULL track pointer in collection" ); continue; } - + // Skip tracks that are not inside out if ( ( m_dataType == AthenaMonManager::collisions || m_dataType == AthenaMonManager::userDefined ) - && ! ( track->info().patternRecoInfo( Trk::TrackInfo::SiSPSeededFinder ) || + && ! ( track->info().patternRecoInfo( Trk::TrackInfo::SiSPSeededFinder ) || track->info().patternRecoInfo( Trk::TrackInfo::SiSpacePointsSeedMaker_HeavyIon ) ) ) continue; - + if ( ! m_baseline_selTool->accept(*track) ) continue; - + // Create a new summary or get copy of the cached one std::unique_ptr<const Trk::TrackSummary> summary(m_trkSummaryTool->summary( * track ) ); - + if ( !summary ) { ATH_MSG_DEBUG( "NULL pointer to track summary" ); continue; } - + nBase++; - + FillHits( track, summary ); FillEtaPhi( track , summary ); - + if ( m_doIBL ) { if ( summary->get( Trk::expectInnermostPixelLayerHit ) && !summary->get( Trk::numberOfInnermostPixelLayerHits ) ) @@ -683,7 +683,7 @@ StatusCode InDetGlobalTrackMonTool::fillHistograms() m_Trk_noIBLhits_frac_LB->Fill( m_manager->lumiBlockNumber(), 0 ); } } - + if ( summary->get( ( m_doIBL ) ? Trk::expectNextToInnermostPixelLayerHit : Trk::expectInnermostPixelLayerHit ) && !summary->get( ( m_doIBL ) ? Trk::numberOfNextToInnermostPixelLayerHits : Trk::numberOfInnermostPixelLayerHits ) ) { nNoBL++; @@ -702,36 +702,36 @@ StatusCode InDetGlobalTrackMonTool::fillHistograms() { m_Trk_noTRText_frac_LB->Fill(m_manager->lumiBlockNumber(), 0); } - + if ( m_tight_selTool->accept(*track) ) { nTight++; - } - - if ( m_doHitMaps ) + } + + if ( m_doHitMaps ) { FillHitMaps( track ); } - - if ( m_doHolePlots ) + + if ( m_doHolePlots ) { FillHoles( track, summary ); } - + m_Trk_Base->Fill( nBase ); m_Trk_nBase_LB->Fill( m_manager->lumiBlockNumber(), nBase ); m_Trk_nTight_LB->Fill( m_manager->lumiBlockNumber(), nTight ); if ( m_doIBL ) m_Trk_noIBLhits_LB->Fill( m_manager->lumiBlockNumber(), nNoIBL ); - + m_Trk_noBLhits_LB->Fill( m_manager->lumiBlockNumber(), nNoBL ); m_Trk_noTRText_LB->Fill( m_manager->lumiBlockNumber(), nNoTRText ); } - + if ( m_doTide ) FillTIDE(); - + if ( m_doForwardTracks ) { SG::ReadHandle<TrackCollection> forward_tracks(m_ForwardTracksName); @@ -742,7 +742,7 @@ StatusCode InDetGlobalTrackMonTool::fillHistograms() ATH_MSG_DEBUG( "No combined tracks in StoreGate " + m_ForwardTracksName.key() ); return StatusCode::SUCCESS; } - + TrackCollection::const_iterator iftrack = forward_tracks->begin(); TrackCollection::const_iterator iftrack_end = forward_tracks->end(); for ( ; iftrack!= iftrack_end; ++iftrack) @@ -753,20 +753,20 @@ StatusCode InDetGlobalTrackMonTool::fillHistograms() ATH_MSG_DEBUG( "NULL track pointer in collection" ); continue; } - + // Create a new summary or get copy of the cached one std::unique_ptr<const Trk::TrackSummary> summary( m_trkSummaryTool->summary( * track ) ); - + if ( !summary ) { ATH_MSG_DEBUG( "NULL pointer to track summary" ); continue; } - + FillForwardTracks( track , summary ); } } - } + } return StatusCode::SUCCESS; } @@ -784,7 +784,7 @@ void InDetGlobalTrackMonTool::FillHits( const Trk::Track *track, const std::uniq int sctHits = (summary->get(Trk::numberOfSCTHits) >= 0 ? summary->get(Trk::numberOfSCTHits) : 0) + (summary->get(Trk::numberOfSCTDeadSensors) >= 0 ? summary->get(Trk::numberOfSCTDeadSensors) : 0 ); int trtHits = summary->get(Trk::numberOfTRTHits) + summary->get(Trk::numberOfTRTDeadStraws); - + const Trk::Perigee *perigee = track->perigeeParameters(); if ( !perigee ) return; @@ -794,9 +794,9 @@ void InDetGlobalTrackMonTool::FillHits( const Trk::Track *track, const std::uniq m_trk_hits_eta_phi[0]->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], summary->get( Trk::numberOfInnermostPixelLayerHits ) ); m_trk_hits_LB[0]->Fill( m_manager->lumiBlockNumber(), summary->get( Trk::numberOfInnermostPixelLayerHits ) ); } - + m_trk_hits_eta_phi[1]->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], pixHits ); - m_trk_disabled_eta_phi[1]->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], + m_trk_disabled_eta_phi[1]->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], ( summary->get(Trk::numberOfPixelDeadSensors) >= 0 ) ? summary->get(Trk::numberOfPixelDeadSensors) : 0 ); m_trk_hits_LB[1]->Fill( m_manager->lumiBlockNumber(), pixHits ); m_trk_shared_pix_eta_phi->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], @@ -805,28 +805,28 @@ void InDetGlobalTrackMonTool::FillHits( const Trk::Track *track, const std::uniq ( summary->get(Trk::numberOfPixelHoles) >= 0 ) ? summary->get(Trk::numberOfPixelHoles) : 0 ); m_trk_split_pix_eta_phi->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], ( summary->get(Trk::numberOfPixelSplitHits) >= 0 ) ? summary->get(Trk::numberOfPixelSplitHits) : 0 ); - + m_trk_hits_eta_phi[2]->Fill( perigee->eta(), perigee->parameters()[Trk::phi0],sctHits ); - m_trk_disabled_eta_phi[2]->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], + m_trk_disabled_eta_phi[2]->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], ( summary->get(Trk::numberOfSCTDeadSensors) >= 0 ) ? summary->get(Trk::numberOfSCTDeadSensors) : 0 ) ; m_trk_hits_LB[2]->Fill( m_manager->lumiBlockNumber(), sctHits ); m_trk_shared_sct_eta_phi->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], ( summary->get(Trk::numberOfSCTSharedHits) >= 0 ) ? summary->get(Trk::numberOfSCTSharedHits) : 0 ); - + m_trk_holes_sct_eta_phi->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], ( summary->get(Trk::numberOfSCTHoles) >= 0 ) ? summary->get(Trk::numberOfSCTHoles) : 0 ); - + m_trk_hits_eta_phi[3]->Fill( perigee->eta(), perigee->parameters()[Trk::phi0],trtHits ); - m_trk_disabled_eta_phi[3]->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], + m_trk_disabled_eta_phi[3]->Fill( perigee->eta(), perigee->parameters()[Trk::phi0], ( summary->get(Trk::numberOfTRTDeadStraws) >= 0 ) ? summary->get(Trk::numberOfTRTDeadStraws) : 0 ); m_trk_hits_LB[3]->Fill( m_manager->lumiBlockNumber(), trtHits ); -} +} void InDetGlobalTrackMonTool::FillEtaPhi( const Trk::Track *track, const std::unique_ptr<const Trk::TrackSummary> & summary ) { if ( ! track || ! summary ) return; - + const Trk::Perigee *perigee = track->perigeeParameters(); float eta = perigee->eta(); float phi = perigee->parameters()[Trk::phi0]; @@ -845,7 +845,7 @@ void InDetGlobalTrackMonTool::FillEtaPhi( const Trk::Track *track, const std::un { m_Trk_eta_phi_noIBLhit_ratio->Fill( eta, phi, 0 ); } - + /// Next-to-innermost if ( summary->get( Trk::expectNextToInnermostPixelLayerHit ) && !summary->get( Trk::numberOfNextToInnermostPixelLayerHits ) ) { @@ -867,14 +867,14 @@ void InDetGlobalTrackMonTool::FillEtaPhi( const Trk::Track *track, const std::un m_Trk_eta_phi_noBLhit_ratio->Fill( eta, phi, 0 ); } } - + // No TRT extension if ( summary->get(Trk::numberOfTRTHits) == 0 ) m_Trk_eta_phi_noTRText_ratio->Fill( eta, phi, 1 ); else m_Trk_eta_phi_noTRText_ratio->Fill( eta, phi, 0 ); } - + m_Trk_eta_phi_Tight->Fill( eta, phi); /// TRACKSEL: Tight @@ -897,12 +897,12 @@ void InDetGlobalTrackMonTool::FillForwardTracks( const Trk::Track *track, const { float eta = perigee->eta(); float phi = perigee->parameters()[Trk::phi0]; - + if ( eta > 0. ) { m_Trk_FORW_FA_eta_phi->Fill( eta, phi ); m_Trk_FORW_FA_nPIXhits->Fill ( summary->get(Trk::numberOfPixelHits) + summary->get(Trk::numberOfPixelDeadSensors) ); - } + } else { m_Trk_FORW_FC_eta_phi->Fill( eta, phi ); @@ -911,11 +911,11 @@ void InDetGlobalTrackMonTool::FillForwardTracks( const Trk::Track *track, const m_Trk_FORW_qoverp->Fill( perigee->parameters()[Trk::qOverP] *1000.0 ); } - + if ( track->fitQuality() && track->fitQuality()->numberDoF() > 0 ) m_Trk_FORW_chi2->Fill(track->fitQuality()->chiSquared()/track->fitQuality()->numberDoF()); - - return; + + return; } void InDetGlobalTrackMonTool::FillTIDE() @@ -927,18 +927,18 @@ void InDetGlobalTrackMonTool::FillTIDE() { if ( (*jetItr)->pt() < 20000. ) continue; - + std::vector<const xAOD::IParticle*> trackVector; if ( !(*jetItr)->getAssociatedObjects<xAOD::IParticle>(xAOD::JetAttribute::GhostTrack, trackVector) ) continue; - + for ( std::vector<const xAOD::IParticle*>::const_iterator trkItr = trackVector.begin(); trkItr != trackVector.end() ; trkItr++ ) { const xAOD::TrackParticle* trackPart = dynamic_cast<const xAOD::TrackParticle*>(*trkItr); if ( !trackPart ) continue; - + uint8_t split; uint8_t shared; uint8_t pix; @@ -964,8 +964,8 @@ void InDetGlobalTrackMonTool::FillTIDE() } if ( foundVertex ) { - std::unique_ptr<const Trk::ImpactParametersAndSigma>myIPandSigma( - m_trackToVertexIPEstimator->estimate(trackPart, + std::unique_ptr<const Trk::ImpactParametersAndSigma>myIPandSigma( + m_trackToVertexIPEstimator->estimate(trackPart, foundVertex )); if ( myIPandSigma ) { @@ -980,47 +980,49 @@ void InDetGlobalTrackMonTool::FillTIDE() m_trk_jetassoc_split_pix_dr->Fill( trackPart->p4().DeltaR( (*jetItr)->p4() ), frac ); m_trk_jetassoc_split_pix_lb->Fill( m_manager->lumiBlockNumber(), frac ); } - + if ( trackPart->summaryValue( shared, xAOD::numberOfPixelSharedHits) ) { float frac = (float)shared / pix; m_trk_jetassoc_shared_pix_dr->Fill( trackPart->p4().DeltaR( (*jetItr)->p4() ), frac ); m_trk_jetassoc_shared_pix_lb->Fill( m_manager->lumiBlockNumber(), frac ); } - + if ( m_doTideResiduals ) { auto track = trackPart->track(); if ( ! track ) continue; - + const DataVector<const Trk::TrackStateOnSurface>* trackStates = track->trackStateOnSurfaces(); if ( trackStates == 0 ) return; - + DataVector<const Trk::TrackStateOnSurface>::const_iterator it = trackStates->begin(); DataVector<const Trk::TrackStateOnSurface>::const_iterator it_end = trackStates->end(); for (;it!=it_end; ++it) { const Trk::TrackStateOnSurface* tsos=(*it); - + if (tsos == 0) continue; - + //SILICON (SCT + Pixel) const InDet::SiClusterOnTrack *clus = dynamic_cast<const InDet::SiClusterOnTrack*>( tsos->measurementOnTrack() ); if ( !clus ) continue; - + const InDet::SiCluster *RawDataClus = dynamic_cast<const InDet::SiCluster*>(clus->prepRawData()); if (!RawDataClus) continue; - + if ( RawDataClus->detectorElement()->isPixel() ) { const Trk::RIO_OnTrack* hit = dynamic_cast <const Trk::RIO_OnTrack*>( tsos->measurementOnTrack() ); - + if (hit && tsos->trackParameters()) { const Trk::TrackParameters* PropagatedTrackParams = tsos->trackParameters()->clone(); - const Trk::TrackParameters* UnbiasedTrackParams = m_iUpdator->removeFromState(*PropagatedTrackParams, tsos->measurementOnTrack()->localParameters(), tsos->measurementOnTrack()->localCovariance()); + const Trk::TrackParameters* UnbiasedTrackParams = m_iUpdator->removeFromState(*PropagatedTrackParams, + tsos->measurementOnTrack()->localParameters(), + tsos->measurementOnTrack()->localCovariance()).release(); delete PropagatedTrackParams; if ( !UnbiasedTrackParams ) if(msgLvl(MSG::WARNING)) msg(MSG::WARNING) << "RemoveFromState did not work, using original TrackParameters" << endmsg; - + const Trk::ResidualPull * residualPull = m_residualPullCalculator->residualPull(tsos->measurementOnTrack(), ( UnbiasedTrackParams ) ? UnbiasedTrackParams:tsos->trackParameters(), Trk::ResidualPull::Unbiased); if (residualPull) { { @@ -1071,7 +1073,7 @@ void InDetGlobalTrackMonTool::FillTIDE() ATH_MSG_WARNING( "Unable to get jets, turning TIDE plots off!" ); m_doTide = false; } - + return; } @@ -1079,14 +1081,14 @@ void InDetGlobalTrackMonTool::FillHitMaps( const Trk::Track *track ) { const DataVector<const Trk::TrackStateOnSurface>* trackStates = track->trackStateOnSurfaces(); if ( trackStates == 0 ) return; - + DataVector<const Trk::TrackStateOnSurface>::const_iterator it = trackStates->begin(); DataVector<const Trk::TrackStateOnSurface>::const_iterator it_end = trackStates->end(); for (;it!=it_end; ++it) { const Trk::TrackStateOnSurface* trackState=(*it); - + if (trackState == 0) continue; - + //TRT const InDet::TRT_DriftCircleOnTrack *trtcircle = dynamic_cast<const InDet::TRT_DriftCircleOnTrack*>(trackState->measurementOnTrack()); if ( trtcircle ) @@ -1106,11 +1108,11 @@ void InDetGlobalTrackMonTool::FillHitMaps( const Trk::Track *track ) break; } } - + //SILICON (SCT + Pixel) const InDet::SiClusterOnTrack *clus = dynamic_cast<const InDet::SiClusterOnTrack*>( trackState->measurementOnTrack() ); if ( !clus ) continue; - + const InDet::SiCluster *RawDataClus = dynamic_cast<const InDet::SiCluster*>(clus->prepRawData()); if (!RawDataClus) continue; @@ -1126,7 +1128,7 @@ void InDetGlobalTrackMonTool::FillHitMaps( const Trk::Track *track ) m_ID_hitmap_x_y_eca->Fill( clus->globalPosition()[0], clus->globalPosition()[1] ); break; } - + }else{ switch ( m_pixelID->barrel_ec( RawDataClus->identify() ) ) { case -2: @@ -1150,13 +1152,13 @@ void InDetGlobalTrackMonTool::FillHoles( const Trk::Track * track, const std::un int pixelh = summary->get(Trk::numberOfPixelHoles) >= 0 ? summary->get(Trk::numberOfPixelHoles) : 0; int scth = summary->get(Trk::numberOfSCTHoles) >= 0 ? summary->get(Trk::numberOfSCTHoles) : 0; int trth = summary->get(Trk::numberOfTRTHoles) >= 0 ? summary->get(Trk::numberOfTRTHoles) : 0; - - // Gaetano Added : + + // Gaetano Added : m_pixel_holes->Fill(summary->get(Trk::numberOfPixelHoles)); m_sct_holes->Fill(summary->get(Trk::numberOfSCTHoles)); m_trt_holes->Fill(summary->get(Trk::numberOfTRTHoles)); - - // Filling Combined Holes and Excluding # holes = -1 case Tracks on surface does not exist + + // Filling Combined Holes and Excluding # holes = -1 case Tracks on surface does not exist if (summary->get(Trk::numberOfPixelHoles)>=0) m_comb_holes->Fill(pixelh); @@ -1167,58 +1169,58 @@ void InDetGlobalTrackMonTool::FillHoles( const Trk::Track * track, const std::un m_comb_holes->Fill(trth); m_silicon_vs_trt->Fill(pixelh+scth,trth); - m_sct_vs_pixels->Fill(scth,pixelh); - + m_sct_vs_pixels->Fill(scth,pixelh); + if ( track->fitQuality() && track->fitQuality()->numberDoF() > 0 ){ m_holes_quality->Fill(track->fitQuality()->chiSquared()/track->fitQuality()->numberDoF(),pixelh+scth+trth); m_holes_quality_profile->Fill(scth+trth+pixelh,track->fitQuality()->chiSquared()/track->fitQuality()->numberDoF()); } - - // Filling Number of holes vs number of hits for tracks with at least a hole. + + // Filling Number of holes vs number of hits for tracks with at least a hole. if (scth >0 || trth >0 || pixelh >0) { m_holes_hits->Fill(summary->get(Trk::numberOfTRTHits)+summary->get(Trk::numberOfSCTHits) + summary->get(Trk::numberOfSCTDeadSensors)+summary->get(Trk::numberOfPixelHits) + summary->get(Trk::numberOfPixelDeadSensors),scth+trth+pixelh); m_holesvshits->Fill(summary->get(Trk::numberOfTRTHits)+summary->get(Trk::numberOfSCTHits) + summary->get(Trk::numberOfSCTDeadSensors)+summary->get(Trk::numberOfPixelHits) + summary->get(Trk::numberOfPixelDeadSensors),scth+trth+pixelh); } // Here The Perigee Parameters of Holes - const Trk::Perigee *perigee = dynamic_cast<const Trk::Perigee *>(track->perigeeParameters()); - + const Trk::Perigee *perigee = dynamic_cast<const Trk::Perigee *>(track->perigeeParameters()); + m_holes_eta_phi_n->Fill( perigee->eta(),perigee->parameters()[Trk::phi],scth+pixelh/(summary->get(Trk::numberOfTRTHits)+summary->get(Trk::numberOfSCTHits) + summary->get(Trk::numberOfSCTDeadSensors)+summary->get(Trk::numberOfPixelHits) + summary->get(Trk::numberOfPixelDeadSensors))); - + m_holes_eta_phi->Fill( perigee->eta(),perigee->parameters()[Trk::phi]); m_holes_eta_pt->Fill(perigee->eta(),perigee->pT()/1000.0,scth+pixelh); m_holes_phi_pt->Fill(perigee->parameters()[Trk::phi],perigee->pT()/1000.0,scth+pixelh); - - // Filling holes vs hits in eta bins + + // Filling holes vs hits in eta bins if (scth >0 || trth >0 || pixelh >0){ // Filling ECA if (perigee->eta()>=-2.5 && perigee->eta()<=-1.5) { m_holesvshits_ECA->Fill(summary->get(Trk::numberOfTRTHits)+summary->get(Trk::numberOfSCTHits) + summary->get(Trk::numberOfSCTDeadSensors)+summary->get(Trk::numberOfPixelHits) + summary->get(Trk::numberOfPixelDeadSensors),scth+pixelh+trth); } - + if (perigee->eta()>=-1.5 && perigee->eta()<=1.5) { m_holesvshits_BA->Fill(summary->get(Trk::numberOfTRTHits)+summary->get(Trk::numberOfSCTHits) + summary->get(Trk::numberOfSCTDeadSensors)+summary->get(Trk::numberOfPixelHits) + summary->get(Trk::numberOfPixelDeadSensors),scth+pixelh+trth); } - - + + if (perigee->eta()>=1.5 && perigee->eta()<=2.5) { m_holesvshits_ECC->Fill(summary->get(Trk::numberOfTRTHits)+summary->get(Trk::numberOfSCTHits) + summary->get(Trk::numberOfSCTDeadSensors)+summary->get(Trk::numberOfPixelHits) + summary->get(Trk::numberOfPixelDeadSensors),scth+pixelh+trth); } } - + if (m_DoHoles_Search) FillHoleMaps(track); - + return; } void InDetGlobalTrackMonTool::FillHoleMaps( const Trk::Track *track ) { std::unique_ptr<const DataVector<const Trk::TrackStateOnSurface> > holesOnTrack( m_holes_search_tool->getHolesOnTrack(*track,track->info().particleHypothesis()) ); - + // loop over holes if (!holesOnTrack) { msg(MSG::WARNING) << "Got no holes on track" << endmsg; - } else { + } else { for (DataVector<const Trk::TrackStateOnSurface>::const_iterator it=holesOnTrack->begin(); it!=holesOnTrack->end(); it++) { @@ -1226,16 +1228,16 @@ void InDetGlobalTrackMonTool::FillHoleMaps( const Trk::Track *track ) msg(MSG::WARNING) << "TrackStateOnSurface from hole search tool == Null" << endmsg; continue; } - // Here The X Y Z of Holes + // Here The X Y Z of Holes const Trk::TrackParameters *clus =(*it)->trackParameters() ; - if (clus){ + if (clus){ m_HolesMAP_XY->Fill(clus->position()[0],clus->position()[1]); m_HolesMAP_ZX->Fill( clus->position()[2], clus->position()[0]); - m_HolesMAP_ZR->Fill(clus->position()[2], sqrt( pow( clus->position()[0], 2) + pow( clus->position()[1], 2) )); - - } - } + m_HolesMAP_ZR->Fill(clus->position()[2], sqrt( pow( clus->position()[0], 2) + pow( clus->position()[1], 2) )); + + } + } } - + return; } diff --git a/InnerDetector/InDetMonitoring/SCT_Monitoring/src/SCTTracksMonAlg.cxx b/InnerDetector/InDetMonitoring/SCT_Monitoring/src/SCTTracksMonAlg.cxx index 9997ee98a6b0e0cda8174e23cbea0cf603ba57ae..4e8414a3ee35d2e7e2a09115b506b11b3e9a42bb 100644 --- a/InnerDetector/InDetMonitoring/SCT_Monitoring/src/SCTTracksMonAlg.cxx +++ b/InnerDetector/InDetMonitoring/SCT_Monitoring/src/SCTTracksMonAlg.cxx @@ -47,7 +47,7 @@ namespace { } SCTTracksMonAlg::SCTTracksMonAlg(const std::string& name, ISvcLocator* pSvcLocator) :AthMonitorAlgorithm(name, pSvcLocator) { - + } StatusCode SCTTracksMonAlg::initialize(){ @@ -66,8 +66,8 @@ StatusCode SCTTracksMonAlg::initialize(){ } StatusCode SCTTracksMonAlg::fillHistograms(const EventContext& ctx) const{ - -ATH_MSG_DEBUG("SCTTracksMonAlg::fillHistograms()"); + +ATH_MSG_DEBUG("SCTTracksMonAlg::fillHistograms()"); const bool doThisSubsystem[N_REGIONS] = { m_doNegativeEndcap, true, m_doPositiveEndcap @@ -77,14 +77,14 @@ ATH_MSG_DEBUG("SCTTracksMonAlg::fillHistograms()"); if (m_doTrigger and (not checkTriggers(firedTriggers).isSuccess())) { ATH_MSG_WARNING("Triggers not found!"); } - SG::ReadHandle<TrackCollection> tracks{m_tracksName,ctx}; + SG::ReadHandle<TrackCollection> tracks{m_tracksName,ctx}; if (not tracks.isValid()) { ATH_MSG_WARNING("No collection named " << m_tracksName.key() << " in StoreGate"); return StatusCode::SUCCESS; } - ATH_MSG_DEBUG("Begin loop over " << tracks->size() << " tracks"); + ATH_MSG_DEBUG("Begin loop over " << tracks->size() << " tracks"); int goodTrks_N{0}; int local_tot_trkhits{0}; for (const Trk::Track* track: *tracks) { @@ -103,10 +103,10 @@ ATH_MSG_DEBUG("SCTTracksMonAlg::fillHistograms()"); if (trkSum) { scthits_on_trk = trkSum->get(Trk::numberOfSCTHits); } else { - ATH_MSG_WARNING("TrackSummary not found not using track!"); + ATH_MSG_WARNING("TrackSummary not found not using track!"); } if (scthits_on_trk < m_trackHitCut) { - ATH_MSG_DEBUG("track fails minimum SCT hit requirement"); + ATH_MSG_DEBUG("track fails minimum SCT hit requirement"); break; } goodTrks_N++; @@ -119,12 +119,12 @@ ATH_MSG_DEBUG("SCTTracksMonAlg::fillHistograms()"); } double trackPerigeeTheta{track->perigeeParameters()->parameters()[Trk::theta]}; double trackPerigeeEta{-log(tan(0.5 * trackPerigeeTheta))}; - auto tracksPerRegionAcc{Monitored::Scalar<float>("tracksPerRegion", etaRegion(trackPerigeeEta))}; + auto tracksPerRegionAcc{Monitored::Scalar<float>("tracksPerRegion", etaRegion(trackPerigeeEta))}; fill("SCTTracksMonitor", tracksPerRegionAcc); auto trk_etaAcc{Monitored::Scalar<float>("trk_eta", trackPerigeeEta)}; - fill("SCTTracksMonitor", trk_etaAcc); + fill("SCTTracksMonitor", trk_etaAcc); if (track->perigeeParameters()->parameters()[Trk::qOverP] != 0.) { auto trk_ptAcc{Monitored::Scalar<float>("trk_pt", std::abs(1. / (track->perigeeParameters()->parameters()[Trk::qOverP] * 1000.)))}; @@ -137,7 +137,7 @@ ATH_MSG_DEBUG("SCTTracksMonAlg::fillHistograms()"); auto trk_phiAcc{Monitored::Scalar<float>("trk_phi", track->perigeeParameters()->parameters()[Trk::phi])}; fill("SCTTracksMonitor", trk_phiAcc); - if (m_doTrigger) { + if (m_doTrigger) { for (int trig{0}; trig < N_TRIGGER_TYPES; ++trig) { if (hasTriggerFired(trig, firedTriggers)) { auto trackTriggerAcc{Monitored::Scalar<int>("trackTriggers", trig)}; @@ -177,7 +177,11 @@ ATH_MSG_DEBUG("SCTTracksMonAlg::fillHistograms()"); #endif if (m_doUnbiasedCalc) { if (trkParam) { - trkParameters.reset(m_updator->removeFromState(*trkParam, rio->localParameters(), rio->localCovariance())); //need to take ownership of the returned pointer + trkParameters =m_updator->removeFromState(*trkParam, + rio->localParameters(), + rio->localCovariance()); + // need to take ownership of the returned + // pointer if (trkParameters) { trkParam = trkParameters.get(); } diff --git a/InnerDetector/InDetMonitoring/SCT_Monitoring/src/SCTTracksMonTool.cxx b/InnerDetector/InDetMonitoring/SCT_Monitoring/src/SCTTracksMonTool.cxx index 2f70b02c9b3cc745d695463635746bf5844516c3..1f3e3de634ed58788e479103860e8a25b62d09b8 100644 --- a/InnerDetector/InDetMonitoring/SCT_Monitoring/src/SCTTracksMonTool.cxx +++ b/InnerDetector/InDetMonitoring/SCT_Monitoring/src/SCTTracksMonTool.cxx @@ -1,7 +1,5 @@ -// -*- C++ -*- - /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ /** @file SCTTracksMonTool.cxx @@ -119,7 +117,7 @@ SCTTracksMonTool::bookHistograms() { } // Booking Track related Histograms ATH_CHECK(bookGeneralHistos()); - + return StatusCode::SUCCESS; } @@ -196,7 +194,7 @@ SCTTracksMonTool::fillHistograms() { for (int trig{0}; trig < N_TRIGGER_TYPES; ++trig) { if (hasTriggerFired(trig, firedTriggers)) { m_trackTrigger->Fill(trig); - } + } } } bool hasHits[N_REGIONS] = { @@ -231,7 +229,9 @@ SCTTracksMonTool::fillHistograms() { #endif if (m_doUnbiasedCalc) { if (trkParam) { - trkParameters.reset(m_updator->removeFromState(*trkParam, rio->localParameters(), rio->localCovariance())); //need to take ownership of the returned pointer + trkParameters = m_updator->removeFromState( + *trkParam, rio->localParameters(), rio->localCovariance()); + // need to take ownership of the returned pointer if (trkParameters) { trkParam = trkParameters.get(); } @@ -340,7 +340,7 @@ SCTTracksMonTool::procHistograms() { StatusCode SCTTracksMonTool::checkHists(bool /*fromFinalize*/) { - + return StatusCode::SUCCESS; } @@ -381,7 +381,7 @@ SCTTracksMonTool::bookGeneralHistos() { ("Overall Residual Distribution for the "+regionNames[iReg]).c_str(), 100, -0.5, 0.5); m_totalResidual[iReg]->GetXaxis()->SetTitle("Residual [mm]"); - ATH_CHECK(Tracks.regHist(m_totalResidual[iReg])); + ATH_CHECK(Tracks.regHist(m_totalResidual[iReg])); m_totalPull[iReg] = new TH1F(("total"+regionNames[iReg]+"Pull").c_str(), ("Overall Pull Distribution for the "+regionNames[iReg]).c_str(), diff --git a/InnerDetector/InDetRecTools/SiCombinatorialTrackFinderTool_xk/src/SiCombinatorialTrackFinder_xk.cxx b/InnerDetector/InDetRecTools/SiCombinatorialTrackFinderTool_xk/src/SiCombinatorialTrackFinder_xk.cxx index ac146b88f79b5b0db7dd48419864bb39b382bf46..83014b3ba93c49fc0135f0920ae90a1ee1c130f0 100644 --- a/InnerDetector/InDetRecTools/SiCombinatorialTrackFinderTool_xk/src/SiCombinatorialTrackFinder_xk.cxx +++ b/InnerDetector/InDetRecTools/SiCombinatorialTrackFinderTool_xk/src/SiCombinatorialTrackFinder_xk.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -20,7 +20,6 @@ #include "TrkGeometry/MagneticFieldProperties.h" #include "TrkMeasurementBase/MeasurementBase.h" #include "TrkToolInterfaces/IPatternParametersUpdator.h" -#include "TrkToolInterfaces/IUpdator.h" #include "TrkTrack/TrackInfo.h" #include <iomanip> @@ -43,7 +42,7 @@ InDet::SiCombinatorialTrackFinder_xk::SiCombinatorialTrackFinder_xk /////////////////////////////////////////////////////////////////// StatusCode InDet::SiCombinatorialTrackFinder_xk::initialize() -{ +{ // Get RungeKutta propagator tool // if ( m_proptool.retrieve().isFailure() ) { @@ -71,7 +70,7 @@ StatusCode InDet::SiCombinatorialTrackFinder_xk::initialize() ATH_MSG_INFO("Retrieved tool " << m_riocreator); } - if (m_usePIX) { + if (m_usePIX) { if ( m_pixelCondSummaryTool.retrieve().isFailure() ) { ATH_MSG_FATAL("Failed to retrieve tool " << m_pixelCondSummaryTool); return StatusCode::FAILURE; @@ -93,8 +92,8 @@ StatusCode InDet::SiCombinatorialTrackFinder_xk::initialize() } } else { m_sctCondSummaryTool.disable(); - } - + } + // Get InDetBoundaryCheckTool if ( m_boundaryCheckTool.retrieve().isFailure() ) { ATH_MSG_FATAL("Failed to retrieve tool " << m_boundaryCheckTool); @@ -103,9 +102,9 @@ StatusCode InDet::SiCombinatorialTrackFinder_xk::initialize() else { ATH_MSG_INFO("Retrieved tool " << m_boundaryCheckTool); } - - + + // Setup callback for magnetic field // magneticFieldInit(); @@ -124,7 +123,7 @@ StatusCode InDet::SiCombinatorialTrackFinder_xk::initialize() // initialize conditions object key for field cache // ATH_CHECK( m_fieldCondObjInputKey.initialize() ); - + return StatusCode::SUCCESS; } @@ -165,8 +164,8 @@ MsgStream& InDet::SiCombinatorialTrackFinder_xk::dumpconditions(MsgStream& out) "ToroidalField" , "Grid3DField" , "RealisticField" , "UndefinedField", "AthenaField" , "?????" }; - int mode = m_fieldprop.magneticFieldMode(); - if (mode<0 || mode>8 ) mode = 8; + int mode = m_fieldprop.magneticFieldMode(); + if (mode<0 || mode>8 ) mode = 8; n = 62-fieldmode[mode].size(); std::string s3; @@ -248,7 +247,7 @@ MsgStream& InDet::SiCombinatorialTrackFinder_xk::dumpevent(SiCombinatorialTrackF <<" |"<<std::endl; out<<"| Number wrong DE roads | "<<std::setw(12)<<data.roadbug() <<" |"<<std::endl; - out<<"| Number output tracks | "<<std::setw(12)<<data.findtracks() + out<<"| Number output tracks | "<<std::setw(12)<<data.findtracks() <<" |"<<std::endl; out<<"|---------------------------------------------------------------------|" <<std::endl; @@ -256,7 +255,7 @@ MsgStream& InDet::SiCombinatorialTrackFinder_xk::dumpevent(SiCombinatorialTrackF } /////////////////////////////////////////////////////////////////// -// Initiate track finding tool +// Initiate track finding tool /////////////////////////////////////////////////////////////////// void InDet::SiCombinatorialTrackFinder_xk::newEvent(const EventContext& ctx, SiCombinatorialTrackFinderData_xk& data) const @@ -270,14 +269,14 @@ void InDet::SiCombinatorialTrackFinder_xk::newEvent(const EventContext& ctx, SiC data.inittracks() = 0; data.findtracks() = 0; data.roadbug() = 0; - + // Set track info // data.trackinfo().setPatternRecognitionInfo(Trk::TrackInfo::SiSPSeededFinder); data.cosmicTrack() = 0; // Add conditions object to SiCombinatorialTrackFinderData to be able to access the field cache for each new event - // Get conditions object for field cache + // Get conditions object for field cache SG::ReadCondHandle<AtlasFieldCacheCondObj> readHandle{m_fieldCondObjInputKey, ctx}; const AtlasFieldCacheCondObj* fieldCondObj{*readHandle}; if (fieldCondObj == nullptr) { @@ -294,7 +293,7 @@ void InDet::SiCombinatorialTrackFinder_xk::newEvent(const EventContext& ctx, SiC void InDet::SiCombinatorialTrackFinder_xk::newEvent (const EventContext& ctx, SiCombinatorialTrackFinderData_xk& data, Trk::TrackInfo info, const TrackQualityCuts& Cuts) const { - + if (not data.isInitialized()) { //Check if to use PRDAssociation before initializing all the tools int useasso; @@ -306,7 +305,7 @@ void InDet::SiCombinatorialTrackFinder_xk::newEvent newEvent(ctx, data); data.trackinfo() = info; - + /// Get track quality cuts information from argument and write it into /// the event data getTrackQualityCuts(data, Cuts); @@ -330,7 +329,7 @@ void InDet::SiCombinatorialTrackFinder_xk::endEvent(SiCombinatorialTrackFinderDa { if (not data.isInitialized()) initializeCombinatorialData(Gaudi::Hive::currentContext(), data); - // Print event information + // Print event information // if (m_outputlevel<=0) { data.nprint() = 1; @@ -356,7 +355,7 @@ const std::list<Trk::Track*>& InDet::SiCombinatorialTrackFinder_xk::getTracks data.statistic().fill(false); - /// turn off brem fit & electron flags + /// turn off brem fit & electron flags data.tools().setBremNoise(false, false); /// remove existing tracks data.tracks().erase(data.tracks().begin(), data.tracks().end()); @@ -372,7 +371,7 @@ const std::list<Trk::Track*>& InDet::SiCombinatorialTrackFinder_xk::getTracks ///try to find the tracks EStat_t FT = findTrack(data, Tp, Sp, Gp, DE, PT, ctx); - + /// if we didn't find anything, bail out if(FT!=Success) { data.statistic()[FT] = true; @@ -385,14 +384,14 @@ const std::list<Trk::Track*>& InDet::SiCombinatorialTrackFinder_xk::getTracks Trk::Track* t = convertToTrack(data); ++data.findtracks(); - if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); + if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); data.tracks().push_back(t); if (!data.tools().multiTrack() || data.simpleTrack() || Sp.size()<=2 || data.cosmicTrack() || data.trajectory().pTfirst() < data.tools().pTmin()) return data.tracks(); while ((t=convertToNextTrack(data))) { ++data.findtracks(); - if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); + if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); data.tracks().push_back(t); } return data.tracks(); @@ -428,7 +427,7 @@ const std::list<Trk::Track*>& InDet::SiCombinatorialTrackFinder_xk::getTracks data.statistic()[FT] = true; return data.tracks(); } - if (!data.trajectory().isNewTrack(PT)) + if (!data.trajectory().isNewTrack(PT)) { data.statistic()[NotNewTrk] = true; return data.tracks(); @@ -439,7 +438,7 @@ const std::list<Trk::Track*>& InDet::SiCombinatorialTrackFinder_xk::getTracks // Trk::Track* t = convertToTrack(data); if (t==nullptr) return data.tracks(); - if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); + if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); ++data.findtracks(); data.tracks().push_back(t); @@ -447,15 +446,15 @@ const std::list<Trk::Track*>& InDet::SiCombinatorialTrackFinder_xk::getTracks if (!data.tools().multiTrack() || data.simpleTrack() || Sp.size()<=2 || data.cosmicTrack() || data.trajectory().pTfirst() < data.tools().pTmin()) return data.tracks(); while ((t=convertToNextTrack(data))) { - if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); + if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); ++data.findtracks(); data.tracks().push_back(t); - } + } return data.tracks(); } /////////////////////////////////////////////////////////////////// -// Main method for track finding using space points and +// Main method for track finding using space points and // using electron noise model /////////////////////////////////////////////////////////////////// @@ -489,7 +488,7 @@ const std::list<Trk::Track*>& InDet::SiCombinatorialTrackFinder_xk::getTracksWi } EStat_t FT = findTrack(data,Tp,Sp,Gp,DE,PT,ctx); - + bool Q = (FT==Success); if (Q){ Q = data.trajectory().isNewTrack(PT); @@ -510,16 +509,16 @@ const std::list<Trk::Track*>& InDet::SiCombinatorialTrackFinder_xk::getTracksWi data.tools().setMultiTracks(mult,Xi2m); if (!t) return data.tracks(); - if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); + if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); ++data.findtracks(); data.tracks().push_back(t); na = data.trajectory().nclusters(); if (na >=12 && !data.trajectory().nclustersNoAdd()) return data.tracks(); - + if (data.trajectory().pTfirst() < data.pTminBrem()) return data.tracks(); } if ((*Sp.begin())->clusterList().second) return data.tracks(); - + // Repeat track finding using electron noise model // data.statistic()[BremAttempt] = true; @@ -533,10 +532,10 @@ const std::list<Trk::Track*>& InDet::SiCombinatorialTrackFinder_xk::getTracksWi } if (!data.trajectory().isNewTrack(PT)) { data.statistic()[NotNewTrk] = true; return data.tracks(); } - + int nb = data.trajectory().nclusters(); if (nb <= na) return data.tracks(); - + data.trajectory().sortStep(); // Trk::Track production @@ -552,7 +551,7 @@ const std::list<Trk::Track*>& InDet::SiCombinatorialTrackFinder_xk::getTracksWi data.tools().setMultiTracks(mult, Xi2m); if (t==nullptr) return data.tracks(); - if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); + if (m_writeHolesFromPattern) data.addPatternHoleSearchOutcome(t,data.trajectory().getHoleSearchResult()); ++data.findtracks(); data.tracks().push_back(t); @@ -571,7 +570,7 @@ InDet::SiCombinatorialTrackFinder_xk::EStat_t InDet::SiCombinatorialTrackFinder_ std::multimap<const Trk::PrepRawData*,const Trk::Track*>& PT, const EventContext& ctx) const { - /// init event data + /// init event data if (not data.isInitialized()) initializeCombinatorialData(ctx, data); /// populate a list of boundary links for the detector elements on our search road @@ -594,10 +593,10 @@ InDet::SiCombinatorialTrackFinder_xk::EStat_t InDet::SiCombinatorialTrackFinder_ /// Cluster list preparationn std::list<const InDet::SiCluster*> Cl; - bool isTwoPointSeed = false; + bool isTwoPointSeed = false; - /// in inside-out track finding, Sp.size() is typically 3 - /// for TRT-seeded backtracking, it is 2 + /// in inside-out track finding, Sp.size() is typically 3 + /// for TRT-seeded backtracking, it is 2 /// both applications go into this branch if (Sp.size() > 1) { @@ -606,29 +605,29 @@ InDet::SiCombinatorialTrackFinder_xk::EStat_t InDet::SiCombinatorialTrackFinder_ return TwoCluster; } if (Sp.size()==2) isTwoPointSeed = true; - } - /// use case if we have a set of global positions rather than space points to start from + } + /// use case if we have a set of global positions rather than space points to start from else if (Gp.size() > 2) { if (!data.trajectory().globalPositionsToClusters(p_pixcontainer, p_sctcontainer, Gp, DEL, PT, Cl)) return TwoCluster; } else { - /// use case if we have neither space-points nor global posittions, but track parameters to start from + /// use case if we have neither space-points nor global posittions, but track parameters to start from if (!data.trajectory().trackParametersToClusters(p_pixcontainer, p_sctcontainer, Tp, DEL, PT, Cl)) return TwoCluster; } ++data.goodseeds(); /// Build initial trajectory bool Qr; - /// This will initialize the trajectory using the clusters we have and the parameter estimate + /// This will initialize the trajectory using the clusters we have and the parameter estimate bool Q = data.trajectory().initialize(m_usePIX, m_useSCT, p_pixcontainer, p_sctcontainer, Tp, Cl, DEL, Qr,ctx); /// if the initialisation fails (indicating this is probably a bad attempt) and we are running with - /// global positions instead of seeding + /// global positions instead of seeding if (!Q && Sp.size() < 2 && Gp.size() > 3) { - /// reset our cluster list + /// reset our cluster list Cl.clear(); /// try again using the clusters from the track parameters only if (!data.trajectory().trackParametersToClusters(p_pixcontainer, p_sctcontainer, Tp, DEL, PT, Cl)) return TwoCluster; - + if (!data.trajectory().initialize(m_usePIX, m_useSCT, p_pixcontainer, p_sctcontainer, Tp, Cl, DEL, Qr,ctx)) return TwoCluster; /// if it worked now, set the quality flag to true @@ -637,9 +636,9 @@ InDet::SiCombinatorialTrackFinder_xk::EStat_t InDet::SiCombinatorialTrackFinder_ /// this can never happen?! if (!Qr){ - ++data.roadbug(); + ++data.roadbug(); return WrongRoad; - } + } /// this can never happen either?! if (!Q) return WrongInit; @@ -660,18 +659,18 @@ InDet::SiCombinatorialTrackFinder_xk::EStat_t InDet::SiCombinatorialTrackFinder_ if (data.trajectory().difference() > 0) { if (!data.trajectory().forwardFilter() ) return CantFindTrk; if (!data.trajectory().backwardSmoother (false) ) return CantFindTrk; - } + } int na = data.trajectory().nclustersNoAdd(); /// check if we found enough clusters if (data.trajectory().nclusters()+na < data.nclusmin() || data.trajectory().ndf() < data.nwclusmin()) return CantFindTrk; - } + } /// case of a strip seed or mixed PPS else { // Strategy for mixed seeds if (!data.trajectory().backwardSmoother(isTwoPointSeed) ) return CantFindTrk; if (!data.trajectory().backwardExtension(itmax) ) return CantFindTrk; if (!data.trajectory().forwardExtension(true,itmax)) return CantFindTrk; - /// first application of hit cut + /// first application of hit cut int na = data.trajectory().nclustersNoAdd(); if (data.trajectory().nclusters()+na < data.nclusmin() || data.trajectory().ndf() < data.nwclusmin()) return CantFindTrk; /// backward smooting @@ -686,17 +685,17 @@ InDet::SiCombinatorialTrackFinder_xk::EStat_t InDet::SiCombinatorialTrackFinder_ if (!data.trajectory().forwardFilter() ) return CantFindTrk; if (!data.trajectory().backwardSmoother (false)) return CantFindTrk; } - } - /// quality cut + } + /// quality cut if (data.trajectory().qualityOptimization() < (m_qualityCut*data.nclusmin()) ) return CantFindTrk; if (data.trajectory().pTfirst () < data.pTmin() && data.trajectory().nclusters() < data.nclusmin() ) return CantFindTrk; if (data.trajectory().nclusters() < data.nclusminb() || data.trajectory().ndf () < data.nwclusmin()) return CantFindTrk; - - /// refine the hole cut + + /// refine the hole cut if (m_writeHolesFromPattern){ - data.trajectory().updateHoleSearchResult(); + data.trajectory().updateHoleSearchResult(); if (!data.trajectory().getHoleSearchResult().passPatternHoleCut) return CantFindTrk; } @@ -742,7 +741,7 @@ Trk::Track* InDet::SiCombinatorialTrackFinder_xk::convertToNextTrack(SiCombinato void InDet::SiCombinatorialTrackFinder_xk::magneticFieldInit() { - // Build MagneticFieldProperties + // Build MagneticFieldProperties // if (m_fieldmode == "NoField" ) m_fieldprop = Trk::MagneticFieldProperties(Trk::NoField ); else if (m_fieldmode == "MapSolenoid") m_fieldprop = Trk::MagneticFieldProperties(Trk::FastField); @@ -761,11 +760,11 @@ bool InDet::SiCombinatorialTrackFinder_xk::spacePointsToClusters /// get the first cluster on an SP const Trk::PrepRawData* p = s->clusterList().first; if (p) { - /// add to list + /// add to list const InDet::SiCluster* c = static_cast<const InDet::SiCluster*>(p); if (c) Sc.push_back(c); } - /// for strips, also make sure to pick up the second one! + /// for strips, also make sure to pick up the second one! p = s->clusterList().second; if (p) { const InDet::SiCluster* c = static_cast<const InDet::SiCluster*>(p); @@ -775,7 +774,7 @@ bool InDet::SiCombinatorialTrackFinder_xk::spacePointsToClusters /// Detector elments test std::list<const InDet::SiCluster*>::iterator cluster = Sc.begin(), nextCluster, endClusters = Sc.end(); - + /// here we reject cases where two subsequent clusters are on the same detector element for (; cluster!=endClusters; ++cluster) { @@ -790,7 +789,7 @@ bool InDet::SiCombinatorialTrackFinder_xk::spacePointsToClusters } return true; } - + /////////////////////////////////////////////////////////////////// // Convert detector elements to detector element links /////////////////////////////////////////////////////////////////// @@ -890,7 +889,7 @@ void InDet::SiCombinatorialTrackFinder_xk::getTrackQualityCuts void InDet::SiCombinatorialTrackFinder_xk::initializeCombinatorialData(const EventContext& ctx, SiCombinatorialTrackFinderData_xk& data) const { /// Add conditions object to SiCombinatorialTrackFinderData to be able to access the field cache for each new event - /// Get conditions object for field cache + /// Get conditions object for field cache SG::ReadCondHandle<AtlasFieldCacheCondObj> readHandle{m_fieldCondObjInputKey, ctx}; const AtlasFieldCacheCondObj* fieldCondObj{*readHandle}; if (fieldCondObj == nullptr) { @@ -907,7 +906,7 @@ void InDet::SiCombinatorialTrackFinder_xk::initializeCombinatorialData(const Eve (m_useSCT ? &*m_sctCondSummaryTool : nullptr), &m_fieldprop, &*m_boundaryCheckTool); - + } void InDet::SiCombinatorialTrackFinder_xk::fillStatistic(SiCombinatorialTrackFinderData_xk& data, std::array<bool,6>& information) const diff --git a/InnerDetector/InDetRecTools/TRT_SeededTrackFinderTool/src/TRT_SeededTrackFinder_ATL.cxx b/InnerDetector/InDetRecTools/TRT_SeededTrackFinderTool/src/TRT_SeededTrackFinder_ATL.cxx index f43903d7d75f157fd54da24e9af12619ba1d1715..254d93b6be769defa3a7fe7c6482ac5d5398b6df 100755 --- a/InnerDetector/InDetRecTools/TRT_SeededTrackFinderTool/src/TRT_SeededTrackFinder_ATL.cxx +++ b/InnerDetector/InDetRecTools/TRT_SeededTrackFinderTool/src/TRT_SeededTrackFinder_ATL.cxx @@ -654,8 +654,8 @@ std::list<Trk::Track*> InDet::TRT_SeededTrackFinder_ATL::findTrack auto per = m_proptool->propagate(*upTP,persurf,Trk::oppositeMomentum,false,m_fieldprop,Trk::nonInteracting); //Propagate if(!per){ if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG)<<"No extrapolated track parameters!"<<endmsg; - delete niTP; - delete upTP; + delete niTP; + delete upTP; continue; } @@ -670,8 +670,8 @@ std::list<Trk::Track*> InDet::TRT_SeededTrackFinder_ATL::findTrack //delete per; if( int(DE.size()) < m_nclusmin){ //Not enough detector elements to satisfy the minimum number of clusters requirement. Stop if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Too few detector elements, not expected" << endmsg; - delete niTP; - delete upTP; + delete niTP; + delete upTP; continue; } @@ -701,13 +701,13 @@ std::list<Trk::Track*> InDet::TRT_SeededTrackFinder_ATL::findTrack if(msgLvl(MSG::DEBUG)) msg(MSG::DEBUG) << "Initial Track Parameters at 1st SP created and scaled from TRT segment, " << endmsg; if(msgLvl(MSG::VERBOSE)) msg(MSG::VERBOSE) << (*mesTP) << endmsg; }else{ - delete niTP; - delete upTP; + delete niTP; + delete upTP; continue; } }else{ - delete niTP; - delete upTP; + delete niTP; + delete upTP; continue; } @@ -772,10 +772,10 @@ InDet::TRT_SeededTrackFinder_ATL::getTP(MagField::AtlasFieldCache& fieldCache, c }else{ //Based on the hit information update the track parameters and the error matrix - const Trk::TrackParameters* uTP = 0; - Trk::FitQualityOnSurface* sct_fitChi2 = 0; + const Trk::TrackParameters* uTP = nullptr; + Trk::FitQualityOnSurface* sct_fitChi2 = nullptr; - uTP = m_updatorTool->addToState(*eTP,SP->localParameters(),SP->localCovariance(),sct_fitChi2); + uTP = m_updatorTool->addToState(*eTP,SP->localParameters(),SP->localCovariance(),sct_fitChi2).release(); if(!uTP) { //The updator failed if (sct_fitChi2) { @@ -817,8 +817,8 @@ InDet::TRT_SeededTrackFinder_ATL::getTP(MagField::AtlasFieldCache& fieldCache, c } // Clean up - //delete eTP; - delete uTP; + //delete eTP; + delete uTP; delete sct_fitChi2; } } diff --git a/InnerDetector/InDetRecTools/TRT_TrackHoleSearch/src/TRTStrawEfficiency.cxx b/InnerDetector/InDetRecTools/TRT_TrackHoleSearch/src/TRTStrawEfficiency.cxx index bca8dda647f831dffae920e89a72520353ce134a..d69a5ec32a93c61ec292f9d2cda6b7292f5c2103 100644 --- a/InnerDetector/InDetRecTools/TRT_TrackHoleSearch/src/TRTStrawEfficiency.cxx +++ b/InnerDetector/InDetRecTools/TRT_TrackHoleSearch/src/TRTStrawEfficiency.cxx @@ -498,16 +498,16 @@ int TRTStrawEfficiency::fill_hit_data(const Trk::TrackStateOnSurface& hit) { m_hit_HL.push_back( (det == 3)&&(trtcircle != 0) ? trtcircle->highLevel() : -1 ); // unbiased trk parameters - const Trk::TrackParameters* unbiased_track_parameters = nullptr; - unbiased_track_parameters = m_updator->removeFromState(*(hit.trackParameters()), - hit.measurementOnTrack()->localParameters(), - hit.measurementOnTrack()->localCovariance()); + std::unique_ptr<Trk::TrackParameters> unbiased_track_parameters = + m_updator->removeFromState( + *(hit.trackParameters()), + hit.measurementOnTrack()->localParameters(), + hit.measurementOnTrack()->localCovariance()); - m_hit_ub_locR.push_back( det == 3 && unbiased_track_parameters ? unbiased_track_parameters->parameters()[Trk::locR] : -1 ); + m_hit_ub_locR.push_back( det == 3 && unbiased_track_parameters ? unbiased_track_parameters->parameters()[Trk::locR] : -1 ); m_hit_ub_x.push_back( unbiased_track_parameters ? unbiased_track_parameters->position().x() : -1 ); m_hit_ub_y.push_back( unbiased_track_parameters ? unbiased_track_parameters->position().y() : -1 ); m_hit_ub_z.push_back( unbiased_track_parameters ? unbiased_track_parameters->position().z() : -1 ); - delete unbiased_track_parameters; // ------- added by dan ------- int is_tube_hit = -1; diff --git a/InnerDetector/InDetTrigRecAlgs/InDetTrigTrackResidualMonitor/src/TrigTrackResidualMonitor.cxx b/InnerDetector/InDetTrigRecAlgs/InDetTrigTrackResidualMonitor/src/TrigTrackResidualMonitor.cxx index f549adb20b4506cde9503b1915145f5c43f58388..75a6b3d3c35ca9c34f7875fe22e6586a319aaa15 100644 --- a/InnerDetector/InDetTrigRecAlgs/InDetTrigTrackResidualMonitor/src/TrigTrackResidualMonitor.cxx +++ b/InnerDetector/InDetTrigRecAlgs/InDetTrigTrackResidualMonitor/src/TrigTrackResidualMonitor.cxx @@ -44,57 +44,57 @@ ATLAS_NO_CHECK_FILE_THREAD_SAFETY; // legacy trigger code namespace InDet { - TrigTrackResidualMonitor::TrigTrackResidualMonitor(const std::string &name, + TrigTrackResidualMonitor::TrigTrackResidualMonitor(const std::string &name, ISvcLocator *pSvcLocator) : HLT::FexAlgo (name, pSvcLocator), - + m_allTracksFromStoreGate(0), m_monitoring(0), - m_path("/EXPERT"), + m_path("/EXPERT"), + - m_trackSelectorTool("InDet::InDetDetailedTrackSelectorTool"), m_trkSummaryTool("Trk::TrackSummaryTool/InDetTrackSummaryTool"), m_updator("Trk::Updator"), - + m_propagator("Trk::Propagator"), //m_ParticleHypothesis(Trk::nonInteracting), m_ParticleHypothesis(Trk::pion), - + m_residualPullCalculator("Trk::ResidualPullCalculator/ResidualPullCalculator") - + { - + declareProperty("doMonitoring", m_monitoring); declareProperty("histoPath", m_path); declareProperty("ResidualPullCalculator", m_residualPullCalculator, "Tool to calculate residuals and pulls"); declareProperty("TrackSelectorTool", m_trackSelectorTool,"Tool to select the tracks"); declareProperty("SummaryTool", m_trkSummaryTool); - - + + /////biased plots for residuals and pull measurements - - + + ///////////// Barrel Region ////////// - + declareMonitoredStdContainer("ResidualPixellocXBiasedBarrel" , m_resPixellocXBiasedBarrel ); declareMonitoredStdContainer("ResidualPixellocYBiasedBarrel" , m_resPixellocYBiasedBarrel ); declareMonitoredStdContainer("PullPixellocXBiasedBarrel" , m_pullPixellocXBiasedBarrel ); declareMonitoredStdContainer("PullPixellocYBiasedBarrel" , m_pullPixellocYBiasedBarrel ); declareMonitoredStdContainer("ResidualSCTBiasedBarrel" , m_resSCTBiasedBarrel ); declareMonitoredStdContainer("PullSCTBiasedBarrel" , m_pullSCTBiasedBarrel ); - - + + /////////// EndCap A ////////// - + declareMonitoredStdContainer("ResidualPixellocXBiasedEndCapA" , m_resPixellocXBiasedEndCapA ); declareMonitoredStdContainer("ResidualPixellocYBiasedEndCapA" , m_resPixellocYBiasedEndCapA ); declareMonitoredStdContainer("PullPixellocXBiasedEndCapA" , m_pullPixellocXBiasedEndCapA ); declareMonitoredStdContainer("PullPixellocYBiasedEndCapA" , m_pullPixellocYBiasedEndCapA ); declareMonitoredStdContainer("ResidualSCTBiasedEndCapA" , m_resSCTBiasedEndCapA ); declareMonitoredStdContainer("PullSCTBiasedEndCapA" , m_pullSCTBiasedEndCapA ); - - + + ///////////// EndCap C ////////// declareMonitoredStdContainer("ResidualPixellocXBiasedEndCapC" , m_resPixellocXBiasedEndCapC ); @@ -103,65 +103,65 @@ namespace InDet declareMonitoredStdContainer("PullPixellocYBiasedEndCapC" , m_pullPixellocYBiasedEndCapC ); declareMonitoredStdContainer("ResidualSCTBiasedEndCapC" , m_resSCTBiasedEndCapC ); declareMonitoredStdContainer("PullSCTBiasedEndCapC" , m_pullSCTBiasedEndCapC ); - - - - + + + + /////Unbiased plots for residuals and pull measurements - - + + /////////////Barrel Region////////// - + declareMonitoredStdContainer("ResidualPixellocXUnbiasedBarrel" , m_resPixellocXUnbiasedBarrel ); declareMonitoredStdContainer("ResidualPixellocYUnbiasedBarrel" , m_resPixellocYUnbiasedBarrel ); declareMonitoredStdContainer("PullPixellocXUnbiasedBarrel" , m_pullPixellocXUnbiasedBarrel ); declareMonitoredStdContainer("PullPixellocYUnbiasedBarrel" , m_pullPixellocYUnbiasedBarrel ); declareMonitoredStdContainer("ResidualSCTUnbiasedBarrel" , m_resSCTUnbiasedBarrel ); declareMonitoredStdContainer("PullSCTUnbiasedBarrel" , m_pullSCTUnbiasedBarrel ); - + ///////////// EndCap A ////////// - - + + declareMonitoredStdContainer("ResidualPixellocXUnbiasedEndCapA" , m_resPixellocXUnbiasedEndCapA ); declareMonitoredStdContainer("ResidualPixellocYUnbiasedEndCapA" , m_resPixellocYUnbiasedEndCapA ); declareMonitoredStdContainer("PullPixellocXUnbiasedEndCapA" , m_pullPixellocXUnbiasedEndCapA ); declareMonitoredStdContainer("PullPixellocYUnbiasedEndCapA" , m_pullPixellocYUnbiasedEndCapA ); declareMonitoredStdContainer("ResidualSCTUnbiasedEndCapA" , m_resSCTUnbiasedEndCapA ); declareMonitoredStdContainer("PullSCTUnbiasedEndCapA" , m_pullSCTUnbiasedEndCapA ); - + //////////// EndCap C ////////// - + declareMonitoredStdContainer("ResidualPixellocXUnbiasedEndCapC" , m_resPixellocXUnbiasedEndCapC ); declareMonitoredStdContainer("ResidualPixellocYUnbiasedEndCapC" , m_resPixellocYUnbiasedEndCapC ); declareMonitoredStdContainer("PullPixellocXUnbiasedEndCapC" , m_pullPixellocXUnbiasedEndCapC ); declareMonitoredStdContainer("PullPixellocYUnbiasedEndCapC" , m_pullPixellocYUnbiasedEndCapC ); declareMonitoredStdContainer("ResidualSCTUnbiasedEndCapC" , m_resSCTUnbiasedEndCapC ); declareMonitoredStdContainer("PullSCTUnbiasedEndCapC" , m_pullSCTUnbiasedEndCapC ); - - - + + + ///Propagator and Updator - + declareProperty("UpdatorTool" , m_updator); declareProperty("propagator" , m_propagator); - - + + //// Track parameters - + declareMonitoredStdContainer("TrackPt" , m_TrackPt); declareMonitoredStdContainer("npix" , m_npix); declareMonitoredStdContainer("nsct" , m_nsct); declareMonitoredStdContainer("npixh" , m_npixh); declareMonitoredStdContainer("nscth" , m_nscth); - + } - + TrigTrackResidualMonitor::~TrigTrackResidualMonitor() {} @@ -169,9 +169,9 @@ namespace InDet // Initialisation /////////////////////////////////////////////////////////////////// HLT::ErrorCode TrigTrackResidualMonitor::hltInitialize() { - + msg() << MSG::DEBUG << "initialize() success" << endmsg; - + //Track Selector Tool if ( m_trackSelectorTool.retrieve().isFailure() ) { msg() << MSG::FATAL << "Failed to retrieve track selector tool " << m_trackSelectorTool << endmsg; @@ -180,7 +180,7 @@ namespace InDet else{ msg() << MSG::INFO << "Retrieved track selector tool " << m_trackSelectorTool << endmsg; } - + //Track Summary Tool if ( m_trkSummaryTool.retrieve().isFailure() ) { msg() << MSG::FATAL << "Failed to retrieve track summary tool " << m_trkSummaryTool << endmsg; @@ -189,9 +189,9 @@ namespace InDet else{ msg() << MSG::INFO << "Retrieved track summary tool " << m_trkSummaryTool << endmsg; } - - - //Residual Pool Calculator Tool + + + //Residual Pool Calculator Tool if ( m_residualPullCalculator.retrieve().isFailure() ) { msg() << MSG::FATAL << "Failed to retrieve ResidualPull Calculator " << m_residualPullCalculator << endmsg; return HLT::BAD_ALGO_CONFIG; @@ -199,8 +199,8 @@ namespace InDet else{ msg() << MSG::INFO << "Retrieved ResidualPull Calculator " << m_residualPullCalculator << endmsg; } - - //idHelper ATLAS ID + + //idHelper ATLAS ID if (detStore()->retrieve(m_idHelper, "AtlasID").isFailure()) { msg() << MSG::FATAL << "Could not get Atlas ID helper" << endmsg; return HLT::BAD_ALGO_CONFIG; @@ -208,9 +208,9 @@ namespace InDet else{ msg() << MSG::DEBUG << "Atlas id Helper found !" << endmsg; } - - - //Pixel ID + + + //Pixel ID const PixelID * IdHelperPixel(0); if (detStore()->retrieve(IdHelperPixel, "PixelID").isFailure()) { msg() << MSG::FATAL << "Could not get Pixel ID helper" << endmsg; @@ -219,11 +219,11 @@ namespace InDet else{ msg() << MSG::DEBUG << "Pixel Id Helper found !" << endmsg; } - + m_idHelperPixel = IdHelperPixel; - - //SCT ID + + //SCT ID const SCT_ID * IdHelperSCT(0); if (detStore()->retrieve(IdHelperSCT, "SCT_ID").isFailure()) { msg() << MSG::FATAL << "Could not get SCT ID helper" << endmsg; @@ -232,9 +232,9 @@ namespace InDet else{ msg() << MSG::DEBUG << "SCT Id Helper found !" << endmsg; } - + m_idHelperSCT = IdHelperSCT; - + //Get Updator if (m_updator.retrieve().isFailure()) { @@ -244,9 +244,9 @@ namespace InDet else{ msg() << MSG::INFO << "Retrieved tool " << m_updator.typeAndName() << endmsg; } - - - + + + // Get Propagator if (m_propagator.retrieve().isFailure()) { msg() << MSG::FATAL << "Can not retrieve Updator of type " << m_propagator.typeAndName() << endmsg; @@ -255,46 +255,46 @@ namespace InDet else{ msg() << MSG::INFO << "Retrieved tool " << m_propagator.typeAndName() << endmsg; } - + return HLT::OK; - + } - - - - + + + + /////////////////////////////////////////////////////////////////// // Execute HLT Algorithm /////////////////////////////////////////////////////////////////// HLT::ErrorCode TrigTrackResidualMonitor::hltExecute(const HLT::TriggerElement*, HLT::TriggerElement* outputTE) { - + int outputLevel = msgLvl(); - + if(outputLevel <= MSG::DEBUG) msg() << MSG::DEBUG << "execHLTAlgorithm()" << endmsg; - + ////// histogram variables ///////// - + /////////////////////// Biased //////////////////////////////// - - - //Barrel Region - m_resPixellocXBiasedBarrel.clear(); - m_resPixellocYBiasedBarrel.clear(); + + + //Barrel Region + m_resPixellocXBiasedBarrel.clear(); + m_resPixellocYBiasedBarrel.clear(); m_pullPixellocXBiasedBarrel.clear(); m_pullPixellocYBiasedBarrel.clear(); - m_resSCTBiasedBarrel.clear(); + m_resSCTBiasedBarrel.clear(); m_pullSCTBiasedBarrel.clear(); //EndCap A - m_resPixellocXBiasedEndCapA.clear(); - m_resPixellocYBiasedEndCapA.clear(); + m_resPixellocXBiasedEndCapA.clear(); + m_resPixellocYBiasedEndCapA.clear(); m_pullPixellocXBiasedEndCapA.clear(); m_pullPixellocYBiasedEndCapA.clear(); - m_resSCTBiasedEndCapA.clear(); + m_resSCTBiasedEndCapA.clear(); m_pullSCTBiasedEndCapA.clear(); @@ -303,7 +303,7 @@ namespace InDet m_resPixellocYBiasedEndCapC.clear(); m_pullPixellocXBiasedEndCapC.clear(); m_pullPixellocYBiasedEndCapC.clear(); - m_resSCTBiasedEndCapC.clear(); + m_resSCTBiasedEndCapC.clear(); m_pullSCTBiasedEndCapC.clear(); @@ -313,81 +313,81 @@ namespace InDet //Barrel Region m_resPixellocXUnbiasedBarrel.clear(); m_resPixellocYUnbiasedBarrel.clear(); - m_pullPixellocXUnbiasedBarrel.clear(); - m_pullPixellocYUnbiasedBarrel.clear(); - m_resSCTUnbiasedBarrel.clear(); + m_pullPixellocXUnbiasedBarrel.clear(); + m_pullPixellocYUnbiasedBarrel.clear(); + m_resSCTUnbiasedBarrel.clear(); m_pullSCTUnbiasedBarrel.clear(); //EndCap A - m_resPixellocXUnbiasedEndCapA.clear(); - m_resPixellocYUnbiasedEndCapA.clear(); + m_resPixellocXUnbiasedEndCapA.clear(); + m_resPixellocYUnbiasedEndCapA.clear(); m_pullPixellocXUnbiasedEndCapA.clear(); m_pullPixellocYUnbiasedEndCapA.clear(); - m_resSCTUnbiasedEndCapA.clear(); + m_resSCTUnbiasedEndCapA.clear(); m_pullSCTUnbiasedEndCapA.clear(); //EndCap C - m_resPixellocXUnbiasedEndCapC.clear(); - m_resPixellocYUnbiasedEndCapC.clear(); + m_resPixellocXUnbiasedEndCapC.clear(); + m_resPixellocYUnbiasedEndCapC.clear(); m_pullPixellocXUnbiasedEndCapC.clear(); m_pullPixellocYUnbiasedEndCapC.clear(); - m_resSCTUnbiasedEndCapC.clear(); + m_resSCTUnbiasedEndCapC.clear(); m_pullSCTUnbiasedEndCapC.clear(); - m_TrackPt.clear(); - m_npix.clear(); - m_nsct.clear(); + m_TrackPt.clear(); + m_npix.clear(); + m_nsct.clear(); m_npixh.clear(); m_nscth.clear(); //---------------------------------------------------------------------- // Navigate throw the trigger element to retrieve the last TrackCollection //---------------------------------------------------------------------- - + //initialize monitored objects m_allTracksFromStoreGate = 0; if ( HLT::OK != getFeature(outputTE, m_allTracksFromStoreGate) ) { msg() << MSG::ERROR << " Input track collection could not be found " << endmsg; - + return HLT::NAV_ERROR; } if(!m_allTracksFromStoreGate){ if(outputLevel <= MSG::DEBUG) msg() << MSG::DEBUG << " Input track collection was not attached. Algorithm not executed!" << endmsg; - - return HLT::OK; + + return HLT::OK; } else { if(outputLevel <= MSG::VERBOSE) msg() << MSG::VERBOSE << " Input track collection has size " << m_allTracksFromStoreGate->size() << endmsg; if ( m_allTracksFromStoreGate->size() == 0 ) { if(outputLevel <= MSG::DEBUG) msg() << MSG::DEBUG << " Input track collection has 0 size. Algorithm not executed!" << endmsg; - return HLT::OK; + return HLT::OK; } } for (TrackCollection::const_iterator itResTrk = m_allTracksFromStoreGate->begin(); - + itResTrk != m_allTracksFromStoreGate->end() ; ++itResTrk) { - + DataVector<const Trk::TrackStateOnSurface>::const_iterator it= (*itResTrk)->trackStateOnSurfaces()->begin(); DataVector<const Trk::TrackStateOnSurface>::const_iterator itEnd= (*itResTrk)->trackStateOnSurfaces()->end(); - + const Trk::Track* track = *itResTrk; const Trk::TrackStateOnSurface* tsos; - + const Trk::TrackSummary *trkSum = track->trackSummary(); - + if(!trkSum){ Trk::Track* nonConstTrack = const_cast<Trk::Track*>(track); m_trkSummaryTool->updateTrack(*nonConstTrack); trkSum = nonConstTrack->trackSummary(); } - - + + int npix, nsct, npixh, nscth, npixds,nsctds; npix = nsct = npixh = nscth = npixds = nsctds = -1; if(trkSum){ @@ -397,14 +397,14 @@ namespace InDet npixh = trkSum->get(Trk::numberOfPixelHoles); nsctds = trkSum->get(Trk::numberOfSCTDeadSensors); npixds = trkSum->get(Trk::numberOfPixelDeadSensors); - + m_npix.push_back(npix); m_nsct.push_back(nsct); m_npixh.push_back(npixh); m_nscth.push_back(nscth); } - - + + if (trkSum && npix >= 3 && nsct >= 6){ const Trk::Perigee *trkPerig = track->perigeeParameters(); double TrackPt = -1; @@ -417,15 +417,15 @@ namespace InDet if ((*it)->type(Trk::TrackStateOnSurface::Measurement) ){ const Trk::MeasurementBase* mesb=dynamic_cast <const Trk::MeasurementBase*>((*it)->measurementOnTrack()); const Trk::TrackParameters* trackPars = (*it)->trackParameters(); - + const Trk::ResidualPull* resPullPixelBiased;// = 0; const Trk::ResidualPull* resPullSCTBiased; //= 0; - + const Trk::ResidualPull* resPullPixelUnbiased;// = 0; const Trk::ResidualPull* resPullSCTUnbiased; //= 0; - + int detType = 99; - + const Trk::MeasurementBase* mesh = (*it)->measurementOnTrack(); const Trk::RIO_OnTrack* hitbec = dynamic_cast <const Trk::RIO_OnTrack*>(mesh); if (not hitbec){ @@ -433,15 +433,15 @@ namespace InDet continue; } const Identifier & hitIdbec = hitbec->identify(); - - + + if (m_idHelper->is_pixel(hitIdbec)){ detType = 0; } if (m_idHelper->is_sct(hitIdbec)) { detType = 1; } - + if((mesb) != 0 && (trackPars) !=0){ const Trk::TrackParameters* TrackParams(0); const Trk::TrackParameters* UnbiasedTrackParams(0); @@ -449,18 +449,18 @@ namespace InDet const Trk::TrackParameters* OtherSideUnbiasedTrackParams(0); const Trk::TrackParameters* PropagatedPixelUnbiasedTrackParams(0); const Trk::TrackParameters* PixelUnbiasedTrackParams(0); - + const Trk::Surface* Surf = &(mesb->associatedSurface()); const Identifier id = Surf->associatedDetectorElementIdentifier(); - + if ( id.is_valid()) { int barrelECSCTUB = 99; - int barrelECSCTB = 99; + int barrelECSCTB = 99; int barrelECPUB = 99; int barrelECPB = 99; if (detType == 1 ) { - // if (m_idHelperSCT->is_sct(id)) { //there's no TrueUnbiased for non-SCT (pixel) hits) - + // if (m_idHelperSCT->is_sct(id)) { //there's no TrueUnbiased for non-SCT (pixel) hits) + // check if other module side was also hit and try to remove other hit as well const Identifier& idbECSCTUB = m_idHelperSCT->wafer_id(hitIdbec); barrelECSCTUB = m_idHelperSCT->barrel_ec(idbECSCTUB); @@ -470,7 +470,7 @@ namespace InDet m_idHelperSCT->get_other_side(waferHash, otherSideHash); const Identifier OtherModuleSideID = m_idHelperSCT->wafer_id(otherSideHash); //const Trk::RIO_OnTrack* hit(0); - + for (const Trk::TrackStateOnSurface* TempTsos : *(*itResTrk)->trackStateOnSurfaces()) { const Trk::RIO_OnTrack* hitOnTrack = dynamic_cast <const Trk::RIO_OnTrack*>(TempTsos->measurementOnTrack()); //hit = hitOnTrack; @@ -481,13 +481,13 @@ namespace InDet } } } - + if (OtherModuleSideHit) { if (OtherModuleSideHit->trackParameters()) { OtherSideUnbiasedTrackParams = m_updator->removeFromState(*(OtherModuleSideHit->trackParameters()), OtherModuleSideHit->measurementOnTrack()->localParameters(), - OtherModuleSideHit->measurementOnTrack()->localCovariance()); - + OtherModuleSideHit->measurementOnTrack()->localCovariance()).release(); + if (OtherSideUnbiasedTrackParams) { const Trk::Surface* TempSurface = &(OtherModuleSideHit->measurementOnTrack()->associatedSurface()); const Trk::MagneticFieldProperties* TempField = 0; @@ -497,25 +497,25 @@ namespace InDet TempField = dynamic_cast <const Trk::MagneticFieldProperties*>(TempSurface->associatedLayer()->enclosingTrackingVolume()); } } - } - + } + PropagatedTrackParams = m_propagator->propagate(*OtherSideUnbiasedTrackParams, tsos->measurementOnTrack()->associatedSurface(), Trk::anyDirection, false, *TempField, m_ParticleHypothesis).release(); - + delete OtherSideUnbiasedTrackParams; - - UnbiasedTrackParams = m_updator->removeFromState(*PropagatedTrackParams, - tsos->measurementOnTrack()->localParameters(), - tsos->measurementOnTrack()->localCovariance()); - + + UnbiasedTrackParams = m_updator->removeFromState(*PropagatedTrackParams, + tsos->measurementOnTrack()->localParameters(), + tsos->measurementOnTrack()->localCovariance()).release(); + delete PropagatedTrackParams; if (UnbiasedTrackParams) { - TrackParams = UnbiasedTrackParams->clone(); + TrackParams = UnbiasedTrackParams->clone(); } - + resPullSCTUnbiased = m_residualPullCalculator->residualPull(mesb,TrackParams,Trk::ResidualPull::Unbiased); if(barrelECSCTUB == 0) { // Barrel region m_resSCTUnbiasedBarrel.push_back(resPullSCTUnbiased->residual()[Trk::loc1]); @@ -529,45 +529,45 @@ namespace InDet m_resSCTUnbiasedEndCapC.push_back(resPullSCTUnbiased->residual()[Trk::loc1]); m_pullSCTUnbiasedEndCapC.push_back(resPullSCTUnbiased->pull()[Trk::loc1]); } - delete UnbiasedTrackParams; - } - } - } + delete UnbiasedTrackParams; + } + } + } } // end of m_True Unbiased Loop - - + + else if ( detType == 0 ) { - // else if (m_idHelperPixel->is_pixel(id) ) { + // else if (m_idHelperPixel->is_pixel(id) ) { const Identifier& idbECPUB = m_idHelperPixel->wafer_id(hitIdbec); barrelECPUB = m_idHelperPixel->barrel_ec(idbECPUB); const Trk::TrackStateOnSurface* PixelSideHit(0); PixelSideHit = *it; - - PropagatedPixelUnbiasedTrackParams = m_updator->removeFromState(*tsos->trackParameters(), - tsos->measurementOnTrack()->localParameters(), - tsos->measurementOnTrack()->localCovariance()); + + PropagatedPixelUnbiasedTrackParams = m_updator->removeFromState(*tsos->trackParameters(), + tsos->measurementOnTrack()->localParameters(), + tsos->measurementOnTrack()->localCovariance()).release(); const Trk::Surface* TempSurfacePixel = &(PixelSideHit->measurementOnTrack()->associatedSurface()); const Trk::MagneticFieldProperties* TempFieldPixel = 0; - + if (TempSurfacePixel){ if (TempSurfacePixel->associatedLayer()){ if (TempSurfacePixel->associatedLayer()->enclosingTrackingVolume()){ TempFieldPixel = dynamic_cast <const Trk::MagneticFieldProperties*>(TempSurfacePixel->associatedLayer()->enclosingTrackingVolume()); } } - } - + } + PixelUnbiasedTrackParams = m_propagator->propagate(*PropagatedPixelUnbiasedTrackParams, tsos->measurementOnTrack()->associatedSurface(), Trk::anyDirection, false, *TempFieldPixel, m_ParticleHypothesis).release(); - delete PropagatedPixelUnbiasedTrackParams; - + delete PropagatedPixelUnbiasedTrackParams; + if (PixelUnbiasedTrackParams) { - TrackParams = PixelUnbiasedTrackParams->clone(); + TrackParams = PixelUnbiasedTrackParams->clone(); } - + resPullPixelUnbiased = m_residualPullCalculator->residualPull(mesb,TrackParams,Trk::ResidualPull::Unbiased); if (barrelECPUB == 0){ m_resPixellocXUnbiasedBarrel.push_back(resPullPixelUnbiased->residual()[Trk::locX]); @@ -588,15 +588,15 @@ namespace InDet m_pullPixellocYUnbiasedEndCapC.push_back(resPullPixelUnbiased->pull()[Trk::locY]); } } - - + + if ( detType == 0 ){ // if (m_idHelperPixel->is_pixel(id) ) { const Identifier& idbECPB = m_idHelperPixel->wafer_id(hitIdbec); barrelECPB = m_idHelperPixel->barrel_ec(idbECPB); - + resPullPixelBiased = m_residualPullCalculator->residualPull(mesb,trackPars,Trk::ResidualPull::Biased); - + if(barrelECPB == 0){ m_resPixellocXBiasedBarrel.push_back(resPullPixelBiased->residual()[Trk::locX]); m_resPixellocYBiasedBarrel.push_back(resPullPixelBiased->residual()[Trk::locY]); @@ -615,15 +615,15 @@ namespace InDet m_pullPixellocXBiasedEndCapC.push_back(resPullPixelBiased->pull()[Trk::locX]); m_pullPixellocYBiasedEndCapC.push_back(resPullPixelBiased->pull()[Trk::locY]); } - - + + } else if ( detType == 1 ) { // } else if (m_idHelperSCT->is_sct(id)) { const Identifier& idbECSCTB = m_idHelperSCT->wafer_id(hitIdbec); barrelECSCTB = m_idHelperSCT->barrel_ec(idbECSCTB); - + resPullSCTBiased = m_residualPullCalculator->residualPull(mesb,trackPars,Trk::ResidualPull::Biased); - + if(barrelECSCTB == 0){ m_resSCTBiasedBarrel.push_back(resPullSCTBiased->residual()[Trk::locX]); m_pullSCTBiasedBarrel.push_back(resPullSCTBiased->pull()[Trk::locX]); @@ -641,23 +641,23 @@ namespace InDet } // if loop, track parameters ! = 0 or trackPars !=0 } // If loop Trk::measurement } // end of for loop over trackStateOnSurfaces - - } + + } }// end of the 'if trkPerig' }//end of 'if trkSum and npix>=3 and nsct>=6 } // end of loop over all tracks - - + + return HLT::OK; } - - + + /////////////////////////////////////////////////////////////////// // Finalize /////////////////////////////////////////////////////////////////// - + HLT::ErrorCode TrigTrackResidualMonitor::hltFinalize() { msg() << MSG::DEBUG << "finalize() success" << endmsg; diff --git a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPhysHitDecoratorAlg.cxx b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPhysHitDecoratorAlg.cxx index cf1b191d787b2237e202f617134d7fe82a896293..3b50e0c0afcc05c3e57987f7bd216ab3d80d8103 100644 --- a/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPhysHitDecoratorAlg.cxx +++ b/InnerDetector/InDetValidation/InDetPhysValMonitoring/src/InDetPhysHitDecoratorAlg.cxx @@ -75,7 +75,7 @@ InDetPhysHitDecoratorAlg::initialize() { ATH_CHECK( m_trkParticleName.initialize() ); IDPVM::createDecoratorKeys(*this,m_trkParticleName,m_prefix,float_decor_names,m_floatDecor); - + IDPVM::createDecoratorKeys(*this,m_trkParticleName,m_prefix, int_decor_names, m_intDecor); assert( m_intDecor.size() == kNIntDecorators); assert( m_floatDecor.size() == kNFloatDecorators); @@ -428,7 +428,7 @@ InDetPhysHitDecoratorAlg::getUnbiasedTrackParameters(const Trk::TrackParameters* // Get unbiased state unbiasedTrkParameters = m_updatorHandle->removeFromState(*trkParameters, measurement->localParameters(), - measurement->localCovariance()); + measurement->localCovariance()).release(); if (!unbiasedTrkParameters) { ATH_MSG_INFO( "Could not get unbiased track parameters, use normal parameters" ); isUnbiased = false; diff --git a/InnerDetector/InDetValidation/InDetRecStatistics/src/InDetRecStatisticsAlg.cxx b/InnerDetector/InDetValidation/InDetRecStatistics/src/InDetRecStatisticsAlg.cxx index a66fb96e617ebc131f3d8f0c67a3376b3ec6ede3..7d7f07bf716a654831fe3ae90944afd565265efd 100755 --- a/InnerDetector/InDetValidation/InDetRecStatistics/src/InDetRecStatisticsAlg.cxx +++ b/InnerDetector/InDetValidation/InDetRecStatistics/src/InDetRecStatisticsAlg.cxx @@ -7,16 +7,16 @@ // // to do-list: // o write out percentage of tracks with bad tracksummary -// o add energy of mctracks for Michael +// o add energy of mctracks for Michael // o don't save intermediate newTracking track's to ntuple // o statistics prints hit association purity, (holes, shared hits in sct/pixels/b-layer, outliers, etc...) -// o navigation between hits and tracks -// X check Propagator defaults (check with Andrei regarding Tool) +// o navigation between hits and tracks +// X check Propagator defaults (check with Andrei regarding Tool) // o count tracks with without associated hits, without truth, truth without beginvertex // o improved navigation between truth and reconstructed tracks // o follow atlas naming conventions for all variable and method names -#include "GaudiKernel/SmartDataPtr.h" +#include "GaudiKernel/SmartDataPtr.h" #include "GaudiKernel/IPartPropSvc.h" #include "HepPDT/ParticleData.hh" #include "CLHEP/Units/SystemOfUnits.h" @@ -98,7 +98,7 @@ InDet::InDetRecStatisticsAlg::InDetRecStatisticsAlg(const std::string& name, ISv m_maxZStartPrimary ( 200.0*CLHEP::mm), m_maxZStartSecondary (2000.0*CLHEP::mm), m_minREndPrimary ( 400.0*CLHEP::mm), - m_minREndSecondary (1000.0*CLHEP::mm), + m_minREndSecondary (1000.0*CLHEP::mm), m_minZEndPrimary (2300.0*CLHEP::mm), //m_maxZIndet (), m_minZEndSecondary (3200.0*CLHEP::mm), @@ -145,7 +145,7 @@ InDet::InDetRecStatisticsAlg::InDetRecStatisticsAlg(const std::string& name, ISv declareProperty("minREndPrimary", m_minREndPrimary); declareProperty("minREndSecondary", m_minREndSecondary); declareProperty("minZEndPrimary", m_minZEndPrimary); - declareProperty("minZEndSecondary", m_minZEndSecondary); + declareProperty("minZEndSecondary", m_minZEndSecondary); m_idHelper = NULL; m_pixelID = NULL; m_sctID = NULL; @@ -166,7 +166,7 @@ StatusCode InDet::InDetRecStatisticsAlg::initialize(){ if (sc1.isFailure()) { ATH_MSG_FATAL("Error retrieving services !"); return StatusCode::FAILURE; - } + } if (m_RecTrackCollection_keys.size()<=0) { ATH_MSG_ERROR("No reco track collection specified! Aborting."); @@ -175,10 +175,10 @@ StatusCode InDet::InDetRecStatisticsAlg::initialize(){ if (m_doTruth && m_RecTrackCollection_keys.size() != m_TrackTruthCollection_keys.size()) { ATH_MSG_ERROR("You have specified " - << m_RecTrackCollection_keys.size() - << " TrackCollection keys, and " << m_TrackTruthCollection_keys.size() + << m_RecTrackCollection_keys.size() + << " TrackCollection keys, and " << m_TrackTruthCollection_keys.size() << " TrackTruthCollection keys." - << " You have to specify one TrackTruthCollection for each" + << " You have to specify one TrackTruthCollection for each" << " TrackCollection! Exiting." ); return StatusCode::FAILURE; @@ -198,8 +198,8 @@ StatusCode InDet::InDetRecStatisticsAlg::initialize(){ "No Updator for unbiased track states given, use normal states!"); m_updator = 0; } - - + + //get residual and pull calculator if (m_residualPullCalculator.empty()) { ATH_MSG_INFO( @@ -209,9 +209,9 @@ StatusCode InDet::InDetRecStatisticsAlg::initialize(){ "It is recommended to give R/P calculators to the det-specific tool" << " handle lists then."); } else if (m_residualPullCalculator.retrieve().isFailure()) { - ATH_MSG_FATAL("Could not retrieve "<< m_residualPullCalculator + ATH_MSG_FATAL("Could not retrieve "<< m_residualPullCalculator <<" (to calculate residuals and pulls) "); - + } else { ATH_MSG_INFO("Generic hit residuals&pulls will be calculated in one or both " << "available local coordinates"); @@ -233,27 +233,27 @@ StatusCode InDet::InDetRecStatisticsAlg::initialize(){ ct.minREndPrimary = m_minREndPrimary; ct.minREndSecondary = m_minREndSecondary; ct.minZEndPrimary = m_minZEndPrimary; - ct.minZEndSecondary = m_minZEndSecondary; + ct.minZEndSecondary = m_minZEndSecondary; ct.minPt = m_minPt; ct.minEtaDBM = m_minEtaDBM; ct.maxEtaDBM = m_maxEtaDBM; unsigned int nCollections = 0; - for (SG::ReadHandleKeyArray<TrackCollection>::const_iterator - it = m_RecTrackCollection_keys.begin(); + for (SG::ReadHandleKeyArray<TrackCollection>::const_iterator + it = m_RecTrackCollection_keys.begin(); it < m_RecTrackCollection_keys.end(); ++ it) { - InDet::TrackStatHelper * collection = - new TrackStatHelper(it->key(),(m_doTruth ? m_TrackTruthCollection_keys[nCollections].key() : ""), m_doTruth); + InDet::TrackStatHelper * collection = + new TrackStatHelper(it->key(),(m_doTruth ? m_TrackTruthCollection_keys[nCollections].key() : ""), m_doTruth); nCollections ++; - collection->SetCuts(ct); - m_SignalCounters.push_back(collection); + collection->SetCuts(ct); + m_SignalCounters.push_back(collection); } - + StatusCode sc3 = resetStatistics(); // reset all statistic counters if (sc3.isFailure()) { ATH_MSG_FATAL("Error in resetStatistics !"); return StatusCode::FAILURE; - } + } ATH_CHECK( m_RecTrackCollection_keys.initialize() ); ATH_CHECK( m_McTrackCollection_key.initialize(m_doTruth && !m_McTrackCollection_key.key().empty()) ); @@ -293,12 +293,12 @@ StatusCode InDet::InDetRecStatisticsAlg::execute(const EventContext &ctx) const // devide generated tracks into primary, truncated, secondary std::vector <std::pair<HepMC::ConstGenParticlePtr,int> > GenSignal; - // GenSignalPrimary, GenSignalTruncated, GenSignalSecondary; + // GenSignalPrimary, GenSignalTruncated, GenSignalSecondary; unsigned int inTimeStart = 0; unsigned int inTimeEnd = 0; if (m_doTruth) selectGenSignal ((SimTracks.isValid() ? &(*SimTracks) : nullptr), GenSignal, inTimeStart, inTimeEnd, counter); - // step through the various reconstructed TrackCollections and + // step through the various reconstructed TrackCollections and // corresponding TrackTruthCollections and produce statistics for each if (m_SignalCounters.size()<=0) { @@ -315,13 +315,13 @@ StatusCode InDet::InDetRecStatisticsAlg::execute(const EventContext &ctx) const } } if (m_SignalCounters.size() != rec_track_collections.size()) { - ATH_MSG_ERROR("Number expected reco track collections does not match the actual number of such collections (" + ATH_MSG_ERROR("Number expected reco track collections does not match the actual number of such collections (" << m_SignalCounters.size() << "!=" << rec_track_collections.size() << ")" ); } std::vector< SG::ReadHandle<TrackCollection> >::iterator rec_track_collections_iter = rec_track_collections.begin(); std::vector< SG::ReadHandle<TrackTruthCollection> >::iterator truth_track_collections_iter = truth_track_collections.begin(); - for (std::vector <class TrackStatHelper *>::const_iterator statHelper + for (std::vector <class TrackStatHelper *>::const_iterator statHelper = m_SignalCounters.begin(); statHelper != m_SignalCounters.end(); ++statHelper, ++rec_track_collections_iter) { @@ -348,7 +348,7 @@ StatusCode InDet::InDetRecStatisticsAlg::execute(const EventContext &ctx) const if (m_doSharedHits) { prd_to_track_map = m_assoTool->createPRDtoTrackMap(); // clear prdAssociationTool (this may be altered) - // loop over tracks and add PRD + // loop over tracks and add PRD TrackCollection::const_iterator trackIt = RecCollection->begin(); TrackCollection::const_iterator trackItEnd = RecCollection->end(); for ( ; trackIt != trackItEnd ; ++trackIt) { @@ -357,23 +357,23 @@ StatusCode InDet::InDetRecStatisticsAlg::execute(const EventContext &ctx) const } } } - - std::vector <const Trk::Track *> RecTracks, RecSignal; + + std::vector <const Trk::Track *> RecTracks, RecSignal; selectRecSignal (RecCollection, RecTracks,RecSignal,counter); - ATH_MSG_DEBUG( - " RecTracks.size()=" << RecTracks.size() + ATH_MSG_DEBUG( + " RecTracks.size()=" << RecTracks.size() << ", GenSignal.size()=" << GenSignal.size()); ATH_MSG_DEBUG("Accumulating Statistics..."); - (*statHelper)->addEvent (RecCollection, - RecTracks, + (*statHelper)->addEvent (RecCollection, + RecTracks, prd_to_track_map.get(), - GenSignal, - TruthMap, - m_idHelper, - m_pixelID, - m_sctID, + GenSignal, + TruthMap, + m_idHelper, + m_pixelID, + m_sctID, m_trkSummaryTool.operator->(), m_UseTrackSummary, &inTimeStart, @@ -381,10 +381,10 @@ StatusCode InDet::InDetRecStatisticsAlg::execute(const EventContext &ctx) const counter.m_counter[kN_rec_tracks_processed] += RecCollection->size(); - for ( TrackCollection::const_iterator it = RecCollection->begin() ; + for ( TrackCollection::const_iterator it = RecCollection->begin() ; it < RecCollection->end(); ++ it){ std::vector<const Trk::RIO_OnTrack*> rioOnTracks; - Trk::RoT_Extractor::extract( rioOnTracks, + Trk::RoT_Extractor::extract( rioOnTracks, (*it)->measurementsOnTrack()->stdcont() ); counter.m_counter[kN_spacepoints_processed] += rioOnTracks.size(); } @@ -406,16 +406,16 @@ StatusCode InDet :: InDetRecStatisticsAlg :: finalize() { printStatistics(); - for (std::vector <class TrackStatHelper *>::const_iterator collection = - m_SignalCounters.begin(); collection != m_SignalCounters.end(); + for (std::vector <class TrackStatHelper *>::const_iterator collection = + m_SignalCounters.begin(); collection != m_SignalCounters.end(); collection++) { ATH_MSG_DEBUG(s_linestr2); delete (*collection); - } + } m_SignalCounters.clear(); return StatusCode::SUCCESS; } - + StatusCode InDet :: InDetRecStatisticsAlg :: getServices () { @@ -427,11 +427,11 @@ StatusCode InDet :: InDetRecStatisticsAlg :: getServices () ATH_MSG_FATAL(" Could not initialize Particle Properties Service" ); return StatusCode::FAILURE; } - + m_particleDataTable = partPropSvc->PDT(); //Set up ATLAS ID helper to be able to identify the RIO's det-subsystem. - + // Get the dictionary manager from the detector store const IdDictManager* idDictMgr = 0; sc = detStore()->retrieve(idDictMgr, "IdDict"); @@ -439,16 +439,16 @@ StatusCode InDet :: InDetRecStatisticsAlg :: getServices () ATH_MSG_FATAL("Could not get IdDictManager !"); return StatusCode::FAILURE; } - + // Initialize the helper with the dictionary information. sc = detStore()->retrieve(m_idHelper, "AtlasID"); if (sc.isFailure()) { ATH_MSG_FATAL("Could not get AtlasDetectorID helper."); return StatusCode::FAILURE; } - + //get Pixel, SCT, TRT managers and helpers - + if (detStore()->retrieve(m_pixelID, "PixelID").isFailure()) { msg(MSG::FATAL) << "Could not get Pixel ID helper" << endmsg; return StatusCode::FAILURE; @@ -458,12 +458,12 @@ StatusCode InDet :: InDetRecStatisticsAlg :: getServices () return StatusCode::FAILURE; } - //retrieve the TRT helper only if not-SLHC layout used + //retrieve the TRT helper only if not-SLHC layout used sc = detStore()->retrieve(m_idDictMgr, "IdDict"); if (sc.isFailure()) { ATH_MSG_FATAL("Could not get IdDictManager !"); return StatusCode::FAILURE; - } + } const IdDictDictionary* dict = m_idDictMgr->manager()->find_dictionary("InnerDetector"); if(!dict) { ATH_MSG_FATAL(" Cannot access InnerDetector dictionary "); @@ -480,10 +480,10 @@ StatusCode InDet :: InDetRecStatisticsAlg :: getServices () } } // - + if (m_UseTrackSummary) { if (m_trkSummaryTool.retrieve().isFailure() ) { - ATH_MSG_FATAL("Failed to retrieve tool " + ATH_MSG_FATAL("Failed to retrieve tool " << m_trkSummaryTool); return StatusCode::FAILURE; } else { @@ -515,12 +515,12 @@ StatusCode InDet :: InDetRecStatisticsAlg :: getServices () } else { m_truthToTrack.disable(); } - + //adding track selector tool if(m_useTrackSelection){ if ( m_trackSelectorTool.retrieve().isFailure() ) { ATH_MSG_FATAL("Failed to retrieve tool " << m_trackSelectorTool); - return StatusCode::FAILURE; + return StatusCode::FAILURE; } else { ATH_MSG_INFO("Retrieved tool " << m_trackSelectorTool); } @@ -533,26 +533,26 @@ StatusCode InDet :: InDetRecStatisticsAlg :: getServices () StatusCode InDet :: InDetRecStatisticsAlg :: resetStatistics() { m_counter.reset(); m_events_processed = 0; - - for (std::vector<InDet::TrackStatHelper *>::const_iterator counter = - m_SignalCounters.begin(); + + for (std::vector<InDet::TrackStatHelper *>::const_iterator counter = + m_SignalCounters.begin(); counter != m_SignalCounters.end(); ++ counter) { (*counter)->reset(); } return StatusCode :: SUCCESS; } -void InDet::InDetRecStatisticsAlg::selectRecSignal(const TrackCollection* RecCollection, +void InDet::InDetRecStatisticsAlg::selectRecSignal(const TrackCollection* RecCollection, std::vector <const Trk::Track *> & RecTracks , std::vector <const Trk::Track *> & RecSignal, InDet::InDetRecStatisticsAlg::CounterLocal &counter) const { - + for ( TrackCollection::const_iterator it = RecCollection->begin() ; it != RecCollection->end(); ++ it){ RecTracks.push_back(*it); - const DataVector<const Trk::TrackParameters>* trackpara = + const DataVector<const Trk::TrackParameters>* trackpara = (*it)->trackParameters(); - + if(trackpara->size() > 0){ const Trk::TrackParameters* para = trackpara->front(); if (para){ @@ -570,14 +570,14 @@ void InDet::InDetRecStatisticsAlg::selectRecSignal(const TrackCollection* RecCol // select charged, stable particles in allowed pt and eta range void InDet :: InDetRecStatisticsAlg :: -selectGenSignal (const McEventCollection* SimTracks, +selectGenSignal (const McEventCollection* SimTracks, std::vector <std::pair<HepMC::ConstGenParticlePtr,int> > & GenSignal, unsigned int /*inTimeStart*/, unsigned int /*inTimeEnd*/, InDet::InDetRecStatisticsAlg::CounterLocal &counter) const //'unused' compiler warning { if (! SimTracks) return; - unsigned int nb_mc_event = SimTracks->size(); + unsigned int nb_mc_event = SimTracks->size(); std::unique_ptr<PileUpType> put = std::make_unique<PileUpType>(SimTracks); McEventCollection::const_iterator inTimeMBend; @@ -604,15 +604,15 @@ selectGenSignal (const McEventCollection* SimTracks, const HepPDT::ParticleData* pd = m_particleDataTable->particle(std::abs(pdgCode)); if (!pd) { ATH_MSG_DEBUG("Could not get particle data for particle with " - <<"pdgCode="<<pdgCode<< ", status=" << particle->status() + <<"pdgCode="<<pdgCode<< ", status=" << particle->status() << ", barcode=" << HepMC::barcode(particle)); ATH_MSG_DEBUG("GenParticle= " << particle); continue; } float charge = pd->charge(); if (std::abs(charge)<0.5) continue; - if (std::abs(particle->momentum().perp()) > m_minPt && - std::abs(particle->momentum().pseudoRapidity()) < m_maxEta ) { + if (std::abs(particle->momentum().perp()) > m_minPt && + std::abs(particle->momentum().pseudoRapidity()) < m_maxEta ) { std::pair<HepMC::ConstGenParticlePtr,int> thisPair(particle,ievt); GenSignal.push_back(thisPair); } @@ -646,28 +646,28 @@ void InDet :: InDetRecStatisticsAlg :: printStatistics() { std::stringstream outstr; int def_precision(outstr.precision()); outstr << "\n" - << MSG::INFO - << std::setiosflags(std::ios::fixed | std::ios::showpoint) + << MSG::INFO + << std::setiosflags(std::ios::fixed | std::ios::showpoint) << std::setw(7) << std::setprecision(2) << s_linestr << "\n" - << "Summary" << "\n" + << "Summary" << "\n" << "\tProcessed : " << m_events_processed << " events, " << m_counter.m_counter[kN_rec_tracks_processed] << " reconstructed tracks with " << m_counter.m_counter[kN_spacepoints_processed] << " hits, and " << m_counter.m_counter[kN_gen_tracks_processed] << " truth particles" << "\n" << "\tProblem objects : " << m_counter.m_counter[kN_rec_tracks_without_perigee] - << " tracks without perigee, " + << " tracks without perigee, " << m_counter.m_counter[kN_unknown_hits] << " unknown hits" << "\n" << "\t" << "Reco TrackCollections : "; bool first = true; - for (std::vector <class TrackStatHelper *>::const_iterator collection = + for (std::vector <class TrackStatHelper *>::const_iterator collection = m_SignalCounters.begin(); collection != m_SignalCounters.end(); collection++) { - if (first) { + if (first) { first = false; - } + } else { outstr << ", "; } @@ -685,9 +685,9 @@ void InDet :: InDetRecStatisticsAlg :: printStatistics() { for (std::vector <class TrackStatHelper *>::const_iterator collection = m_SignalCounters.begin(); collection != m_SignalCounters.end(); collection++) { - if (first) { + if (first) { first = false; - } + } else { outstr << ", "; } @@ -696,42 +696,42 @@ void InDet :: InDetRecStatisticsAlg :: printStatistics() { ATH_MSG_INFO(outstr.str()); outstr.str(""); } - outstr.str(""); - outstr << "\n" + outstr.str(""); + outstr << "\n" << s_linestr2 << "\n" - << "Cuts and Settings for Statistics Table" << "\n" - << "\t" << "TrackSummary Statistics" << "\t" - << (m_UseTrackSummary ? "YES" : "NO") << "\n" - << "\t" << "Signal \t" << "pT > " + << "Cuts and Settings for Statistics Table" << "\n" + << "\t" << "TrackSummary Statistics" << "\t" + << (m_UseTrackSummary ? "YES" : "NO") << "\n" + << "\t" << "Signal \t" << "pT > " << m_minPt/1000 << " GeV/c, |eta| < " << m_maxEta << "\t\t" - << "\t" << "Primary track start \t" << "R < " - << m_maxRStartPrimary << "mm and |z| < " + << "\t" << "Primary track start \t" << "R < " + << m_maxRStartPrimary << "mm and |z| < " << m_maxZStartPrimary << "mm" << "\n" - << "\t" << "Barrel \t" << 0.0 + << "\t" << "Barrel \t" << 0.0 << "< |eta| < " << m_maxEtaBarrel << "\t\t\t" - << "\t" << "Primary track end \t" << "R > " - << m_minREndPrimary << "mm or |z| > " << m_minZEndPrimary + << "\t" << "Primary track end \t" << "R > " + << m_minREndPrimary << "mm or |z| > " << m_minZEndPrimary << "mm" << "\n" - << "\t" << "Transition Region \t" << m_maxEtaBarrel + << "\t" << "Transition Region \t" << m_maxEtaBarrel << "< |eta| < " << m_maxEtaTransition << "\t\t\t" - << "\t" << "Secondary (non-Primary) start \t" - << " R < " << m_maxRStartSecondary << "mm and" + << "\t" << "Secondary (non-Primary) start \t" + << " R < " << m_maxRStartSecondary << "mm and" << " |z| < " << m_maxZStartSecondary << " mm" << "\n" - << "\t" << "Endcap \t" << m_maxEtaTransition + << "\t" << "Endcap \t" << m_maxEtaTransition << "< |eta| < " << m_maxEtaEndcap << "\t\t\t" << "\t" << "Secondary (non-primary) end \t" << " R > " << m_minREndSecondary << "mm or" << " |z| > " << m_minREndSecondary << "mm" << "\n" << "\t" << "Forward \t" << "|eta| > " << m_minEtaDBM << "\n" - << "\t" << "Low prob tracks #1 \t" << "< " - << m_fakeTrackCut << " of hits from single Truth Track " - << "\n" - << "\t" << "Low prob tracks #2 \t" << "< " - << m_fakeTrackCut2 << " of hits from single Truth Track " - << "\n" + << "\t" << "Low prob tracks #1 \t" << "< " + << m_fakeTrackCut << " of hits from single Truth Track " + << "\n" + << "\t" << "Low prob tracks #2 \t" << "< " + << m_fakeTrackCut2 << " of hits from single Truth Track " + << "\n" << "\t" << "No link tracks \t Track has no link associated to an HepMC Particle" << "\n" - << "\t" << "Good reco tracks \t" << "> " + << "\t" << "Good reco tracks \t" << "> " << m_matchTrackCut << " of hits from single Truth Track + a link !"; ATH_MSG_INFO(outstr.str()); outstr.str(""); @@ -739,7 +739,7 @@ void InDet :: InDetRecStatisticsAlg :: printStatistics() { MsgStream &out = msg(MSG::INFO); { RestoreStream<MsgStream> restore(out); - for (std::vector <class TrackStatHelper *>::const_iterator collection = + for (std::vector <class TrackStatHelper *>::const_iterator collection = m_SignalCounters.begin(); collection != m_SignalCounters.end(); collection++) { if ((*collection)->key()=="CombinedInDetTracks"){ @@ -782,19 +782,19 @@ void InDet :: InDetRecStatisticsAlg :: printStatistics() { } if(m_printSecondary){ - outstr.str(""); + outstr.str(""); outstr << "\n" << std::setprecision(def_precision) <<s_linestr<<"\n" <<"Statistics for Secondaries (non-Primaries)"<<"\n" - << "\t" << "Secondary track start \t" - << " R < " << m_maxRStartSecondary << "mm and" + << "\t" << "Secondary track start \t" + << " R < " << m_maxRStartSecondary << "mm and" << " |z| < " << m_maxZStartSecondary << " mm" << "\n" << "\t" << "Secondary track end \t" << " R > " << m_minREndSecondary << "mm or" << " |z| > " << m_minZEndSecondary << "mm"; - ATH_MSG_INFO(outstr.str()); + ATH_MSG_INFO(outstr.str()); outstr.str(""); - for (std::vector <class TrackStatHelper *>::const_iterator collection = + for (std::vector <class TrackStatHelper *>::const_iterator collection = m_SignalCounters.begin(); collection != m_SignalCounters.end(); collection++) { if ((*collection)->key()=="CombinedInDetTracks"){ @@ -815,7 +815,7 @@ void InDet :: InDetRecStatisticsAlg :: printStatistics() { void InDet :: InDetRecStatisticsAlg ::printTrackSummary (MsgStream &out, enum eta_region eta_reg) { bool printed = false; - for (std::vector <class TrackStatHelper *>::const_iterator collection = + for (std::vector <class TrackStatHelper *>::const_iterator collection = m_SignalCounters.begin(); collection != m_SignalCounters.end(); collection++) { if ((*collection)->key()=="CombinedInDetTracks"){ @@ -827,7 +827,7 @@ void InDet :: InDetRecStatisticsAlg ::printTrackSummary (MsgStream &out, enum et << "----------------------------------------------------------------------------------------------------------------------------------------------" << "\n"; } printed = false; - for (std::vector <class TrackStatHelper *>::const_iterator collection = + for (std::vector <class TrackStatHelper *>::const_iterator collection = m_SignalCounters.begin(); collection != m_SignalCounters.end(); collection++) { if ((*collection)->key()=="CombinedInDetTracks"){ @@ -838,7 +838,7 @@ void InDet :: InDetRecStatisticsAlg ::printTrackSummary (MsgStream &out, enum et out << "\n" << "----------------------------------------------------------------------------------------------------------------------------------------------" << "\n"; } - for (std::vector <class TrackStatHelper *>::const_iterator collection = + for (std::vector <class TrackStatHelper *>::const_iterator collection = m_SignalCounters.begin(); collection != m_SignalCounters.end(); collection++) { if ((*collection)->key()=="CombinedInDetTracks"){ @@ -848,10 +848,10 @@ void InDet :: InDetRecStatisticsAlg ::printTrackSummary (MsgStream &out, enum et } // ================================================================================================================= -// calculatePull +// calculatePull // ================================================================================================================= -float InDet :: InDetRecStatisticsAlg :: calculatePull(const float residual, - const float trkErr, +float InDet :: InDetRecStatisticsAlg :: calculatePull(const float residual, + const float trkErr, const float hitErr){ double ErrorSum; ErrorSum = sqrt(pow(trkErr, 2) + pow(hitErr, 2)); @@ -860,16 +860,16 @@ float InDet :: InDetRecStatisticsAlg :: calculatePull(const float residual, } const Trk::TrackParameters * InDet::InDetRecStatisticsAlg::getUnbiasedTrackParameters(const Trk::TrackParameters* trkParameters, const Trk::MeasurementBase* measurement ){ - + const Trk::TrackParameters *unbiasedTrkParameters = 0; - + // ----------------------------------------- // use unbiased track states or normal ones? // unbiased track parameters are tried to retrieve if the updator tool // is available and if unbiased track states could be produced before // for the current track (ie. if one trial to get unbiased track states - // fail + // fail if (m_updator && (m_isUnbiased==1) ) { if ( trkParameters->covariance() ) { @@ -878,8 +878,8 @@ const Trk::TrackParameters * InDet::InDetRecStatisticsAlg::getUnbiasedTrackPara unbiasedTrkParameters = m_updator->removeFromState( *trkParameters, measurement->localParameters(), - measurement->localCovariance()); - + measurement->localCovariance()).release(); + if (!unbiasedTrkParameters) { ATH_MSG_WARNING("Could not get unbiased track parameters, " <<"use normal parameters"); @@ -896,7 +896,7 @@ const Trk::TrackParameters * InDet::InDetRecStatisticsAlg::getUnbiasedTrackPara m_isUnbiased = 0; } } // end if no measured track parameter - return unbiasedTrkParameters; + return unbiasedTrkParameters; } @@ -904,7 +904,7 @@ Identifier InDet::InDetRecStatisticsAlg::getIdentifier(const Trk::MeasurementBa Identifier id; const Trk::CompetingRIOsOnTrack *comprot = 0; // identify by ROT: - const Trk::RIO_OnTrack *rot = + const Trk::RIO_OnTrack *rot = dynamic_cast<const Trk::RIO_OnTrack*>(measurement); if (rot) { id = rot->identify(); @@ -921,5 +921,5 @@ Identifier InDet::InDetRecStatisticsAlg::getIdentifier(const Trk::MeasurementBa } } delete comprot; - return id; + return id; } diff --git a/Reconstruction/RecoTools/TrackToCalo/src/ParticleCaloExtensionTool.h b/Reconstruction/RecoTools/TrackToCalo/src/ParticleCaloExtensionTool.h index a0587bddbcac19432e5cb45e00bebc5435925070..2ae9e7882e55ff2ff4bad172d41da526525023cb 100644 --- a/Reconstruction/RecoTools/TrackToCalo/src/ParticleCaloExtensionTool.h +++ b/Reconstruction/RecoTools/TrackToCalo/src/ParticleCaloExtensionTool.h @@ -21,9 +21,9 @@ /* interfce for the extrapolator tool*/ #include "TrkExInterfaces/IExtrapolator.h" -#include "TrkEventPrimitives/ParticleHypothesis.h" +#include "TrkEventPrimitives/ParticleHypothesis.h" #include "TrkDetDescrUtils/GeometrySignature.h" -/* +/* * xAOD includes */ #include "xAODTracking/TrackParticle.h" @@ -44,35 +44,35 @@ public: * used throughout the sw */ using IParticleCaloExtensionTool::caloExtension; using IParticleCaloExtensionTool::caloExtensionCollection; - - + + ParticleCaloExtensionTool(const std::string&,const std::string&,const IInterface*); virtual ~ParticleCaloExtensionTool(); virtual StatusCode initialize() override final; virtual StatusCode finalize() override final; - /* + /* * Implement the IParticleCaloExtension methods */ virtual std::unique_ptr<Trk::CaloExtension> caloExtension(const EventContext& ctx, const xAOD::IParticle& particle) const override final; virtual const Trk::CaloExtension* caloExtension( const EventContext& ctx, - const xAOD::IParticle& particle, + const xAOD::IParticle& particle, IParticleCaloExtensionTool::Cache& cache ) const override final; virtual const Trk::CaloExtension* caloExtension( const xAOD::IParticle& particle, const CaloExtensionCollection& cache ) const override final; virtual StatusCode caloExtensionCollection( const EventContext& ctx, - const xAOD::IParticleContainer& particles, + const xAOD::IParticleContainer& particles, const std::vector<bool>& mask, CaloExtensionCollection& caloextensions) const override final; virtual std::unique_ptr<Trk::CaloExtension> caloExtension( const EventContext& ctx, - const TrackParameters& startPars, - PropDirection propDir, + const TrackParameters& startPars, + PropDirection propDir, ParticleHypothesis particleType ) const override final; @@ -86,14 +86,26 @@ private: const xAOD::TrackParticle& particle ) const; ToolHandle<Trk::IExtrapolator> m_extrapolator {this, "Extrapolator", ""}; - Gaudi::Property<std::string> m_particleTypeName{this,"ParticleType","muon", - "The particle type : muon, pion, electron,nonInteracting"}; - Gaudi::Property<bool> m_startFromPerigee{this,"StartFromPerigee",false, "Start from Perigee"}; + Gaudi::Property<std::string> m_particleTypeName{ + this, + "ParticleType", + "muon", + "The particle type : muon, pion, electron,nonInteracting" + }; + Gaudi::Property<bool> m_startFromPerigee{ this, + "StartFromPerigee", + false, + "Start from Perigee" }; const AtlasDetectorID* m_detID; - ParticleHypothesis m_particleType ; - - Gaudi::Property<unsigned int> m_extrapolDetectorID{this,"ExtrapolationDetectorID", Trk::Calo, "The detector this tool should extrapolate through. Expects a Trk::GeometrySignature enum value."}; - + ParticleHypothesis m_particleType; + + Gaudi::Property<unsigned int> m_extrapolDetectorID{ + this, + "ExtrapolationDetectorID", + Trk::Calo, + "The detector this tool should extrapolate through. Expects a " + "Trk::GeometrySignature enum value." + }; }; } diff --git a/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignResidualCalculator.cxx b/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignResidualCalculator.cxx index 958806144fd4519ddabcf9ed24047ce03bf346f6..d9f86fbdc5d87ce692fd7c0470da5bf41927a8ce 100644 --- a/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignResidualCalculator.cxx +++ b/Tracking/TrkAlignment/TrkAlignGenTools/src/AlignResidualCalculator.cxx @@ -25,8 +25,8 @@ namespace Trk { //______________________________________________________________ AlignResidualCalculator::AlignResidualCalculator(const std::string& type, const std::string& name, const IInterface* parent) - - : AthAlgTool(type,name,parent) + + : AthAlgTool(type,name,parent) , m_pullCalculator("Trk::ResidualPullCalculator/ResidualPullCalculator") , m_updator("Trk::KalmanUpdator/TrkKalmanUpdator") , m_qOverP{} @@ -35,7 +35,7 @@ namespace Trk { , m_chi2ForMeasType(0) { declareInterface<IAlignResidualCalculator>(this); - + declareProperty("ResidualPullCalculator", m_pullCalculator); declareProperty("ResidualType", m_resType = HitOnly); declareProperty("IncludeScatterers", m_includeScatterers = false ); @@ -51,10 +51,10 @@ namespace Trk { //________________________________________________________________________ StatusCode AlignResidualCalculator::initialize() - { + { // get residual pull calculator if (m_pullCalculator.retrieve().isFailure()) { - msg(MSG::FATAL) << "Could not get " << m_pullCalculator << endmsg; + msg(MSG::FATAL) << "Could not get " << m_pullCalculator << endmsg; return StatusCode::FAILURE; } ATH_MSG_INFO("Retrieved " << m_pullCalculator); @@ -62,7 +62,7 @@ namespace Trk { // get updator if(m_resType==Unbiased) { if (m_updator.retrieve().isFailure()) { - msg(MSG::FATAL) << "Could not get " << m_updator << endmsg; + msg(MSG::FATAL) << "Could not get " << m_updator << endmsg; return StatusCode::FAILURE; } ATH_MSG_INFO("Retrieved " << m_pullCalculator); @@ -78,14 +78,14 @@ namespace Trk { { return StatusCode::SUCCESS; } - + //________________________________________________________________________ double AlignResidualCalculator::setResiduals(AlignTSOSCollection* atsosColl,const Track* track) { bool useNewTrack = (track!=0); return setResiduals(atsosColl->begin(), atsosColl->end(), track, useNewTrack); } - + //________________________________________________________________________ double AlignResidualCalculator::setResiduals(AlignTrack* alignTrack,const Track* track) { @@ -93,11 +93,11 @@ namespace Trk { const Track* newTrack = (useNewTrack) ? track : alignTrack; return setResiduals(alignTrack->firstAtsos(), alignTrack->lastAtsos(), newTrack, useNewTrack); } - + //________________________________________________________________________ double AlignResidualCalculator::setResiduals(AlignTSOSCollection::iterator firstAtsos, AlignTSOSCollection::iterator lastAtsos, - const Track* track, bool newTrack) + const Track* track, bool newTrack) { m_nDoF=0; m_matchedTSOS.clear(); @@ -108,7 +108,7 @@ namespace Trk { m_chi2ForMeasType[i]=0.; //ATH_MSG_DEBUG("in setResiduals with newTrack="<<newTrack); - + if (!track&&newTrack) { ATH_MSG_ERROR("no track!"); return 0.; } int ntsos(0); @@ -125,11 +125,11 @@ namespace Trk { const MaterialEffectsBase* meb = tsos->materialEffectsOnTrack(); const Trk::MaterialEffectsOnTrack* meot = dynamic_cast<const MaterialEffectsOnTrack*>(meb); //const ScatteringAngles* scatterer = (meot) ? meot->scatteringAngles() : 0; - + // if scatterer, add scattering parameters //int nScattererDim=0; - if (m_includeScatterers && meb && meot) { - //nScattererDim = (scatterer) ? 2 : 1; + if (m_includeScatterers && meb && meot) { + //nScattererDim = (scatterer) ? 2 : 1; accumulateScattering(tsos); } //ATH_MSG_DEBUG("scattererDim="<<nScattererDim); @@ -142,23 +142,23 @@ namespace Trk { m_chi2ForMeasType[imeasType] += dchi2; ATH_MSG_DEBUG("adding "<<dchi2<<", m_chi2ForMeasType["<<imeasType<<"]="<<m_chi2ForMeasType[imeasType]); } - - return chi2;///(double)m_nDoF; + + return chi2;///(double)m_nDoF; } - + //_______________________________________________________________________ double AlignResidualCalculator::setResidualsOnATSOS(AlignTSOS * atsos, const TrackStateOnSurface * tsos) { // this method does the following: - // 1. gets residuals (measurement and scattering dimensions), - // 2. adds to AlignTSOS, and - // 3. returns contribution to chi2 from this ATSOS - + // 1. gets residuals (measurement and scattering dimensions), + // 2. adds to AlignTSOS, and + // 3. returns contribution to chi2 from this ATSOS + ATH_MSG_DEBUG("in setResidualsOnATSOS"); atsos->clearResiduals(); - + double dchi2(0.); // scattering residual(s) and/or energy loss first @@ -168,13 +168,13 @@ namespace Trk { // when using unbiased residuals including scatterers doesn't make sense if(m_resType == Unbiased) ATH_MSG_WARNING("When using unbiased residuals including scatterers doesn't make sense!"); - + const MaterialEffectsBase* meb = tsos->materialEffectsOnTrack(); const Trk::MaterialEffectsOnTrack* meot = dynamic_cast<const MaterialEffectsOnTrack*>(meb); const ScatteringAngles* scatterer = (meot) ? meot->scatteringAngles() : 0; - + int nscatparam=0; - if (meb && meot) + if (meb && meot) nscatparam = (scatterer) ? 2 : 1; for (int iparam=0;iparam<nscatparam;iparam++) { @@ -200,13 +200,13 @@ namespace Trk { errSq *= errSq; } } - else{ - ATH_MSG_WARNING("scatterer has no TrackParameters!"); + else{ + ATH_MSG_WARNING("scatterer has no TrackParameters!"); } Residual res(HitOnly,Scatterer,ParamDefs(iparam),residual,errSq); - atsos->addResidual(res); - + atsos->addResidual(res); + dchi2 += res.residualNorm()*res.residualNorm(); m_nDoF++; } @@ -227,7 +227,7 @@ namespace Trk { errSq*=errSq; Residual res(HitOnly,EnergyDeposit,ParamDefs(0),residual,errSq); - atsos->addResidual(res); + atsos->addResidual(res); dchi2 += res.residualNorm()*res.residualNorm(); m_nDoF++; } @@ -236,7 +236,7 @@ namespace Trk { // residuals from measurement if (atsos->rio() || atsos->crio()) { - + int nparams = (atsos->measType()==TrackState::Pixel) ? 2 : 1; for (int iparam=0;iparam<nparams;iparam++) { @@ -255,10 +255,10 @@ namespace Trk { if (m_resType == Unbiased) { // Get unbiased state - const Trk::TrackParameters * unbiasedTrackPars = + const Trk::TrackParameters * unbiasedTrackPars = m_updator->removeFromState(*trackPars, mesb->localParameters(), - mesb->localCovariance()); + mesb->localCovariance()).release(); if (unbiasedTrackPars) { trackPars = unbiasedTrackPars; // AlignTSOS desctructor takes care of deleting unbiasedTrackPars @@ -303,11 +303,11 @@ namespace Trk { m_nDoF++; } } - return dchi2; + return dchi2; } //________________________________________________________________________ - void AlignResidualCalculator::accumulateScattering(const TrackStateOnSurface* tsos) + void AlignResidualCalculator::accumulateScattering(const TrackStateOnSurface* tsos) { const MaterialEffectsOnTrack* meot = dynamic_cast<const MaterialEffectsOnTrack*>(tsos->materialEffectsOnTrack()); @@ -322,12 +322,12 @@ namespace Trk { if (!dynamic_cast<const CaloEnergy*>(energyLoss)) { m_previousQOverP = m_qOverP; } - + return; } - + //________________________________________________________________________ - const TrackStateOnSurface* + const TrackStateOnSurface* AlignResidualCalculator::getMatchingTSOS(const AlignTSOS* atsos, const Track* track) const { const TrackStateOnSurface* tsos(0); @@ -341,7 +341,7 @@ namespace Trk { const MeasurementBase* mesb = itTsos->measurementOnTrack(); const RIO_OnTrack* rio = dynamic_cast<const RIO_OnTrack*>(mesb); const CompetingRIOsOnTrack* crio = dynamic_cast<const CompetingRIOsOnTrack*>(mesb); - + if (!rio && crio) { rio = &(crio->rioOnTrack(0)); } @@ -350,7 +350,7 @@ namespace Trk { ATH_MSG_DEBUG("matched TSOS with identifier: "<<rio->identify()); tsos=itTsos; break; - } + } } ATH_MSG_DEBUG("done with measurement"); } @@ -358,7 +358,7 @@ namespace Trk { const Amg::Vector3D origPosition=atsos->trackParameters()->position(); double distance2(1.e27); - + // loop over track and get closest TSOS for (const TrackStateOnSurface* itTsos : *track->trackStateOnSurfaces()) { if (itTsos->type(TrackStateOnSurface::Outlier)) @@ -372,13 +372,13 @@ namespace Trk { distance2=newdist2; tsos=itTsos; } - } + } ATH_MSG_DEBUG("done with scatterer"); - } - if (!tsos) return 0; - const Amg::Vector3D addPosition=tsos->trackParameters()->position(); + } + if (!tsos) return 0; + const Amg::Vector3D addPosition=tsos->trackParameters()->position(); if (std::find(m_matchedTSOS.begin(),m_matchedTSOS.end(),tsos)==m_matchedTSOS.end()) { - m_matchedTSOS.push_back(tsos); + m_matchedTSOS.push_back(tsos); ATH_MSG_DEBUG("added tsos with pos: "<<addPosition); } else { @@ -387,5 +387,5 @@ namespace Trk { } return tsos; } - + } // end namespace diff --git a/Tracking/TrkFitter/TrkDynamicNoiseAdjustor/src/InDetDynamicNoiseAdjustment.cxx b/Tracking/TrkFitter/TrkDynamicNoiseAdjustor/src/InDetDynamicNoiseAdjustment.cxx index 42c8248f788623422e3ce8ebb77c56400ce02dd5..a922788e05763b03e3fadd2f5e92d286750b3070 100755 --- a/Tracking/TrkFitter/TrkDynamicNoiseAdjustor/src/InDetDynamicNoiseAdjustment.cxx +++ b/Tracking/TrkFitter/TrkDynamicNoiseAdjustor/src/InDetDynamicNoiseAdjustment.cxx @@ -299,7 +299,7 @@ Trk::InDetDynamicNoiseAdjustment::DNA_Adjust( // Change updatedPar for step one const Trk::TrackParameters* clonePars1 = - CREATE_PARAMETERS(*updatedPar, updatedParameters1, updatedCovariance1); + CREATE_PARAMETERS(*updatedPar, updatedParameters1, updatedCovariance1).release(); delete updatedPar; updatedPar = clonePars1; // --- Extrapolate changed updatedPar and calculate chi2 for step one @@ -337,7 +337,7 @@ Trk::InDetDynamicNoiseAdjustment::DNA_Adjust( // --- Change updatedPar for step two const Trk::TrackParameters* clonePars2 = - CREATE_PARAMETERS(*updatedPar, updatedParameters2, updatedCovariance2); + CREATE_PARAMETERS(*updatedPar, updatedParameters2, updatedCovariance2).release(); delete updatedPar; updatedPar = clonePars2; diff --git a/Tracking/TrkFitter/TrkFitterUtils/src/TrackFitInputPreparator.cxx b/Tracking/TrkFitter/TrkFitterUtils/src/TrackFitInputPreparator.cxx index f738b1e56b0c61bb939619c965db4cc6d5cd9a07..977de441fc33f07ae58efda451b4f0c1963dad1f 100755 --- a/Tracking/TrkFitter/TrkFitterUtils/src/TrackFitInputPreparator.cxx +++ b/Tracking/TrkFitter/TrkFitterUtils/src/TrackFitInputPreparator.cxx @@ -25,7 +25,7 @@ Trk::TrackFitInputPreparator::TrackFitInputPreparator() : m_sortingRefPoint(0., 0., 0.), m_extrapolator(nullptr) { - m_TP_ComparisonFunction + m_TP_ComparisonFunction = new Trk::TrkParametersComparisonFunction(m_sortingRefPoint); } @@ -33,7 +33,7 @@ Trk::TrackFitInputPreparator::TrackFitInputPreparator(const Amg::Vector3D& gp, c m_sortingRefPoint(gp), m_extrapolator(extrapolator) { - m_TP_ComparisonFunction + m_TP_ComparisonFunction = new Trk::TrkParametersComparisonFunction(m_sortingRefPoint); } @@ -100,7 +100,7 @@ StatusCode Trk::TrackFitInputPreparator::copyToTrajectory MB_IndexVector::iterator itIdx = sortedHitSet.begin(); for (; itIdx!=sortedHitSet.end(); ++itIdx) { bool outlier = (*inputTrk.trackStateOnSurfaces())[(*itIdx).second]->type(TrackStateOnSurface::Outlier); - const Trk::MeasurementBase* extractMB = + const Trk::MeasurementBase* extractMB = ((*inputTrk.trackStateOnSurfaces())[(*itIdx).second]->measurementOnTrack()); if (extractMB) { insertStateIntoTrajectory( trajectory, @@ -137,7 +137,7 @@ StatusCode Trk::TrackFitInputPreparator::copyToTrajectory // (reintegrateOutliers?false:outlier), // false,istate++)); // trajectory.back().identifier(Trk::IdentifierExtractor::extract((*it)->measurementOnTrack())); - } + } } } @@ -212,7 +212,7 @@ StatusCode Trk::TrackFitInputPreparator::copyToTrajectory for ( ; itIdx!=sortedHitSet.end(); ++itIdx) { if ((*itIdx).second < nInputStates ) { bool outlier = (*inputTrk.trackStateOnSurfaces())[(*itIdx).second]->type(TrackStateOnSurface::Outlier); - const Trk::MeasurementBase* extractMB = + const Trk::MeasurementBase* extractMB = ((*inputTrk.trackStateOnSurfaces())[(*itIdx).second]->measurementOnTrack()); if (extractMB) { insertStateIntoTrajectory( trajectory, @@ -242,7 +242,7 @@ StatusCode Trk::TrackFitInputPreparator::copyToTrajectory } } - + /* if inputs are already sorted or assumed so by convention, trajectory will not yet have been filled. In that case, just copy linearly. */ @@ -276,7 +276,7 @@ StatusCode Trk::TrackFitInputPreparator::copyToTrajectory StatusCode Trk::TrackFitInputPreparator::copyToTrajectory (Trk::Trajectory& trajectory, const Trk::TrackParameters*& referenceParameters, const Trk::Track& inputTrk1, const Trk::Track& inputTrk2, - const SortInputFlag doSorting, const bool reintegrateOutliers, + const SortInputFlag doSorting, const bool reintegrateOutliers, const ParticleHypothesis& partHypo) const { if (!trajectory.empty() ) { @@ -347,7 +347,7 @@ StatusCode Trk::TrackFitInputPreparator::copyToTrajectory for ( ; itIdx!=sortedHitSet.end(); ++itIdx) { if ((*itIdx).second < nInputStates ) { // extract from track #1 bool outlier = (*inputTrk1.trackStateOnSurfaces())[(*itIdx).second]->type(TrackStateOnSurface::Outlier); - const Trk::MeasurementBase* extractMB = + const Trk::MeasurementBase* extractMB = ((*inputTrk1.trackStateOnSurfaces())[(*itIdx).second]->measurementOnTrack()); if (extractMB) { insertStateIntoTrajectory( trajectory, @@ -364,7 +364,7 @@ StatusCode Trk::TrackFitInputPreparator::copyToTrajectory << "problem with track #1" << std::endl; } else { // extract from track #2 bool outlier = (*inputTrk2.trackStateOnSurfaces())[(*itIdx).second]->type(TrackStateOnSurface::Outlier); - const Trk::MeasurementBase* extractMB = + const Trk::MeasurementBase* extractMB = ((*inputTrk2.trackStateOnSurfaces())[(*itIdx).second]->measurementOnTrack()); if (extractMB) { insertStateIntoTrajectory( trajectory, @@ -384,7 +384,7 @@ StatusCode Trk::TrackFitInputPreparator::copyToTrajectory } } - + /* if inputs are already sorted or assumed so by convention, trajectory will not yet have been filled. In that case, just copy linearly. */ @@ -436,7 +436,7 @@ Trk::Track* Trk::TrackFitInputPreparator::copyToTrack DataVector<const TrackStateOnSurface> *newListOfStates = new DataVector<const TrackStateOnSurface>; TS_iterator itStates = inputTrk.trackStateOnSurfaces()->begin(); - for (;itStates!=inputTrk.trackStateOnSurfaces()->end();++itStates) + for (;itStates!=inputTrk.trackStateOnSurfaces()->end();++itStates) if ( (*itStates)->type(Trk::TrackStateOnSurface::Measurement) || (*itStates)->type(Trk::TrackStateOnSurface::Outlier) ) { std::bitset<TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern(0); @@ -445,7 +445,7 @@ Trk::Track* Trk::TrackFitInputPreparator::copyToTrack else typePattern.set(TrackStateOnSurface::Measurement); newListOfStates->push_back(new TrackStateOnSurface ((*itStates)->measurementOnTrack()->clone(), - ( (*itStates)->trackParameters() ? + ( (*itStates)->trackParameters() ? (*itStates)->trackParameters()->clone() : nullptr ), nullptr, @@ -462,7 +462,7 @@ Trk::Track* Trk::TrackFitInputPreparator::copyToTrack } if (doSorting) { - Trk::TrackStateOnSurfaceComparisonFunction* CompFunc = + Trk::TrackStateOnSurfaceComparisonFunction* CompFunc = new Trk::TrackStateOnSurfaceComparisonFunction ( (*inputTrk.trackParameters()->begin())->momentum() ) ; if(!__gnu_cxx::is_sorted(newListOfStates->begin(),newListOfStates->end(), *CompFunc)) @@ -484,12 +484,12 @@ Trk::MeasurementSet Trk::TrackFitInputPreparator::stripMeasurements MeasurementSet newMbSet; // collect MBs from Track (speed: assume use for extending track at end) DataVector<const MeasurementBase>::const_iterator it - = inputTrk.measurementsOnTrack()->begin(); - for ( ; it!=inputTrk.measurementsOnTrack()->end(); ++it) + = inputTrk.measurementsOnTrack()->begin(); + for ( ; it!=inputTrk.measurementsOnTrack()->end(); ++it) if ((*it)) newMbSet.push_back ( *it ); // add MBs from input list MeasurementSet::const_iterator itSet = inputMbs.begin(); - for ( ; itSet!=inputMbs.end(); ++itSet) + for ( ; itSet!=inputMbs.end(); ++itSet) if ((*itSet)) newMbSet.push_back ( *itSet ); return newMbSet; @@ -547,7 +547,7 @@ void Trk::TrackFitInputPreparator::insertStateIntoTrajectory(Trajectory& traject bool isOutlier, bool ownsMeasurement, const TrackParameters* initialParameters, - const ParticleHypothesis& partHypo ) const { + const ParticleHypothesis& partHypo ) const { const TrackParameters* trkPar = nullptr; Trk::ProtoMaterialEffects* matEffOnMeasurementSurface = nullptr; //std::cout << "InputPrep: partHypo:" << partHypo << std::endl; @@ -556,7 +556,9 @@ void Trk::TrackFitInputPreparator::insertStateIntoTrajectory(Trajectory& traject if (!trajectory.empty()) { /// get previous state: const TrackParameters* prevPar = trajectory.back().referenceParameters(); - if (prevPar->covariance()) prevPar = CREATE_PARAMETERS(*prevPar,prevPar->parameters(),nullptr); + if (prevPar->covariance()) { + prevPar = CREATE_PARAMETERS(*prevPar,prevPar->parameters(),nullptr).release(); + } const std::vector< const Trk::TrackStateOnSurface * >* collectedTSOS = m_extrapolator->extrapolateM( *prevPar, measurement->associatedSurface(), @@ -567,7 +569,7 @@ void Trk::TrackFitInputPreparator::insertStateIntoTrajectory(Trajectory& traject //Trk::pion // FIXME: decide on particle hypothesis to use! //track->info().particleHypothesis() ); - if (trajectory.back().referenceParameters()->covariance()) delete prevPar; // balance CREATE_PARS from a few lines earlier + if (trajectory.back().referenceParameters()->covariance()) delete prevPar; // balance CREATE_PARS from a few lines earlier if (collectedTSOS) { // copy into ProtoTrackStateOnSurface for memory management, ignoring the last: for (unsigned int i = 0 ; i < collectedTSOS->size() -1; i++) { diff --git a/Tracking/TrkFitter/TrkKalmanFitter/src/ForwardKalmanFitter.cxx b/Tracking/TrkFitter/TrkKalmanFitter/src/ForwardKalmanFitter.cxx index 75da53b5eca7e3e960b994fc2cd39c7774e412be..d4679bc2c6b27cb1709043799dca6ec6c8c28837 100755 --- a/Tracking/TrkFitter/TrkKalmanFitter/src/ForwardKalmanFitter.cxx +++ b/Tracking/TrkFitter/TrkKalmanFitter/src/ForwardKalmanFitter.cxx @@ -644,7 +644,7 @@ Trk::FitterStatusCode Trk::ForwardKalmanFitter::updateOrSkip (*cov)(i,i) = cov0[i]; } } - updatedPar = CREATE_PARAMETERS(*predPar,par,cov); + updatedPar = CREATE_PARAMETERS(*predPar,par,cov).release(); fitQuality = new Trk::FitQuality(0.0, fittableMeasurement->localParameters().dimension()); } else { @@ -653,7 +653,7 @@ Trk::FitterStatusCode Trk::ForwardKalmanFitter::updateOrSkip // make the update updatedPar = m_updator->addToState(*predPar, fittableMeasurement->localParameters(), fittableMeasurement->localCovariance(), - fitQuality); + fitQuality).release(); //////////////////////////////////////////////////////////////////// // check that updated parameters are ok and write back to trajectory if (!updatedPar) { @@ -692,7 +692,7 @@ Trk::FitterStatusCode Trk::ForwardKalmanFitter::updateOrSkip // make the update updatedPar = m_updator->addToState(*predPar, fittableMeasurement->localParameters(), fittableMeasurement->localCovariance(), - fitQuality); + fitQuality).release(); if ( (!updatedPar || !fitQuality || (runOutlier && fitQuality->chiSquared() > m_StateChiSquaredPerNumberDoFPreCut * fitQuality->numberDoF())) ) { @@ -806,7 +806,7 @@ Trk::FitterStatusCode Trk::ForwardKalmanFitter::enterSeedIntoTrajectory for (int i=0; i<5; ++i) (*cov)(i,i) = cov0[i]; const AmgVector(5)& par = inputParAtStartSurface->parameters(); // TODO: check does one need covariance here? - const Trk::TrackParameters* seedPar = CREATE_PARAMETERS((*inputParAtStartSurface),par, cov); + const Trk::TrackParameters* seedPar = CREATE_PARAMETERS((*inputParAtStartSurface),par, cov).release(); if (inputParAtStartSurface != &inputPar) delete inputParAtStartSurface; ffs->checkinForwardPar(seedPar); ATH_MSG_VERBOSE ("-Fe prepared trajectory with seed parameters on state "<<ffs->positionOnTrajectory()); diff --git a/Tracking/TrkFitter/TrkKalmanFitter/src/ForwardRefTrackKalmanFitter.cxx b/Tracking/TrkFitter/TrkKalmanFitter/src/ForwardRefTrackKalmanFitter.cxx index 518c583434ff587d6099e3d5c06890f6cedc9669..2f87613e65c79c26a3719ef0d54b0b2459c2fe23 100755 --- a/Tracking/TrkFitter/TrkKalmanFitter/src/ForwardRefTrackKalmanFitter.cxx +++ b/Tracking/TrkFitter/TrkKalmanFitter/src/ForwardRefTrackKalmanFitter.cxx @@ -64,7 +64,7 @@ Trk::ForwardRefTrackKalmanFitter::ForwardRefTrackKalmanFitter(const std::string& { // AlgTool stuff declareInterface<IForwardKalmanFitter>( this ); - + // declare all properties needed to configure fitter, defaults declareProperty("StateChi2PerNDFPreCut", m_StateChiSquaredPerNumberDoFPreCut=50.f, "coarse pre-cut on the predicted state's chi2/ndf against outliers destabilising the filter - only in effect if called with runOutlier true"); @@ -91,7 +91,7 @@ StatusCode Trk::ForwardRefTrackKalmanFitter::finalize() ATH_MSG_INFO ("finalize() successful in " << name()); return StatusCode::SUCCESS; } - + //////////////////////////////////////////////////////////////////////////////// // // // configure the Forward Filter @@ -114,7 +114,7 @@ StatusCode Trk::ForwardRefTrackKalmanFitter::configureWithTools(const Trk::IExtr m_ROTcreator = rot_crea; m_dynamicNoiseAdjustor = dna; m_recalibrator = mr; - + // protection, if not confiured if (!m_updator) { ATH_MSG_ERROR ("Updator missing, need to configure with it !"); @@ -126,9 +126,9 @@ StatusCode Trk::ForwardRefTrackKalmanFitter::configureWithTools(const Trk::IExtr } msg(MSG::INFO) << "Configuring " << name() << " with tools from KalmanFitter:" << endmsg; msg(MSG::INFO) << "Updator and Extrapolator - present" << endmsg; - msg(MSG::INFO) << "Dyn.NoiseAdjustment Pix/SCT - " + msg(MSG::INFO) << "Dyn.NoiseAdjustment Pix/SCT - " << (m_dynamicNoiseAdjustor? "present" : "none") << endmsg; - msg(MSG::INFO) << "General RIO_OnTrackCreator - " + msg(MSG::INFO) << "General RIO_OnTrackCreator - " << (m_ROTcreator? "present" : "none") << endmsg; msg(MSG::INFO) << "RIO_OnTrack Recalibrator - " << (m_recalibrator?"present":"none")<<endmsg; return StatusCode::SUCCESS; @@ -141,7 +141,7 @@ StatusCode Trk::ForwardRefTrackKalmanFitter::configureWithTools(const Trk::IExtr // // //////////////////////////////////////////////////////////////////////////////// -Trk::FitterStatusCode +Trk::FitterStatusCode Trk::ForwardRefTrackKalmanFitter::fit(Trk::Trajectory&, const Trk::PrepRawDataSet& , const Trk::TrackParameters& , @@ -187,8 +187,8 @@ Trk::ForwardRefTrackKalmanFitter::fit(Trk::Trajectory& trajectory, // testIt = m_utility->nextFittableState(trajectory,it); // } } - ATH_MSG_VERBOSE ("-F- start FwFilter with parameters from "<< - (filterStartState>2 ? "before this new Outlier state":"the seed") + ATH_MSG_VERBOSE ("-F- start FwFilter with parameters from "<< + (filterStartState>2 ? "before this new Outlier state":"the seed") << " at pos. " << it->positionOnTrajectory() << " filter start state " << filterStartState); if (!it->parametersDifference() || !it->referenceParameters()) { @@ -233,11 +233,11 @@ Trk::ForwardRefTrackKalmanFitter::fit(Trk::Trajectory& trajectory, predDiffCov = C; // to solve constness problem // back into trajectory it->checkinParametersDifference(predDiffPar); - it->checkinParametersCovariance(predDiffCov); + it->checkinParametersCovariance(predDiffCov); updatedDifference.reset(); // delete updatedDiffCov; updatedDiffCov=0; } - if (msgLvl(MSG::DEBUG)) + if (msgLvl(MSG::DEBUG)) printGlobalParams( it->positionOnTrajectory(), " extrp", *it->referenceParameters(),*predDiffPar ); @@ -261,7 +261,6 @@ Trk::ForwardRefTrackKalmanFitter::fit(Trk::Trajectory& trajectory, m_recalibrator->calibrationStatus(*it->measurement(),TrackState::TRT) ); fittableMeasurement = it->measurement(); ATH_MSG_VERBOSE ("TRT ROT calibration changed, from "<<oldType<<" to "<<it->calibrationType()); - delete param; } Trk::FitQualityOnSurface* fitQS=nullptr; @@ -289,7 +288,7 @@ Trk::ForwardRefTrackKalmanFitter::fit(Trk::Trajectory& trajectory, // analyse the fit quality, possibly flag as outlier if ( runOutlier && fitQS->chiSquared() > m_StateChiSquaredPerNumberDoFPreCut * fitQS->numberDoF() ) { - + // allow making of wire-hits for TRT fits with L/R-solving on the fly if ( m_recalibrator && it->measurementType() == TrackState::TRT) { const AmgVector(5) x = it->referenceParameters()->parameters()+(*predDiffPar); @@ -304,9 +303,9 @@ Trk::ForwardRefTrackKalmanFitter::fit(Trk::Trajectory& trajectory, fittableMeasurement = it->measurement(); ATH_MSG_VERBOSE ("TRT ROT calibration changed, from "<<oldType<<" to broad hit "<< it->calibrationType()<< " instead of outlier"); - delete fitQS; + delete fitQS; fitQS=nullptr; - updatedDifference.reset( + updatedDifference.reset( m_updator->updateParameterDifference(*predDiffPar, *predDiffCov, *(it->measurementDifference()), fittableMeasurement->localCovariance(), @@ -320,8 +319,7 @@ Trk::ForwardRefTrackKalmanFitter::fit(Trk::Trajectory& trajectory, it->isOutlier(Trk::TrackState::StateOutlier); } } - //delete param; - } else { + } else { ATH_MSG_DEBUG ( "failed Chi2 test, remove measurement from track fit." ); it->isOutlier ( Trk::TrackState::StateOutlier ); } @@ -329,7 +327,7 @@ Trk::ForwardRefTrackKalmanFitter::fit(Trk::Trajectory& trajectory, && (*predDiffCov)(Trk::phi,Trk::phi) < 0.01*0.01 && (*predDiffCov)(Trk::theta,Trk::theta) < 0.01*0.01 && ! ( Trk::SensorBoundsCheck::areParamsInside - ( *fittableMeasurement, + ( *fittableMeasurement, (it->referenceParameters()->parameters()+updatedDifference->first), updatedDifference->second, 5.0, 4.0 ) ) ) { ATH_MSG_DEBUG ( "failed track-within-sensor test, remove measurement from fit." ); @@ -357,7 +355,7 @@ Trk::ForwardRefTrackKalmanFitter::fit(Trk::Trajectory& trajectory, delete fitQS; } } - // bremStateIfBremFound = NULL; + // bremStateIfBremFound = NULL; // extract jacobian which is the one to transport from this to next state jacobian = it->jacobian(); @@ -390,7 +388,7 @@ Trk::FitterStatusCode Trk::ForwardRefTrackKalmanFitter::enterSeedIntoTrajectory Trk::Trajectory::iterator ffs = m_utility->firstFittableState(trajectory); - + if (createReferenceTrajectory && ffs->jacobian()) { ATH_MSG_WARNING ("internal mistake: reference parameters should be recreated only on"<< " EMPTY trajectory."); @@ -408,7 +406,7 @@ Trk::FitterStatusCode Trk::ForwardRefTrackKalmanFitter::enterSeedIntoTrajectory } const Trk::Surface& startSurface = ffs->measurement()->associatedSurface(); const Trk::TrackParameters* inputParAtStartSurface = nullptr; - + // chk if TPar are already in correct local frame: first pointer check (quick) then geometric if ( &startSurface == &inputPar.associatedSurface() || startSurface == inputPar.associatedSurface() ) { @@ -455,9 +453,9 @@ Trk::FitterStatusCode Trk::ForwardRefTrackKalmanFitter::enterSeedIntoTrajectory // lazy initialization because the tracking geometry is built after conditions are there Trk::MagneticFieldProperties useFullField(Trk::FullField); - if (m_idEnclosingVolume == nullptr ) m_idEnclosingVolume = + if (m_idEnclosingVolume == nullptr ) m_idEnclosingVolume = m_extrapolator->trackingGeometry()->trackingVolume("InDet::Containers::InnerDetector"); - if (m_msCompleteVolume == nullptr ) m_msCompleteVolume = + if (m_msCompleteVolume == nullptr ) m_msCompleteVolume = m_extrapolator->trackingGeometry()->trackingVolume("All::Container::CompleteDetector"); if (m_idEnclosingVolume==nullptr && m_msCompleteVolume == nullptr) { ATH_MSG_WARNING ("Could not get any detector enclosing volume from tracking geometry."); @@ -466,32 +464,32 @@ Trk::FitterStatusCode Trk::ForwardRefTrackKalmanFitter::enterSeedIntoTrajectory const IPropagator* propagator = nullptr; bool isInsideID = true; if (m_idEnclosingVolume && m_idEnclosingVolume->inside(inputParAtStartSurface->position())) { - ATH_MSG_VERBOSE ("subPropagator detection: found id volume of signature ID " << + ATH_MSG_VERBOSE ("subPropagator detection: found id volume of signature ID " << (unsigned int)m_idEnclosingVolume->geometrySignature()); propagator = m_extrapolator->subPropagator(*m_idEnclosingVolume); } else if (m_msCompleteVolume) { propagator = m_extrapolator->subPropagator(*m_msCompleteVolume); isInsideID = false; - ATH_MSG_VERBOSE ("subPropagator detector: found MS enclosing volume with signature ID " << + ATH_MSG_VERBOSE ("subPropagator detector: found MS enclosing volume with signature ID " << (unsigned int)m_msCompleteVolume->geometrySignature()); } else { ATH_MSG_WARNING ("No way to get the correct propagator!"); return FitterStatusCode::BadInput; } - auto lastPropagatedPar = + auto lastPropagatedPar = CREATE_PARAMETERS((*inputParAtStartSurface), inputParAtStartSurface->parameters(), nullptr); // remove covariance for (auto it=m_utility->firstFittableState ( trajectory ); it!=trajectory.end(); ++it) { if (!it->referenceParameters()) { //gives up ownership by default, ProtoTrackStateOnSurface takes care of deletion - it->checkinReferenceParameters (lastPropagatedPar); + it->checkinReferenceParameters (lastPropagatedPar.release()); } else { //delete lastPropagatedPar; lastPropagatedPar=nullptr; // FIXME study this further, whether cov really not needed and how close in param // space the old and new references are. ATH_MSG_VERBOSE("At state T"<<it->positionOnTrajectory()<<" have already reference."); - if (it->referenceParameters()->covariance()) + if (it->referenceParameters()->covariance()) ATH_MSG_DEBUG("Warning - reference parameters have a covariance, which is unnecessary."); } if ((it+1) == trajectory.end()) break; // no jacobian beyond last trajectory state @@ -501,7 +499,7 @@ Trk::FitterStatusCode Trk::ForwardRefTrackKalmanFitter::enterSeedIntoTrajectory isInsideID = false; propagator = m_extrapolator->subPropagator(*m_msCompleteVolume); ATH_MSG_DEBUG ("changed from ID to MS propagator."); - } else if (!isInsideID && m_idEnclosingVolume + } else if (!isInsideID && m_idEnclosingVolume && m_idEnclosingVolume->inside(nextSurface.center())) { isInsideID = true; propagator = m_extrapolator->subPropagator(*m_idEnclosingVolume); @@ -515,14 +513,13 @@ Trk::FitterStatusCode Trk::ForwardRefTrackKalmanFitter::enterSeedIntoTrajectory } lastPropagatedPar = propagator->propagate(*it->referenceParameters(), nextSurface, - Trk::anyDirection, + Trk::anyDirection, /*bcheck=*/ false, useFullField,jac, pathLimit, - controlledMatEffects.particleType() ).release(); + controlledMatEffects.particleType() ); if (!jac || !lastPropagatedPar) { ATH_MSG_WARNING ("lost reference track while propagating."); delete jac; - //delete lastPropagatedPar; return FitterStatusCode::BadInput; } it->checkinTransportJacobian(jac,true); @@ -544,7 +541,7 @@ void Trk::ForwardRefTrackKalmanFitter::printGlobalParams(int istate, const std:: const AmgVector(5) x = ref.parameters()+diff; auto param = CREATE_PARAMETERS(ref,x,nullptr); char tt[80]; snprintf(tt,79,"T%.2d",istate); - msg(MSG::VERBOSE) << tt << ptype << " GP:" + msg(MSG::VERBOSE) << tt << ptype << " GP:" << std::setiosflags(std::ios::fixed | std::ios::showpoint | std::ios::right ) << std::setw(9) << std::setprecision(2) << param->position()[0] << std::setw(9) << std::setprecision(2) << param->position()[1] @@ -554,5 +551,4 @@ void Trk::ForwardRefTrackKalmanFitter::printGlobalParams(int istate, const std:: << std::setw(8) << std::setprecision(0) << param->momentum()[1] << std::setw(8) << std::setprecision(0) << param->momentum()[2] << std::setprecision(6) << endmsg; - delete param; } diff --git a/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanFitter.cxx b/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanFitter.cxx index c1293717fd595848baf7787242576c98530c5c1c..b25a0d97493f615071bd4a5cbbc1c611e7c38d79 100755 --- a/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanFitter.cxx +++ b/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanFitter.cxx @@ -82,9 +82,9 @@ Trk::KalmanFitter::KalmanFitter(const std::string& t,const std::string& n, m_chiSquaredAfb{}, m_chiSquaredAfbNontriviality{} { declareInterface<ITrackFitter>( this ); - + m_trajectory.reserve(100); - + // --- tools used by KalmanFitter, passed as ToolHandles declareProperty("ExtrapolatorHandle",m_extrapolator, "Extrapolation tool for transporting track pars and handling material effects"); @@ -143,7 +143,7 @@ StatusCode Trk::KalmanFitter::initialize() { //AthAlgTool::initialize().ignore(); m_log.setLevel(msgLevel()); // individual outputlevel not known before initialise - + // get all the track fitter sub-tools (REQUIRED tools, obviously) ATH_CHECK(m_forwardFitter.retrieve()); ATH_CHECK(m_smoother.retrieve()); @@ -168,7 +168,7 @@ StatusCode Trk::KalmanFitter::initialize() ATH_MSG_FATAL ("can not retrieve extrapolator of type " << m_extrapolator.typeAndName()); return StatusCode::FAILURE; } ATH_MSG_INFO ("retrieved tool " << m_extrapolator.typeAndName()); - + // --- get ROT creator (OPTIONAL tool) if (!m_ROTcreator.empty()) { if (m_ROTcreator.retrieve().isFailure()) { @@ -263,13 +263,13 @@ StatusCode Trk::KalmanFitter::initialize() (&(*m_extrapolator)) : nullptr); // configure internal DAF - if (!m_internalDAF.empty() && + if (!m_internalDAF.empty() && m_internalDAF->configureWithTools((!m_extrapolator.empty()?(&(*m_extrapolator)):nullptr), (!m_updator.empty()?(&(*m_updator)):nullptr), (!m_recalibrator.empty()?(&(*m_recalibrator)):nullptr), m_utility ).isFailure()) { ATH_MSG_WARNING ("failure while configuring internal DAF!"); - ATH_MSG_INFO ("debugging info: ex = " << m_extrapolator << " up = " << m_updator << + ATH_MSG_INFO ("debugging info: ex = " << m_extrapolator << " up = " << m_updator << " rc " << m_recalibrator<<" ut = " << m_utility); return StatusCode::FAILURE; } @@ -338,7 +338,7 @@ StatusCode Trk::KalmanFitter::initialize() } ATH_MSG_INFO ("Initial covariance, set with the KF: " << m_cov0); - + std::vector<int> statVec(nStatIndex, 0); m_fitStatistics.resize(nFitStatsCodes, statVec); m_chiSquaredAfb.fill(0.); @@ -353,7 +353,7 @@ StatusCode Trk::KalmanFitter::finalize() delete m_tparScaleSetter; delete m_utility; delete m_inputPreparator; - + if (msgLvl(MSG::INFO)) { std::stringstream ss; int iw=9; @@ -395,7 +395,7 @@ StatusCode Trk::KalmanFitter::finalize() ss << "-------------------------------------------------------------------------------\n"; ATH_MSG_INFO (name() << "'s fit statistics:\n"<<ss.str()); } - + ATH_MSG_INFO ("finalize() successful in " << name()); return StatusCode::SUCCESS; } @@ -430,11 +430,11 @@ Trk::KalmanFitter::fit(const EventContext& ctx, DataVector<const TrackParameters>::const_iterator it = inputTrack.trackParameters()->begin(); for(int i=0 ; it!=inputTrack.trackParameters()->end(); ++it, ++i) { - ATH_MSG_VERBOSE( "TrackPar" << (i<10 ? " " : " ") << i + ATH_MSG_VERBOSE( "TrackPar" << (i<10 ? " " : " ") << i << " position mag : " << (*it)->position().mag() << ", to ref is " << ((*it)->position()-m_sortingRefPoint).mag()); } - ATH_MSG_VERBOSE( "Now getting track parameters near origin " + ATH_MSG_VERBOSE( "Now getting track parameters near origin " << (m_option_enforceSorting? "via STL sort" : "as first TP (convention)")); } // fill internal trajectory through external preparator class @@ -461,7 +461,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, this_eta = minPar->eta(); monitorTrackFits( Trk::KalmanFitter::Call, this_eta ); } - + // --- perform first forward filter on measurement set extracted from track ATH_MSG_VERBOSE ("\n***** call forward kalman filter, iteration # 1 *****\n"); if (m_forwardFitter->enterSeedIntoTrajectory(m_trajectory,*minPar,m_cov0,kalMec,true) @@ -481,7 +481,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, m_trajectory.clear(); if (!fittedTrack) delete fitQual; return std::unique_ptr<Trk::Track>(fittedTrack); - } + } delete fitQual; m_trajectory.clear(); // iterations failed: @@ -495,7 +495,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, } ATH_MSG_DEBUG( "fit(track) during iterations failed." ); return nullptr; - + } @@ -571,11 +571,11 @@ Trk::KalmanFitter::fit(const EventContext& ctx, m_trajectory.clear(); if (!fittedTrack) delete fitQual; return std::unique_ptr<Trk::Track>(fittedTrack); - } + } delete fitQual; m_trajectory.clear(); return nullptr; - + } // fit a set of MeasurementBase objects @@ -617,13 +617,13 @@ Trk::KalmanFitter::fit(const EventContext& ctx, MeasurementSet::const_iterator it1 = sortedHitSet.begin(); MeasurementSet::const_iterator it1End = sortedHitSet.end(); for( ; it1!=it1End; ++it1) { - ATH_MSG_VERBOSE( "-K- globalPos() magnitude is " + ATH_MSG_VERBOSE( "-K- globalPos() magnitude is " << (*it1)->globalPosition().mag() << ", transverse r " << (*it1)->globalPosition().perp() ); } } delete MeasB_CompFunc; - + // fill measurements into fitter-internal trajectory: no outlier, external meas't MeasurementSet::const_iterator it = sortedHitSet.begin(); MeasurementSet::const_iterator itEnd = sortedHitSet.end(); @@ -645,7 +645,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, this_eta = estimatedStartParameters.eta(); monitorTrackFits( Trk::KalmanFitter::Call, this_eta ); } - + ATH_MSG_VERBOSE( "These TrackPars are chosen as seed: "<<estimatedStartParameters); /* --- perform first forward filter on measurement set. Assume that clients who @@ -671,7 +671,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, m_trajectory.clear(); if (!fittedTrack) delete fitQual; return std::unique_ptr<Trk::Track>(fittedTrack); - } + } if (fitQual) delete fitQual; m_trajectory.clear(); // iterations failed: @@ -685,7 +685,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, } ATH_MSG_DEBUG( "fit(vec<MB>) during iteration failed." ); return nullptr; - + } // extend a track fit to include an additional set of PrepRawData objects @@ -700,7 +700,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, m_fitStatus = Trk::FitterStatusCode::BadInput; ATH_MSG_VERBOSE ("--> enter KalmanFitter::fit(Track,PrdSet,,)"); ATH_MSG_VERBOSE (" with Track from author = " << inputTrack.info().dumpInfo()); - + // protection, if empty PrepRawDataSet if (addPrdColl.empty()) { ATH_MSG_WARNING ("client tries to add an empty PrepRawDataSet to the track fit."); @@ -709,7 +709,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, /* determine the Track Parameter which is the start of the trajectory, i.e. closest to the reference point */ - ATH_MSG_VERBOSE ("get track parameters near origin " + ATH_MSG_VERBOSE ("get track parameters near origin " << (m_option_enforceSorting? "via STL sort" : "from 1st state")); const TrackParameters* estimatedStartParameters = m_option_enforceSorting ? *(std::min_element(inputTrack.trackParameters()->begin(), @@ -719,12 +719,12 @@ Trk::KalmanFitter::fit(const EventContext& ctx, // use external preparator class to prepare PRD set for fitter interface - PrepRawDataSet orderedPRDColl = + PrepRawDataSet orderedPRDColl = m_inputPreparator->stripPrepRawData(inputTrack,addPrdColl,m_option_enforceSorting, true /* do not lose outliers! */); std::unique_ptr<Trk::Track> fittedTrack = fit(ctx, orderedPRDColl, *estimatedStartParameters, runOutlier, matEffects); - const TrackInfo& existingInfo = inputTrack.info(); + const TrackInfo& existingInfo = inputTrack.info(); if (fittedTrack) fittedTrack->info().addPatternRecoAndProperties(existingInfo); return fittedTrack; } @@ -743,7 +743,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, m_fitStatus = Trk::FitterStatusCode::BadInput; ATH_MSG_VERBOSE ("--> enter KalmanFitter::fit(Track,Meas'BaseSet,,)"); ATH_MSG_VERBOSE (" with Track from author = " << inputTrack.info().dumpInfo()); - + // protection, if empty MeasurementSet if (addMeasColl.empty()) { ATH_MSG_WARNING( "client tries to add an empty MeasurementSet to the track fit." ); @@ -804,7 +804,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, m_trajectory.clear(); if (!fittedTrack) delete fitQual; return std::unique_ptr<Trk::Track>(fittedTrack); - } + } delete fitQual; fitQual = nullptr; m_trajectory.clear(); @@ -821,7 +821,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, } ATH_MSG_DEBUG ("fit(track,vec<MB>) during iteration failed."); return nullptr; - + } // combined fit of two tracks @@ -835,7 +835,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, { m_fitStatus = Trk::FitterStatusCode::BadInput; ATH_MSG_VERBOSE ("--> enter KalmanFitter::fit(Track,Track,)"); - ATH_MSG_VERBOSE (" with Tracks from #1 = " << intrk1.info().dumpInfo() + ATH_MSG_VERBOSE (" with Tracks from #1 = " << intrk1.info().dumpInfo() << " and #2 = " << intrk2.info().dumpInfo()); // protection against not having measurements on the input tracks @@ -848,7 +848,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, /* determine the Track Parameter which is the start of the trajectory, i.e. closest to the reference point */ - ATH_MSG_VERBOSE( "get track parameters near origin " + ATH_MSG_VERBOSE( "get track parameters near origin " << (m_option_enforceSorting? "via STL sort" : "as first TP (convention)")); if (!intrk1.trackParameters() || intrk1.trackParameters()->empty()) { ATH_MSG_WARNING( "input #1 fails to provide track parameters for seeding the " @@ -858,7 +858,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, // fill internal trajectory through external preparator class const TrackParameters* minPar = nullptr; - if (m_inputPreparator->copyToTrajectory(m_trajectory, minPar, + if (m_inputPreparator->copyToTrajectory(m_trajectory, minPar, intrk1,intrk2,m_option_enforceSorting, m_option_reintegrateOutliers, matEffects) == StatusCode::FAILURE) { @@ -882,7 +882,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, this_eta = minPar->eta(); monitorTrackFits( Trk::KalmanFitter::Call, this_eta ); } - + // --- perform first forward filter on measurement set extracted from track if (m_forwardFitter->enterSeedIntoTrajectory(m_trajectory,*minPar,m_cov0,kalMec,true) != Trk::FitterStatusCode::Success) return nullptr; @@ -901,10 +901,10 @@ Trk::KalmanFitter::fit(const EventContext& ctx, makeTrack(ctx, fitQual, *minPar, &kalMec, this_eta, &(intrk1.info())); m_trajectory.clear(); if (!fittedTrack) delete fitQual; - const TrackInfo& existingInfo2 = intrk2.info(); + const TrackInfo& existingInfo2 = intrk2.info(); if (fittedTrack) fittedTrack->info().addPatternReco(existingInfo2); return std::unique_ptr<Trk::Track>(fittedTrack); - } + } delete fitQual; m_trajectory.clear(); // iterations failed: @@ -917,7 +917,7 @@ Trk::KalmanFitter::fit(const EventContext& ctx, m_callValidationTool = false; } return nullptr; - + } // Main internal iteration logic for all interfaces: @@ -965,7 +965,7 @@ bool Trk::KalmanFitter::iterateKalmanFilter(const EventContext& ctx, // run backward smoother if (m_forwardFitter->needsReferenceTrajectory()) m_fitStatus = m_smoother->fitWithReference(m_trajectory, newFitQuality, kalMec); - else + else m_fitStatus = m_smoother->fit(m_trajectory, newFitQuality, kalMec); // call validation tool if provided if (m_callValidationTool) @@ -986,7 +986,7 @@ bool Trk::KalmanFitter::iterateKalmanFilter(const EventContext& ctx, if (m_option_doValidationAction) m_extrapolator->validationAction(); if (nOutlierIterations==1 && !m_utility->trajectoryHasMefot(m_trajectory) - && !m_brempointAnalyser.empty() + && !m_brempointAnalyser.empty() && !kalMec.aggressiveDNA() && kalMec.breakpointType()==Trk::BreakpointNotSpecified ) { kalMec.updateBreakpoint(Trk::NoBreakpoint); @@ -1040,11 +1040,11 @@ bool Trk::KalmanFitter::iterateKalmanFilter(const EventContext& ctx, if (newFitQuality == nullptr || newFitQuality->numberDoF() <= 0) { fitter_is_ready = false; } else { - fitter_is_ready = + fitter_is_ready = !m_outlierLogic->flagNewOutliers( m_trajectory,*newFitQuality, iFilterBeginState,nOutlierIterations ); if (!m_outlierRecovery.empty()) { - bool nothingToRecover = + bool nothingToRecover = !m_outlierRecovery->flagNewOutliers( m_trajectory,*newFitQuality, iFilterBeginState,nOutlierIterations ); ATH_MSG_DEBUG("have outlier-recovery tool, this "<< @@ -1058,8 +1058,8 @@ bool Trk::KalmanFitter::iterateKalmanFilter(const EventContext& ctx, if (msgLvl(MSG::DEBUG)) m_utility->dumpTrajectory(m_trajectory, name()); bool fit_has_failed = - ( newFitQuality==nullptr - || newFitQuality->numberDoF() <=0 + ( newFitQuality==nullptr + || newFitQuality->numberDoF() <=0 || ( (m_utility->numberOfOutliers(m_trajectory)-nPreviousOutliers)> 0.4*m_trajectory.size()) || nOutlierIterations >= m_option_max_N_iterations || m_utility->rankedNumberOfMeasurements(m_trajectory) < 5); @@ -1088,7 +1088,7 @@ bool Trk::KalmanFitter::iterateKalmanFilter(const EventContext& ctx, if ( (nMeasPrecise+nMeasTube+nOutlPrecise+nOutlTube) > 12 && ( ( (nOutlPrecise+nOutlTube) > 7 && nOutlierIterations >= m_option_max_N_iterations-1) || (m_utility->numberOfNewOutliers(m_trajectory,posFirstTrt)>3 - && nOutlierIterations >= m_option_max_N_iterations-1) + && nOutlierIterations >= m_option_max_N_iterations-1) || (nOutlierIterations >= m_option_max_N_iterations && m_trajectory.size()>20) )) { m_fitStatus = Trk::FitterStatusCode::NoConvergence; @@ -1118,7 +1118,7 @@ bool Trk::KalmanFitter::iterateKalmanFilter(const EventContext& ctx, return false; } } // end dna-separation skips outliers - + } // end loop over outliers return true; } @@ -1135,7 +1135,7 @@ bool Trk::KalmanFitter::invokeAnnealingFilter(const Trk::TrackParameters*& star if ( runOutlier && !m_internalDAF.empty() ) { // --- There is an alternative: perform enhanced local pattern recognition (DAF) - + bool instable_filter = (m_fitStatus == Trk::FitterStatusCode::UpdateFailure) || (m_fitStatus == Trk::FitterStatusCode::FitQualityFailure) || (m_fitStatus == Trk::FitterStatusCode::ExtrapolationFailure) @@ -1151,18 +1151,18 @@ bool Trk::KalmanFitter::invokeAnnealingFilter(const Trk::TrackParameters*& star double chi2_AFB = 0.0; if (newFitQuality != nullptr) { Trk::FitQuality ffq = m_utility->forwardFilterQuality(m_trajectory); - chi2_AFB = (ffq.chiSquared() - newFitQuality->chiSquared()) / + chi2_AFB = (ffq.chiSquared() - newFitQuality->chiSquared()) / (ffq.chiSquared() + newFitQuality->chiSquared()); } unsigned int count_trt = m_utility->numberOfSpecificStates(m_trajectory,Trk::TrackState::TRT,Trk::TrackState::AnyState); found_problematic_seed = m_trajectory.size() < 25 && // don't continue iterating on long tracks - count_trt<0.9*m_trajectory.size() && + count_trt<0.9*m_trajectory.size() && (m_utility->numberOfNewOutliers(m_trajectory,6) > 1 || (chi2_AFB > 0.1 && m_trajectory.size()<18) /*FKF returned w/ more problems*/ ); } if (instable_filter || found_problematic_seed) { - + // --- prepare trajectory for running DAF as outlier and driftcircle-R-L logic m_utility->defineMeasurementsExceptThis(m_trajectory,0); m_utility->clearFitResultsAfterOutlier(m_trajectory,newFitQuality,0); @@ -1170,12 +1170,12 @@ bool Trk::KalmanFitter::invokeAnnealingFilter(const Trk::TrackParameters*& star FitterStatusCode dafStatus = Trk::FitterStatusCode::OutlierLogicFailure; if (m_forwardFitter->enterSeedIntoTrajectory(m_trajectory,*startPar,m_cov0,kalMec,false) - == Trk::FitterStatusCode::Success) + == Trk::FitterStatusCode::Success) dafStatus = m_internalDAF->filterTrajectory(m_trajectory, kalMec.particleType()); // remark: there is also an interface for running the DAF on a *part of* the // trajectory, intended for TRT, ID, MS subparts of combined tracks - if (dafStatus == Trk::FitterStatusCode::Success) { + if (dafStatus == Trk::FitterStatusCode::Success) { ATH_MSG_VERBOSE("internal DAF succeeded, now going back to std fit by running one backward smoother."); kalMec.updateBreakpoint(Trk::BreakpointNotSpecified); @@ -1190,8 +1190,8 @@ bool Trk::KalmanFitter::invokeAnnealingFilter(const Trk::TrackParameters*& star else ATH_MSG_INFO( "Problem - no FitQ % "); } } - } - + } + bool successfulRecovery = newFitQuality!= nullptr && dafStatus==Trk::FitterStatusCode::Success && m_utility->rankedNumberOfMeasurements(m_trajectory) >= 5 @@ -1201,10 +1201,10 @@ bool Trk::KalmanFitter::invokeAnnealingFilter(const Trk::TrackParameters*& star if (msgLvl(MSG::INFO)) monitorTrackFits( InternalDafUsed, this_eta ); m_fitStatus = Trk::FitterStatusCode::Success; return true; - } + } ATH_MSG_DEBUG ("intDAF called, but to no good!"); if (msgLvl(MSG::INFO)) monitorTrackFits( DafNoImprovement, this_eta ); - + } } @@ -1240,7 +1240,7 @@ bool Trk::KalmanFitter::prepareNextIteration(const unsigned int& upcomingIterati double Chi2FilterAfb = 0.0; if (FQ != nullptr) { for (Trk::Trajectory::const_iterator it=m_trajectory.begin(); it!=m_trajectory.end(); it++) - if ( !it->isOutlier() || + if ( !it->isOutlier() || (it->trackStateType() != Trk::TrackState::ExternalOutlier && it->iterationShowingThisOutlier() == int(upcomingIteration-1)) ) Chi2FilterAfb += it->forwardStateChiSquared(); @@ -1264,11 +1264,11 @@ bool Trk::KalmanFitter::prepareNextIteration(const unsigned int& upcomingIterati (*covN)(i,i) = (*cov)(i,i) < m_cov0[i] ? (*cov)(i,i)*scale : m_cov0[i]; } newSeedPars = CREATE_PARAMETERS(*resultFromPreviousIter, - resultFromPreviousIter->parameters(),covN); + resultFromPreviousIter->parameters(),covN).release(); } } - // if that worked: clean up, set filter back to first state and plug in new seed parameters + // if that worked: clean up, set filter back to first state and plug in new seed parameters if (newSeedPars) { iFilterBeginState = 1; m_utility->clearFitResultsAfterOutlier(m_trajectory,FQ,iFilterBeginState); @@ -1321,7 +1321,7 @@ Trk::KalmanFitter::makeTrack( if (msgLvl(MSG::DEBUG)) monitorTrackFits( MinimalTrackFailure, this_eta ); m_fitStatus = Trk::FitterStatusCode::FewFittableMeasurements; return nullptr; - } + } SmoothedTrajectory* finalTrajectory = new SmoothedTrajectory(); // add new TSoS with parameters on reference surface (e.g. physics Perigee) @@ -1393,7 +1393,7 @@ Trk::KalmanFitter::makeTrack( } m_fitStatus = Trk::FitterStatusCode::Success; return fittedTrack; - + } const Trk::TrackStateOnSurface* @@ -1404,7 +1404,7 @@ Trk::KalmanFitter::internallyMakePerigee( { Trajectory::const_iterator it = m_trajectory.begin(); const Trk::TrackParameters* nearestParam = nullptr; - + // --- simple case to get "first" track parameters: ID track if (!it->isOutlier() && (it->smoothedTrackParameters()) && m_sortingRefPoint.mag() < 1.0E-100 && @@ -1451,7 +1451,7 @@ Trk::KalmanFitter::makeReferenceState( { Trajectory::const_iterator it = m_trajectory.begin(); const Trk::TrackParameters* nearestParam = nullptr; - + // --- simple case: ref surface was entered at first measurement if (!it->isOutlier() && (&(it->measurement()->associatedSurface()) == &refSurface) ) return nullptr; @@ -1541,25 +1541,25 @@ bool Trk::KalmanFitter::check_operability(int iSet, const RunOutlierRemoval& run if (matEff!=Trk::nonInteracting) ATH_MSG_DEBUG( "-> material effects active and switched to "<< matEff ); } - + // check RIO_OnTrack creator necessity if (m_ROTcreator.empty() && iSet==1) { ATH_MSG_ERROR( "RIO_OnTrackCreator tool not configured, but your fit on PrepRawData will need it!" ); return false; } - + // prevent the fitter from running into empty HitSet if (empty) { ATH_MSG_WARNING("attempt to fit empty vector of "<< mySet << " objects" ) ; return false; } - + // internal consistency check if (!m_trajectory.empty()) { ATH_MSG_ERROR("coding problem? fitter starts with uncleared internal vectors!" ) ; return false; } - + return true; } @@ -1608,6 +1608,6 @@ Trk::KalmanFitter::callValidation(const EventContext& ctx, // write validation data for iteration with index StatusCode sc = m_FitterValidationTool->writeProtoTrajectoryData(m_trajectory, iterationIndex, per, fitStatCode.getCode()); // FIXME. just ignore as this is only for validation. - sc.ignore(); + sc.ignore(); delete perPar; } diff --git a/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanOutlierRecovery_InDet.cxx b/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanOutlierRecovery_InDet.cxx index 92380f32992b8d274c2a66e8e336d96552095d10..95827e3c33a2f9dc8d4f088be36a7ab1e53c7609 100755 --- a/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanOutlierRecovery_InDet.cxx +++ b/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanOutlierRecovery_InDet.cxx @@ -48,7 +48,7 @@ Trk::KalmanOutlierRecovery_InDet::KalmanOutlierRecovery_InDet(const std::string& { // AlgTool stuff declareInterface<IKalmanOutlierLogic>( this ); - + // declare all properties needed to configure fitter, defaults declareProperty("TrackChi2PerNDFCut", m_Trajectory_Chi2PerNdfCut=17.f, "Chi2/ndf cut to reject a fit and start search for outliers"); @@ -68,7 +68,7 @@ StatusCode Trk::KalmanOutlierRecovery_InDet::initialize() m_Trajectory_Chi2ProbCut = 1.0-Genfun::CumulativeChiSquare(1)(m_Trajectory_Chi2PerNdfCut); ATH_MSG_INFO ("Trajectory quality cut set to chi2/ndf of " << m_Trajectory_Chi2PerNdfCut << - " giving chi2-prob " << m_Trajectory_Chi2ProbCut ); // FIXME + " giving chi2-prob " << m_Trajectory_Chi2ProbCut ); // FIXME ATH_MSG_INFO ("outlier state cut set to chi2/ndf of " << m_State_Chi2PerNdfCut ); ATH_MSG_INFO ("initialize() successful in " << name() ); return sc; @@ -89,7 +89,7 @@ StatusCode Trk::KalmanOutlierRecovery_InDet::configureWithTools(Trk::IExtrapolat m_extrapolator = extrap; m_updator = updator; m_recalibrator = recal; - + // protection, if not confiured if (!m_updator) { ATH_MSG_ERROR ("Updator missing, need to configure it !" ); @@ -143,18 +143,18 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, if (it->measurementType()==Pixel) {if (it->isNewOutlier()) ++c_outPix; ++c_allPix;} if (it->measurementType()==SCT) {if (it->isNewOutlier()) ++c_outSct; ++c_allSct;} if (it->measurementType()==TRT) {if (it->isNewOutlier()) ++c_outTrt; ++c_allTrt;} - if ( (it->measurementType()==Pixel || it->measurementType()==SCT - || it->measurementType()==TRT) && it->isNewOutlier() + if ( (it->measurementType()==Pixel || it->measurementType()==SCT + || it->measurementType()==TRT) && it->isNewOutlier() && it->iterationShowingThisOutlier() == fitIteration) ++numberOfRejections; } // recovery of bad cases in the Silicon - if (numberOfRejections > 0 || + if (numberOfRejections > 0 || (m_utility->numberOfNewOutliers(T) > std::min(.4*T.size(),7.) )) { using namespace Trk::TrackState; Trk::Trajectory::iterator state1 = T.begin(); while (!state1->forwardTrackParameters() && state1!=T.end()) ++state1; - if (state1 == T.end()) { + if (state1 == T.end()) { ATH_MSG_WARNING ("outlier recovery internally inconsistent."); return false; } @@ -164,7 +164,7 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, ") -- " << c_outSct<<"("<< c_allSct<<") -- " << c_outTrt<<"("<<c_allTrt<<")"); // === part 1: pixel === recover occas. pixel outliers as broad clusters if SCT is reliable - if (fitIteration <= 2 && m_recalibrator!=nullptr + if (fitIteration <= 2 && m_recalibrator!=nullptr && c_allPix > 0 && 2*c_outPix <= c_allPix && 2*c_outSct < c_allSct ) { @@ -183,7 +183,7 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, if ( (it->measurement()->localCovariance()(Trk::locX,Trk::locX) < 0.02*0.02) || (it->measurement()->localCovariance()(Trk::locY,Trk::locY) < 0.2*0.2) ) { - const Trk::MeasurementBase* broadPixel = + const Trk::MeasurementBase* broadPixel = m_recalibrator->makeBroadMeasurement(*it->measurement(), *smoothedParAtOutlier, Pixel); if (broadPixel!=nullptr) { @@ -198,7 +198,7 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, sqrt(broadPixel->localCovariance()(Trk::locY,Trk::locY)) ); it->replaceMeasurement(broadPixel,Trk::TrackState::BroadCluster); it->isOutlier(false); - if (it->positionOnTrajectory() < firstNew) firstNew = it->positionOnTrajectory(); + if (it->positionOnTrajectory() < firstNew) firstNew = it->positionOnTrajectory(); failureRecoveryNeedsRefit=true; } else { delete broadPixel; @@ -228,7 +228,7 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, it->isOutlier(GeneralOutlier,fitIteration); firstNew = 1; return true; - } + } const int badRankedNumberOfMeas = m_utility->rankedNumberOfMeasurements(T); Trk::Trajectory::iterator lastSctState = T.end(); @@ -263,20 +263,20 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, *sctExitTemp->parameters()[Trk::qOverP]; const Trk::TrackParameters* sctExit = sctExitTemp->associatedSurface().createTrackParameters(par[Trk::loc1],par[Trk::loc2], - par[Trk::phi],par[Trk::theta],par[Trk::qOverP],cov); + par[Trk::phi],par[Trk::theta],par[Trk::qOverP],cov); delete sctExitTemp; ATH_MSG_DEBUG ("-O- At iteration " << fitIteration << " SCT exit: meas't (" << lastSctState->measurement()->localParameters()[Trk::locX] << ", " << lastSctState->measurement()->localParameters()[Trk::locY] << ") vs. prediction ("<< sctExit->parameters()[Trk::locX]<< ", "<<sctExit->parameters()[Trk::locY]<< ") "); - + // switch to reverse gear and run a small filter through the SCT Trk::Trajectory::reverse_iterator lastSctState_r = Trk::Trajectory::reverse_iterator(++lastSctState); const Trk::TrackParameters* sctFitResult = m_updator->addToState(*sctExit, lastSctState_r->measurement()->localParameters(), - lastSctState_r->measurement()->localCovariance()); - delete sctExit; + lastSctState_r->measurement()->localCovariance()).release(); + delete sctExit; Trk::Trajectory::reverse_iterator rit = lastSctState_r + 1; Trk::Trajectory::reverse_iterator firstSctState_r = T.rend(); for( ; rit!=T.rend(); ++rit) { @@ -299,7 +299,7 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, } sctFitResult = m_updator->addToState(*predPar, rit->measurement()->localParameters(), - rit->measurement()->localCovariance()); + rit->measurement()->localCovariance()).release(); ATH_MSG_VERBOSE ("At "<<rit->positionOnTrajectory() << " errs in locX: "<< rit->measurement()->localCovariance()(Trk::locX) ); firstSctState_r = rit; @@ -338,7 +338,7 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, || (rit->isOutlier() && rit->trackStateType() != PredictedOutlier) ) && (rit->measurement()->localCovariance()(Trk::locX) < 0.02) && (rit->measurement()->localCovariance()(Trk::locY) < 0.2) ) { - const Trk::MeasurementBase* broadPixel = + const Trk::MeasurementBase* broadPixel = m_recalibrator->makeBroadMeasurement(*rit->measurement(), *filteredPar, Pixel); if (broadPixel!=nullptr) { if (( broadPixel->localCovariance()(Trk::locX) @@ -369,7 +369,7 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, (testQuality? testQuality->chiSquared() : -1.0) ); // next step: decide if outlier is too big for the current mini-filter - if (!testQuality || testQuality->chiSquared() > + if (!testQuality || testQuality->chiSquared() > 4*m_State_Chi2PerNdfCut * testQuality->numberDoF() ) { updatedPar = filteredPar; filteredPar=nullptr; @@ -378,18 +378,18 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, } else { updatedPar = m_updator->addToState(*filteredPar, rit->measurement()->localParameters(), - rit->measurement()->localCovariance()); + rit->measurement()->localCovariance()).release(); if (updatedPar==nullptr) updatedPar=filteredPar; else delete filteredPar; ATH_MSG_DEBUG ("At "<<rit->positionOnTrajectory()<<": using this state to proceed."); } if (!testQuality || - (testQuality->chiSquared() > + (testQuality->chiSquared() > 0.5*m_State_Chi2PerNdfCut * testQuality->numberDoF() ) ) { rit->isOutlier(Trk::TrackState::TrackOutlier,fitIteration); ++numberOfChangedStates; ATH_MSG_DEBUG ("At "<<rit->positionOnTrajectory() <<": remove state with tightened "<< "outlier cut, chi2="<<testQuality->chiSquared()); - } else if (!rit->isOutlier() && + } else if (!rit->isOutlier() && rit->measurement()->localCovariance()(Trk::locX) > 0.1) { rit->isOutlier(Trk::TrackState::TrackOutlier,fitIteration); ++numberOfChangedStates; @@ -420,8 +420,8 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, it->isOutlier(false); } } - - } + + } } // stop recovery for bad cases @@ -437,24 +437,24 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, if (it->isDriftCircle() && rot!=nullptr && rot->prepRawData()!=nullptr) msg(MSG::VERBOSE) << "Testing L/R of " << (it->isOutlier() ? "Outl." : "Hit " ) << it->positionOnTrajectory() << " : Par = " - << (it->smoothedTrackParameters() ? + << (it->smoothedTrackParameters() ? it->smoothedTrackParameters()->parameters()[Trk::locR] : -999.0) - << " Mbs = " + << " Mbs = " << it->measurement()->localParameters()[Trk::locR] << ", Prd = " <<(rot->prepRawData() ? rot->prepRawData()->localPosition()[Trk::locR] : -999.) << endmsg; } - + const Trk::TrackParameters* refTrkPar = it->smoothedTrackParameters(); // step 1 - try re-integrating drift radius outliers as tube hit inlayers if (it->measurementType() == Trk::TrackState::TRT && refTrkPar!=nullptr && (it->trackStateType() == Trk::TrackState::StateOutlier || it->trackStateType() == Trk::TrackState::TrackOutlier) - && it->iterationShowingThisOutlier() == fitIteration - && (Trk::TrackState::TubeHit != + && it->iterationShowingThisOutlier() == fitIteration + && (Trk::TrackState::TubeHit != m_recalibrator->calibrationStatus(*it->measurement(),Trk::TrackState::TRT)) ) { - const Trk::RIO_OnTrack* recalibratedROT = + const Trk::RIO_OnTrack* recalibratedROT = m_recalibrator->makeBroadMeasurement(*it->measurement(),*refTrkPar, Trk::TrackState::TRT); if (recalibratedROT!=nullptr) { @@ -470,14 +470,14 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, // step 2 - try re-integrating tube hits as drift radius hits if (it->measurementType() == Trk::TrackState::TRT && refTrkPar!=nullptr && !it->isOutlier() - && (Trk::TrackState::TubeHit == + && (Trk::TrackState::TubeHit == m_recalibrator->calibrationStatus(*it->measurement(),Trk::TrackState::TRT)) ) { const Trk::RIO_OnTrack* trt=dynamic_cast<const Trk::RIO_OnTrack*>(it->measurement()); const TrackParameters* mTP = it->smoothedTrackParameters(); if (trt && trt->prepRawData() && mTP->covariance() && ( fabs(trt->prepRawData()->localPosition()[Trk::locR] - - fabs(it->smoothedTrackParameters()->parameters()[Trk::locR])) + - fabs(it->smoothedTrackParameters()->parameters()[Trk::locR])) < 2.5*sqrt(trt->prepRawData()->localCovariance()(Trk::locR,Trk::locR) + (*mTP->covariance())(Trk::locR,Trk::locR))) ) { @@ -530,8 +530,8 @@ bool Trk::KalmanOutlierRecovery_InDet::flagNewOutliers(Trk::Trajectory& T, if (!tubeHitMade && mTP && (m_recalibrator->calibrationStatus(*it->measurement(),Trk::TrackState::TRT) == Trk::TrackState::TubeHit) - && ( fabs(trt->prepRawData()->localPosition()[Trk::locR] - - fabs(it->smoothedTrackParameters()->parameters()[Trk::locR])) + && ( fabs(trt->prepRawData()->localPosition()[Trk::locR] + - fabs(it->smoothedTrackParameters()->parameters()[Trk::locR])) < 2.0*sqrt(trt->prepRawData()->localCovariance()(Trk::locR,Trk::locR) + (*mTP->covariance())(Trk::locR,Trk::locR))) ) { @@ -578,7 +578,7 @@ bool Trk::KalmanOutlierRecovery_InDet::reject(const Trk::FitQuality& fitQuality) ATH_MSG_DEBUG ("-O- number d.o.f not positive - reject trajectory."); if ( !(fitQuality.chiSquared() > 0.0)) ATH_MSG_DEBUG ("-O- chi2 is not positive - numerical problems?" ); - return true; + return true; } // ok - it's accepted return false; diff --git a/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanPiecewiseAnnealingFilter.cxx b/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanPiecewiseAnnealingFilter.cxx index ee329b5d86840f2f7621b2669275f44bb656cccb..e79ad9d1ca837cd3a3b67e778ea4f086e5fa15f1 100644 --- a/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanPiecewiseAnnealingFilter.cxx +++ b/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanPiecewiseAnnealingFilter.cxx @@ -71,7 +71,7 @@ Trk::KalmanPiecewiseAnnealingFilter::~KalmanPiecewiseAnnealingFilter() StatusCode Trk::KalmanPiecewiseAnnealingFilter::initialize() { - + StatusCode sc = AlgTool::initialize(); if (sc.isFailure()) return sc; @@ -152,7 +152,7 @@ bool Trk::KalmanPiecewiseAnnealingFilter::annealingProblem_driftCircles // stop if strategy won't work - like when it was already tried. Trk::Trajectory::const_iterator it = m_trajPiece.begin(); - if (it->isOutlier() || alreadyTried + if (it->isOutlier() || alreadyTried || m_option_annealingScheme.at(annealer) <= 2.0 ) return false; // strategy only shown to improve on drift-circle initiating fits @@ -183,9 +183,9 @@ bool Trk::KalmanPiecewiseAnnealingFilter::annealingProblem_driftCircles fabs(m_trajPiece.front().measurement()->localParameters()[Trk::locR]) <= 0.01)) { m_trajPiece.front().isOutlier(Trk::TrackState::FilterOutlier, 1); } else { - const Trk::RIO_OnTrack* recalibratedROT = + const Trk::RIO_OnTrack* recalibratedROT = m_recalibrator->makeBroadMeasurement((crot->rioOnTrack(crot->indexOfMaxAssignProb())),*tp); - if (recalibratedROT) + if (recalibratedROT) m_trajPiece.front().replaceMeasurement(recalibratedROT, Trk::TrackState::TubeHit); else m_trajPiece.front().isOutlier(Trk::TrackState::FilterOutlier, 1); @@ -219,7 +219,7 @@ bool Trk::KalmanPiecewiseAnnealingFilter::annealingProblem_all bool foundImprovement = false; for(Trajectory::iterator it = m_trajPiece.begin(); it != m_trajPiece.end(); ++it) { - const Trk::CompetingRIOsOnTrack* compROT = + const Trk::CompetingRIOsOnTrack* compROT = dynamic_cast<const Trk::CompetingRIOsOnTrack*>(it->measurement()); if (compROT == nullptr || it->isOutlier()) continue; @@ -233,13 +233,13 @@ bool Trk::KalmanPiecewiseAnnealingFilter::annealingProblem_all bool highPrecisionSCT = (it->measurementType() == Trk::TrackState::SCT) && (msErrX < 0.018); double chi2ts = (it->fitQuality()? it->fitQuality()->chiSquared() : -999.0); - const Trk::TrackParameters* refPars = it->smoothedTrackParameters() ? + const Trk::TrackParameters* refPars = it->smoothedTrackParameters() ? it->smoothedTrackParameters() : it->forwardTrackParameters(); if ( (assPrb < 0.90 || chi2ts > 1.0) && (highPrecisionPixel || highPrecisionSCT) && refPars ) { - const Trk::RIO_OnTrack* broadCluster = + const Trk::RIO_OnTrack* broadCluster = m_recalibrator->makeBroadMeasurement(*compROT, *refPars, it->measurementType()); if (broadCluster!=nullptr) { @@ -291,7 +291,7 @@ bool Trk::KalmanPiecewiseAnnealingFilter::annealingProblem_all bool foundImprovement = false; for(Trajectory::iterator it = m_trajPiece.begin(); it != m_trajPiece.end(); ++it) { - const Trk::CompetingRIOsOnTrack* compROT = + const Trk::CompetingRIOsOnTrack* compROT = dynamic_cast<const Trk::CompetingRIOsOnTrack*>(it->measurement()); if (compROT == nullptr || it->isOutlier()) continue; @@ -303,12 +303,12 @@ bool Trk::KalmanPiecewiseAnnealingFilter::annealingProblem_all && (msErrX < 0.010 || msErrY < 0.080); bool highPrecisionSCT = (it->measurementType() == Trk::TrackState::SCT) && (msErrX < 0.018); - const Trk::TrackParameters* refPars = it->smoothedTrackParameters() ? + const Trk::TrackParameters* refPars = it->smoothedTrackParameters() ? it->smoothedTrackParameters() : it->forwardTrackParameters(); if ( (highPrecisionPixel || highPrecisionSCT) && refPars ) { - const Trk::RIO_OnTrack* broadCluster = + const Trk::RIO_OnTrack* broadCluster = m_recalibrator->makeBroadMeasurement(*compROT, *refPars, it->measurementType()); if (broadCluster!=nullptr) { @@ -347,7 +347,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectory //================ main method: the piece-wise filter ========================== Trk::FitterStatusCode -Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece +Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece (Trajectory& trajectory, Trajectory::iterator& start, const TrackParameters*& start_updatedPar, @@ -390,7 +390,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece predDiffPar.reset( start->checkoutParametersDifference() ); predPar = CREATE_PARAMETERS(*start->referenceParameters(), (start->referenceParameters()->parameters() + (*predDiffPar)), - new AmgSymMatrix(5)(*start->parametersCovariance())); + new AmgSymMatrix(5)(*start->parametersCovariance())).release(); delete start->checkoutParametersCovariance(); } } else { @@ -407,7 +407,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece } else { // filter using differences const TransportJacobian& jac = *m_trajPiece.back().jacobian(); - AmgVector(5) updDiffPar = updatedPar->parameters() + AmgVector(5) updDiffPar = updatedPar->parameters() - m_trajPiece.back().referenceParameters()->parameters(); predDiffPar = std::make_unique<AmgVector(5)>( jac*updDiffPar ); AmgSymMatrix(5)* C = new AmgSymMatrix(5) (jac*(*updatedPar->covariance())*jac.transpose()); @@ -417,16 +417,25 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece (*C)(Trk::theta,Trk::theta) += std::pow(input_it->materialEffects()->sigmaDeltaTheta(),2); const double& mass = m_particleMasses.mass[particleType]; const double currQOverPsquared = std::pow((*predDiffPar)(Trk::qOverP) + input_it->referenceParameters()->parameters()[Trk::qOverP], 2); - const double sigmaDeltaQoverPsquared = (currQOverPsquared > 0.) ? (std::pow(input_it->materialEffects()->sigmaDeltaE(), 2) * (mass*mass + 1./currQOverPsquared) * (currQOverPsquared*currQOverPsquared*currQOverPsquared)) : 0.; - (*C)(Trk::qOverP,Trk::qOverP)+= sigmaDeltaQoverPsquared; - ATH_MSG_VERBOSE ("mass=" << mass << ", qOverP_ref="<< std::scientific << input_it->referenceParameters()->parameters()[Trk::qOverP] - << ", qOverP_diff=" << (*predDiffPar)(Trk::qOverP) - << ", sigmaDeltaE=" << input_it->materialEffects()->sigmaDeltaE() - << ", sigmaDeltaQoverP=" << sqrt(sigmaDeltaQoverPsquared) << std::fixed);//std::defaultfloat); + const double sigmaDeltaQoverPsquared = + (currQOverPsquared > 0.) + ? (std::pow(input_it->materialEffects()->sigmaDeltaE(), 2) * + (mass * mass + 1. / currQOverPsquared) * + (currQOverPsquared * currQOverPsquared * currQOverPsquared)) + : 0.; + (*C)(Trk::qOverP, Trk::qOverP) += sigmaDeltaQoverPsquared; + ATH_MSG_VERBOSE( + "mass=" + << mass << ", qOverP_ref=" << std::scientific + << input_it->referenceParameters()->parameters()[Trk::qOverP] + << ", qOverP_diff=" << (*predDiffPar)(Trk::qOverP) + << ", sigmaDeltaE=" << input_it->materialEffects()->sigmaDeltaE() + << ", sigmaDeltaQoverP=" << sqrt(sigmaDeltaQoverPsquared) + << std::fixed); // std::defaultfloat); ATH_MSG_VERBOSE ("Added material effects."); } const AmgVector(5) x = input_it->referenceParameters()->parameters()+(*predDiffPar); - predPar = CREATE_PARAMETERS(*input_it->referenceParameters(),x,C); + predPar = CREATE_PARAMETERS(*input_it->referenceParameters(),x,C).release(); ATH_MSG_DEBUG("used difference to make predpar = " << *predPar); } } @@ -439,7 +448,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece return Trk::FitterStatusCode::ForwardFilterFailure; } - const Trk::RIO_OnTrack* testROT + const Trk::RIO_OnTrack* testROT = dynamic_cast<const Trk::RIO_OnTrack*>(input_it->measurement()); if (input_it->isOutlier() || testROT==nullptr || input_it->measurement()==nullptr) { @@ -462,7 +471,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece // --- make a simple competing ROT: Left/right ambiguity for drift circles and // competition against outlier hypothesis for (unambiguous) clusters - const Trk::CompetingRIOsOnTrack* highBetaCluster = + const Trk::CompetingRIOsOnTrack* highBetaCluster = m_compRotTool->createSimpleCompetingROT(*testROT->prepRawData(),*predPar,beta); if (!highBetaCluster) { ATH_MSG_DEBUG ("CompROT creation failed in filterTrajPiece() annealing " <<beta); @@ -472,12 +481,12 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece } if (input_it->isCluster() && msgLvl(MSG::VERBOSE)) std::cout << "DAF's CompCluster: " << *highBetaCluster << std::endl; - Trk::ProtoTrackStateOnSurface newState = + Trk::ProtoTrackStateOnSurface newState = Trk::ProtoTrackStateOnSurface(highBetaCluster,false,true,iDafSteps); m_trajPiece.push_back(newState); m_trajPiece.back().setMeasurementType(input_it->measurementType(), Trk::TrackState::HighPrecision); - } + } if (m_forwardFitter->needsReferenceTrajectory()) { if (!input_it->referenceParameters()) { @@ -491,7 +500,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece m_trajPiece.back().checkinParametersDifference(predDiffPar.release() ); m_trajPiece.back().checkinParametersCovariance(new AmgSymMatrix(5)(*predPar->covariance())); } - + if (input_it->isOutlier() || !m_trajPiece.back().measurement() ) { delete updatedPar; updatedPar = predPar; @@ -503,7 +512,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece updatedPar = m_updator->addToState(*predPar, m_trajPiece.back().measurement()->localParameters(), m_trajPiece.back().measurement()->localCovariance(), - fitQuality); + fitQuality).release(); if (!updatedPar) { ATH_MSG_DEBUG ("addToState failed in filterTrajPiece(), annealing "<<beta); m_trajPiece.clear(); @@ -521,7 +530,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece delete updatedPar; FitQuality currForwardFQ = m_utility->forwardFilterQuality(m_trajPiece); - m_chi2DuringAnnealing[0] = currForwardFQ.numberDoF()>0 ? + m_chi2DuringAnnealing[0] = currForwardFQ.numberDoF()>0 ? currForwardFQ.chiSquared()/currForwardFQ.numberDoF() : 0.0; ////////////////////////////////////////////////////////////////////////////// @@ -540,8 +549,8 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece ATH_MSG_WARNING ("Programming error - lost seed"); m_utility->dumpTrajectory(m_trajPiece, name()); } - /* old code for lost seed: - const TrackParameters* newPredPar = + /* old code for lost seed: + const TrackParameters* newPredPar = m_extrapolator->extrapolate(*start_predPar, ffs->measurement()->associatedSurface(), Trk::alongMomentum, false, particleType); */ @@ -551,9 +560,9 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece false /*no runOutlier*/, dafMec, false, 1); FitQuality currForwardFQ = m_utility->forwardFilterQuality(m_trajPiece); - m_chi2DuringAnnealing[annealer] = currForwardFQ.numberDoF()>0 ? + m_chi2DuringAnnealing[annealer] = currForwardFQ.numberDoF()>0 ? currForwardFQ.chiSquared()/currForwardFQ.numberDoF() : 0.0; - + if ( this->annealingProblem_driftCircles(savedForwardFQ,currForwardFQ, fitStatus,annealer,hadAnnealingProblemDC) ) { ATH_MSG_DEBUG ("AnnMonitor-DC sends piecewise DAF back to start!"); @@ -579,9 +588,9 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece double assgnProbSum = 0.0; for(Trajectory::iterator it = m_trajPiece.begin(); it != m_trajPiece.end(); ++it) { - const Trk::CompetingRIOsOnTrack* compROT = + const Trk::CompetingRIOsOnTrack* compROT = dynamic_cast<const Trk::CompetingRIOsOnTrack*>(it->measurement()); - if (compROT != nullptr && !it->isOutlier()) assgnProbSum += + if (compROT != nullptr && !it->isOutlier()) assgnProbSum += compROT->assignmentProbability(compROT->indexOfMaxAssignProb()); } if (assgnProbSum < 0.5) { @@ -607,7 +616,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece m_trajPiece.clear(); return fitStatus; } - if (m_trajPiece.begin()->forwardTrackParameters() ) + if (m_trajPiece.begin()->forwardTrackParameters() ) ATH_MSG_DEBUG ("check traj consistency " << *m_trajPiece.begin()->forwardTrackParameters() ); beta = ( annealer+1 >= m_option_annealingScheme.size() ? @@ -617,7 +626,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece // --loop and lower the annealing temperature for(Trajectory::iterator it = m_trajPiece.begin(); it != m_trajPiece.end(); ++it) { - const Trk::CompetingRIOsOnTrack* compROT = + const Trk::CompetingRIOsOnTrack* compROT = dynamic_cast<const Trk::CompetingRIOsOnTrack*>(it->measurement()); if (compROT && it->smoothedTrackParameters() && !it->isOutlier()) { const Trk::TrackParameters* annealingPars = it->smoothedTrackParameters(); @@ -630,7 +639,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece if (msgLvl(MSG::VERBOSE)) { for(Trajectory::iterator it = m_trajPiece.begin(); it != m_trajPiece.end(); ++it) { - const Trk::CompetingRIOsOnTrack* compROT = + const Trk::CompetingRIOsOnTrack* compROT = dynamic_cast<const Trk::CompetingRIOsOnTrack*>(it->measurement()); const Trk::FitQuality* testFQ = nullptr; if (it->smoothedTrackParameters() && it->measurement()) { @@ -667,10 +676,10 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece return Trk::FitterStatusCode::BadInput; } if (!it->isOutlier()) fittableState = itForKF; - const Trk::CompetingRIOsOnTrack* compROT = + const Trk::CompetingRIOsOnTrack* compROT = dynamic_cast<const Trk::CompetingRIOsOnTrack*>(it->measurement()); - if (msgLvl(MSG::VERBOSE) && it->measurement() && itForKF->measurement()) + if (msgLvl(MSG::VERBOSE) && it->measurement() && itForKF->measurement()) std::cout << std::setiosflags(std::ios::fixed) << "results: " << itForKF->positionOnTrajectory() << " predict " << (it->smoothedTrackParameters() ? @@ -680,12 +689,12 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece << (compROT? compROT->rioOnTrack(compROT->indexOfMaxAssignProb()).localParameters()[Trk::locX] : -999.0) <<" prob=" << (compROT? compROT->assignmentProbability(compROT->indexOfMaxAssignProb()) : -999.0); - + std::string decision = "ex. outlier"; if (it->isOutlier() && itForKF->trackStateType() != Trk::TrackState::ExternalOutlier) itForKF->isOutlier(Trk::TrackState::FilterOutlier); - if ( !it->isOutlier() && !compROT + if ( !it->isOutlier() && !compROT && (it->measurement() != itForKF->measurement()) ) { itForKF->replaceMeasurement(it->checkoutMeasurement()); itForKF->isOutlier(false); @@ -694,11 +703,11 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece if (!it->isOutlier() && compROT) { double predictedLocalR = it->smoothedTrackParameters()->parameters()[Trk::locR]; double assProb = compROT->assignmentProbability(compROT->indexOfMaxAssignProb()); - const PrepRawData* prd = compROT->rioOnTrack(compROT->indexOfMaxAssignProb()).prepRawData(); + const PrepRawData* prd = compROT->rioOnTrack(compROT->indexOfMaxAssignProb()).prepRawData(); if (it->isDriftCircle()) { if (assProb > 1.5*m_option_outlierCut) { if (fabs(prd->localPosition()[Trk::locR])<0.30) { - const Trk::RIO_OnTrack* recalibratedROT = + const Trk::RIO_OnTrack* recalibratedROT = m_recalibrator->makePreciseMeasurement(*compROT,*it->smoothedTrackParameters()); itForKF->replaceMeasurement(recalibratedROT,Trk::TrackState::Nominal); itForKF->isOutlier(false); @@ -708,7 +717,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece decision = "drift circle (max prob)"; } } else if (fabs(predictedLocalR) < 2.10) { - const Trk::RIO_OnTrack* recalibratedROT = + const Trk::RIO_OnTrack* recalibratedROT = m_recalibrator->makeBroadMeasurement(*compROT,*it->smoothedTrackParameters()); itForKF->replaceMeasurement(recalibratedROT); itForKF->isOutlier(false); decision = "tube hit"; @@ -722,7 +731,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece itForKF->isOutlier(Trk::TrackState::AssProbOutlier, 1); decision = "new outlier"; } else decision = "cluster hit"; - + // TO-DO start doing broad-cluster association here. } } @@ -737,7 +746,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece if (it->parametersCovariance()) itForKF->checkinParametersCovariance(it->checkoutParametersCovariance()); itForKF->setForwardStateFitQuality(it->forwardStateChiSquared(),it->forwardStateNumberDoF()); - if (it->dnaMaterialEffects()!=nullptr) + if (it->dnaMaterialEffects()!=nullptr) itForKF->checkinDNA_MaterialEffects(it->checkoutDNA_MaterialEffects()); // } } @@ -753,7 +762,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece ATH_MSG_DEBUG ("now stepping the main trajectory iterators ahead." ); Trajectory::iterator lastStateOnPiece= m_utility->lastFittableState(m_trajPiece); Trajectory::iterator resumeKfState = m_utility->nextFittableState(trajectory,fittableState); - + if (resumeKfState == trajectory.end()) { // ## case 1: DAF on full trajectory /* resumeKfState = fittableState; lastStateOnPiece = m_utility->previousFittableState(m_trajPiece,lastStateOnPiece); @@ -772,7 +781,7 @@ Trk::KalmanPiecewiseAnnealingFilter::filterTrajectoryPiece if (m_forwardFitter->needsReferenceTrajectory()) ATH_MSG_ERROR("Code missing!"); if (start_predPar) delete start_predPar; - start_predPar = + start_predPar = m_extrapolator->extrapolate(*lastStateOnPiece->smoothedTrackParameters(), resumeKfState->measurement()->associatedSurface(), Trk::alongMomentum, false, particleType); diff --git a/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanSmoother.cxx b/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanSmoother.cxx index afd06632c399eb4f9a99e5373d9f2880693d8418..3ebf2488c9d00cef28527811d30b46b4fbe8099b 100755 --- a/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanSmoother.cxx +++ b/Tracking/TrkFitter/TrkKalmanFitter/src/KalmanSmoother.cxx @@ -223,10 +223,10 @@ Trk::FitterStatusCode Trk::KalmanSmoother::fit(Trk::Trajectory& tra if (!fittableMeasurement || !forwardTPar) m_utility->dumpTrajectory(trajectory, "DAF-inconsistency"); // first smoothed TrkParameter is last forward prediction updated with last MBase - else smooPar.reset( m_updator->addToState(*forwardTPar, + else smooPar= m_updator->addToState(*forwardTPar, fittableMeasurement->localParameters(), fittableMeasurement->localCovariance(), - fitQual) ); + fitQual); if (msgLvl(MSG::INFO)) monitorTrackFits( Call, ( forwardTPar ? forwardTPar->eta() : 1000. ) ); if(!smooPar) { ATH_MSG_WARNING ("first smoother update failed, reject track"); @@ -260,11 +260,12 @@ Trk::FitterStatusCode Trk::KalmanSmoother::fit(Trk::Trajectory& tra std::unique_ptr<const TrackParameters> predPar( CREATE_PARAMETERS(*(lastPredictedState->smoothedTrackParameters()),par,firstErrMtx) ); // The first step of backward-filtering is done before any loop because of the // specially formed prediction (from the last forward parameters). - std::unique_ptr<const TrackParameters> updatedPar( m_updator->addToState(*predPar, - fittableMeasurement->localParameters(), - fittableMeasurement->localCovariance(), - trackQualityIncrement) ); - if(!updatedPar || !trackQualityIncrement) { + std::unique_ptr<const TrackParameters> updatedPar = + m_updator->addToState(*predPar, + fittableMeasurement->localParameters(), + fittableMeasurement->localCovariance(), + trackQualityIncrement); + if (!updatedPar || !trackQualityIncrement) { if (msgLvl(MSG::INFO)) monitorTrackFits( UpdateFailure, predPar->eta() ); ATH_MSG_INFO (" update using initial measurement failed, reject track"); return FitterStatusCode::UpdateFailure; @@ -363,9 +364,10 @@ Trk::FitterStatusCode Trk::KalmanSmoother::fit(Trk::Trajectory& tra printGlobalParams(rit->positionOnTrajectory(), " pred", predPar.get(), detectedMomentumNoise ); // update track parameters (allows for preset LR solution for straws) - updatedPar.reset( m_updator->addToState(*predPar, fittableMeasurement->localParameters(), - fittableMeasurement->localCovariance(), - trackQualityIncrement) ); + updatedPar = m_updator->addToState(*predPar, + fittableMeasurement->localParameters(), + fittableMeasurement->localCovariance(), + trackQualityIncrement); if (!updatedPar || !trackQualityIncrement) { if (msgLvl(MSG::INFO)) monitorTrackFits( UpdateFailure, predPar->eta() ); @@ -392,7 +394,7 @@ Trk::FitterStatusCode Trk::KalmanSmoother::fit(Trk::Trajectory& tra } else { if (m_doSmoothing) { forwardTPar = rit->forwardTrackParameters(); - smooPar.reset( m_updator->combineStates( *forwardTPar, *updatedPar) ); + smooPar = m_updator->combineStates(*forwardTPar, *updatedPar); } else { smooPar.reset( updatedPar->clone() ); } @@ -492,9 +494,10 @@ Trk::FitterStatusCode Trk::KalmanSmoother::fitWithReference(Trk::Trajectory& fitQual, /*doFQ=*/true ) ); const AmgVector(5) x = lastPredictedState->referenceParameters()->parameters() + updatedDifference->first; - smooPar.reset( updatedDifference? CREATE_PARAMETERS(*lastPredictedState->referenceParameters(), - x,new AmgSymMatrix(5)(updatedDifference->second)) : nullptr ); - if (msgLvl(MSG::INFO)) monitorTrackFits( Call, ( smooPar ? smooPar->eta() : 1000. ) ); + smooPar=updatedDifference? CREATE_PARAMETERS(*lastPredictedState->referenceParameters(), + x,new AmgSymMatrix(5)(updatedDifference->second)) : nullptr ; + if (msgLvl(MSG::INFO)) + monitorTrackFits(Call, (smooPar ? smooPar->eta() : 1000.)); if (!smooPar || !fitQual) { ATH_MSG_WARNING ("first smoother update failed, reject track"); if (msgLvl(MSG::INFO)) monitorTrackFits( UpdateFailure, @@ -570,7 +573,7 @@ Trk::FitterStatusCode Trk::KalmanSmoother::fitWithReference(Trk::Trajectory& updatedDifference.reset(); if (msgLvl(MSG::DEBUG)) { const AmgVector(5) x = rit->referenceParameters()->parameters()+predDiffPar; - const Trk::TrackParameters* param = CREATE_PARAMETERS(*rit->referenceParameters(),x,nullptr); + const Trk::TrackParameters* param = CREATE_PARAMETERS(*rit->referenceParameters(),x,nullptr).release(); printGlobalParams( rit->positionOnTrajectory(), " extrp", param ); delete param; } @@ -609,7 +612,7 @@ Trk::FitterStatusCode Trk::KalmanSmoother::fitWithReference(Trk::Trajectory& if (msgLvl(MSG::DEBUG)) { const AmgVector(5) x = rit->referenceParameters()->parameters() + updatedDifference->first; - const Trk::TrackParameters* param = CREATE_PARAMETERS(*rit->referenceParameters(),x,nullptr); + const Trk::TrackParameters* param = CREATE_PARAMETERS(*rit->referenceParameters(),x,nullptr).release(); printGlobalParams (rit->positionOnTrajectory()," updat", param ); delete param; } @@ -623,10 +626,11 @@ Trk::FitterStatusCode Trk::KalmanSmoother::fitWithReference(Trk::Trajectory& if (rit == lastSmoothableState) { // at the last don't do state combination. ATH_MSG_VERBOSE ("Identified state" << (rit->positionOnTrajectory()>9? " " : " 0")<< rit->positionOnTrajectory() << " as last fittable state."); - smooPar.reset( CREATE_PARAMETERS(*rit->referenceParameters(), - (rit->referenceParameters()->parameters()+updatedDifference->first), - new AmgSymMatrix(5)(updatedDifference->second)) ); - rit->checkinSmoothedPar(smooPar.release() ); + smooPar = CREATE_PARAMETERS( + *rit->referenceParameters(), + (rit->referenceParameters()->parameters() + updatedDifference->first), + new AmgSymMatrix(5)(updatedDifference->second)); + rit->checkinSmoothedPar(smooPar.release()); } else if (m_doSmoothing) { std::unique_ptr< std::pair<AmgVector(5),AmgSymMatrix(5)> > smoothedDifference( m_updator->updateParameterDifference(*(rit->parametersDifference()), @@ -641,9 +645,11 @@ Trk::FitterStatusCode Trk::KalmanSmoother::fitWithReference(Trk::Trajectory& } const AmgVector(5) x = rit->referenceParameters()->parameters() + smoothedDifference->first; - smooPar.reset( CREATE_PARAMETERS(*rit->referenceParameters(),x, - new AmgSymMatrix(5)(smoothedDifference->second)) ); - rit->checkinSmoothedPar(smooPar.release() ); + smooPar = + CREATE_PARAMETERS(*rit->referenceParameters(), + x, + new AmgSymMatrix(5)(smoothedDifference->second)); + rit->checkinSmoothedPar(smooPar.release()); } else { smooPar.reset(); ATH_MSG_VERBOSE ("No fitted track parameters made at this state because doSmoothing is OFF"); diff --git a/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdator.h b/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdator.h index 00eda328cfbeb6abadeac313e3268ea55041f571..c4b7d2801921e3c15e10cc2fd677cc49d352a387 100755 --- a/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdator.h +++ b/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdator.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -14,17 +14,16 @@ #ifndef TRK_KALMANUPDATOR_H #define TRK_KALMANUPDATOR_H -#include "TrkToolInterfaces/IUpdator.h" -#include "TrkEventPrimitives/ParamDefs.h" -#include "TrkEventPrimitives/ProjectionMatricesSet.h" -#include "TrkEventPrimitives/FitQualityOnSurface.h" #include "AthenaBaseComps/AthAlgTool.h" +#include "EventPrimitives/EventPrimitives.h" #include "GaudiKernel/MsgStream.h" #include "GeoPrimitives/GeoPrimitives.h" -#include "EventPrimitives/EventPrimitives.h" +#include "TrkEventPrimitives/FitQualityOnSurface.h" +#include "TrkEventPrimitives/ParamDefs.h" +#include "TrkEventPrimitives/ProjectionMatricesSet.h" +#include "TrkToolInterfaces/IUpdator.h" #include <cmath> - namespace Trk { /** @class KalmanUpdator @@ -36,238 +35,310 @@ namespace Trk { state vector. Implemented fully in Eigen using the EDM natively. As a drawback due to Eigen's internal implementation of matrix operations, this tool is generally slower than its alternatives - which are written based on array or SMatrix of fixed size Eigen + which are written based on array or SMatrix of fixed size Eigen internal representations of EDM objects. @author M. Elsing, W. Liebig <http://consult.cern.ch/xwho> */ -class KalmanUpdator : virtual public IUpdator, public AthAlgTool { - public: - //! AlgTool standard constuctor - KalmanUpdator(const std::string&,const std::string&,const IInterface*); - ~KalmanUpdator(); - - //! AlgTool initialisation - virtual StatusCode initialize() override final; - //! AlgTool termination - virtual StatusCode finalize() override final; - - //! measurement updator for the KalmanFitter getting the meas't coord' - //from Amg::Vector2D (use eg with PRD) - virtual TrackParameters* addToState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&) const override final; - //! measurement updator for the KalmanFitter getting the coordinates - //from LocalParameters (use eg with MeasurementBase, ROT) - virtual TrackParameters* addToState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&) const override final; - //! measurement updator interface for the KalmanFitter returning the fit quality - //of the state at the same time (Amg::Vector2D-version) - virtual TrackParameters* addToState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; - //! measurement updator interface for the KalmanFitter returning the fit quality - //of the state at the same time (LocalParameters-version) - virtual TrackParameters* addToState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; +class KalmanUpdator + : virtual public IUpdator + , public AthAlgTool +{ +public: + //! AlgTool standard constuctor + KalmanUpdator(const std::string&, const std::string&, const IInterface*); + ~KalmanUpdator(); + + //! AlgTool initialisation + virtual StatusCode initialize() override final; + //! AlgTool termination + virtual StatusCode finalize() override final; + + //! measurement updator for the KalmanFitter getting the meas't coord' + // from Amg::Vector2D (use eg with PRD) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //! measurement updator for the KalmanFitter getting the coordinates + // from LocalParameters (use eg with MeasurementBase, ROT) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //! measurement updator interface for the KalmanFitter returning the fit + //! quality + // of the state at the same time (Amg::Vector2D-version) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + //! measurement updator interface for the KalmanFitter returning the fit + //! quality + // of the state at the same time (LocalParameters-version) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + + //! reverse update eg for track property analysis (unbiased residuals) + // getting the measurement coordinates from the Amg::Vector2D class. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //! reverse update eg for track property analysis (unbiased residuals) + // getting the measurement coordinates from the LocalParameters class. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //! reverse updator for the KalmanFitter and other fitters using the + // interface with Amg::Vector2D and FitQualityOnSurface. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + //! reverse updator for the KalmanFitter and other fitters using + // the interface with LocalParameters and FitQualityOnSurface. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; - //! reverse update eg for track property analysis (unbiased residuals) - //getting the measurement coordinates from the Amg::Vector2D class. - virtual TrackParameters* removeFromState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&) const override final; - //! reverse update eg for track property analysis (unbiased residuals) - //getting the measurement coordinates from the LocalParameters class. - virtual TrackParameters* removeFromState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&) const override final ; - //! reverse updator for the KalmanFitter and other fitters using the - //interface with Amg::Vector2D and FitQualityOnSurface. - virtual TrackParameters* removeFromState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; - //! reverse updator for the KalmanFitter and other fitters using - //the interface with LocalParameters and FitQualityOnSurface. - virtual TrackParameters* removeFromState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; - - /** @brief trajectory state updator which combines two parts of a trajectory on a common surface. + /** @brief trajectory state updator which combines two parts of a trajectory + on a common surface. - Make sure that the TPs' surfaces are identical and - that the local hit is not duplicated in both trajectories! - */ - virtual TrackParameters* combineStates (const TrackParameters&, - const TrackParameters&) const override final; - /** @brief trajectory state updator which combines two parts of a trajectory - * on a common surface and provides the FitQuality. + Make sure that the TPs' surfaces are identical and + that the local hit is not duplicated in both trajectories! + */ + virtual std::unique_ptr<TrackParameters> combineStates( + const TrackParameters&, + const TrackParameters&) const override final; + /** @brief trajectory state updator which combines two parts of a trajectory + * on a common surface and provides the FitQuality. - Make sure that the TPs' surfaces are identical and that the local hit is not duplicated! - */ - virtual TrackParameters* combineStates (const TrackParameters&, - const TrackParameters&, - FitQualityOnSurface*&) const override final; + Make sure that the TPs' surfaces are identical and that the local hit is + not duplicated! + */ + virtual std::unique_ptr<TrackParameters> combineStates( + const TrackParameters&, + const TrackParameters&, + FitQualityOnSurface*&) const override final; - //! estimator for FitQuality on Surface from a full track state, that is a state - //which contains the current hit (expressed as Amg::Vector2D). - virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX& ) const override final; + //! estimator for FitQuality on Surface from a full track state, that is a + //! state + // which contains the current hit (expressed as Amg::Vector2D). + virtual const FitQualityOnSurface* fullStateFitQuality( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; - //! estimator for FitQuality on Surface from a full track state, that is - //a state which contains the current hit (expressed as LocalParameters). - virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX& ) const override final; - //! estimator for FitQuality on Surface from a predicted track state, that is a state - //which contains the current hit (expressed as Amg::Vector2D). - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX& ) const override final; - //! estimator for FitQuality on Surface from a predicted track state, that is a state - //which contains the current hit (expressed as LocalParameters). - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX& ) const override final; - //! estimator for FitQuality on Surface for the situation when a track is fitted to - //the parameters of another trajectory part extrapolated to the common surface. - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, - const TrackParameters&) const override final; - //! interface for reference-track KF, not implemented. - virtual std::pair<AmgVector(5), AmgSymMatrix(5)>* updateParameterDifference (const AmgVector(5)&, - const AmgSymMatrix(5)&, - const Amg::VectorX&, - const Amg::MatrixX&, - const int&, Trk::FitQualityOnSurface*&, - bool ) const override final - {return nullptr;} + //! estimator for FitQuality on Surface from a full track state, that is + // a state which contains the current hit (expressed as LocalParameters). + virtual const FitQualityOnSurface* fullStateFitQuality( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //! estimator for FitQuality on Surface from a predicted track state, that is + //! a state + // which contains the current hit (expressed as Amg::Vector2D). + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //! estimator for FitQuality on Surface from a predicted track state, that is + //! a state + // which contains the current hit (expressed as LocalParameters). + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //! estimator for FitQuality on Surface for the situation when a track is + //! fitted to + // the parameters of another trajectory part extrapolated to the common + // surface. + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const TrackParameters&) const override final; + //! interface for reference-track KF, not implemented. + virtual std::pair<AmgVector(5), AmgSymMatrix(5)>* updateParameterDifference( + const AmgVector(5) &, + const AmgSymMatrix(5) &, + const Amg::VectorX&, + const Amg::MatrixX&, + const int&, + Trk::FitQualityOnSurface*&, + bool) const override final + { + return nullptr; + } + + //! gives back how updator is configured for inital covariances + virtual std::vector<double> initialErrors() const override final; - //! gives back how updator is configured for inital covariances - virtual std::vector<double> initialErrors() const override final; - private: - //! Common maths calculation code for addToState and removeFromState - Amg::Vector2D interface. - TrackParameters* calculateFilterStep(const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - //! Common maths calculation code for addToState and removeFromState - LocalParameters interface. - TrackParameters* calculateFilterStep(const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - /** also the chi2 calculation and FitQuality object creation is - combined in an extra method. It is called by ___FitQuality() and calculateFilterStep() - The sign controls the calculation in case a predicted input track state (sign=+1) - or smoothed/updated input track state (sign=-1). - */ - FitQualityOnSurface* makeChi2Object(const Amg::VectorX&, - const Amg::MatrixX&, const Amg::MatrixX&, - const int, const int) const; + //! Common maths calculation code for addToState and removeFromState - + //! Amg::Vector2D interface. + std::unique_ptr<TrackParameters> calculateFilterStep(const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + //! Common maths calculation code for addToState and removeFromState - + //! LocalParameters interface. + std::unique_ptr<TrackParameters> calculateFilterStep(const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + /** also the chi2 calculation and FitQuality object creation is + combined in an extra method. It is called by ___FitQuality() and + calculateFilterStep() The sign controls the calculation in case a predicted + input track state (sign=+1) or smoothed/updated input track state + (sign=-1). + */ + FitQualityOnSurface* makeChi2Object(const Amg::VectorX&, + const Amg::MatrixX&, + const Amg::MatrixX&, + const int, + const int) const; - //! avoid CLHEP's empty math operations (H-matrix) by copying members out - Amg::MatrixX projection(const Amg::MatrixX&, const int) const; + //! avoid CLHEP's empty math operations (H-matrix) by copying members out + Amg::MatrixX projection(const Amg::MatrixX&, const int) const; - //! internal structuring: debugging output for start of method. - void logStart (const std::string&, const TrackParameters&) const; - //! internal structuring: common logfile output of the inputs - void logInputCov (const Amg::MatrixX&, const Amg::VectorX&, const Amg::MatrixX&) const; - //! internal structuring: common logfile output during calculation - void logGainForm (int, const Amg::VectorX&, const Amg::MatrixX&, - const Amg::MatrixX&, const Amg::MatrixX&) const; - //! internal structuring: common logfile output after calculation - void logResult(const std::string&, const Amg::VectorX&, const Amg::MatrixX&) const; + //! internal structuring: debugging output for start of method. + void logStart(const std::string&, const TrackParameters&) const; + //! internal structuring: common logfile output of the inputs + void logInputCov(const Amg::MatrixX&, + const Amg::VectorX&, + const Amg::MatrixX&) const; + //! internal structuring: common logfile output during calculation + void logGainForm(int, + const Amg::VectorX&, + const Amg::MatrixX&, + const Amg::MatrixX&, + const Amg::MatrixX&) const; + //! internal structuring: common logfile output after calculation + void logResult(const std::string&, + const Amg::VectorX&, + const Amg::MatrixX&) const; - //! method testing correct use of LocalParameters */ - bool consistentParamDimensions(const LocalParameters&, const int&) const; - //! tests if ranges of abolute phi (-pi, pi) and theta (0, pi) are correct */ - bool thetaPhiWithinRange(const Amg::VectorX&, const int key=31) const; - //! tests if ranges of phi (-pi, pi) and theta (0, pi) residuals are correct */ - bool diffThetaPhiWithinRange(const Amg::VectorX&, const int key=31) const; - //! brings phi/theta back into valid range using 2pi periodicity - bool correctThetaPhiRange(Amg::VectorX&, AmgSymMatrix(5)&, - const bool isDifference=false, const int key=31) const; - bool correctThetaPhiRange(Amg::VectorX&, Amg::MatrixX&, - const bool isDifference=false, const int key=31) const; + //! method testing correct use of LocalParameters */ + bool consistentParamDimensions(const LocalParameters&, const int&) const; + //! tests if ranges of abolute phi (-pi, pi) and theta (0, pi) are correct */ + bool thetaPhiWithinRange(const Amg::VectorX&, const int key = 31) const; + //! tests if ranges of phi (-pi, pi) and theta (0, pi) residuals are correct + //! */ + bool diffThetaPhiWithinRange(const Amg::VectorX&, const int key = 31) const; + //! brings phi/theta back into valid range using 2pi periodicity + bool correctThetaPhiRange(Amg::VectorX&, + AmgSymMatrix(5) &, + const bool isDifference = false, + const int key = 31) const; + bool correctThetaPhiRange(Amg::VectorX&, + Amg::MatrixX&, + const bool isDifference = false, + const int key = 31) const; - std::vector<double> m_cov0; //!< job option: initial covariance matrix - ProjectionMatricesSet m_projectionMatrices; //!< get the correct projection matrix - bool m_useFruehwirth8a; //!< job option: formula for cov update - int m_outputlevel; //!< MsgStream output level cached + std::vector<double> m_cov0; //!< job option: initial covariance matrix + ProjectionMatricesSet + m_projectionMatrices; //!< get the correct projection matrix + bool m_useFruehwirth8a; //!< job option: formula for cov update + int m_outputlevel; //!< MsgStream output level cached }; - inline bool KalmanUpdator::thetaPhiWithinRange (const Amg::VectorX& V, const int key) const { - if (! (key&4 || key&8)) return true; // in case no angles measured. - if (key == 31) return ( (std::abs(V[Trk::phi]) <= M_PI) && (V[Trk::theta]>=0.0) && (V[Trk::theta] <= M_PI) ); - else { // if vector is compressed (i.e. localParameters) need to extract phi,theta first. - bool okay = true; - if (key & 4) { // phi is being measured - int jphi = 0; - for (int itag = 0, ipos=1; itag<Trk::phi; ++itag, ipos*=2) if (key & ipos) ++jphi; - okay = okay && (std::abs(V[jphi]) <= M_PI); - } - if (key & 8) { // theta is being measured - int jtheta = 0; - for (int itag = 0, ipos=1; itag<=Trk::theta; ++itag, ipos*=2) if (key & ipos) ++jtheta; - okay = okay && (std::abs(V[jtheta]-M_PI_2)<=M_PI_2); - } - return okay; - } - } +inline bool +KalmanUpdator::thetaPhiWithinRange(const Amg::VectorX& V, const int key) const +{ + if (!(key & 4 || key & 8)) + return true; // in case no angles measured. + if (key == 31) + return ((std::abs(V[Trk::phi]) <= M_PI) && (V[Trk::theta] >= 0.0) && + (V[Trk::theta] <= M_PI)); + else { // if vector is compressed (i.e. localParameters) need to extract + // phi,theta first. + bool okay = true; + if (key & 4) { // phi is being measured + int jphi = 0; + for (int itag = 0, ipos = 1; itag < Trk::phi; ++itag, ipos *= 2) + if (key & ipos) + ++jphi; + okay = okay && (std::abs(V[jphi]) <= M_PI); + } + if (key & 8) { // theta is being measured + int jtheta = 0; + for (int itag = 0, ipos = 1; itag <= Trk::theta; ++itag, ipos *= 2) + if (key & ipos) + ++jtheta; + okay = okay && (std::abs(V[jtheta] - M_PI_2) <= M_PI_2); + } + return okay; + } +} + +// for speed reasons make two separate inline functions +// phi differences should be smaller than pi (else go other way round) => same +// as absolute phi value. theta differences should be smaller than pi but can be +// negative => other constraint than absolute theta. +inline bool +KalmanUpdator::diffThetaPhiWithinRange(const Amg::VectorX& V, + const int key) const +{ + if (!(key & 4 || key & 8)) + return true; // in case no angles measured. + if (key == 31) + return ((std::abs(V[Trk::phi]) <= M_PI) && (V[Trk::theta] >= -M_PI) && + (V[Trk::theta] <= M_PI)); + + else { // if vector is compressed (i.e. localParameters) need to extract + // phi,theta first. + bool okay = true; + if (key & 4) { // phi is being measured + int jphi = 0; + for (int itag = 0, ipos = 1; itag < Trk::phi; ++itag, ipos *= 2) + if (key & ipos) + ++jphi; + okay = okay && (std::abs(V[jphi]) <= M_PI); + } + if (key & 8) { // theta is being measured + int jtheta = 0; + for (int itag = 0, ipos = 1; itag <= Trk::theta; ++itag, ipos *= 2) + if (key & ipos) + ++jtheta; + okay = okay && (std::abs(V[jtheta]) <= M_PI); + } + return okay; + } +} + +inline FitQualityOnSurface* +KalmanUpdator::makeChi2Object(const Amg::VectorX& residual, + const Amg::MatrixX& covTrk, + const Amg::MatrixX& covRio, + const int sign, + const int key) const +{ // sign: -1 = updated, +1 = predicted parameters. + Amg::MatrixX R = covRio + sign * projection(covTrk, key); // .similarity(H); + if (R.determinant() == 0) { + ATH_MSG_DEBUG("matrix inversion failed"); + return new FitQualityOnSurface(0.0, (int)covRio.cols()); + } + // get chi2 = r.T() * R^-1 * r + double chiSquared = residual.transpose() * R.inverse() * residual; + ATH_MSG_VERBOSE("-U- fitQuality of " << (sign > 0 ? "predicted" : "updated") + << " state, chi2 :" << chiSquared + << " / ndof= " << covRio.cols()); + // return the FitQualityOnSurface object + return new FitQualityOnSurface(chiSquared, int(covRio.cols())); +} - // for speed reasons make two separate inline functions - // phi differences should be smaller than pi (else go other way round) => same as absolute phi value. - // theta differences should be smaller than pi but can be negative => other constraint than absolute theta. - inline bool KalmanUpdator::diffThetaPhiWithinRange (const Amg::VectorX& V, const int key) const { - if (! (key&4 || key&8)) return true; // in case no angles measured. - if (key == 31) return ( (std::abs(V[Trk::phi]) <= M_PI) && (V[Trk::theta]>=-M_PI) && (V[Trk::theta] <= M_PI) ); - - else { // if vector is compressed (i.e. localParameters) need to extract phi,theta first. - bool okay = true; - if (key & 4) { // phi is being measured - int jphi = 0; - for (int itag = 0, ipos=1; itag<Trk::phi; ++itag, ipos*=2) if (key & ipos) ++jphi; - okay = okay && (std::abs(V[jphi]) <= M_PI); - } - if (key & 8) { // theta is being measured - int jtheta = 0; - for (int itag = 0, ipos=1; itag<=Trk::theta; ++itag, ipos*=2) if (key & ipos) ++jtheta; - okay = okay && (std::abs(V[jtheta])<=M_PI); - } - return okay; - } - } - - inline FitQualityOnSurface* KalmanUpdator::makeChi2Object(const Amg::VectorX& residual, - const Amg::MatrixX& covTrk, - const Amg::MatrixX& covRio, - const int sign, - const int key) const - { // sign: -1 = updated, +1 = predicted parameters. - Amg::MatrixX R = covRio + sign * projection(covTrk,key); // .similarity(H); - if (R.determinant() == 0) { - ATH_MSG_DEBUG("matrix inversion failed"); - return new FitQualityOnSurface(0.0,(int)covRio.cols()); - } - // get chi2 = r.T() * R^-1 * r - double chiSquared = residual.transpose()*R.inverse()*residual; - ATH_MSG_VERBOSE("-U- fitQuality of "<< (sign>0?"predicted":"updated") - <<" state, chi2 :" << chiSquared << " / ndof= " << covRio.cols()); - // return the FitQualityOnSurface object - return new FitQualityOnSurface(chiSquared, int(covRio.cols())); - } - - } // end of namespace #endif // TRK_KALMANUPDATOR_CLHEP_H diff --git a/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdatorAmg.h b/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdatorAmg.h index 6a311d6e11c24222201cf6fcbe6773c6c7090267..8d081a9118979f48fa85905a39c753a032a90bd6 100755 --- a/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdatorAmg.h +++ b/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdatorAmg.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -14,11 +14,11 @@ #ifndef TRK_KALMANUPDATORAMG_H #define TRK_KALMANUPDATORAMG_H -#include "TrkToolInterfaces/IUpdator.h" +#include "AthenaBaseComps/AthAlgTool.h" #include "TrkEventPrimitives/ParamDefs.h" #include "TrkEventPrimitives/ProjectionMatricesSet.h" #include "TrkParameters/TrackParameters.h" -#include "AthenaBaseComps/AthAlgTool.h" +#include "TrkToolInterfaces/IUpdator.h" // Eigen/Amg #include "EventPrimitives/EventPrimitives.h" #include "EventPrimitives/EventPrimitivesToStringConverter.h" @@ -26,10 +26,10 @@ namespace Trk { - /** @class KalmanUpdatorAmg - @brief Implementation of Trk::IUpdator based on gain formalism and Eigen mathlib. + @brief Implementation of Trk::IUpdator based on gain formalism and Eigen + mathlib. Tool providing calculations on track states, i.e. to add or remove a measured hit to the state vector. @@ -40,391 +40,531 @@ namespace Trk { based on KalmanUpdatorSMatrix from: @author Wolfgang Liebig <http://consult.cern.ch/xwho/people/54608> */ -class KalmanUpdatorAmg : virtual public IUpdator, public AthAlgTool { - - enum RangeCheckDef {absoluteCheck=0, differentialCheck=1}; - - public: - //!< AlgTool standard constuctor - KalmanUpdatorAmg(const std::string&,const std::string&,const IInterface*); - //!<< AlgTool standard destructor - ~KalmanUpdatorAmg(); - - //!< AlgTool initialisation - virtual StatusCode initialize() override final; - //!< AlgTool termination - virtual StatusCode finalize() override final; - - //!< measurement updator for the KalmanFitter getting the meas't coord' from Amg::Vector2D (use eg with PRD) - // fails: @copydoc Trk::IUpdator::addToState(const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&) - virtual TrackParameters* addToState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&) const override final; - //!< measurement updator for the KalmanFitter getting the coord' from - //LocalParameters (use for example with MeasurementBase, ROT) - virtual TrackParameters* addToState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&) const override final; - //!< measurement updator interface for the KalmanFitter returning the fit quality of the state at the same time (Amg::Vector2D-version) - virtual TrackParameters* addToState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; - //!< measurement updator interface for the KalmanFitter returning the fit quality of the state at the same time (LocalParameters-version) - virtual TrackParameters* addToState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&, FitQualityOnSurface*& ) const override final; - - //!< reverse update eg for track property analysis (unbiased residuals) getting the measurement coordinates from the Amg::Vector2D class. - virtual TrackParameters* removeFromState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&) const override final; - //!< reverse update eg for track property analysis (unbiased residuals) getting the - //measurement coordinates from the LocalParameters class. - virtual TrackParameters* removeFromState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&) const override final; - //!< reverse update for Kalman filters and other applications using the interface with Amg::Vector2D and FitQualityOnSurface. - virtual TrackParameters* removeFromState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; - //!< reverse update for Kalman filters and other applications using the interface with LocalParameters and FitQualityOnSurface. - virtual TrackParameters* removeFromState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; - - /** @brief trajectory state updator which combines two parts of a trajectory on a common surface. - - Make sure that the TPs' surfaces are identical and - that the local hit is not duplicated in both trajectories! - */ - virtual TrackParameters* combineStates (const TrackParameters&, - const TrackParameters&) const override final; - /** @brief trajectory state updator which combines two parts of a trajectory on a common surface and provides the FitQuality. - - Make sure that the TPs' surfaces are identical and that the local hit is not duplicated!*/ - virtual TrackParameters* combineStates (const TrackParameters&, - const TrackParameters&, - FitQualityOnSurface*&) const override final; - - //!< estimator for FitQuality on Surface from a full track state, that is a state which contains the current hit (expressed as Amg::Vector2D). - virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX& ) const override final; - //!< estimator for FitQuality on Surface from a full track state, that is a state which contains the current hit (expressed as LocalParameters). - virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX& ) const override final; - //!< estimator for FitQuality on Surface from a predicted track state, that is a state which contains the current hit (expressed as Amg::Vector2D). - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX& ) const override final; - //!< estimator for FitQuality on Surface from a predicted track state, that is a state which contains the current hit (expressed as LocalParameters). - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX& ) const override final; - //!< estimator for FitQuality on Surface for the situation when a track is fitted to the parameters of another trajectory part extrapolated to the common surface. - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, - const TrackParameters&) const override final; - //!< interface for reference-track KF - virtual std::pair<AmgVector(5), AmgSymMatrix(5)>* updateParameterDifference (const AmgVector(5)&, - const AmgSymMatrix(5)&, - const Amg::VectorX&, - const Amg::MatrixX&, - const int&, - Trk::FitQualityOnSurface*&, bool ) const override final; - - //!< give back how updator is configured for inital covariances - virtual std::vector<double> initialErrors() const override final; - +class KalmanUpdatorAmg + : virtual public IUpdator + , public AthAlgTool +{ + + enum RangeCheckDef + { + absoluteCheck = 0, + differentialCheck = 1 + }; + +public: + //!< AlgTool standard constuctor + KalmanUpdatorAmg(const std::string&, const std::string&, const IInterface*); + //!<< AlgTool standard destructor + ~KalmanUpdatorAmg(); + + //!< AlgTool initialisation + virtual StatusCode initialize() override final; + //!< AlgTool termination + virtual StatusCode finalize() override final; + + //!< measurement updator for the KalmanFitter getting the meas't coord' from + //!< Amg::Vector2D (use eg with PRD) + // fails: @copydoc Trk::IUpdator::addToState(const TrackParameters&, const + // Amg::Vector2D&, const Amg::MatrixX&) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //!< measurement updator for the KalmanFitter getting the coord' from + // LocalParameters (use for example with MeasurementBase, ROT) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //!< measurement updator interface for the KalmanFitter returning the fit + //!< quality of the state at the same time (Amg::Vector2D-version) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + //!< measurement updator interface for the KalmanFitter returning the fit + //!< quality of the state at the same time (LocalParameters-version) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + + //!< reverse update eg for track property analysis (unbiased residuals) + //!< getting the measurement coordinates from the Amg::Vector2D class. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //!< reverse update eg for track property analysis (unbiased residuals) + //!< getting the + // measurement coordinates from the LocalParameters class. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //!< reverse update for Kalman filters and other applications using the + //!< interface with Amg::Vector2D and FitQualityOnSurface. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + //!< reverse update for Kalman filters and other applications using the + //!< interface with LocalParameters and FitQualityOnSurface. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + + /** @brief trajectory state updator which combines two parts of a trajectory + on a common surface. + + Make sure that the TPs' surfaces are identical and + that the local hit is not duplicated in both trajectories! + */ + virtual std::unique_ptr<TrackParameters> combineStates( + const TrackParameters&, + const TrackParameters&) const override final; + /** @brief trajectory state updator which combines two parts of a trajectory + on a common surface and provides the FitQuality. + + Make sure that the TPs' surfaces are identical and that the local hit is + not duplicated!*/ + virtual std::unique_ptr<TrackParameters> combineStates( + const TrackParameters&, + const TrackParameters&, + FitQualityOnSurface*&) const override final; + + //!< estimator for FitQuality on Surface from a full track state, that is a + //!< state which contains the current hit (expressed as Amg::Vector2D). + virtual const FitQualityOnSurface* fullStateFitQuality( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //!< estimator for FitQuality on Surface from a full track state, that is a + //!< state which contains the current hit (expressed as LocalParameters). + virtual const FitQualityOnSurface* fullStateFitQuality( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //!< estimator for FitQuality on Surface from a predicted track state, that is + //!< a state which contains the current hit (expressed as Amg::Vector2D). + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //!< estimator for FitQuality on Surface from a predicted track state, that is + //!< a state which contains the current hit (expressed as LocalParameters). + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //!< estimator for FitQuality on Surface for the situation when a track is + //!< fitted to the parameters of another trajectory part extrapolated to the + //!< common surface. + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const TrackParameters&) const override final; + //!< interface for reference-track KF + virtual std::pair<AmgVector(5), AmgSymMatrix(5)>* updateParameterDifference( + const AmgVector(5) &, + const AmgSymMatrix(5) &, + const Amg::VectorX&, + const Amg::MatrixX&, + const int&, + Trk::FitQualityOnSurface*&, + bool) const override final; + + //!< give back how updator is configured for inital covariances + virtual std::vector<double> initialErrors() const override final; + private: - //!< common code analysing the measurement's rank and calling the appropriate implementation for this rank. - TrackParameters* prepareFilterStep(const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - - - //!< estimator for FitQuality on Surface from a full/predicted track state, that is a state which contains the current hit (expressed as Amg::Vector2D). - const FitQualityOnSurface* stateFitQuality (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&, int predFull ) const; - //!< estimator for FitQuality on Surface from a full/predicted track state, that is a state which contains the current hit (expressed as LocalParameters). - const FitQualityOnSurface* stateFitQuality (const TrackParameters&, const LocalParameters&, const Amg::MatrixX&, int predFull ) const; - - //!< common maths calculation code for all addToState and removeFromState versions which happen to be called with 1-dim measurements. - TrackParameters* calculateFilterStep_1D(const TrackParameters& TP, const AmgSymMatrix(5)& trkCov, - double measPar, double measCov, int paramKey, - int updateDirection, - FitQualityOnSurface*& fQ, - bool) const; - //!< updator maths for pure AMG matrix as needed by reference-track based KF - std::pair<AmgVector(5), AmgSymMatrix(5)>* - calculateFilterStep_1D(const AmgVector(5)&, const AmgSymMatrix(5)&, - double measPar, double measCov, int paramKey, - FitQualityOnSurface*& , bool) const; - - - //!< common maths calculation code for all addToState and removeFromState versions which happen to be called with (2-4)-dim measurements. - template <int DIM> - TrackParameters* calculateFilterStep_T(const TrackParameters& TP, const AmgSymMatrix(5)& trkCov, - const AmgVector(DIM)& measPar, const AmgSymMatrix(DIM)& measCov, int paramKey, - int updateDirection, - FitQualityOnSurface*& fQ, - bool) const; - //!< updator maths for pure AMG matrix as needed by reference-track based KF, 2-4 dim case - template <int DIM> - std::pair<AmgVector(5), AmgSymMatrix(5)>* - calculateFilterStep_T(const AmgVector(5)&, const AmgSymMatrix(5)&, - const AmgVector(DIM)& measPar, const AmgSymMatrix(DIM)& measCov,int paramKey, - FitQualityOnSurface*& , bool) const; - - //!< common maths calculation code for all addToState and removeFromState versions which happen to be called with (2-4)-dim measurements. - TrackParameters* calculateFilterStep_5D(const TrackParameters& TP, const AmgSymMatrix(5)& trkCov, - const AmgVector(5)& measPar, const AmgSymMatrix(5)& measCov, - int updateDirection, - FitQualityOnSurface*& fQ, - bool) const; - - //!< updator maths for pure AMG matrix as needed by reference-track based KF, 5-dim case - std::pair<AmgVector(5), AmgSymMatrix(5)>* - calculateFilterStep_5D(const AmgVector(5)&, const AmgSymMatrix(5)&, - const AmgVector(5)&, const AmgSymMatrix(5)&, - FitQualityOnSurface*& , bool) const; - - //!< Avoid multiplications with sparse H matrices by cutting 2D rows&columns out of the full cov matrix. - template <int DIM> AmgSymMatrix(DIM) projection_T(const AmgSymMatrix(5)&, const int&) const; - - /** also the chi2 calculation and FitQuality object creation is - combined in an extra method. It is called by all the XXX-FitQuality() - methods - The sign controls the calculation in case a predicted input track state - (sign=+1) or smoothed/updated input track state (sign=-1). - */ - //!< make chi2 object for 1D, int is the accessor in the 5-par vector - FitQualityOnSurface* makeChi2_1D(const AmgVector(5)& trkPar, const AmgSymMatrix(5)& trkCov, - double measPar, double measCov, int accessor, int updateDirection) const; - //!< make chi2 object for 2D-4D, int is the paramkey - template <int DIM> - FitQualityOnSurface* makeChi2_T(const AmgVector(5)& trkPar, const AmgSymMatrix(5)& trkCov, - const AmgVector(DIM)&,const AmgSymMatrix(DIM)&, int paramKey, int updateDirection) const; - - //!< Helper method to transform Eigen cov matrix to SMatrix. - const AmgSymMatrix(5)* getStartCov(const TrackParameters&, const int) const; - - //!< Helper method to convert internal results from SMatrix to Eigen. */ - TrackParameters* convertToClonedTrackPars(const TrackParameters&, - const AmgVector(5)&, - const AmgSymMatrix(5)&, - int, bool, std::string_view) const; - - - // === note: any of the following log... method is only called if - // the msgstream level has been set appropriately. - //!< internal structuring: debugging output for start of method. - void logStart (const std::string&, const AmgVector(5)&) const; - //!< internal structuring: common logfile output of the inputs - void logInputCov (const AmgSymMatrix(5)&, const Amg::VectorX&, const Amg::MatrixX&) const; - //!< internal structuring: common logfile output during calculation - void logGainForm (const Amg::MatrixX&, const Amg::MatrixX&, const Amg::MatrixX&) const; - //!< internal structuring: common logfile output after calculation - void logResult(const std::string&, const AmgVector(5)&, const AmgSymMatrix(5)&) const; - - //!< method testing correct use of LocalParameters - bool consistentParamDimensions(const LocalParameters&, const int&) const; - - //!< Test if angles are inside boundaries. - /** Absolute phi values should be in [-pi, pi] (how about endpoints?) - absolute theta values should be in [0, +pi] - phi differences should also be in [-pi, pi] - else go other way round, - theta differences should be smaller than pi but can be negative - => other constraint than absolute theta. - */ - bool thetaPhiWithinRange_5D (const AmgVector(5)& V, - const KalmanUpdatorAmg::RangeCheckDef rcd) const; - - //!< Test if theta angle is inside boundaries. No differential-check option. - bool thetaWithinRange_5D (const AmgVector(5)& V) const; - - //!< method correcting the calculated angles back to their defined ranges phi (-pi, pi) and theta (0, pi). - /** Only works if the excess is not far from the defined range, as it - happens e.g. when the update moves across the phi= +/-pi boundary. */ - bool correctThetaPhiRange_5D(AmgVector(5)&, AmgSymMatrix(5)&, - const KalmanUpdatorAmg::RangeCheckDef) const; - - - std::vector<double> m_cov_stdvec; //!<< job options for initial cov values - AmgVector(5) m_cov0Vec; //!<< initial cov values in AmgVector object - AmgSymMatrix(5)* m_covariance0; //!<< initial cov values in AmgMatrix - bool m_useFruehwirth8a; //!<< job options controlling update formula for covariance matrix - float m_thetaGainDampingValue; - - AmgSymMatrix(5) m_unitMatrix; //!<< avoid mem allocation at every call - - ProjectionMatricesSet m_reMatrices; //!< expansion and reduction matrices set - - static const ParamDefsAccessor s_enumAccessor; + //!< common code analysing the measurement's rank and calling the appropriate + //!< implementation for this rank. + std::unique_ptr<TrackParameters> prepareFilterStep(const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + + //!< estimator for FitQuality on Surface from a full/predicted track state, + //!< that is a state which contains the current hit (expressed as + //!< Amg::Vector2D). + const FitQualityOnSurface* stateFitQuality(const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + int predFull) const; + //!< estimator for FitQuality on Surface from a full/predicted track state, + //!< that is a state which contains the current hit (expressed as + //!< LocalParameters). + const FitQualityOnSurface* stateFitQuality(const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + int predFull) const; + + //!< common maths calculation code for all addToState and removeFromState + //!< versions which happen to be called with 1-dim measurements. + std::unique_ptr<TrackParameters> calculateFilterStep_1D( + const TrackParameters& TP, + const AmgSymMatrix(5) & trkCov, + double measPar, + double measCov, + int paramKey, + int updateDirection, + FitQualityOnSurface*& fQ, + bool) const; + //!< updator maths for pure AMG matrix as needed by reference-track based KF + std::pair<AmgVector(5), AmgSymMatrix(5)>* calculateFilterStep_1D( + const AmgVector(5) &, + const AmgSymMatrix(5) &, + double measPar, + double measCov, + int paramKey, + FitQualityOnSurface*&, + bool) const; + + //!< common maths calculation code for all addToState and removeFromState + //!< versions which happen to be called with (2-4)-dim measurements. + template<int DIM> + std::unique_ptr<TrackParameters> calculateFilterStep_T( + const TrackParameters& TP, + const AmgSymMatrix(5) & trkCov, + const AmgVector(DIM) & measPar, + const AmgSymMatrix(DIM) & measCov, + int paramKey, + int updateDirection, + FitQualityOnSurface*& fQ, + bool) const; + //!< updator maths for pure AMG matrix as needed by reference-track based KF, + //!< 2-4 dim case + template<int DIM> + std::pair<AmgVector(5), AmgSymMatrix(5)>* calculateFilterStep_T( + const AmgVector(5) &, + const AmgSymMatrix(5) &, + const AmgVector(DIM) & measPar, + const AmgSymMatrix(DIM) & measCov, + int paramKey, + FitQualityOnSurface*&, + bool) const; + + //!< common maths calculation code for all addToState and removeFromState + //!< versions which happen to be called with (2-4)-dim measurements. + std::unique_ptr<TrackParameters> calculateFilterStep_5D( + const TrackParameters& TP, + const AmgSymMatrix(5) & trkCov, + const AmgVector(5) & measPar, + const AmgSymMatrix(5) & measCov, + int updateDirection, + FitQualityOnSurface*& fQ, + bool) const; + + //!< updator maths for pure AMG matrix as needed by reference-track based KF, + //!< 5-dim case + std::pair<AmgVector(5), AmgSymMatrix(5)>* calculateFilterStep_5D( + const AmgVector(5) &, + const AmgSymMatrix(5) &, + const AmgVector(5) &, + const AmgSymMatrix(5) &, + FitQualityOnSurface*&, + bool) const; + + //!< Avoid multiplications with sparse H matrices by cutting 2D rows&columns + //!< out of the full cov matrix. + template<int DIM> + AmgSymMatrix(DIM) projection_T(const AmgSymMatrix(5) &, const int&) const; + + /** also the chi2 calculation and FitQuality object creation is + combined in an extra method. It is called by all the XXX-FitQuality() + methods + The sign controls the calculation in case a predicted input track state + (sign=+1) or smoothed/updated input track state (sign=-1). + */ + //!< make chi2 object for 1D, int is the accessor in the 5-par vector + FitQualityOnSurface* makeChi2_1D(const AmgVector(5) & trkPar, + const AmgSymMatrix(5) & trkCov, + double measPar, + double measCov, + int accessor, + int updateDirection) const; + //!< make chi2 object for 2D-4D, int is the paramkey + template<int DIM> + FitQualityOnSurface* makeChi2_T(const AmgVector(5) & trkPar, + const AmgSymMatrix(5) & trkCov, + const AmgVector(DIM) &, + const AmgSymMatrix(DIM) &, + int paramKey, + int updateDirection) const; + + //!< Helper method to transform Eigen cov matrix to SMatrix. + const AmgSymMatrix(5) * getStartCov(const TrackParameters&, const int) const; + + //!< Helper method to convert internal results from SMatrix to Eigen. */ + std::unique_ptr<TrackParameters> convertToClonedTrackPars( + const TrackParameters&, + const AmgVector(5) &, + const AmgSymMatrix(5) &, + int, + bool, + std::string_view) const; + + // === note: any of the following log... method is only called if + // the msgstream level has been set appropriately. + //!< internal structuring: debugging output for start of method. + void logStart(const std::string&, const AmgVector(5) &) const; + //!< internal structuring: common logfile output of the inputs + void logInputCov(const AmgSymMatrix(5) &, + const Amg::VectorX&, + const Amg::MatrixX&) const; + //!< internal structuring: common logfile output during calculation + void logGainForm(const Amg::MatrixX&, + const Amg::MatrixX&, + const Amg::MatrixX&) const; + //!< internal structuring: common logfile output after calculation + void logResult(const std::string&, + const AmgVector(5) &, + const AmgSymMatrix(5) &) const; + + //!< method testing correct use of LocalParameters + bool consistentParamDimensions(const LocalParameters&, const int&) const; + + //!< Test if angles are inside boundaries. + /** Absolute phi values should be in [-pi, pi] (how about endpoints?) + absolute theta values should be in [0, +pi] + phi differences should also be in [-pi, pi] - else go other way round, + theta differences should be smaller than pi but can be negative + => other constraint than absolute theta. + */ + bool thetaPhiWithinRange_5D(const AmgVector(5) & V, + const KalmanUpdatorAmg::RangeCheckDef rcd) const; + + //!< Test if theta angle is inside boundaries. No differential-check option. + bool thetaWithinRange_5D(const AmgVector(5) & V) const; + + //!< method correcting the calculated angles back to their defined ranges phi + //!< (-pi, pi) and theta (0, pi). + /** Only works if the excess is not far from the defined range, as it + happens e.g. when the update moves across the phi= +/-pi boundary. */ + bool correctThetaPhiRange_5D(AmgVector(5) &, + AmgSymMatrix(5) &, + const KalmanUpdatorAmg::RangeCheckDef) const; + + std::vector<double> m_cov_stdvec; //!<< job options for initial cov values + AmgVector(5) m_cov0Vec; //!<< initial cov values in AmgVector object + AmgSymMatrix(5) * m_covariance0; //!<< initial cov values in AmgMatrix + bool m_useFruehwirth8a; //!<< job options controlling update formula for + //!< covariance matrix + float m_thetaGainDampingValue; + + AmgSymMatrix(5) m_unitMatrix; //!<< avoid mem allocation at every call + + ProjectionMatricesSet m_reMatrices; //!< expansion and reduction matrices set + + static const ParamDefsAccessor s_enumAccessor; }; - template <int DIM> TrackParameters* - KalmanUpdatorAmg::calculateFilterStep_T(const TrackParameters& TP, const AmgSymMatrix(5)& trkCov, - const AmgVector(DIM)& measPar, const AmgSymMatrix(DIM)& measCov, int paramKey, - int sign, - FitQualityOnSurface*& fQ, - bool createFQoS) const - { - - ATH_MSG_DEBUG("--> entered KalmanUpdatorAmg::calculateFilterStep_T< " << DIM << ">"); - // get the parameter vector - const AmgVector(5)& trkPar = TP.parameters(); - // reduction matrix H, Kalman gain K, residual r, combined covariance R - AmgMatrix(DIM,5) H; AmgMatrix(5,DIM) K; AmgMatrix(5,5) M; - AmgVector(DIM) r; AmgSymMatrix(DIM) R; - // reduction matrix - H = m_reMatrices.expansionMatrix(paramKey).block<DIM,5>(0,0); - // the projected parameters from the TrackParameters - AmgVector(DIM) projTrkPar; - if ( paramKey == 3 || paramKey == 7 || paramKey == 15 ) - projTrkPar = trkPar.block<DIM,1>(0,0); - else projTrkPar = H*trkPar; - // residual after reduction - r = measPar - projTrkPar; - // combined covariance after reduction - R = (sign * measCov + projection_T<DIM>(trkCov,paramKey)).inverse(); - // Kalman gain matrix - K = trkCov * H.transpose() * R; - // screen output - M = m_unitMatrix - K*H; - if (msgLvl(MSG::VERBOSE)) {logGainForm (r, R, K);} - // --- compute local filtered state - AmgVector(5) newPar = trkPar + K * r; - // --- compute filtered covariance matrix - AmgSymMatrix(5) newCov; - if (!m_useFruehwirth8a) { - // compute covariance matrix of local filteres state - // C = M * trkCov * M.T() +/- K * covRio * K.T() - newCov = M*trkCov*M.transpose() + sign*K*measCov*K.transpose(); - } else { - // C = (1 - KH) trkCov = trkCov - K*H*trkCov = KtimesH*trkCov - newCov = M * trkCov; - } - if (createFQoS) { // get chi2 = r.T() * R2^-1 * r - // when adding, the r and R are ready to for calculating the predicted chi2 - // when removing the r and -R are ready for calculating the updated chi2. - double chiSquared = (sign>0) ? r.transpose()*R*r : r.transpose()*(-R)*r; - // create the FQSonSurface - fQ = new FitQualityOnSurface(chiSquared, DIM); - } - return convertToClonedTrackPars(TP,newPar,newCov,sign,createFQoS,"2D"); - - } - - template <int DIM> std::pair<AmgVector(5), AmgSymMatrix(5)>* - KalmanUpdatorAmg::calculateFilterStep_T(const AmgVector(5)& trkPar, const AmgSymMatrix(5)& trkCov, - const AmgVector(DIM)& measPar, const AmgSymMatrix(DIM)& measCov, - int paramKey, FitQualityOnSurface*& fQ , bool createFQ) const - { - ATH_MSG_DEBUG("--> entered KalmanUpdatorAmg::calculateFilterStep_T< " << DIM << ">"); - // reduction matrix H, Kalman gain K, residual r, combined covariance R - AmgMatrix(DIM,5) H; AmgMatrix(5,DIM) K; AmgMatrix(5,5) M; - AmgVector(DIM) r; AmgSymMatrix(DIM) R; int sign=1; - // reduction matrix - H = m_reMatrices.expansionMatrix(paramKey).block<DIM,5>(0,0); - // the projected parameters from the TrackParameters - AmgVector(DIM) projTrkPar; - if ( paramKey == 3 || paramKey == 7 || paramKey == 15 ) - projTrkPar = trkPar.block<DIM,1>(0,0); - else projTrkPar = H*trkPar; - // residual after reduction - r = measPar - projTrkPar; - // combined covariance after reduction - R = (sign * measCov + projection_T<DIM>(trkCov,paramKey)).inverse(); - // Kalman gain matrix - K = trkCov * H.transpose() * R; - // screen output - M = m_unitMatrix - K*H; - if (msgLvl(MSG::VERBOSE)) {logGainForm (r, R, K);} - // --- compute local filtered state - AmgVector(5) newPar = trkPar + K * r; - // --- compute filtered covariance matrix - AmgSymMatrix(5) newCov; - if (!m_useFruehwirth8a) { - // compute covariance matrix of local filtered state - // C = M * trkCov * M.T() +/- K * covRio * K.T() - newCov = M*trkCov*M.transpose() + sign*K*measCov*K.transpose(); - } else { - // C = (1 - KH) trkCov = trkCov - K*H*trkCov = KtimesH*trkCov - newCov = M * trkCov; +template<int DIM> +std::unique_ptr<TrackParameters> +KalmanUpdatorAmg::calculateFilterStep_T(const TrackParameters& TP, + const AmgSymMatrix(5) & trkCov, + const AmgVector(DIM) & measPar, + const AmgSymMatrix(DIM) & measCov, + int paramKey, + int sign, + FitQualityOnSurface*& fQ, + bool createFQoS) const +{ + + ATH_MSG_DEBUG("--> entered KalmanUpdatorAmg::calculateFilterStep_T< " << DIM + << ">"); + // get the parameter vector + const AmgVector(5)& trkPar = TP.parameters(); + // reduction matrix H, Kalman gain K, residual r, combined covariance R + AmgMatrix(DIM, 5) H; + AmgMatrix(5, DIM) K; + AmgMatrix(5, 5) M; + AmgVector(DIM) r; + AmgSymMatrix(DIM) R; + // reduction matrix + H = m_reMatrices.expansionMatrix(paramKey).block<DIM, 5>(0, 0); + // the projected parameters from the TrackParameters + AmgVector(DIM) projTrkPar; + if (paramKey == 3 || paramKey == 7 || paramKey == 15) + projTrkPar = trkPar.block<DIM, 1>(0, 0); + else + projTrkPar = H * trkPar; + // residual after reduction + r = measPar - projTrkPar; + // combined covariance after reduction + R = (sign * measCov + projection_T<DIM>(trkCov, paramKey)).inverse(); + // Kalman gain matrix + K = trkCov * H.transpose() * R; + // screen output + M = m_unitMatrix - K * H; + if (msgLvl(MSG::VERBOSE)) { + logGainForm(r, R, K); + } + // --- compute local filtered state + AmgVector(5) newPar = trkPar + K * r; + // --- compute filtered covariance matrix + AmgSymMatrix(5) newCov; + if (!m_useFruehwirth8a) { + // compute covariance matrix of local filteres state + // C = M * trkCov * M.T() +/- K * covRio * K.T() + newCov = M * trkCov * M.transpose() + sign * K * measCov * K.transpose(); + } else { + // C = (1 - KH) trkCov = trkCov - K*H*trkCov = KtimesH*trkCov + newCov = M * trkCov; + } + if (createFQoS) { // get chi2 = r.T() * R2^-1 * r + // when adding, the r and R are ready to for calculating the predicted chi2 + // when removing the r and -R are ready for calculating the updated chi2. + double chiSquared = + (sign > 0) ? r.transpose() * R * r : r.transpose() * (-R) * r; + // create the FQSonSurface + fQ = new FitQualityOnSurface(chiSquared, DIM); + } + return convertToClonedTrackPars(TP, newPar, newCov, sign, createFQoS, "2D"); +} + +template<int DIM> +std::pair<AmgVector(5), AmgSymMatrix(5)>* +KalmanUpdatorAmg::calculateFilterStep_T(const AmgVector(5) & trkPar, + const AmgSymMatrix(5) & trkCov, + const AmgVector(DIM) & measPar, + const AmgSymMatrix(DIM) & measCov, + int paramKey, + FitQualityOnSurface*& fQ, + bool createFQ) const +{ + ATH_MSG_DEBUG("--> entered KalmanUpdatorAmg::calculateFilterStep_T< " << DIM + << ">"); + // reduction matrix H, Kalman gain K, residual r, combined covariance R + AmgMatrix(DIM, 5) H; + AmgMatrix(5, DIM) K; + AmgMatrix(5, 5) M; + AmgVector(DIM) r; + AmgSymMatrix(DIM) R; + int sign = 1; + // reduction matrix + H = m_reMatrices.expansionMatrix(paramKey).block<DIM, 5>(0, 0); + // the projected parameters from the TrackParameters + AmgVector(DIM) projTrkPar; + if (paramKey == 3 || paramKey == 7 || paramKey == 15) + projTrkPar = trkPar.block<DIM, 1>(0, 0); + else + projTrkPar = H * trkPar; + // residual after reduction + r = measPar - projTrkPar; + // combined covariance after reduction + R = (sign * measCov + projection_T<DIM>(trkCov, paramKey)).inverse(); + // Kalman gain matrix + K = trkCov * H.transpose() * R; + // screen output + M = m_unitMatrix - K * H; + if (msgLvl(MSG::VERBOSE)) { + logGainForm(r, R, K); + } + // --- compute local filtered state + AmgVector(5) newPar = trkPar + K * r; + // --- compute filtered covariance matrix + AmgSymMatrix(5) newCov; + if (!m_useFruehwirth8a) { + // compute covariance matrix of local filtered state + // C = M * trkCov * M.T() +/- K * covRio * K.T() + newCov = M * trkCov * M.transpose() + sign * K * measCov * K.transpose(); + } else { + // C = (1 - KH) trkCov = trkCov - K*H*trkCov = KtimesH*trkCov + newCov = M * trkCov; + } + if (createFQ) { // get chi2 = r.T() * R2^-1 * r + // when adding, the r and R are ready to for calculating the predicted chi2 + // when removing the r and -R are ready for calculating the updated chi2. + double chiSquared = r.transpose() * R * r; + // create the FQSonSurface + fQ = new FitQualityOnSurface(chiSquared, DIM); + } + return new std::pair<AmgVector(5), AmgSymMatrix(5)>( + std::make_pair(newPar, newCov)); +} + +template<int DIM> +AmgSymMatrix(DIM) Trk::KalmanUpdatorAmg::projection_T(const AmgSymMatrix(5) & M, + const int& key) const +{ + if (key == 3 || key == 7 || + key == 15) { // shortcuts for the most common use cases + return M.block<DIM, DIM>(0, 0); + } else { + Eigen::Matrix<int, DIM, 1, 0, DIM, 1> iv; + iv.setZero(); + for (int i = 0, k = 0; i < 5; ++i) { + if (key & (1 << i)) + iv[k++] = i; } - if (createFQ) { // get chi2 = r.T() * R2^-1 * r - // when adding, the r and R are ready to for calculating the predicted chi2 - // when removing the r and -R are ready for calculating the updated chi2. - double chiSquared = r.transpose()*R*r; - // create the FQSonSurface - fQ = new FitQualityOnSurface(chiSquared, DIM); + AmgSymMatrix(DIM) covSubMatrix; + covSubMatrix.setZero(); + for (int i = 0; i < DIM; ++i) { + for (int j = 0; j < DIM; ++j) { + covSubMatrix(i, j) = M(iv(i), iv(j)); + } } - return new std::pair<AmgVector(5), AmgSymMatrix(5)>(std::make_pair(newPar,newCov)); + return covSubMatrix; } - - template <int DIM> AmgSymMatrix(DIM) - Trk::KalmanUpdatorAmg::projection_T(const AmgSymMatrix(5)& M, const int& key) const - { - if (key == 3 || key == 7 || key == 15) { // shortcuts for the most common use cases - return M.block<DIM, DIM>(0,0); - } else { - Eigen::Matrix<int, DIM, 1, 0, DIM, 1> iv; iv.setZero(); - for (int i=0,k=0; i<5; ++i) { if (key & (1<<i)) iv[k++]=i; } - AmgSymMatrix(DIM) covSubMatrix; covSubMatrix.setZero(); - for (int i=0; i<DIM; ++i) { - for (int j=0; j<DIM; ++j) { - covSubMatrix(i,j) = M(iv(i),iv(j)); - } - } - return covSubMatrix; - } - } - - template <int DIM> - Trk::FitQualityOnSurface* Trk::KalmanUpdatorAmg::makeChi2_T(const AmgVector(5)& trkPar, - const AmgSymMatrix(5)& trkCov, - const AmgVector(DIM)& measPar, - const AmgSymMatrix(DIM)& covPar, - int paramKey, - int sign) const - { // sign: -1 = updated, +1 = predicted parameters. - - // make reduction matrix H from LocalParameters - AmgMatrix(DIM,5) H = m_reMatrices.expansionMatrix(paramKey).block<DIM,5>(0,0); - // not get the residual - ATH_MSG_VERBOSE("-U- makeChi2<"<<DIM<<">: H="<<H<<" is "<< - m_reMatrices.expansionMatrix(paramKey).rows()<<"x"<< - m_reMatrices.expansionMatrix(paramKey).cols()<<" for paramkey "<<paramKey); - AmgVector(DIM) r = measPar - H * trkPar; - // get the projected matrix - AmgSymMatrix(DIM) R = sign*projection_T<DIM>(trkCov,paramKey); - R += covPar; - // calcualte the chi2 value - double chiSquared = 0.0; - if (R.determinant()==0.0) { - ATH_MSG_DEBUG("matrix inversion not possible, set chi2 to zero"); - } else { - chiSquared = r.transpose()*R.inverse()*r; - } - return new FitQualityOnSurface(chiSquared, DIM); - } - - inline bool KalmanUpdatorAmg::thetaPhiWithinRange_5D (const AmgVector(5)& V, const KalmanUpdatorAmg::RangeCheckDef rcd) const { - static const AmgVector(2) thetaMin(0.0,-M_PI); - return ( (fabs(V(Trk::phi)) <= M_PI) && - (V(Trk::theta)>=thetaMin((int)rcd)) && (V(Trk::theta) <= M_PI) ); - } - - inline bool KalmanUpdatorAmg::thetaWithinRange_5D (const AmgVector(5)& V) const { - return (V(Trk::theta)>=0.0 && (V(Trk::theta) <= M_PI) ); - } - +} + +template<int DIM> +Trk::FitQualityOnSurface* +Trk::KalmanUpdatorAmg::makeChi2_T(const AmgVector(5) & trkPar, + const AmgSymMatrix(5) & trkCov, + const AmgVector(DIM) & measPar, + const AmgSymMatrix(DIM) & covPar, + int paramKey, + int sign) const +{ // sign: -1 = updated, +1 = predicted parameters. + + // make reduction matrix H from LocalParameters + AmgMatrix(DIM, 5) H = + m_reMatrices.expansionMatrix(paramKey).block<DIM, 5>(0, 0); + // not get the residual + ATH_MSG_VERBOSE("-U- makeChi2<" + << DIM << ">: H=" << H << " is " + << m_reMatrices.expansionMatrix(paramKey).rows() << "x" + << m_reMatrices.expansionMatrix(paramKey).cols() + << " for paramkey " << paramKey); + AmgVector(DIM) r = measPar - H * trkPar; + // get the projected matrix + AmgSymMatrix(DIM) R = sign * projection_T<DIM>(trkCov, paramKey); + R += covPar; + // calcualte the chi2 value + double chiSquared = 0.0; + if (R.determinant() == 0.0) { + ATH_MSG_DEBUG("matrix inversion not possible, set chi2 to zero"); + } else { + chiSquared = r.transpose() * R.inverse() * r; + } + return new FitQualityOnSurface(chiSquared, DIM); +} + +inline bool +KalmanUpdatorAmg::thetaPhiWithinRange_5D( + const AmgVector(5) & V, + const KalmanUpdatorAmg::RangeCheckDef rcd) const +{ + static const AmgVector(2) thetaMin(0.0, -M_PI); + return ((fabs(V(Trk::phi)) <= M_PI) && + (V(Trk::theta) >= thetaMin((int)rcd)) && (V(Trk::theta) <= M_PI)); +} + +inline bool +KalmanUpdatorAmg::thetaWithinRange_5D(const AmgVector(5) & V) const +{ + return (V(Trk::theta) >= 0.0 && (V(Trk::theta) <= M_PI)); +} + } // end of namespace #endif // TRK_KALMANUPDATORAMG_H diff --git a/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdatorSMatrix.h b/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdatorSMatrix.h index 5ba83a0ac0940c1e1e36478a5286766a6aba4b33..a0841f0e35a7504ac71bf4b61979176b2ae02692 100755 --- a/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdatorSMatrix.h +++ b/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanUpdatorSMatrix.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -15,48 +15,60 @@ #define TRK_KALMANUPDATORSMATRIX_H #if __GNUC__ -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wstrict-overflow" -# if !defined(__clang__) && __GNUC__ >= 6 -# pragma GCC diagnostic ignored "-Wmisleading-indentation" -# endif +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-overflow" +#if !defined(__clang__) && __GNUC__ >= 6 +#pragma GCC diagnostic ignored "-Wmisleading-indentation" +#endif #endif -#include "TrkToolInterfaces/IUpdator.h" +#include "AthenaBaseComps/AthAlgTool.h" #include "TrkEventPrimitives/ParamDefs.h" #include "TrkParameters/TrackParameters.h" -#include "AthenaBaseComps/AthAlgTool.h" +#include "TrkToolInterfaces/IUpdator.h" // Eigen/Amg #include "EventPrimitives/EventPrimitives.h" // ROOT SMatrix lin alg: for internal calculations #include "Math/SMatrix.h" #include "Math/SVector.h" -#include <string_view> #include <cmath> +#include <string_view> -typedef ROOT::Math::SMatrix<double,1,1,ROOT::Math::MatRepSym<double,1> > SCovMatrix1; -typedef ROOT::Math::SMatrix<double,2,2,ROOT::Math::MatRepSym<double,2> > SCovMatrix2; -typedef ROOT::Math::SMatrix<double,3,3,ROOT::Math::MatRepSym<double,3> > SCovMatrix3; -typedef ROOT::Math::SMatrix<double,4,4,ROOT::Math::MatRepSym<double,4> > SCovMatrix4; -typedef ROOT::Math::SMatrix<double,5,5,ROOT::Math::MatRepSym<double,5> > SCovMatrix5; -typedef ROOT::Math::SMatrix<double,2,2,ROOT::Math::MatRepStd<double,2,2> > SGenMatrix2; -typedef ROOT::Math::SMatrix<double,3,3,ROOT::Math::MatRepStd<double,3,3> > SGenMatrix3; -typedef ROOT::Math::SMatrix<double,4,4,ROOT::Math::MatRepStd<double,4,4> > SGenMatrix4; -typedef ROOT::Math::SMatrix<double,5,5,ROOT::Math::MatRepStd<double,5,5> > SGenMatrix5; -typedef ROOT::Math::SVector<double,2> SParVector2; -typedef ROOT::Math::SVector<double,3> SParVector3; -typedef ROOT::Math::SVector<double,4> SParVector4; -typedef ROOT::Math::SVector<double,5> SParVector5; - - +typedef ROOT::Math::SMatrix<double, 1, 1, ROOT::Math::MatRepSym<double, 1>> + SCovMatrix1; +typedef ROOT::Math::SMatrix<double, 2, 2, ROOT::Math::MatRepSym<double, 2>> + SCovMatrix2; +typedef ROOT::Math::SMatrix<double, 3, 3, ROOT::Math::MatRepSym<double, 3>> + SCovMatrix3; +typedef ROOT::Math::SMatrix<double, 4, 4, ROOT::Math::MatRepSym<double, 4>> + SCovMatrix4; +typedef ROOT::Math::SMatrix<double, 5, 5, ROOT::Math::MatRepSym<double, 5>> + SCovMatrix5; +typedef ROOT::Math::SMatrix<double, 2, 2, ROOT::Math::MatRepStd<double, 2, 2>> + SGenMatrix2; +typedef ROOT::Math::SMatrix<double, 3, 3, ROOT::Math::MatRepStd<double, 3, 3>> + SGenMatrix3; +typedef ROOT::Math::SMatrix<double, 4, 4, ROOT::Math::MatRepStd<double, 4, 4>> + SGenMatrix4; +typedef ROOT::Math::SMatrix<double, 5, 5, ROOT::Math::MatRepStd<double, 5, 5>> + SGenMatrix5; +typedef ROOT::Math::SVector<double, 2> SParVector2; +typedef ROOT::Math::SVector<double, 3> SParVector3; +typedef ROOT::Math::SVector<double, 4> SParVector4; +typedef ROOT::Math::SVector<double, 5> SParVector5; namespace Trk { - enum RangeCheckDef {absoluteCheck=0, differentialCheck=1}; +enum RangeCheckDef +{ + absoluteCheck = 0, + differentialCheck = 1 +}; /** @class KalmanUpdatorSMatrix - @brief Implementation of Trk::IUpdator based on gain formalism and SMatrix mathlib. + @brief Implementation of Trk::IUpdator based on gain formalism and SMatrix + mathlib. Tool providing calculations on track states, i.e. to add or remove a measured hit to the state vector. @@ -66,260 +78,339 @@ namespace Trk { @author Wolfgang Liebig <http://consult.cern.ch/xwho/people/54608> */ -class KalmanUpdatorSMatrix : virtual public IUpdator, public AthAlgTool { - public: - //! AlgTool standard constuctor - KalmanUpdatorSMatrix(const std::string&,const std::string&,const IInterface*); - virtual ~KalmanUpdatorSMatrix(); - - //! AlgTool initialisation - virtual StatusCode initialize() override; - //! AlgTool termination - virtual StatusCode finalize() override; - - //! measurement updator for the KalmanFitter getting the meas't coord' from Amg::Vector2D (use eg with PRD) - // fails: @copydoc Trk::IUpdator::addToState(const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&) - virtual TrackParameters* addToState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&) const override final; - //! measurement updator for the KalmanFitter getting the coord' from LocalParameters (use for example with MeasurementBase, ROT) - virtual TrackParameters* addToState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&) const override final; - //! measurement updator interface for the KalmanFitter returning the fit quality of the state at the same time (Amg::Vector2D-version) - virtual TrackParameters* addToState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; - //! measurement updator interface for the KalmanFitter returning the fit quality of the state at the same time (LocalParameters-version) - virtual TrackParameters* addToState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; - - //! reverse update eg for track property analysis (unbiased residuals) getting the measurement coordinates from the Amg::Vector2D class. - virtual TrackParameters* removeFromState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&) const override final; - //! reverse update eg for track property analysis (unbiased residuals) getting the measurement coordinates from the LocalParameters class. - virtual TrackParameters* removeFromState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&) const override final; - //! reverse update for Kalman filters and other applications using the interface with Amg::Vector2D and FitQualityOnSurface. - virtual TrackParameters* removeFromState (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; - //! reverse update for Kalman filters and other applications using the interface with LocalParameters and FitQualityOnSurface. - virtual TrackParameters* removeFromState (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&, - FitQualityOnSurface*& ) const override final; - - /** @brief trajectory state updator which combines two parts of a trajectory on a common surface. - - Make sure that the TPs' surfaces are identical and - that the local hit is not duplicated in both trajectories! - */ - - virtual TrackParameters* combineStates (const TrackParameters&, - const TrackParameters&) const override final; - /** @brief trajectory state updator which combines two parts of a trajectory on a common surface and provides the FitQuality. - - Make sure that the TPs' surfaces are identical and that the local hit is not duplicated! - */ - virtual TrackParameters* combineStates (const TrackParameters&, - const TrackParameters&, - FitQualityOnSurface*&) const override final; - - //! estimator for FitQuality on Surface from a full track state, that is a state which contains the current hit (expressed as Amg::Vector2D). - virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX& ) const override final; - //! estimator for FitQuality on Surface from a full track state, that is a state which contains the current hit (expressed as LocalParameters). - virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX& ) const override final; - //! estimator for FitQuality on Surface from a predicted track state, that is a state which contains the current hit (expressed as Amg::Vector2D). - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX& ) const override final; - //! estimator for FitQuality on Surface from a predicted track state, that is a state which contains the current hit (expressed as LocalParameters). - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX& ) const override final; - //! estimator for FitQuality on Surface for the situation when a track is fitted to the parameters of another trajectory part extrapolated to the common surface. - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, - const TrackParameters&) const override final; - //! interface for reference-track KF, not implemented - virtual std::pair<AmgVector(5), AmgSymMatrix(5)>* updateParameterDifference (const AmgVector(5)&, - const AmgSymMatrix(5)&, - const Amg::VectorX&, - const Amg::MatrixX&, - const int&, - Trk::FitQualityOnSurface*&, - bool ) const override final - {return nullptr;} - - //! give back how updator is configured for inital covariances - virtual std::vector<double> initialErrors() const override final; - +class KalmanUpdatorSMatrix + : virtual public IUpdator + , public AthAlgTool +{ +public: + //! AlgTool standard constuctor + KalmanUpdatorSMatrix(const std::string&, + const std::string&, + const IInterface*); + virtual ~KalmanUpdatorSMatrix(); + + //! AlgTool initialisation + virtual StatusCode initialize() override; + //! AlgTool termination + virtual StatusCode finalize() override; + + //! measurement updator for the KalmanFitter getting the meas't coord' from + //! Amg::Vector2D (use eg with PRD) + // fails: @copydoc Trk::IUpdator::addToState(const TrackParameters&, const + // Amg::Vector2D&, const Amg::MatrixX&) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //! measurement updator for the KalmanFitter getting the coord' from + //! LocalParameters (use for example with MeasurementBase, ROT) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //! measurement updator interface for the KalmanFitter returning the fit + //! quality of the state at the same time (Amg::Vector2D-version) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + //! measurement updator interface for the KalmanFitter returning the fit + //! quality of the state at the same time (LocalParameters-version) + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + + //! reverse update eg for track property analysis (unbiased residuals) getting + //! the measurement coordinates from the Amg::Vector2D class. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //! reverse update eg for track property analysis (unbiased residuals) getting + //! the measurement coordinates from the LocalParameters class. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //! reverse update for Kalman filters and other applications using the + //! interface with Amg::Vector2D and FitQualityOnSurface. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + //! reverse update for Kalman filters and other applications using the + //! interface with LocalParameters and FitQualityOnSurface. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + + /** @brief trajectory state updator which combines two parts of a trajectory + on a common surface. + + Make sure that the TPs' surfaces are identical and + that the local hit is not duplicated in both trajectories! + */ + + virtual std::unique_ptr<TrackParameters> combineStates( + const TrackParameters&, + const TrackParameters&) const override final; + /** @brief trajectory state updator which combines two parts of a trajectory + on a common surface and provides the FitQuality. + + Make sure that the TPs' surfaces are identical and that the local hit is + not duplicated! + */ + virtual std::unique_ptr<TrackParameters> combineStates( + const TrackParameters&, + const TrackParameters&, + FitQualityOnSurface*&) const override final; + + //! estimator for FitQuality on Surface from a full track state, that is a + //! state which contains the current hit (expressed as Amg::Vector2D). + virtual const FitQualityOnSurface* fullStateFitQuality( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //! estimator for FitQuality on Surface from a full track state, that is a + //! state which contains the current hit (expressed as LocalParameters). + virtual const FitQualityOnSurface* fullStateFitQuality( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //! estimator for FitQuality on Surface from a predicted track state, that is + //! a state which contains the current hit (expressed as Amg::Vector2D). + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + //! estimator for FitQuality on Surface from a predicted track state, that is + //! a state which contains the current hit (expressed as LocalParameters). + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + //! estimator for FitQuality on Surface for the situation when a track is + //! fitted to the parameters of another trajectory part extrapolated to the + //! common surface. + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const TrackParameters&) const override final; + //! interface for reference-track KF, not implemented + virtual std::pair<AmgVector(5), AmgSymMatrix(5)>* updateParameterDifference( + const AmgVector(5) &, + const AmgSymMatrix(5) &, + const Amg::VectorX&, + const Amg::MatrixX&, + const int&, + Trk::FitQualityOnSurface*&, + bool) const override final + { + return nullptr; + } + + //! give back how updator is configured for inital covariances + virtual std::vector<double> initialErrors() const override final; + private: - //! common code analysing the measurement's rank and calling the appropriate implementation for this rank. - TrackParameters* prepareFilterStep(const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - //! common maths calculation code for all addToState and removeFromState versions which happen to be called with 1-dim measurements. - TrackParameters* calculateFilterStep_1D(const TrackParameters&, - const SParVector5&, - const SCovMatrix5&, - const double&, - const int&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - //! common maths calculation code for all addToState and removeFromState versions which happen to be called with 2-dim measurements. - TrackParameters* calculateFilterStep_2D(const TrackParameters&, - const SParVector5&, - const SCovMatrix5&, - const SParVector2&, - const int&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - //! common maths calculation code for all addToState and removeFromState versions which happen to be called with 3-dim measurements. - TrackParameters* calculateFilterStep_3D(const TrackParameters&, - const SParVector5&, - const SCovMatrix5&, - const LocalParameters&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - //! common maths calculation code for all addToState and removeFromState versions which happen to be called with 4-dim measurements. - TrackParameters* calculateFilterStep_4D(const TrackParameters&, - const SParVector5&, - const SCovMatrix5&, - const LocalParameters&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - //! common maths calculation code for all addToState and removeFromState versions which happen to be called with 5-dim measurements or two track states. - /** For 5-dim track states the ParameterKey is known to be 31 and - does not need to be passed through the interface. */ - TrackParameters* calculateFilterStep_5D(const TrackParameters&, - const SParVector5&, - const SCovMatrix5&, - const SParVector5&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - - //! Helper method to transform Eigen cov matrix to SMatrix. - bool getStartCov(SCovMatrix5&, const TrackParameters&, const int) const; - //! Helper method to convert internal results from SMatrix to Eigen. */ - TrackParameters* convertToClonedTrackPars(const TrackParameters&, - const SParVector5&, - const SCovMatrix5&, - const int&, const bool&, - std::string_view) const; - /** also the chi2 calculation and FitQuality object creation is - combined in an extra method. It is called by all the XXX-FitQuality() - methods - SMatrix version for 1D, 2D, 5D and Eigen for 3D, 4D. - The calculateFilterStep() have the code duplicated to avoid - re-computing the residual-error matrix. - The sign controls the calculation in case a predicted input track state - (sign=+1) or smoothed/updated input track state (sign=-1). - */ - FitQualityOnSurface* makeChi2_1D(const SParVector5&, const Amg::MatrixX&, - const double&, const double&, - const int&, const int&) const; - FitQualityOnSurface* makeChi2_2D(const SParVector5&, const Amg::MatrixX&, - const SParVector2&, const SCovMatrix2&, - const int&, const int&) const; - FitQualityOnSurface* makeChi2_5D(const SParVector5&, const Amg::MatrixX&, - const SParVector5&, const Amg::MatrixX&, - const int&) const; - FitQualityOnSurface* makeChi2Object(const Amg::VectorX&, - const Amg::MatrixX&, const Amg::MatrixX&, - const Amg::MatrixX&, const int&) const; - - //! Avoid multiplications with sparse H matrices by cutting 2D rows&columns out of the full cov matrix. - SCovMatrix2 projection_2D(const SCovMatrix5&, const int&) const; - //! Avoid multiplications with sparse H matrices by cutting 2D rows&columns out of the full cov matrix. - SCovMatrix2 projection_2D(const Amg::MatrixX&, const int&) const; - //! Avoid multiplications with sparse H matrices by cutting 3D rows&columns out of the full cov matrix. - SCovMatrix3 projection_3D(const SCovMatrix5&, const int&) const; - //! Avoid multiplications with sparse H matrices by cutting 4D rows&columns out of the full cov matrix. - SCovMatrix4 projection_4D(const SCovMatrix5&, const int&) const; - - // === note: any of the following log... method is only called if - // the msgstream level has been set appropriately. - //! internal structuring: debugging output for start of method. - void logStart (const std::string&, const TrackParameters&) const; - //! internal structuring: common logfile output of the inputs - void logInputCov (const SCovMatrix5&, const Amg::VectorX&, const Amg::MatrixX&) const; - //! internal structuring: common logfile output during calculation - void logGainForm (int, const SParVector5&, const SCovMatrix5&, - const SGenMatrix5&) const; - //! internal structuring: common logfile output after calculation - void logResult(const std::string&, const AmgVector(5)&, const AmgSymMatrix(5)&) const; - - //! method testing correct use of LocalParameters - bool consistentParamDimensions(const LocalParameters&, const int&) const; - - //! Test if angles are inside boundaries. - /** Absolute phi values should be in [-pi, pi] (how about endpoints?) - absolute theta values should be in [0, +pi] - phi differences should also be in [-pi, pi] - else go other way round, - theta differences should be smaller than pi but can be negative - => other constraint than absolute theta. - */ - bool thetaPhiWithinRange_5D (const SParVector5& V, - const RangeCheckDef rcd) const; - - //! Test if theta angle is inside boundaries. No differential-check option. - bool thetaWithinRange_5D (const SParVector5& V) const; - - //! method correcting the calculated angles back to their defined ranges phi (-pi, pi) and theta (0, pi). - /** Only works if the excess is not far from the defined range, as it - happens e.g. when the update moves across the phi= +/-pi boundary. */ - bool correctThetaPhiRange_5D(SParVector5&, SCovMatrix5&, - const RangeCheckDef) const; - - - std::vector<double> m_cov_stdvec;//!< job options for initial cov values - SParVector5 m_cov0; //!< initial cov values in SMatrix object - bool m_useFruehwirth8a; //!< job options controlling update formula for covariance matrix - float m_thetaGainDampingValue; - - SCovMatrix5 m_unitMatrix; //!< avoid mem allocation at every call - static const ParamDefsAccessor s_enumAccessor; + //! common code analysing the measurement's rank and calling the appropriate + //! implementation for this rank. + std::unique_ptr<TrackParameters> prepareFilterStep(const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + //! common maths calculation code for all addToState and removeFromState + //! versions which happen to be called with 1-dim measurements. + std::unique_ptr<TrackParameters> calculateFilterStep_1D( + const TrackParameters&, + const SParVector5&, + const SCovMatrix5&, + const double&, + const int&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + //! common maths calculation code for all addToState and removeFromState + //! versions which happen to be called with 2-dim measurements. + std::unique_ptr<TrackParameters> calculateFilterStep_2D( + const TrackParameters&, + const SParVector5&, + const SCovMatrix5&, + const SParVector2&, + const int&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + //! common maths calculation code for all addToState and removeFromState + //! versions which happen to be called with 3-dim measurements. + std::unique_ptr<TrackParameters> calculateFilterStep_3D( + const TrackParameters&, + const SParVector5&, + const SCovMatrix5&, + const LocalParameters&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + //! common maths calculation code for all addToState and removeFromState + //! versions which happen to be called with 4-dim measurements. + std::unique_ptr<TrackParameters> calculateFilterStep_4D( + const TrackParameters&, + const SParVector5&, + const SCovMatrix5&, + const LocalParameters&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + //! common maths calculation code for all addToState and removeFromState + //! versions which happen to be called with 5-dim measurements or two track + //! states. + /** For 5-dim track states the ParameterKey is known to be 31 and + does not need to be passed through the interface. */ + std::unique_ptr<TrackParameters> calculateFilterStep_5D( + const TrackParameters&, + const SParVector5&, + const SCovMatrix5&, + const SParVector5&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + + //! Helper method to transform Eigen cov matrix to SMatrix. + bool getStartCov(SCovMatrix5&, const TrackParameters&, const int) const; + //! Helper method to convert internal results from SMatrix to Eigen. */ + std::unique_ptr<TrackParameters> convertToClonedTrackPars( + const TrackParameters&, + const SParVector5&, + const SCovMatrix5&, + const int&, + const bool&, + std::string_view) const; + /** also the chi2 calculation and FitQuality object creation is + combined in an extra method. It is called by all the XXX-FitQuality() + methods - SMatrix version for 1D, 2D, 5D and Eigen for 3D, 4D. + The calculateFilterStep() have the code duplicated to avoid + re-computing the residual-error matrix. + The sign controls the calculation in case a predicted input track state + (sign=+1) or smoothed/updated input track state (sign=-1). + */ + FitQualityOnSurface* makeChi2_1D(const SParVector5&, + const Amg::MatrixX&, + const double&, + const double&, + const int&, + const int&) const; + FitQualityOnSurface* makeChi2_2D(const SParVector5&, + const Amg::MatrixX&, + const SParVector2&, + const SCovMatrix2&, + const int&, + const int&) const; + FitQualityOnSurface* makeChi2_5D(const SParVector5&, + const Amg::MatrixX&, + const SParVector5&, + const Amg::MatrixX&, + const int&) const; + FitQualityOnSurface* makeChi2Object(const Amg::VectorX&, + const Amg::MatrixX&, + const Amg::MatrixX&, + const Amg::MatrixX&, + const int&) const; + + //! Avoid multiplications with sparse H matrices by cutting 2D rows&columns + //! out of the full cov matrix. + SCovMatrix2 projection_2D(const SCovMatrix5&, const int&) const; + //! Avoid multiplications with sparse H matrices by cutting 2D rows&columns + //! out of the full cov matrix. + SCovMatrix2 projection_2D(const Amg::MatrixX&, const int&) const; + //! Avoid multiplications with sparse H matrices by cutting 3D rows&columns + //! out of the full cov matrix. + SCovMatrix3 projection_3D(const SCovMatrix5&, const int&) const; + //! Avoid multiplications with sparse H matrices by cutting 4D rows&columns + //! out of the full cov matrix. + SCovMatrix4 projection_4D(const SCovMatrix5&, const int&) const; + + // === note: any of the following log... method is only called if + // the msgstream level has been set appropriately. + //! internal structuring: debugging output for start of method. + void logStart(const std::string&, const TrackParameters&) const; + //! internal structuring: common logfile output of the inputs + void logInputCov(const SCovMatrix5&, + const Amg::VectorX&, + const Amg::MatrixX&) const; + //! internal structuring: common logfile output during calculation + void logGainForm(int, + const SParVector5&, + const SCovMatrix5&, + const SGenMatrix5&) const; + //! internal structuring: common logfile output after calculation + void logResult(const std::string&, + const AmgVector(5) &, + const AmgSymMatrix(5) &) const; + + //! method testing correct use of LocalParameters + bool consistentParamDimensions(const LocalParameters&, const int&) const; + + //! Test if angles are inside boundaries. + /** Absolute phi values should be in [-pi, pi] (how about endpoints?) + absolute theta values should be in [0, +pi] + phi differences should also be in [-pi, pi] - else go other way round, + theta differences should be smaller than pi but can be negative + => other constraint than absolute theta. + */ + bool thetaPhiWithinRange_5D(const SParVector5& V, + const RangeCheckDef rcd) const; + + //! Test if theta angle is inside boundaries. No differential-check option. + bool thetaWithinRange_5D(const SParVector5& V) const; + + //! method correcting the calculated angles back to their defined ranges phi + //! (-pi, pi) and theta (0, pi). + /** Only works if the excess is not far from the defined range, as it + happens e.g. when the update moves across the phi= +/-pi boundary. */ + bool correctThetaPhiRange_5D(SParVector5&, + SCovMatrix5&, + const RangeCheckDef) const; + + std::vector<double> m_cov_stdvec; //!< job options for initial cov values + SParVector5 m_cov0; //!< initial cov values in SMatrix object + bool m_useFruehwirth8a; //!< job options controlling update formula for + //!< covariance matrix + float m_thetaGainDampingValue; + + SCovMatrix5 m_unitMatrix; //!< avoid mem allocation at every call + static const ParamDefsAccessor s_enumAccessor; }; - inline bool KalmanUpdatorSMatrix::thetaPhiWithinRange_5D (const SParVector5& V, - const RangeCheckDef rcd) const { - static const SParVector2 thetaMin(0.0,-M_PI); - return ( (std::abs(V(Trk::phi)) <= M_PI) && - (V(Trk::theta)>=thetaMin((int)rcd)) && (V(Trk::theta) <= M_PI) ); - } - - inline bool KalmanUpdatorSMatrix::thetaWithinRange_5D (const SParVector5& V) const { - return (V(Trk::theta)>=0.0 && (V(Trk::theta) <= M_PI) ); - } - -} // end of namespace +inline bool +KalmanUpdatorSMatrix::thetaPhiWithinRange_5D(const SParVector5& V, + const RangeCheckDef rcd) const +{ + static const SParVector2 thetaMin(0.0, -M_PI); + return ((std::abs(V(Trk::phi)) <= M_PI) && + (V(Trk::theta) >= thetaMin((int)rcd)) && (V(Trk::theta) <= M_PI)); +} + +inline bool +KalmanUpdatorSMatrix::thetaWithinRange_5D(const SParVector5& V) const +{ + return (V(Trk::theta) >= 0.0 && (V(Trk::theta) <= M_PI)); +} +} // end of namespace #if __GNUC__ -# pragma GCC diagnostic pop +#pragma GCC diagnostic pop #endif - #endif // TRK_KALMANUPDATOR_H diff --git a/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanWeightUpdator.h b/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanWeightUpdator.h index 0513f7698b8b790bf3112d6f0e0c803f60a99449..ea58045c6a36773e3ceaeaa53bf175fc51e73aaf 100755 --- a/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanWeightUpdator.h +++ b/Tracking/TrkTools/TrkMeasurementUpdator/TrkMeasurementUpdator/KalmanWeightUpdator.h @@ -14,13 +14,13 @@ #ifndef TRK_KALMANWEIGHTUPDATOR_H #define TRK_KALMANWEIGHTUPDATOR_H -#include "TrkToolInterfaces/IUpdator.h" #include "AthenaBaseComps/AthAlgTool.h" +#include "EventPrimitives/EventPrimitives.h" #include "GaudiKernel/MsgStream.h" +#include "GeoPrimitives/GeoPrimitives.h" #include "TrkEventPrimitives/ParamDefs.h" +#include "TrkToolInterfaces/IUpdator.h" #include <cmath> -#include "GeoPrimitives/GeoPrimitives.h" -#include "EventPrimitives/EventPrimitives.h" namespace Trk { @@ -32,209 +32,300 @@ namespace Trk { * This version of the tool implements the weight formalism * @author Sebastian.Fleischmann@cern.ch */ -class KalmanWeightUpdator : virtual public IUpdator, public AthAlgTool { +class KalmanWeightUpdator + : virtual public IUpdator + , public AthAlgTool +{ public: - //! standard AlgTool constructor - KalmanWeightUpdator(const std::string&,const std::string&,const IInterface*); - ~KalmanWeightUpdator(); - - //! standard Athena initialisation - virtual StatusCode initialize() override final; - //! standard Athena termination - virtual StatusCode finalize() override final; - - /** @brief measurement updator for the KalmanFitter getting the measurement - coordinates from Amg::Vector2D (use for example with PrepRawData) */ - virtual TrackParameters* addToState (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&) const override final; - /** @brief measurement updator for the KalmanFitter getting the coordinates - from LocalParameters (use for example with MeasurementBase, ROT) */ - virtual TrackParameters* addToState (const TrackParameters&, const LocalParameters&, const Amg::MatrixX&) const override final ; - /** @brief measurement updator interface for the KalmanFitter returning the - fit quality of the state at the same time (Amg::Vector2D-version) */ - virtual TrackParameters* addToState (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&, FitQualityOnSurface*& ) const override final; - /** @brief measurement updator interface for the KalmanFitter returning the - fit quality of the state at the same time (LocalParameters-version) */ - virtual TrackParameters* addToState (const TrackParameters&, const LocalParameters&, const Amg::MatrixX&, FitQualityOnSurface*& ) const override final; - - /** @brief reverse updator for the KalmanFitter and other fitters, getting - the measurement coordinates from the Amg::Vector2D class. - - It can be used to get unbiased TrackParameters for track residual studies. - */ - virtual TrackParameters* removeFromState (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&) const override final; - /** @brief reverse updator for the KalmanFitter and other fitters, getting - the measurement coordinates from the LocalParameters class. - - It can be used to get unbiased TrackParameters for track residual studies. - */ - virtual TrackParameters* removeFromState (const TrackParameters&, const LocalParameters&, const Amg::MatrixX&) const override final; - /** @brief reverse updator for the KalmanFitter and other fitters using - the interface with Amg::Vector2D and FitQualityOnSurface. - */ - virtual TrackParameters* removeFromState (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&, FitQualityOnSurface*& ) const override final; - /** @brief reverse updator for the KalmanFitter and other fitters using - the interface with LocalParameters and FitQualityOnSurface. - */ - virtual TrackParameters* removeFromState (const TrackParameters&, const LocalParameters&, const Amg::MatrixX&, FitQualityOnSurface*& ) const override final; - - //! trajectory state updator which combines two parts of a trajectory. - /** make sure that the TPs' surfaces are identical and - that the local hit is not duplicated in both trajectories. - */ - virtual TrackParameters* combineStates (const TrackParameters&, const TrackParameters&) const override final ; - //! combines two parts of a trajectory on a common surface and provides the FitQuality - /** make sure that the TPs' surfaces are identical and that the local hit is not duplicated. - */ - virtual TrackParameters* combineStates (const TrackParameters&, const TrackParameters&, FitQualityOnSurface*&) const override final; - - /** @brief estimator for FitQualityOnSurface from a full track state, i.e. - a state which contains the current hit (expressed as Amg::Vector2D). - */ - virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX& ) const override final; - /** @brief estimator for FitQualityOnSurface from a full track state, i.e. - a state which contains the current hit (expressed as LocalParameters). - */ - virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&, const LocalParameters&, const Amg::MatrixX& ) const override final; - /** @brief estimator for FitQualityOnSurface from a predicted track state, - i.e. a state which contains the current hit (expressed as Amg::Vector2D). - */ - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX& ) const override final; - /** @brief estimator for FitQualityOnSurface from a predicted track state, - i.e. a state which contains the current hit (expressed as LocalParameters). - */ - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, const LocalParameters&, const Amg::MatrixX& ) const override final; - /** @brief estimator for FitQuality on Surface for the situation when a - track is fitted to the parameters of another trajectory part - extrapolated to the common surface. - */ - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, const TrackParameters&) const override final; - //! interface for update for reference-track KF, not implemented. - virtual std::pair<AmgVector(5), AmgSymMatrix(5)>* updateParameterDifference (const AmgVector(5)&, const AmgSymMatrix(5)&, - const Amg::VectorX&, const Amg::MatrixX&, - const int&, Trk::FitQualityOnSurface*&, bool ) const override final {return nullptr;} - - //! give back how updator is configured for inital weights - virtual std::vector<double> initialErrors() const override final; + //! standard AlgTool constructor + KalmanWeightUpdator(const std::string&, + const std::string&, + const IInterface*); + ~KalmanWeightUpdator(); + + //! standard Athena initialisation + virtual StatusCode initialize() override final; + //! standard Athena termination + virtual StatusCode finalize() override final; + + /** @brief measurement updator for the KalmanFitter getting the measurement + coordinates from Amg::Vector2D (use for example with PrepRawData) */ + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + /** @brief measurement updator for the KalmanFitter getting the coordinates + from LocalParameters (use for example with MeasurementBase, ROT) */ + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + /** @brief measurement updator interface for the KalmanFitter returning the + fit quality of the state at the same time (Amg::Vector2D-version) */ + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + /** @brief measurement updator interface for the KalmanFitter returning the + fit quality of the state at the same time (LocalParameters-version) */ + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + + /** @brief reverse updator for the KalmanFitter and other fitters, getting + the measurement coordinates from the Amg::Vector2D class. + + It can be used to get unbiased TrackParameters for track residual studies. + */ + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + /** @brief reverse updator for the KalmanFitter and other fitters, getting + the measurement coordinates from the LocalParameters class. + + It can be used to get unbiased TrackParameters for track residual studies. + */ + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + /** @brief reverse updator for the KalmanFitter and other fitters using + the interface with Amg::Vector2D and FitQualityOnSurface. + */ + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + /** @brief reverse updator for the KalmanFitter and other fitters using + the interface with LocalParameters and FitQualityOnSurface. + */ + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const override final; + + //! trajectory state updator which combines two parts of a trajectory. + /** make sure that the TPs' surfaces are identical and + that the local hit is not duplicated in both trajectories. + */ + virtual std::unique_ptr<TrackParameters> combineStates( + const TrackParameters&, + const TrackParameters&) const override final; + //! combines two parts of a trajectory on a common surface and provides the + //! FitQuality + /** make sure that the TPs' surfaces are identical and that the local hit is + * not duplicated. + */ + virtual std::unique_ptr<TrackParameters> combineStates( + const TrackParameters&, + const TrackParameters&, + FitQualityOnSurface*&) const override final; + + /** @brief estimator for FitQualityOnSurface from a full track state, i.e. + a state which contains the current hit (expressed as Amg::Vector2D). + */ + virtual const FitQualityOnSurface* fullStateFitQuality( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + /** @brief estimator for FitQualityOnSurface from a full track state, i.e. + a state which contains the current hit (expressed as LocalParameters). + */ + virtual const FitQualityOnSurface* fullStateFitQuality( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + /** @brief estimator for FitQualityOnSurface from a predicted track state, + i.e. a state which contains the current hit (expressed as Amg::Vector2D). + */ + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const override final; + /** @brief estimator for FitQualityOnSurface from a predicted track state, + i.e. a state which contains the current hit (expressed as LocalParameters). + */ + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const override final; + /** @brief estimator for FitQuality on Surface for the situation when a + track is fitted to the parameters of another trajectory part + extrapolated to the common surface. + */ + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const TrackParameters&) const override final; + //! interface for update for reference-track KF, not implemented. + virtual std::pair<AmgVector(5), AmgSymMatrix(5)>* updateParameterDifference( + const AmgVector(5) &, + const AmgSymMatrix(5) &, + const Amg::VectorX&, + const Amg::MatrixX&, + const int&, + Trk::FitQualityOnSurface*&, + bool) const override final + { + return nullptr; + } + + //! give back how updator is configured for inital weights + virtual std::vector<double> initialErrors() const override final; private: - //! common maths calculation code for addToState and removeFromState - TrackParameters* calculateFilterStep( const TrackParameters&, - const Amg::Vector2D&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - /** @brief common maths calculation code for addToState and removeFromState. - - Used formulas: - - (R. Fruehwirth, et al., Data Analysis Techniques for High-Energy Physics, 2nd ed.)<br> - \f$ p_{k|k} = G_{k|k}^{-1} ( G_{k|k-1} p_{k|k-1} H^T_k W_k m_k )\f$ - \f$ G_{k|k} = G_{k|k-1} + H^T_k W_k H_k \f$<br> - (R. Fruehwirth, Application of Kalman filtering, NIM A262, 446)<br> - \f$ r_{k|k} = m_k - H_k p_{k|k} \f$ - \f$ \chi_{k|F}^2 = r_{k|k}^T W_k r_{k|k} + (p_{k|k} - p_{k|k-1})^T G_{k|k-1} (p_{k|k} - p_{k|k-1}) \f$ - */ - TrackParameters* calculateFilterStep( const TrackParameters&, - const LocalParameters&, - const Amg::MatrixX&, - const int, - FitQualityOnSurface*&, - bool) const; - - /** @brief also the chi2 calculation and FitQuality object creation using - gain matrix formalism is combined in an extra method. - - It is called by ___FitQuality(). - The sign controls the calculation in case a predicted input track state (sign=+1) - or smoothed/updated input track state (sign=-1).<br> - Used formula: - (R. Fruehwirth, et al., Data Analysis Techniques for High-Energy Physics, 2nd ed.) - \f$ r = m - H p \f$ - \f$ \chi^2 = r^T (V - H C H^T)^{-1} r \f$ - */ - FitQualityOnSurface* makeChi2Object(Amg::VectorX&, - const Amg::MatrixX&, const Amg::MatrixX&, - const Amg::MatrixX&, const int) const; - /** @brief The chi2 calculation and FitQuality object creation using - weighted means formalism is combined in an extra method. - - It is called by calculateFilterStep() and combineStates(). - Used formula: - (Fruehwirth, Application of Kalman filtering, NIM A262, 446) - \f$ r_1 = m - H p_{new} \f$ - \f$ r_2 = p_{new} - p_{old} \f$ - \f$ \chi^2 = r_1^T V^{-1}.r_1 + r_2^T C_{old}^{-1}.r_2 \f$ - */ - FitQualityOnSurface* makeChi2Object( Amg::VectorX& residual1, - const Amg::MatrixX& weight1, - const int key1, - Amg::VectorX& residual2, - const Amg::MatrixX& weight2, - const int key2 ) const; - - //! debugging output at input; only called if log.level() is low. */ - void logInputCov (const Amg::MatrixX&, const Amg::VectorX&, const Amg::MatrixX&) const; - //! debugging output of result; only called if log.level() is low. */ - void logResult (const std::string&, const TrackParameters&) const; - //! debugging output of cov result; only called if log.level() is low. */ - void logOutputCov(const Amg::VectorX&, const Amg::MatrixX&) const; - //! debugging output of weight mat; only called if log.level() is low. */ - void logOutputWeightMat(Amg::MatrixX& covPar) const; - - //! job options: initial weight matrix for input pars without error matrix - std::vector<double> m_weight; - - //! cached log.level() - int m_outputlevel; - - //! check correct ranges of absolute phi (-pi, pi) and theta (0, pi) values - bool thetaPhiWithinRange(const Amg::VectorX&, const int key=31) const; - //! check correct ranges of phi (-pi, pi) and theta (0, pi) differences - bool diffThetaPhiWithinRange(const Amg::VectorX&, const int key=31) const; - //! bring phi or theta back into allowed range using periodicity - bool correctThetaPhiRange(Amg::VectorX&, const bool isDifference=false, const int key=31) const; + //! common maths calculation code for addToState and removeFromState + std::unique_ptr<TrackParameters> calculateFilterStep(const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + /** @brief common maths calculation code for addToState and removeFromState. + + Used formulas: + + (R. Fruehwirth, et al., Data Analysis Techniques for High-Energy Physics, 2nd + ed.)<br> \f$ p_{k|k} = G_{k|k}^{-1} ( G_{k|k-1} p_{k|k-1} H^T_k W_k m_k )\f$ + \f$ G_{k|k} = G_{k|k-1} + H^T_k W_k H_k \f$<br> + (R. Fruehwirth, Application of Kalman filtering, NIM A262, 446)<br> + \f$ r_{k|k} = m_k - H_k p_{k|k} \f$ + \f$ \chi_{k|F}^2 = r_{k|k}^T W_k r_{k|k} + (p_{k|k} - p_{k|k-1})^T G_{k|k-1} + (p_{k|k} - p_{k|k-1}) \f$ + */ + std::unique_ptr<TrackParameters> calculateFilterStep(const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + const int, + FitQualityOnSurface*&, + bool) const; + + /** @brief also the chi2 calculation and FitQuality object creation using + gain matrix formalism is combined in an extra method. + + It is called by ___FitQuality(). + The sign controls the calculation in case a predicted input track state + (sign=+1) or smoothed/updated input track state (sign=-1).<br> Used + formula: (R. Fruehwirth, et al., Data Analysis Techniques for High-Energy + Physics, 2nd ed.) \f$ r = m - H p \f$ \f$ \chi^2 = r^T (V - H C H^T)^{-1} r + \f$ + */ + FitQualityOnSurface* makeChi2Object(Amg::VectorX&, + const Amg::MatrixX&, + const Amg::MatrixX&, + const Amg::MatrixX&, + const int) const; + /** @brief The chi2 calculation and FitQuality object creation using + weighted means formalism is combined in an extra method. + + It is called by calculateFilterStep() and combineStates(). + Used formula: + (Fruehwirth, Application of Kalman filtering, NIM A262, 446) + \f$ r_1 = m - H p_{new} \f$ + \f$ r_2 = p_{new} - p_{old} \f$ + \f$ \chi^2 = r_1^T V^{-1}.r_1 + r_2^T C_{old}^{-1}.r_2 \f$ + */ + FitQualityOnSurface* makeChi2Object(Amg::VectorX& residual1, + const Amg::MatrixX& weight1, + const int key1, + Amg::VectorX& residual2, + const Amg::MatrixX& weight2, + const int key2) const; + + //! debugging output at input; only called if log.level() is low. */ + void logInputCov(const Amg::MatrixX&, + const Amg::VectorX&, + const Amg::MatrixX&) const; + //! debugging output of result; only called if log.level() is low. */ + void logResult(const std::string&, const TrackParameters&) const; + //! debugging output of cov result; only called if log.level() is low. */ + void logOutputCov(const Amg::VectorX&, const Amg::MatrixX&) const; + //! debugging output of weight mat; only called if log.level() is low. */ + void logOutputWeightMat(Amg::MatrixX& covPar) const; + + //! job options: initial weight matrix for input pars without error matrix + std::vector<double> m_weight; + + //! cached log.level() + int m_outputlevel; + + //! check correct ranges of absolute phi (-pi, pi) and theta (0, pi) values + bool thetaPhiWithinRange(const Amg::VectorX&, const int key = 31) const; + //! check correct ranges of phi (-pi, pi) and theta (0, pi) differences + bool diffThetaPhiWithinRange(const Amg::VectorX&, const int key = 31) const; + //! bring phi or theta back into allowed range using periodicity + bool correctThetaPhiRange(Amg::VectorX&, + const bool isDifference = false, + const int key = 31) const; }; -inline bool KalmanWeightUpdator::thetaPhiWithinRange (const Amg::VectorX& V, const int key) const { - if (! (key&4 || key&8)) return true; // in case no angles measured. - if (key == 31) return ( (std::abs(V[Trk::phi]) <= M_PI) && (V[Trk::theta]>=0.0) && (V[Trk::theta] <= M_PI) ); - else { // if vector is compressed (i.e. localParameters) need to extract phi,theta first. - bool okay = true; - if (key & 4) { // phi is being measured - int jphi = 0; - for (int itag = 0, ipos=1; itag<Trk::phi; ++itag, ipos*=2) if (key & ipos) ++jphi; - okay = okay && (std::abs(V[jphi]) <= M_PI); - } - if (key & 8) { // theta is being measured - int jtheta = 0; - for (int itag = 0, ipos=1; itag<=Trk::theta; ++itag, ipos*=2) if (key & ipos) ++jtheta; - okay = okay && (std::abs(V[jtheta]-M_PI_2)<=M_PI_2); - } - return okay; +inline bool +KalmanWeightUpdator::thetaPhiWithinRange(const Amg::VectorX& V, + const int key) const +{ + if (!(key & 4 || key & 8)) + return true; // in case no angles measured. + if (key == 31) + return ((std::abs(V[Trk::phi]) <= M_PI) && (V[Trk::theta] >= 0.0) && + (V[Trk::theta] <= M_PI)); + else { // if vector is compressed (i.e. localParameters) need to extract + // phi,theta first. + bool okay = true; + if (key & 4) { // phi is being measured + int jphi = 0; + for (int itag = 0, ipos = 1; itag < Trk::phi; ++itag, ipos *= 2) + if (key & ipos) + ++jphi; + okay = okay && (std::abs(V[jphi]) <= M_PI); + } + if (key & 8) { // theta is being measured + int jtheta = 0; + for (int itag = 0, ipos = 1; itag <= Trk::theta; ++itag, ipos *= 2) + if (key & ipos) + ++jtheta; + okay = okay && (std::abs(V[jtheta] - M_PI_2) <= M_PI_2); } + return okay; + } } // for speed reasons make two separate inline functions -// phi differences should be smaller than pi (else go other way round) => same as absolute phi value. -// theta differences should be smaller than pi but can be negative => other constraint than absolute theta. -inline bool KalmanWeightUpdator::diffThetaPhiWithinRange (const Amg::VectorX& V, const int key) const { - if (! (key&4 || key&8)) return true; // in case no angles measured. - if (key == 31) return ( (std::abs(V[Trk::phi]) <= M_PI) && (V[Trk::theta]>=-M_PI) && (V[Trk::theta] <= M_PI) ); - else { // if vector is compressed (i.e. localParameters) need to extract phi,theta first. - bool okay = true; - if (key & 4) { // phi is being measured - int jphi = 0; - for (int itag = 0, ipos=1; itag<Trk::phi; ++itag, ipos*=2) if (key & ipos) ++jphi; - okay = okay && (std::abs(V[jphi]) <= M_PI); - } - if (key & 8) { // theta is being measured - int jtheta = 0; - for (int itag = 0, ipos=1; itag<=Trk::theta; ++itag, ipos*=2) if (key & ipos) ++jtheta; - okay = okay && (std::abs(V[jtheta])<=M_PI); - } - return okay; +// phi differences should be smaller than pi (else go other way round) => same +// as absolute phi value. theta differences should be smaller than pi but can be +// negative => other constraint than absolute theta. +inline bool +KalmanWeightUpdator::diffThetaPhiWithinRange(const Amg::VectorX& V, + const int key) const +{ + if (!(key & 4 || key & 8)) + return true; // in case no angles measured. + if (key == 31) + return ((std::abs(V[Trk::phi]) <= M_PI) && (V[Trk::theta] >= -M_PI) && + (V[Trk::theta] <= M_PI)); + else { // if vector is compressed (i.e. localParameters) need to extract + // phi,theta first. + bool okay = true; + if (key & 4) { // phi is being measured + int jphi = 0; + for (int itag = 0, ipos = 1; itag < Trk::phi; ++itag, ipos *= 2) + if (key & ipos) + ++jphi; + okay = okay && (std::abs(V[jphi]) <= M_PI); + } + if (key & 8) { // theta is being measured + int jtheta = 0; + for (int itag = 0, ipos = 1; itag <= Trk::theta; ++itag, ipos *= 2) + if (key & ipos) + ++jtheta; + okay = okay && (std::abs(V[jtheta]) <= M_PI); } + return okay; + } } } // end of namespace diff --git a/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdator.cxx b/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdator.cxx index 33132dc8f095b5e6684497d25ba497d096c8a4c8..3ca2fdbb840004d1dc67ca3c983737ecbe69bb30 100755 --- a/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdator.cxx +++ b/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdator.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ /////////////////////////////////////////////////////////////////// @@ -61,8 +61,8 @@ StatusCode Trk::KalmanUpdator::finalize() } // updator #1 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanUpdator::addToState (const Trk::TrackParameters& trkPar, - const Amg::Vector2D& measmtPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator::addToState (const Trk::TrackParameters& trkPar, + const Amg::Vector2D& measmtPos, const Amg::MatrixX& measmtErr) const { if (m_outputlevel <= 0) logStart("addToState(TP,LPOS,ERR)",trkPar); FitQualityOnSurface* fitQoS = nullptr; @@ -70,7 +70,7 @@ Trk::TrackParameters* Trk::KalmanUpdator::addToState (const Trk::TrackParameters } // updator #2 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanUpdator::addToState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator::addToState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtErr) const { if (m_outputlevel <= 0) logStart("addToState(TP,LPAR,ERR)",trkPar); @@ -78,21 +78,21 @@ Trk::TrackParameters* Trk::KalmanUpdator::addToState (const Trk::TrackParameters return calculateFilterStep (trkPar, measmtPar, measmtErr,1,fitQoS, false); } // updator #3 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanUpdator::addToState (const Trk::TrackParameters& trkPar, - const Amg::Vector2D& measmtPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator::addToState (const Trk::TrackParameters& trkPar, + const Amg::Vector2D& measmtPos, const Amg::MatrixX& measmtErr, FitQualityOnSurface*& fitQoS) const { if (m_outputlevel <= 0) logStart("addToState(TP,LPOS,ERR,FQ)",trkPar); if (fitQoS) { ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to avoid mem leak!" ); return nullptr; - } + } return calculateFilterStep (trkPar, measmtPos, measmtErr, 1, fitQoS, true); - + } // updator #4 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanUpdator::addToState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator::addToState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtErr, FitQualityOnSurface*& fitQoS) const { @@ -100,14 +100,14 @@ Trk::TrackParameters* Trk::KalmanUpdator::addToState (const Trk::TrackParameters if (fitQoS) { ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to avoid mem leak!" ); return nullptr; - } + } return calculateFilterStep (trkPar, measmtPar, measmtErr, 1, fitQoS, true); - + } // inverse updator #1 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanUpdator::removeFromState (const Trk::TrackParameters& trkPar, - const Amg::Vector2D& measmtPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator::removeFromState (const Trk::TrackParameters& trkPar, + const Amg::Vector2D& measmtPos, const Amg::MatrixX& measmtErr) const { if (m_outputlevel<=0) logStart("removeFromState(TP,LPOS,ERR)",trkPar); FitQualityOnSurface* fitQoS = nullptr; @@ -115,7 +115,7 @@ Trk::TrackParameters* Trk::KalmanUpdator::removeFromState (const Trk::TrackParam } // inverse updator #2 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanUpdator::removeFromState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator::removeFromState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtErr) const { if (m_outputlevel) logStart("removeFromState(TP,LPAR,ERR)",trkPar); @@ -124,8 +124,8 @@ Trk::TrackParameters* Trk::KalmanUpdator::removeFromState (const Trk::TrackParam } // inverse updator #3 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanUpdator::removeFromState (const Trk::TrackParameters& trkPar, - const Amg::Vector2D& measmtPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator::removeFromState (const Trk::TrackParameters& trkPar, + const Amg::Vector2D& measmtPos, const Amg::MatrixX& measmtErr, FitQualityOnSurface*& fitQoS) const { if (m_outputlevel<=0) logStart("removeFromState(TP,LPOS,ERR,FQ)",trkPar); @@ -133,13 +133,13 @@ Trk::TrackParameters* Trk::KalmanUpdator::removeFromState (const Trk::TrackParam ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to" << " avoid mem leak!" ); return nullptr; - } + } return calculateFilterStep (trkPar, measmtPos, measmtErr, -1, fitQoS, true); - + } // inverse updator #4 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanUpdator::removeFromState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator::removeFromState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtErr, FitQualityOnSurface*& fitQoS) const { @@ -148,15 +148,17 @@ Trk::TrackParameters* Trk::KalmanUpdator::removeFromState (const Trk::TrackParam ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to" << " avoid mem leak!" ); return nullptr; - } + } return calculateFilterStep (trkPar, measmtPar, measmtErr, -1, fitQoS, true); - + } // state-to-state updator, trajectory combination - version without fitQuality -Trk::TrackParameters* Trk::KalmanUpdator::combineStates (const Trk::TrackParameters& one, - const Trk::TrackParameters& two) const { - // remember, either one OR two might have no error, but not both ! +std::unique_ptr<Trk::TrackParameters> +Trk::KalmanUpdator::combineStates(const Trk::TrackParameters& one, + const Trk::TrackParameters& two) const +{ + // remember, either one OR two might have no error, but not both ! if (!one.covariance() && !two.covariance()) { ATH_MSG_WARNING( "both parameters have no errors, invalid " << "use of Updator::combineStates()" ); @@ -166,24 +168,23 @@ Trk::TrackParameters* Trk::KalmanUpdator::combineStates (const Trk::TrackParamet if (!one.covariance()) { if (m_outputlevel<=0) logResult("combineStates(TP,TP)",two.parameters(), *two.covariance()); - return two.clone(); + return std::unique_ptr<Trk::TrackParameters>(two.clone()); } if (!two.covariance()) { if (m_outputlevel<=0) logResult("combineStates(TP,TP)",one.parameters(), *one.covariance()); - return one.clone(); + return std::unique_ptr<Trk::TrackParameters>(one.clone()); } - + // ... FIXME - TRT is so difficult, need to check that both parameters are in the same frame // otherwise go into frame of one ! - // ok, normal, let's combine using gain matrix formalism const AmgSymMatrix(5)& covTrkOne = (*one.covariance()); const AmgSymMatrix(5)& covTrkTwo = (*two.covariance()); - + AmgSymMatrix(5) sumCov = covTrkOne + covTrkTwo; AmgSymMatrix(5) K = covTrkOne * sumCov.inverse(); - + Amg::VectorX r = two.parameters() - one.parameters(); // catch [-pi,pi] phi boundary problems if (!diffThetaPhiWithinRange(r)) correctThetaPhiRange(r,sumCov,true); @@ -194,16 +195,23 @@ Trk::TrackParameters* Trk::KalmanUpdator::combineStates (const Trk::TrackParamet ATH_MSG_WARNING( "combineStates(TP,TP): could not combine angular values." ); return nullptr; } - + // return cloned version of Track Parameters (MeasuredPerigee, MeasuredAtA...) - TrackParameters* comb = one.associatedSurface().createTrackParameters(par[Trk::loc1],par[Trk::loc2], - par[Trk::phi],par[Trk::theta],par[Trk::qOverP],covPar); - if (m_outputlevel<=0) logResult("combineStates(TP,TP)", par, *covPar); + auto comb = + one.associatedSurface().createUniqueTrackParameters(par[Trk::loc1], + par[Trk::loc2], + par[Trk::phi], + par[Trk::theta], + par[Trk::qOverP], + covPar); + if (m_outputlevel <= 0){ + logResult("combineStates(TP,TP)", par, *covPar); + } return comb; } // state-to-state updator, trajectory combination - version with fitQuality -Trk::TrackParameters* Trk::KalmanUpdator::combineStates (const Trk::TrackParameters& one, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator::combineStates (const Trk::TrackParameters& one, const Trk::TrackParameters& two, FitQualityOnSurface*& fitQoS) const { // try if both Track Parameters are measured ones ? @@ -215,19 +223,19 @@ Trk::TrackParameters* Trk::KalmanUpdator::combineStates (const Trk::TrackParamet if (fitQoS) { ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to avoid mem leak!" ); return nullptr; - } + } // if only one of two has an error, return that one if (!one.covariance()) { fitQoS = new FitQualityOnSurface(0.f, 5); if (m_outputlevel<=0) logResult("combineStates(TP,TP,FQ)", one.parameters(), (*two.covariance())); - return two.clone(); + return std::unique_ptr<Trk::TrackParameters>(two.clone()); } if (!two.covariance()) { fitQoS = new FitQualityOnSurface(0.f, 5); if (m_outputlevel<=0) logResult("combineStates(TP,TP,FQ)", one.parameters(), (*one.covariance())); - return one.clone(); + return std::unique_ptr<Trk::TrackParameters>(one.clone()); } // covariance matrix for prediction and the state to be added @@ -251,23 +259,30 @@ Trk::TrackParameters* Trk::KalmanUpdator::combineStates (const Trk::TrackParamet // compute fit quality double chiSquared = r.transpose()*R_inv*r; fitQoS = new FitQualityOnSurface(chiSquared, 5); - + // return cloned version of Track Parameters (MeasuredPerigee, MeasuredAtA...) - TrackParameters* comb = one.associatedSurface().createTrackParameters(par[Trk::loc1],par[Trk::loc2], - par[Trk::phi],par[Trk::theta],par[Trk::qOverP],covPar); - if (m_outputlevel<=0) logResult("combineStates(TP,TP,FQ)", par, *covPar); + auto comb = + one.associatedSurface().createUniqueTrackParameters(par[Trk::loc1], + par[Trk::loc2], + par[Trk::phi], + par[Trk::theta], + par[Trk::qOverP], + covPar); + if (m_outputlevel <= 0){ + logResult("combineStates(TP,TP,FQ)", par, *covPar); + } return comb; - + } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdator::fullStateFitQuality (const Trk::TrackParameters& trkPar, const Amg::Vector2D& locPos, const Amg::MatrixX& rioErr) const { ATH_MSG_DEBUG( "--> entered KalmanUpdator::fullStateFitQuality(TP,LPOS,ERR)" ); - + // try if Track Parameters are measured ones ? if (!trkPar.covariance()) { ATH_MSG_ERROR( "updated smoother/trajectory has no error matrix" ); @@ -282,27 +297,27 @@ Trk::KalmanUpdator::fullStateFitQuality (const Trk::TrackParameters& trkPar, for (int iLocCoord=0; iLocCoord < nLocCoord; iLocCoord++) { rioPar[iLocCoord] = locPos[iLocCoord]; } - + // measurement Matrix ( n x m ) Amg::MatrixX H(rioErr.cols(),covTrk.cols()); H.setZero(); for (int i=0; i < nLocCoord; i++) H(i,i)=1.f; - + // residuals Amg::VectorX r = rioPar - H * trkPar.parameters(); - + // all the rest is outsourced to a common chi2 routine return makeChi2Object(r,covTrk,rioErr,-1,(nLocCoord==1?1:3)); } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdator::fullStateFitQuality (const Trk::TrackParameters& trkPar, const Trk::LocalParameters& rioPar, const Amg::MatrixX& rioErr) const { ATH_MSG_VERBOSE( "--> entered KalmanUpdator::fullStateFitQuality(TP,LPAR,ERR)" ); - + // try if Track Parameters are measured ones ? if (!trkPar.covariance()) { ATH_MSG_ERROR( "updated smoother/trajectory has no error matrix" ); @@ -315,7 +330,7 @@ Trk::KalmanUpdator::fullStateFitQuality (const Trk::TrackParameters& trkPar, // State to measurement dimensional reduction Matrix ( n x m ) const Amg::MatrixX& H(rioPar.expansionMatrix()); - + // residuals Amg::VectorX r = rioPar; if( rioPar.parameterKey()==31 ) r -= trkPar.parameters(); @@ -326,7 +341,7 @@ Trk::KalmanUpdator::fullStateFitQuality (const Trk::TrackParameters& trkPar, } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdator::predictedStateFitQuality (const Trk::TrackParameters& predPar, const Amg::Vector2D& rioLocPos, const Amg::MatrixX& rioLocErr) const { @@ -334,7 +349,7 @@ Trk::KalmanUpdator::predictedStateFitQuality (const Trk::TrackParameters& predPa // try if Track Parameters are measured ones ? if (predPar.covariance() == nullptr) { #if 0 - if (&predPar == nullptr) + if (&predPar == nullptr) ATH_MSG_WARNING( "input state is NULL in predictedStateFitQuality()" ); else #endif @@ -355,16 +370,16 @@ Trk::KalmanUpdator::predictedStateFitQuality (const Trk::TrackParameters& predPa Amg::MatrixX H(rioLocErr.cols(),covPred.cols()); H.setZero(); for (int i=0; i < nLocCoord; i++) H(i,i)=1.f; - + // residuals Amg::VectorX r = rioPar - H * predPar.parameters(); - + // all the rest is outsourced to a common chi2 routine return makeChi2Object(r,covPred,rioLocErr,+1,(nLocCoord==1?1:3)); } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdator::predictedStateFitQuality (const Trk::TrackParameters& predPar, const Trk::LocalParameters& rioPar, const Amg::MatrixX& rioErr) const { @@ -373,7 +388,7 @@ Trk::KalmanUpdator::predictedStateFitQuality (const Trk::TrackParameters& predPa // try if Track Parameters are measured ones ? if (predPar.covariance() == nullptr) { #if 0 - if (&predPar == nullptr) + if (&predPar == nullptr) ATH_MSG_WARNING( "input state is NULL in predictedStateFitQuality()" ); else #endif @@ -388,18 +403,18 @@ Trk::KalmanUpdator::predictedStateFitQuality (const Trk::TrackParameters& predPa // State to measurement dimensional reduction Matrix ( n x m ) const Amg::MatrixX& H(rioPar.expansionMatrix()); - + // residuals Amg::VectorX r = rioPar; if(rioPar.parameterKey()==31) r -= predPar.parameters(); else r -= H * predPar.parameters(); - + // all the rest is outsourced to a common chi2 routine return makeChi2Object(r,covPred,rioErr,+1,rioPar.parameterKey()); } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdator::predictedStateFitQuality (const Trk::TrackParameters& one, const Trk::TrackParameters& two) const { ATH_MSG_VERBOSE( "--> entered KalmanUpdator::predictedStateFitQuality(TP,TP)" ); @@ -415,7 +430,7 @@ Trk::KalmanUpdator::predictedStateFitQuality (const Trk::TrackParameters& one, << "assume initial state and return chi2=0.0" ); return new FitQualityOnSurface(0.f, 5); } - + // covariance matrix for prediction and the state to be added const AmgSymMatrix(5)& covTrkOne = (*one.covariance()); const AmgSymMatrix(5)& covTrkTwo = (*two.covariance()); @@ -434,20 +449,22 @@ std::vector<double> Trk::KalmanUpdator::initialErrors() const { } // mathematics for Kalman updator and inverse Kalman filter -Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackParameters& trkPar, - const Amg::Vector2D& locPos, - const Amg::MatrixX& covRio, - const int sign, - Trk::FitQualityOnSurface*& fitQoS, - bool createFQoS) const { +std::unique_ptr<Trk::TrackParameters> +Trk::KalmanUpdator::calculateFilterStep(const Trk::TrackParameters& trkPar, + const Amg::Vector2D& locPos, + const Amg::MatrixX& covRio, + const int sign, + Trk::FitQualityOnSurface*& fitQoS, + bool createFQoS) const +{ - // try if Track Parameters are measured ones ? + // try if Track Parameters are measured ones ? AmgSymMatrix(5) covTrk; if (!trkPar.covariance()) { if (sign<0) { ATH_MSG_WARNING( "MeasuredTrackParameters == Null, can not calculate updated parameter state" ); return nullptr; - } + } // no error given - use a huge error matrix for the time // covTrk = Amg::MatrixX(5, 1) * 1000.f; ATH_MSG_VERBOSE( "-U- no covTrk at input - assign large error matrix for the time being." ); @@ -456,7 +473,7 @@ Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackP covTrk(2,2) = m_cov0[2]; covTrk(3,3) = m_cov0[3]; covTrk(4,4) = m_cov0[4]; - + }else { covTrk = (*trkPar.covariance()); } @@ -469,7 +486,7 @@ Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackP << ": undefined phi,theta range in input parameters." ); return nullptr; } - + // measurement vector of RIO_OnTrack - needs more care for # local par? int nLocCoord = covRio.cols(); if ( (nLocCoord < 1) || (nLocCoord > 2 ) ) { @@ -486,10 +503,10 @@ Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackP Amg::MatrixX H(covRio.cols(),covTrk.cols()); H.setZero(); for (int i=0; i < nLocCoord; i++) H(i,i)=1.f; - + // residual from reconstructed hit wrt. predicted state Amg::VectorX r = rioPar - H * parTrk; - + // compute covariance on of residual R = +/- covRIO + H * covTrk * H.T() Amg::MatrixX R = (sign * covRio) + projection(covTrk,(nLocCoord==1 ? 1 : 3) ); // .similarity(H); // compute Kalman gain matrix @@ -521,7 +538,7 @@ Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackP (sign>0?"addToState(TP,LPOS,ERR,FQ)":"removeFromState(TP,LPOS,ERR,FQ)"): (sign>0?"addToState(TP,LPOS,ERR)":"removeFromState(TP,LPOS,ERR)"), par,*covPar); - + // if a pointer is given, compute chi2 if (createFQoS) { if (sign<0) { @@ -534,19 +551,25 @@ Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackP } } // return cloned version of Track Parameters (MeasuredPerigee, MeasuredAtA...) - TrackParameters* updated = trkPar.associatedSurface().createTrackParameters(par[Trk::loc1],par[Trk::loc2], - par[Trk::phi],par[Trk::theta],par[Trk::qOverP],covPar); + auto updated = + trkPar.associatedSurface().createUniqueTrackParameters(par[Trk::loc1], + par[Trk::loc2], + par[Trk::phi], + par[Trk::theta], + par[Trk::qOverP], + covPar); return updated; } - // mathematics for Kalman updator and inverse Kalman filter -Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackParameters& trkPar, - const Trk::LocalParameters& rioPar, - const Amg::MatrixX& covRio, - const int sign, - Trk::FitQualityOnSurface*& fitQoS, - bool createFQoS ) const { +std::unique_ptr<Trk::TrackParameters> +Trk::KalmanUpdator::calculateFilterStep(const Trk::TrackParameters& trkPar, + const Trk::LocalParameters& rioPar, + const Amg::MatrixX& covRio, + const int sign, + Trk::FitQualityOnSurface*& fitQoS, + bool createFQoS) const +{ // try if Track Parameters are measured ones ? AmgSymMatrix(5) covTrk; @@ -555,7 +578,7 @@ Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackP ATH_MSG_WARNING( "MeasuredTrackParameters == Null, can not calculate " << "updated parameter state." ); return nullptr; - } + } // no error given - use a huge error matrix for the time // covTrk = Amg::MatrixX(5, 1) * 1000.f; ATH_MSG_VERBOSE( "-U- no covTrk at input - " @@ -565,7 +588,7 @@ Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackP covTrk(2,2) = m_cov0[2]; covTrk(3,3) = m_cov0[3]; covTrk(4,4) = m_cov0[4]; - + } else { covTrk = (*trkPar.covariance()); } @@ -598,7 +621,7 @@ Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackP // catch [-pi,pi] phi boundary problems to keep chi2 under control if (!diffThetaPhiWithinRange(r,rioPar.parameterKey()) ) correctThetaPhiRange(r,R,true,rioPar.parameterKey()); - + // compute Kalman gain matrix if (R.determinant()==0.) return nullptr; Amg::MatrixX K = covTrk * H.transpose() * R.inverse(); @@ -608,7 +631,7 @@ Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackP if (m_outputlevel<0) {logGainForm (nLocCoord,r,R.inverse(),K,M);} // compute local filtered state Amg::VectorX par = parTrk + K * r; - + // compute covariance matrix of local filteres state AmgSymMatrix(5)* covPar; if (m_useFruehwirth8a) { @@ -639,9 +662,13 @@ Trk::TrackParameters* Trk::KalmanUpdator::calculateFilterStep (const Trk::TrackP } } // return cloned version of Track Parameters (MeasuredPerigee, MeasuredAtA...) - TrackParameters* updated = trkPar.associatedSurface().createTrackParameters(par[Trk::loc1],par[Trk::loc2], - par[Trk::phi],par[Trk::theta],par[Trk::qOverP],covPar); - return updated; + return trkPar.associatedSurface().createUniqueTrackParameters( + par[Trk::loc1], + par[Trk::loc2], + par[Trk::phi], + par[Trk::theta], + par[Trk::qOverP], + covPar); } Amg::MatrixX Trk::KalmanUpdator::projection(const Amg::MatrixX& M, const int key) const @@ -652,7 +679,7 @@ Amg::MatrixX Trk::KalmanUpdator::projection(const Amg::MatrixX& M, const int key const Amg::MatrixX& redMatrix = m_projectionMatrices.reductionMatrix(key); Amg::MatrixX R = redMatrix.transpose()*M*redMatrix; return R; - + } @@ -688,7 +715,7 @@ bool Trk::KalmanUpdator::correctThetaPhiRange(Amg::VectorX& V, AmgSymMatrix(5)& else if (key & 8) { // theta is within localParameter and a measured coordinate for (int itag = 0, ipos=1 ; itag<Trk::theta; ++itag, ipos*=2) if (key & ipos) ++jtheta; } - + // correct theta and phi coordinate if ((jtheta>=0) && (V[jtheta]<thetaMin || V[jtheta]> M_PI) ) { if (m_outputlevel <= 0 ) { @@ -732,7 +759,7 @@ bool Trk::KalmanUpdator::correctThetaPhiRange(Amg::VectorX& V, AmgSymMatrix(5)& C(2,jtheta) = -C(2,jtheta); if (key>15) C(4,jtheta) = -C(4,jtheta); } - + if (m_outputlevel <=0) { msg() << MSG::DEBUG << "-U- now use corrected " << (isDifference?"diff. ":" ") << "value phi= "; if (jphi>=0) msg() << V[jphi]; else msg() <<"free"; @@ -770,7 +797,7 @@ bool Trk::KalmanUpdator::correctThetaPhiRange(Amg::VectorX& V, Amg::MatrixX& C, else if (key & 8) { // theta is within localParameter and a measured coordinate for (int itag = 0, ipos=1 ; itag<Trk::theta; ++itag, ipos*=2) if (key & ipos) ++jtheta; } - + // correct theta and phi coordinate if ((jtheta>=0) && (V[jtheta]<thetaMin || V[jtheta]> M_PI) ) { if (m_outputlevel <= 0 ) { @@ -814,7 +841,7 @@ bool Trk::KalmanUpdator::correctThetaPhiRange(Amg::VectorX& V, Amg::MatrixX& C, C(2,jtheta) = -C(2,jtheta); if (key>15) C(4,jtheta) = -C(4,jtheta); } - + if (m_outputlevel <=0) { msg() << MSG::DEBUG << "-U- now use corrected " << (isDifference?"diff. ":" ") << "value phi= "; if (jphi>=0) msg() << V[jphi]; else msg() <<"free"; @@ -860,9 +887,9 @@ void Trk::KalmanUpdator::logInputCov(const Amg::MatrixX& covTrk, msg() << " covariance matrix " << " " << " " << std::setw(9)<<covTrk(2,2)<<" "<< std::setw(9)<<covTrk(2,3)<<" " << std::setw(9)<<covTrk(2,4)<< "\n" ; - msg() << " of the PREDICTED track pars " << " " << " " + msg() << " of the PREDICTED track pars " << " " << " " << std::setw(9)<<covTrk(3,3)<<" "<< std::setw(9)<<covTrk(3,4)<<"\n" ; - msg() << " " << " " << " " + msg() << " " << " " << " " << std::setw(9)<<covTrk(4,4)<<std::setprecision(6)<< endmsg; int nLocCoord = covRio.cols(); @@ -887,7 +914,7 @@ void Trk::KalmanUpdator::logGainForm(int nc, const Amg::VectorX& r, const Amg::M for (int i=0; i<nc; i++) msg() << MSG::VERBOSE // K is a row x col = 5 x nc matrix. << ( i==0 ? "-U- gain mtx K=(" : " (" ) << std::setiosflags(std::ios::fixed | std::ios::showpoint | std::ios::right ) - << std::setw(7) << std::setprecision(4) << K(0,i)<<", " + << std::setw(7) << std::setprecision(4) << K(0,i)<<", " << std::setw(7) << std::setprecision(4) << K(1,i)<<", " << std::setw(7) << std::setprecision(4) << K(2,i)<<", " << std::setw(7) << std::setprecision(4) << K(3,i)<<", " @@ -899,7 +926,7 @@ void Trk::KalmanUpdator::logGainForm(int nc, const Amg::VectorX& r, const Amg::M << M(4,4) <<")" << endmsg; } -void Trk::KalmanUpdator::logResult(const std::string& methodName, +void Trk::KalmanUpdator::logResult(const std::string& methodName, const Amg::VectorX& par, const Amg::MatrixX& covPar) const { // again some verbose debug output @@ -909,7 +936,7 @@ void Trk::KalmanUpdator::logResult(const std::string& methodName, << std::setw(10)<<par[2]<< std::setw(10)<<par[3]<<std::setprecision(4) << std::setw(10)<<par[4] <<endmsg; msg() << MSG::VERBOSE << "-U- new cov" <<std::setiosflags(std::ios::right)<<std::setprecision(3) - << std::setw(9)<<(covPar)(0,0)<<" "<< std::setw(9)<<(covPar)(0,1)<<" " + << std::setw(9)<<(covPar)(0,0)<<" "<< std::setw(9)<<(covPar)(0,1)<<" " << std::setw(9)<<(covPar)(0,2)<<" "<< std::setw(9)<<(covPar)(0,3) << " " << std::setw(9)<<(covPar)(0,4)<< "\n"; msg() << " " << " " << " " @@ -918,10 +945,10 @@ void Trk::KalmanUpdator::logResult(const std::string& methodName, msg() << " covariance matrix " << " " << " " << std::setw(9)<<(covPar)(2,2)<<" "<< std::setw(9)<<(covPar)(2,3)<<" " << std::setw(9)<<(covPar)(2,4)<< "\n"; - msg() << " of the UPDATED track pars " << " " + msg() << " of the UPDATED track pars " << " " << " " <<std::setw(9)<<(covPar)(3,3)<< " " << std::setw(9)<<(covPar)(3,4)<< "\n"; - msg() << " " << " " - << " " + msg() << " " << " " + << " " << std::setw(9)<<(covPar)(4,4)<<std::setprecision(6)<< endmsg; } diff --git a/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdatorAmg.cxx b/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdatorAmg.cxx index c2a47c4d4969bb5ba57e54a709883e3a11974399..090bc79666cdc542db91fb23c2b7ea1801a4dd5e 100755 --- a/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdatorAmg.cxx +++ b/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdatorAmg.cxx @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -65,7 +65,7 @@ StatusCode Trk::KalmanUpdatorAmg::initialize() ATH_MSG_INFO("Track state cov matrix will be calculated according to Gelb-1975 p305."); ATH_MSG_INFO("initialize() successful in " << name()); - + return StatusCode::SUCCESS; } @@ -77,18 +77,18 @@ StatusCode Trk::KalmanUpdatorAmg::finalize() } // updator #1 for Kalman Fitter - version with Amg::Vector2D (PrepRawData method) -Trk::TrackParameters* Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParameters& trkPar, - const Amg::Vector2D& measLocPos, - const Amg::MatrixX& measLocCov) const +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParameters& trkPar, + const Amg::Vector2D& measLocPos, + const Amg::MatrixX& measLocCov) const { if (msgLvl(MSG::VERBOSE)) {logStart("addToState(TP,LPOS,ERR)",trkPar.parameters());} FitQualityOnSurface* fitQoS = nullptr; const int updatingSign = 1; - + // get the Start covariance matrix const AmgSymMatrix(5)* trkCov = getStartCov(trkPar,updatingSign); if (!trkCov) return nullptr; - + int nLocCoord = measLocCov.cols(); if (nLocCoord == 1) { return calculateFilterStep_1D (trkPar,*trkCov, @@ -98,16 +98,16 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParamet return calculateFilterStep_T<2>(trkPar,*trkCov, measLocPos,measLocCov.block<2,2>(0,0),3, updatingSign,fitQoS,false); - } - + } + ATH_MSG_WARNING(" number (" << nLocCoord << ") of local coordinates must be 1 or 2, can not update!"); return nullptr; } // updator #2 for Kalman Fitter - version with LocalParameters (MeasurementBase method) -Trk::TrackParameters* Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, - const Amg::MatrixX& measmtCov) const + const Amg::MatrixX& measmtCov) const { if (msgLvl(MSG::VERBOSE)) {logStart("addToState(TP,LPAR,ERR)",trkPar.parameters());} FitQualityOnSurface* fitQoS = nullptr; @@ -115,8 +115,8 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParamet } // updator #3 for Kalman Fitter - version with Amg::Vector2D (PrepRawData method) -Trk::TrackParameters* Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParameters& trkPar, - const Amg::Vector2D& measLocPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParameters& trkPar, + const Amg::Vector2D& measLocPos, const Amg::MatrixX& measLocCov, FitQualityOnSurface*& fitQoS) const { @@ -125,7 +125,7 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParamet if (fitQoS) { ATH_MSG_WARNING("expect nil FitQuality pointer, refuse operation to avoid mem leak!"); return nullptr; - } + } // get the Start covariance matrix const AmgSymMatrix(5)* trkCov = getStartCov(trkPar,updatingSign); if (!trkCov) return nullptr; @@ -139,15 +139,15 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParamet return calculateFilterStep_T<2>(trkPar,*trkCov, measLocPos,measLocCov.block<2,2>(0,0),3, updatingSign,fitQoS,true); - } + } ATH_MSG_WARNING(" number (" << nLocCoord << ") of local coordinates must be 1 or 2, can not update!"); return nullptr; - - + + } // updator #4 for Kalman Fitter - version with LocalParameters (MeasurementBase method) -Trk::TrackParameters* Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtCov, FitQualityOnSurface*& fitQoS) const @@ -156,23 +156,23 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::addToState (const Trk::TrackParamet if (fitQoS) { ATH_MSG_WARNING("expect nil FitQuality pointer, refuse operation to avoid mem leak!"); return nullptr; - } + } return prepareFilterStep (trkPar, measmtPar, measmtCov, 1, fitQoS, true); - + } // inverse updator #1 for Kalman Fitter - version with Amg::Vector2D (PrepRawData method) -Trk::TrackParameters* Trk::KalmanUpdatorAmg::removeFromState (const Trk::TrackParameters& trkPar, - const Amg::Vector2D& measLocPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::removeFromState (const Trk::TrackParameters& trkPar, + const Amg::Vector2D& measLocPos, const Amg::MatrixX& measLocCov) const { if (msgLvl(MSG::VERBOSE)) {logStart("removeFromState(TP,LPOS,ERR)",trkPar.parameters());} FitQualityOnSurface* fitQoS = nullptr; const int updatingSign = -1; - + // get the Start covariance matrix const AmgSymMatrix(5)* trkCov = getStartCov(trkPar,updatingSign); if (!trkCov) return nullptr; - + if (msgLvl(MSG::VERBOSE)) {logInputCov(*trkCov,measLocPos,measLocCov);} int nLocCoord = measLocCov.cols(); @@ -184,14 +184,14 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::removeFromState (const Trk::TrackPa return calculateFilterStep_T<2>(trkPar,*trkCov, measLocPos,measLocCov.block<2,2>(0,0),3, updatingSign,fitQoS,false); - } + } ATH_MSG_WARNING(" number (" << nLocCoord << ") of local coordinates must be 1 or 2, can not un-update!"); return nullptr; - + } // inverse updator #2 for Kalman Fitter - version with LocalParameters (MeasurementBase method) -Trk::TrackParameters* Trk::KalmanUpdatorAmg::removeFromState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::removeFromState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtCov) const { if (msgLvl(MSG::DEBUG)) {logStart("removeFromState(TP,LPAR,ERR)",trkPar.parameters());} @@ -200,8 +200,8 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::removeFromState (const Trk::TrackPa } // inverse updator #3 for Kalman Fitter - version with Amg::Vector2D (PrepRawData method) -Trk::TrackParameters* Trk::KalmanUpdatorAmg::removeFromState (const Trk::TrackParameters& trkPar, - const Amg::Vector2D& measLocPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::removeFromState (const Trk::TrackParameters& trkPar, + const Amg::Vector2D& measLocPos, const Amg::MatrixX& measLocCov, FitQualityOnSurface*& fitQoS) const { const int updatingSign = -1; @@ -210,14 +210,14 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::removeFromState (const Trk::TrackPa ATH_MSG_WARNING("expect nil FitQuality pointer, refuse operation to" << " avoid mem leak!"); return nullptr; - } + } // get the Start covariance matrix const AmgSymMatrix(5)* trkCov = getStartCov(trkPar,updatingSign); - if (!trkCov) return nullptr; - + if (!trkCov) return nullptr; + if (msgLvl(MSG::VERBOSE)) {logInputCov(*trkCov,measLocPos,measLocCov);} - + int nLocCoord = measLocCov.cols(); if (nLocCoord == 1) { return calculateFilterStep_1D (trkPar,*trkCov, @@ -227,30 +227,30 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::removeFromState (const Trk::TrackPa return calculateFilterStep_T<2>(trkPar,*trkCov, measLocPos,measLocCov.block<2,2>(0,0),3, updatingSign,fitQoS,true); - } + } ATH_MSG_WARNING(" number (" << nLocCoord << ") of local coordinates must be 1 or 2, can not un-update!"); return nullptr; - - + + } // inverse updator #4 for Kalman Fitter - version with LocalParameters (MeasurementBase method) -Trk::TrackParameters* Trk::KalmanUpdatorAmg::removeFromState(const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::removeFromState(const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtCov, - FitQualityOnSurface*& fitQoS) const + FitQualityOnSurface*& fitQoS) const { if (msgLvl(MSG::VERBOSE)) logStart("removeFromState(TP,LPAR,ERR,FQ)",trkPar.parameters()); if (fitQoS) { ATH_MSG_WARNING("expect nil FitQuality pointer, refuse operation to avoid mem leak!"); return nullptr; - } + } return prepareFilterStep (trkPar, measmtPar, measmtCov, -1, fitQoS, true); - + } // state-to-state updator, trajectory combination - version without fitQuality -Trk::TrackParameters* Trk::KalmanUpdatorAmg::combineStates (const Trk::TrackParameters& one, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::combineStates (const Trk::TrackParameters& one, const Trk::TrackParameters& two) const { // try if both Track Parameters are measured ones ? const AmgSymMatrix(5)* covOne = one.covariance(); @@ -264,19 +264,19 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::combineStates (const Trk::TrackPara // if only one of two has an error, return that one if (!covOne) { if (msgLvl(MSG::VERBOSE)) logResult("combineStates(TP,TP)",two.parameters(),*covTwo); - return two.clone(); + return std::unique_ptr<Trk::TrackParameters>(two.clone()); } if (!covTwo) { if (msgLvl(MSG::VERBOSE)) logResult("combineStates(TP,TP)",one.parameters(),*covOne); - return one.clone(); + return std::unique_ptr<Trk::TrackParameters>(one.clone()); } - + FitQualityOnSurface* fitQoS = nullptr; return calculateFilterStep_5D(one,*covOne,two.parameters(),*covTwo,+1,fitQoS,false); } // state-to-state updator, trajectory combination - version with fitQuality -Trk::TrackParameters* Trk::KalmanUpdatorAmg::combineStates (const Trk::TrackParameters& one, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::combineStates (const Trk::TrackParameters& one, const Trk::TrackParameters& two, FitQualityOnSurface*& fitQoS) const { // try if both Track Parameters are measured ones ? @@ -295,23 +295,23 @@ Trk::TrackParameters* Trk::KalmanUpdatorAmg::combineStates (const Trk::TrackPara // if only one of two has an error, return that one if (!covOne) { if (msgLvl(MSG::VERBOSE)) logResult("combineStates(TP,TP)",two.parameters(),*covTwo); - return two.clone(); + return std::unique_ptr<Trk::TrackParameters>(two.clone()); } if (!covTwo) { if (msgLvl(MSG::VERBOSE)) logResult("combineStates(TP,TP)",one.parameters(),*covOne); - return one.clone(); + return std::unique_ptr<Trk::TrackParameters>(one.clone()); } return calculateFilterStep_5D(one,(*covOne),two.parameters(),(*covTwo),+1,fitQoS,true); } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorAmg::stateFitQuality (const Trk::TrackParameters& trkPar, const Amg::Vector2D& rioLocPos, const Amg::MatrixX& rioCov, - int fullPred) const + int fullPred) const { - + // try if Track Parameters are measured ones ? if (!trkPar.covariance()) { ATH_MSG_ERROR("updated track state has no error matrix, return 0."); @@ -325,18 +325,18 @@ Trk::KalmanUpdatorAmg::stateFitQuality (const Trk::TrackParameters& trkPar, } if (nLocCoord == 2) { return makeChi2_T<2>(trkPar.parameters(),(*trkPar.covariance()), rioLocPos,rioCov.block<2,2>(0,0), 3,fullPred); - } + } ATH_MSG_WARNING("Error in local position - must be 1D or 2D!"); return nullptr; - + } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorAmg::predictedStateFitQuality (const Trk::TrackParameters& predPar, const Amg::Vector2D& rioLocPos, - const Amg::MatrixX& rioCov) const + const Amg::MatrixX& rioCov) const { ATH_MSG_VERBOSE("--> entered KalmanUpdatorAmg::predictedStateFitQuality(TP,LPOS,ERR)"); // ATH_MSG_VERBOSE("LPOS: "<<rioLocPos << " cov:"<<rioCov); @@ -344,10 +344,10 @@ Trk::KalmanUpdatorAmg::predictedStateFitQuality (const Trk::TrackParameters& pre } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorAmg::fullStateFitQuality (const Trk::TrackParameters& trkPar, const Amg::Vector2D& rioLocPos, - const Amg::MatrixX& rioCov) const + const Amg::MatrixX& rioCov) const { ATH_MSG_VERBOSE("--> entered KalmanUpdatorAmg::fullStateFitQuality(TP,LPOS,ERR)"); return stateFitQuality(trkPar, rioLocPos,rioCov, 1); @@ -355,13 +355,13 @@ Trk::KalmanUpdatorAmg::fullStateFitQuality (const Trk::TrackParameters& trkPar, // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorAmg::stateFitQuality (const Trk::TrackParameters& trkPar, const Trk::LocalParameters& parRio, const Amg::MatrixX& rioCov, - int fullPred) const + int fullPred) const { - + // try if Track Parameters are measured ones ? if (!trkPar.covariance()) { ATH_MSG_ERROR("updated track state has no error matrix, return 0."); @@ -372,7 +372,7 @@ Trk::KalmanUpdatorAmg::stateFitQuality (const Trk::TrackParameters& trkPar, if (nLocCoord == 1) { return makeChi2_1D(trkPar.parameters(),(*trkPar.covariance()), parRio(0),rioCov(0,0),parRio.parameterKey(),fullPred); - } + } if (nLocCoord == 2) { return makeChi2_T<2>(trkPar.parameters(),(*trkPar.covariance()), parRio.block<2,1>(0,0),rioCov.block<2,2>(0,0), parRio.parameterKey(),fullPred); @@ -384,7 +384,7 @@ Trk::KalmanUpdatorAmg::stateFitQuality (const Trk::TrackParameters& trkPar, if (nLocCoord == 4) { return makeChi2_T<4>(trkPar.parameters(),(*trkPar.covariance()), parRio.block<4,1>(0,0),rioCov.block<4,4>(0,0), parRio.parameterKey(),fullPred); - } + } if (nLocCoord == 5) { return makeChi2_T<5>(trkPar.parameters(),(*trkPar.covariance()), parRio.block<5,1>(0,0),rioCov.block<5,5>(0,0), parRio.parameterKey(),fullPred); @@ -397,12 +397,12 @@ Trk::KalmanUpdatorAmg::stateFitQuality (const Trk::TrackParameters& trkPar, // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorAmg::fullStateFitQuality (const Trk::TrackParameters& trkPar, const Trk::LocalParameters& parRio, - const Amg::MatrixX& rioCov) const + const Amg::MatrixX& rioCov) const { - + ATH_MSG_VERBOSE("--> entered KalmanUpdatorAmg::fullStateFitQuality(TP,LPAR,ERR)"); return stateFitQuality(trkPar,parRio,rioCov,-1); } @@ -410,7 +410,7 @@ Trk::KalmanUpdatorAmg::fullStateFitQuality (const Trk::TrackParameters& trkPar, // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorAmg::predictedStateFitQuality (const Trk::TrackParameters& predPar, const Trk::LocalParameters& parRio, const Amg::MatrixX& rioCov) const @@ -420,9 +420,9 @@ Trk::KalmanUpdatorAmg::predictedStateFitQuality (const Trk::TrackParameters& pre } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorAmg::predictedStateFitQuality (const Trk::TrackParameters& trkParOne, - const Trk::TrackParameters& trkParTwo) const + const Trk::TrackParameters& trkParTwo) const { ATH_MSG_VERBOSE("--> entered KalmanUpdatorAmg::predictedStateFitQuality(TP,TP)"); // try if both Track Parameters are measured ones ? @@ -449,7 +449,7 @@ std::vector<double> Trk::KalmanUpdatorAmg::initialErrors() const { } // analyse dimension of localParameters to call appropriate fast-access mathematics -Trk::TrackParameters* Trk::KalmanUpdatorAmg::prepareFilterStep (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::prepareFilterStep (const Trk::TrackParameters& trkPar, const Trk::LocalParameters& parRio, const Amg::MatrixX& rioCov, const int sign, @@ -523,19 +523,19 @@ std::pair<AmgVector(5), AmgSymMatrix(5)>* Trk::KalmanUpdatorAmg::updateParameter // calculations for Kalman updator and inverse Kalman filter -Trk::TrackParameters* +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::calculateFilterStep_1D (const TrackParameters& TP, const AmgSymMatrix(5)& trkCov, double measPar, double measCov, int paramKey, int sign, Trk::FitQualityOnSurface*& fitQoS, - bool createFQoS ) const + bool createFQoS ) const { - + // use measuring coordinate (variable "mk") instead of reduction matrix ATH_MSG_DEBUG("--> entered KalmanUpdatorAmg::calculateFilterStep_1D "); int mk=0; if (paramKey!=1) for (int i=0; i<5; ++i) if (paramKey & (1<<i)) { mk=i; break; } - // get the parameters from the + // get the parameters from the const AmgVector(5)& trkPar = TP.parameters(); // use measuring coordinate (variable "mk") instead of reduction matrix double r = measPar - trkPar(mk); @@ -560,7 +560,7 @@ Trk::KalmanUpdatorAmg::calculateFilterStep_1D (const TrackParameters& TP, const newPar = trkPar + dampedCov * R * r; K(Trk::theta,0) = K(Trk::theta,0)*m_thetaGainDampingValue; ATH_MSG_DEBUG("-U- damped gain mtx K = " << Amg::toString(K)); - } else + } else ATH_MSG_DEBUG("-U- theta out of range but can not damp this update."); } // --- compute covariance matrix of local filteres state @@ -587,7 +587,7 @@ Trk::KalmanUpdatorAmg::calculateFilterStep_1D (const TrackParameters& TP, const if (createFQoS) { double predictedResidual = (sign<0) ? r : (measPar - newPar(mk)) ; - const AmgSymMatrix(5)& updatedCov = (sign<0) ? + const AmgSymMatrix(5)& updatedCov = (sign<0) ? trkCov : // when removing, the input are updated par newCov ; // when adding, chi2 is made from upd. par @@ -680,7 +680,7 @@ Trk::KalmanUpdatorAmg::calculateFilterStep_1D(const AmgVector(5)& trkPar, const return new std::pair<AmgVector(5), AmgSymMatrix(5)>(std::make_pair(newPar,newCov)); } -Trk::TrackParameters* +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::calculateFilterStep_5D(const TrackParameters& TP, const AmgSymMatrix(5)& trkCov, const AmgVector(5)& measPar, const AmgSymMatrix(5)& measCov, int sign, @@ -691,10 +691,10 @@ Trk::KalmanUpdatorAmg::calculateFilterStep_5D(const TrackParameters& TP, const A // get the parameter vector const AmgVector(5)& trkPar = TP.parameters(); // Kalman gain K, residual r, combined covariance R - AmgMatrix(5,5) K; AmgMatrix(5,5) M; - AmgVector(5) r; AmgSymMatrix(5) R; - - // same stuff without reduction + AmgMatrix(5,5) K; AmgMatrix(5,5) M; + AmgVector(5) r; AmgSymMatrix(5) R; + + // same stuff without reduction r = measPar - trkPar; // for full safety in Eigen see http://eigen.tuxfamily.org/dox/classEigen_1_1FullPivLU.html @@ -724,7 +724,7 @@ Trk::KalmanUpdatorAmg::calculateFilterStep_5D(const TrackParameters& TP, const A fQ = new FitQualityOnSurface(chiSquared, 5); } return convertToClonedTrackPars(TP,newPar,newCov,sign,createFQoS,"2D"); - + } std::pair<AmgVector(5), AmgSymMatrix(5)>* @@ -737,7 +737,7 @@ Trk::KalmanUpdatorAmg::calculateFilterStep_5D(const AmgVector(5)& trkPar, const // Kalman gain K, residual r, combined covariance R AmgMatrix(5,5) K; AmgMatrix(5,5) M; AmgVector(5) r; AmgSymMatrix(5) R; - // same stuff without reduction + // same stuff without reduction r = measPar - trkPar; R = (sign * measCov + trkCov).inverse(); K = trkCov * R; @@ -771,9 +771,9 @@ Trk::FitQualityOnSurface* Trk::KalmanUpdatorAmg::makeChi2_1D(const AmgVector(5)& const AmgSymMatrix(5)& trkCov, double valRio, double rioCov, int paramKey, int sign) const -{ +{ int mk=0; - if (paramKey!=1) for (int i=0; i<5; ++i) if (paramKey & (1<<i)) { mk=i; break; } + if (paramKey!=1) for (int i=0; i<5; ++i) if (paramKey & (1<<i)) { mk=i; break; } // sign: -1 = updated, +1 = predicted parameters. double r = valRio - trkPar(mk); // if (mk==3) catchPiPi; @@ -781,55 +781,56 @@ Trk::FitQualityOnSurface* Trk::KalmanUpdatorAmg::makeChi2_1D(const AmgVector(5)& if (chiSquared == 0.0) { ATH_MSG_DEBUG( "inversion of the error-on-the-residual failed for 1D measurement, set chi2 to zero."); return nullptr; - } + } chiSquared = r*r/chiSquared; - + return new FitQualityOnSurface(chiSquared, 1); } -Trk::TrackParameters* +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorAmg::convertToClonedTrackPars(const Trk::TrackParameters& TP, const AmgVector(5)& par, const AmgSymMatrix(5)& covPar, int sign, bool createFQoS, - std::string_view ndtext) const + std::string_view ndtext) const { - - Trk::TrackParameters* resultPar = - TP.associatedSurface().createTrackParameters(par[0],par[1],par[2],par[3],par[4],new AmgSymMatrix(5)(covPar)); + + std::unique_ptr<Trk::TrackParameters> resultPar = + TP.associatedSurface().createUniqueTrackParameters( + par[0], par[1], par[2], par[3], par[4], new AmgSymMatrix(5)(covPar)); // screen output if (msgLvl(MSG::VERBOSE) && resultPar) { char reportCalledInterface[80]; char ndtext2[5]; memset(ndtext2, '\0', 5 ); ndtext.copy(ndtext2,2); // convert char to string - if (sign>0) + if (sign>0) sprintf(reportCalledInterface,"%s-%s,%s)", (ndtext=="5D"?"combineStates(TP,TP":"addToState(TP,Meas"), ndtext2,(createFQoS?"Err,FQ":"Err")); - else + else sprintf(reportCalledInterface,"%s,Meas-%s,%s)","removeFromState(TP,", ndtext2,(createFQoS?"Err,FQ":"Err")); logResult((std::string)reportCalledInterface, resultPar->parameters(),covPar); } - + return resultPar; } const AmgSymMatrix(5)* Trk::KalmanUpdatorAmg::getStartCov(const Trk::TrackParameters& inputParameters, const int isign) const { - + const AmgSymMatrix(5)* covariance = inputParameters.covariance(); if (!covariance) { if (isign<0) { ATH_MSG_WARNING ("-U- no trkCov in fit iteration, can not calculate updated parameter state."); return nullptr; - } + } // no error given - use a huge error matrix for the time ATH_MSG_VERBOSE ("-U- no trkCov at input - assign large error matrix for the time being."); return m_covariance0; - + } return covariance; } @@ -848,7 +849,7 @@ bool Trk::KalmanUpdatorAmg::correctThetaPhiRange_5D(AmgVector(5)& V,AmgSymMatrix const KalmanUpdatorAmg::RangeCheckDef rcd) const { static const AmgVector(2) thetaMin(0.0, -M_PI); - + // correct theta coordinate if ( V(Trk::theta)<thetaMin((int)rcd) || V(Trk::theta)> M_PI ) { ATH_MSG_DEBUG ("-U- theta angle out of range: theta= "<<V(Trk::theta)<<", phi= "<<V(Trk::phi)); @@ -885,7 +886,7 @@ bool Trk::KalmanUpdatorAmg::correctThetaPhiRange_5D(AmgVector(5)& V,AmgSymMatrix V(Trk::phi) = fmod(V(Trk::phi)-M_PI,2*M_PI)+M_PI; ATH_MSG_DEBUG(" out of range, now "<< "corrected to " << V(Trk::phi)); } - + return true; } diff --git a/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdatorSMatrix.cxx b/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdatorSMatrix.cxx index edb56ba9e4e39560fbd64a9193d84e0188b0fe9c..27acf82508515ff8ce98a64fc01ea6fdcc9a5574 100755 --- a/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdatorSMatrix.cxx +++ b/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanUpdatorSMatrix.cxx @@ -75,8 +75,8 @@ StatusCode Trk::KalmanUpdatorSMatrix::finalize() } // updator #1 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackParameters& inputTrkPar, - const Amg::Vector2D& measLocPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackParameters& inputTrkPar, + const Amg::Vector2D& measLocPos, const Amg::MatrixX& measLocCov) const { if (msgLvl(MSG::VERBOSE)) logStart("addToState(TP,LPOS,ERR)",inputTrkPar); FitQualityOnSurface* fitQoS = nullptr; @@ -84,8 +84,8 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackPar SCovMatrix5 covTrk; if (!getStartCov(covTrk,inputTrkPar,updatingSign)) return nullptr; - - + + int nLocCoord = measLocCov.cols(); if (nLocCoord == 1) { return calculateFilterStep_1D (inputTrkPar, // transmit the surface @@ -98,14 +98,14 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackPar SParVector2(measLocPos[0],measLocPos[1]),3, measLocCov, updatingSign,fitQoS,false); - } - ATH_MSG_WARNING( " number (" << nLocCoord << ") of local coordinates must be 1 or 2, can not update!" ); + } + ATH_MSG_WARNING( " number (" << nLocCoord << ") of local coordinates must be 1 or 2, can not update!" ); return nullptr; - + } // updator #2 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtCov) const { if (msgLvl(MSG::VERBOSE)) logStart("addToState(TP,LPAR,ERR)",trkPar); @@ -114,8 +114,8 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackPar } // updator #3 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackParameters& inputTP, - const Amg::Vector2D& measLocPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackParameters& inputTP, + const Amg::Vector2D& measLocPos, const Amg::MatrixX& measLocCov, FitQualityOnSurface*& fitQoS) const { const int updatingSign = 1; @@ -123,11 +123,11 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackPar if (fitQoS) { ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to avoid mem leak!"); return nullptr; - } + } SCovMatrix5 covTrk; if (!getStartCov(covTrk,inputTP,updatingSign)) return nullptr; - + int nLocCoord = measLocCov.cols(); if (nLocCoord == 1) { return calculateFilterStep_1D (inputTP, @@ -140,15 +140,15 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackPar SParVector2(measLocPos[0],measLocPos[1]),3, measLocCov, updatingSign,fitQoS,true); - } - ATH_MSG_WARNING( " number (" << nLocCoord << ") of local coordinates must be 1 or 2, can not update!" ); + } + ATH_MSG_WARNING( " number (" << nLocCoord << ") of local coordinates must be 1 or 2, can not update!" ); return nullptr; - - + + } // updator #4 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtCov, FitQualityOnSurface*& fitQoS) const { @@ -157,14 +157,14 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::addToState (const Trk::TrackPar ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to" << " avoid mem leak!" ); return nullptr; - } + } return prepareFilterStep (trkPar, measmtPar, measmtCov, 1, fitQoS, true); - + } // inverse updator #1 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::TrackParameters& inputTP, - const Amg::Vector2D& measLocPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::TrackParameters& inputTP, + const Amg::Vector2D& measLocPos, const Amg::MatrixX& measLocCov) const { if (msgLvl(MSG::VERBOSE)) logStart("removeFromState(TP,LPOS,ERR)",inputTP); FitQualityOnSurface* fitQoS = nullptr; @@ -184,15 +184,15 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::Tra SParVector2(measLocPos[0],measLocPos[1]),3, measLocCov, updatingSign,fitQoS,false); - } + } ATH_MSG_WARNING( " number (" << nLocCoord << ") of local coordinates " - << "must be 1 or 2, can not un-update!" ); + << "must be 1 or 2, can not un-update!" ); return nullptr; - + } // inverse updator #2 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtCov) const { if (msgLvl(MSG::DEBUG)) logStart("removeFromState(TP,LPAR,ERR)",trkPar); @@ -201,8 +201,8 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::Tra } // inverse updator #3 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::TrackParameters& inputTP, - const Amg::Vector2D& measLocPos, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::TrackParameters& inputTP, + const Amg::Vector2D& measLocPos, const Amg::MatrixX& measLocCov, FitQualityOnSurface*& fitQoS) const { const int updatingSign = -1; @@ -211,11 +211,11 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::Tra msg(MSG::WARNING) << "expect nil FitQuality pointer, refuse operation to" << " avoid mem leak!" << endmsg; return nullptr; - } + } SCovMatrix5 covTrk; - + if (!getStartCov(covTrk,inputTP,updatingSign)) return nullptr; - + int nLocCoord = measLocCov.cols(); if (nLocCoord == 1) { return calculateFilterStep_1D (inputTP, @@ -228,16 +228,16 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::Tra SParVector2(measLocPos[0],measLocPos[1]),3, measLocCov, updatingSign,fitQoS,true); - } + } ATH_MSG_WARNING( " number (" << nLocCoord << ") of local coordinates" << " must be 1 or 2, can not un-update!" ); return nullptr; - - + + } // inverse updator #4 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtCov, FitQualityOnSurface*& fitQoS) const { @@ -245,13 +245,13 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::removeFromState (const Trk::Tra if (fitQoS) { ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to avoid mem leak!" ); return nullptr; - } + } return prepareFilterStep (trkPar, measmtPar, measmtCov, -1, fitQoS, true); - + } // state-to-state updator, trajectory combination - version without fitQuality -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::combineStates (const Trk::TrackParameters& one, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::combineStates (const Trk::TrackParameters& one, const Trk::TrackParameters& two) const { // try if both Track Parameters are measured ones ? const AmgSymMatrix(5)* covOne = one.covariance(); @@ -265,16 +265,16 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::combineStates (const Trk::Track // if only one of two has an error, return that one if (!covOne) { if (msgLvl(MSG::VERBOSE)) logResult("combineStates(TP,TP)",two.parameters(),*covTwo); - return two.clone(); + return std::unique_ptr<Trk::TrackParameters>(two.clone()); } if (!covTwo) { if (msgLvl(MSG::VERBOSE)) logResult("combineStates(TP,TP)",one.parameters(),*covOne); - return one.clone(); + return std::unique_ptr<Trk::TrackParameters>(one.clone()); } - + // ... FIXME - TRT is so difficult, need to check that both parameters are in the same frame // otherwise go into frame of one ! - + // call 5dim updator to combine using gain matrix formalism SCovMatrix5 covOneSM; for (int i=0; i<5; ++i) @@ -290,7 +290,7 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::combineStates (const Trk::Track } // state-to-state updator, trajectory combination - version with fitQuality -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::combineStates (const Trk::TrackParameters& one, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::combineStates (const Trk::TrackParameters& one, const Trk::TrackParameters& two, FitQualityOnSurface*& fitQoS) const { // try if both Track Parameters are measured ones ? @@ -302,29 +302,29 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::combineStates (const Trk::Track ATH_MSG_WARNING( "both parameters have no errors, invalid use of Updator::combineStates()" ); return nullptr; } - + if (fitQoS) { ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to avoid mem leak!"); return nullptr; } - + // if only one of two has an error, return that one if (!covOne) { if (msgLvl(MSG::VERBOSE)) logResult("combineStates(TP,TP)",two.parameters(),*covTwo); - return two.clone(); + return std::unique_ptr<Trk::TrackParameters>(two.clone()); } if (!covTwo) { if (msgLvl(MSG::VERBOSE)) logResult("combineStates(TP,TP)",one.parameters(),*covOne); - return one.clone(); + return std::unique_ptr<Trk::TrackParameters>(one.clone()); } - + // call 5dim updator to combine using gain matrix formalism SCovMatrix5 covOneSM; for (int i=0; i<5; ++i) for (int j=0; j<=i; ++j) { covOneSM(j,i) = (*covOne)(j,i); } - + return calculateFilterStep_5D(one,SParVector5(&one.parameters()[0],5),covOneSM, SParVector5(&two.parameters()[0],5), (*covTwo), @@ -333,7 +333,7 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::combineStates (const Trk::Track // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorSMatrix::fullStateFitQuality (const Trk::TrackParameters& trkPar, const Amg::Vector2D& locPos, const Amg::MatrixX& covRio) const { @@ -359,20 +359,20 @@ Trk::KalmanUpdatorSMatrix::fullStateFitQuality (const Trk::TrackParameters& trkP (*trkPar.covariance()), SParVector2(locPos[Trk::locX],locPos[Trk::locY]), SmeasCov, 2,-1); - } + } ATH_MSG_WARNING( "Error in local position - must be 1D or 2D!" ); return nullptr; - + } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorSMatrix::fullStateFitQuality (const Trk::TrackParameters& trkPar, const Trk::LocalParameters& parRio, const Amg::MatrixX& covRio) const { ATH_MSG_VERBOSE( "--> entered KalmanUpdatorSMatrix::fullStateFitQuality(TP,LPAR,ERR)" ); - + // try if Track Parameters are measured ones ? if (!trkPar.covariance()) { ATH_MSG_ERROR( "updated track state has no error matrix" ); @@ -413,19 +413,19 @@ Trk::KalmanUpdatorSMatrix::fullStateFitQuality (const Trk::TrackParameters& trkP // State to measurement dimensional reduction Matrix ( n x m ) const Amg::MatrixX& H = parRio.expansionMatrix(); - + // residuals Amg::VectorX r; if (parRio.parameterKey()==31) r = (parRio - trkPar.parameters()); else r = (parRio - H*trkPar.parameters()); - + // all the rest is outsourced to a common chi2 routine return makeChi2Object(r,(*trkPar.covariance()),covRio,H,-1); - + } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorSMatrix::predictedStateFitQuality (const Trk::TrackParameters& predPar, const Amg::Vector2D& rioLocPos, const Amg::MatrixX& covRio) const { @@ -433,7 +433,7 @@ Trk::KalmanUpdatorSMatrix::predictedStateFitQuality (const Trk::TrackParameters& // try if Track Parameters are measured ones ? if (!predPar.covariance()) { #if 0 - if (&predPar == nullptr) + if (&predPar == nullptr) ATH_MSG_WARNING( "input state is NULL in predictedStateFitQuality()" ); else #endif @@ -456,14 +456,14 @@ Trk::KalmanUpdatorSMatrix::predictedStateFitQuality (const Trk::TrackParameters& (*predPar.covariance()), SParVector2(rioLocPos[Trk::locX],rioLocPos[Trk::locY]), SmeasCov, 2,+1); - } + } ATH_MSG_WARNING( "Error in local position - must be 1D or 2D!" ); return nullptr; - + } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorSMatrix::predictedStateFitQuality (const Trk::TrackParameters& predPar, const Trk::LocalParameters& parRio, const Amg::MatrixX& covRio) const { @@ -472,7 +472,7 @@ Trk::KalmanUpdatorSMatrix::predictedStateFitQuality (const Trk::TrackParameters& // try if Track Parameters are measured ones ? if (!predPar.covariance()) { #if 0 - if (&predPar == nullptr) + if (&predPar == nullptr) ATH_MSG_WARNING( "input state is NULL in predictedStateFitQuality()" ); else #endif @@ -514,20 +514,20 @@ Trk::KalmanUpdatorSMatrix::predictedStateFitQuality (const Trk::TrackParameters& // State to measurement dimensional reduction Matrix ( n x m ) const Amg::MatrixX& H = parRio.expansionMatrix(); - + // residuals Amg::VectorX r; if (parRio.parameterKey()==31) r = parRio - predPar.parameters(); else r = parRio - H * predPar.parameters(); - + // all the rest is outsourced to a common chi2 routine return makeChi2Object(r,(*predPar.covariance()), covRio,H,+1); - + } // estimator for FitQuality on Surface (allows for setting of LR for straws) -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdatorSMatrix::predictedStateFitQuality (const Trk::TrackParameters& trkParOne, const Trk::TrackParameters& trkParTwo) const { ATH_MSG_VERBOSE("--> entered KalmanUpdatorSMatrix::predictedStateFitQuality(TP,TP)"); @@ -557,7 +557,7 @@ std::vector<double> Trk::KalmanUpdatorSMatrix::initialErrors() const { } // analyse dimension of localParameters to call appropriate fast-access mathematics -Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::prepareFilterStep (const Trk::TrackParameters& inputTrkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::prepareFilterStep (const Trk::TrackParameters& inputTrkPar, const Trk::LocalParameters& parRio, const Amg::MatrixX& covRio, const int sign, @@ -598,7 +598,7 @@ Trk::TrackParameters* Trk::KalmanUpdatorSMatrix::prepareFilterStep (const Trk::T } // calculations for Kalman updator and inverse Kalman filter -Trk::TrackParameters* +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::calculateFilterStep_1D (const TrackParameters& TP, const SParVector5& trkPar, const SCovMatrix5& trkCov, @@ -627,7 +627,7 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_1D (const TrackParameters& TP, ATH_MSG_VERBOSE( "-U- inv. sigmaR = " << R); ATH_MSG_VERBOSE( "-U- gain mtx K=(" <<std::setiosflags(std::ios::fixed | std::ios::showpoint | std::ios::right) - << std::setw(7) << std::setprecision(4) << K(0,0)<<", " + << std::setw(7) << std::setprecision(4) << K(0,0)<<", " << std::setw(7) << std::setprecision(4) << K(1,0)<<", " << std::setw(7) << std::setprecision(4) << K(2,0)<<", " << std::setw(7) << std::setprecision(4) << K(3,0)<<", " @@ -648,7 +648,7 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_1D (const TrackParameters& TP, K(Trk::theta,0) = K(Trk::theta,0)*m_thetaGainDampingValue; ATH_MSG_DEBUG( "-U- damped gain K=(" <<std::setiosflags(std::ios::fixed | std::ios::showpoint | std::ios::right) - << std::setw(7) << std::setprecision(4) << K(0,0)<<", " + << std::setw(7) << std::setprecision(4) << K(0,0)<<", " << std::setw(7) << std::setprecision(4) << K(1,0)<<", " << std::setw(7) << std::setprecision(4) << K(2,0)<<", " << std::setw(7) << std::setprecision(4) << K(3,0)<<", " @@ -710,7 +710,7 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_1D (const TrackParameters& TP, } // calculations for Kalman updator and inverse Kalman filter -Trk::TrackParameters* +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::calculateFilterStep_2D (const TrackParameters& TP, const SParVector5& trkPar, const SCovMatrix5& trkCov, @@ -742,12 +742,12 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_2D (const TrackParameters& TP, } // --- compute Kalman gain matrix - ROOT::Math::SMatrix<double,5,2,ROOT::Math::MatRepStd<double, 5, 2> > + ROOT::Math::SMatrix<double,5,2,ROOT::Math::MatRepStd<double, 5, 2> > K = trkCov * ROOT::Math::Transpose(H) * R; if (msgLvl(MSG::VERBOSE)) { - SParVector5 trans_r; SCovMatrix5 trans_R; SGenMatrix5 trans_K; + SParVector5 trans_r; SCovMatrix5 trans_R; SGenMatrix5 trans_K; logGainForm (2, trans_r.Place_at(r,0), - trans_R.Place_at(R,0,0), + trans_R.Place_at(R,0,0), trans_K.Place_at(K,0,0)); } @@ -764,7 +764,7 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_2D (const TrackParameters& TP, if (msgLvl(MSG::DEBUG)) { msg(MSG::DEBUG) << "-U- damped gain K0=(" <<std::setiosflags(std::ios::fixed | std::ios::showpoint | std::ios::right) - << std::setw(7) << std::setprecision(4) << K(0,0)<<", " + << std::setw(7) << std::setprecision(4) << K(0,0)<<", " << std::setw(7) << std::setprecision(4) << K(1,0)<<", " << std::setw(7) << std::setprecision(4) << K(2,0)<<", " << std::setw(7) << std::setprecision(4) << K(3,0)<<", " @@ -772,7 +772,7 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_2D (const TrackParameters& TP, << std::resetiosflags(std::ios::fixed) << endmsg; msg(MSG::DEBUG) << "-U- K1=(" <<std::setiosflags(std::ios::fixed | std::ios::showpoint | std::ios::right) - << std::setw(7) << std::setprecision(4) << K(0,1)<<", " + << std::setw(7) << std::setprecision(4) << K(0,1)<<", " << std::setw(7) << std::setprecision(4) << K(1,1)<<", " << std::setw(7) << std::setprecision(4) << K(2,1)<<", " << std::setw(7) << std::setprecision(4) << K(3,1)<<", " @@ -820,7 +820,7 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_2D (const TrackParameters& TP, } // calculations for Kalman updator and inverse Kalman filter -Trk::TrackParameters* +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::calculateFilterStep_3D (const TrackParameters& TP, const SParVector5& trkPar, const SCovMatrix5& trkCov, @@ -853,11 +853,11 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_3D (const TrackParameters& TP, } // compute Kalman gain matrix - ROOT::Math::SMatrix<double,5,3,ROOT::Math::MatRepStd<double, 5, 3> > + ROOT::Math::SMatrix<double,5,3,ROOT::Math::MatRepStd<double, 5, 3> > K = trkCov * ROOT::Math::Transpose(H) * R; SGenMatrix5 M = m_unitMatrix - K * H; if (msgLvl(MSG::VERBOSE)) { - SParVector5 trans_r; SCovMatrix5 trans_R; SGenMatrix5 trans_K; + SParVector5 trans_r; SCovMatrix5 trans_R; SGenMatrix5 trans_K; logGainForm (3, trans_r.Place_at(r,0), trans_R.Place_at(R,0,0), trans_K.Place_at(K,0,0)); } @@ -896,7 +896,7 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_3D (const TrackParameters& TP, // for both signs (add/remove) the chi2 is now calculated like for updated states SCovMatrix3 R2 = SmeasCov - projection_3D(updatedCov,measPar.parameterKey()); - double chiSquared; + double chiSquared; if ( !R2.Invert() ) { ATH_MSG_DEBUG( "matrix (3D) inversion not possible, set chi2 to zero"); chiSquared = 0.f; @@ -912,7 +912,7 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_3D (const TrackParameters& TP, } // calculations for Kalman updator and inverse Kalman filter -Trk::TrackParameters* +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::calculateFilterStep_4D (const TrackParameters& TP, const SParVector5& trkPar, const SCovMatrix5& trkCov, @@ -948,11 +948,11 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_4D (const TrackParameters& TP, } // compute Kalman gain matrix - ROOT::Math::SMatrix<double,5,4,ROOT::Math::MatRepStd<double, 5, 4> > + ROOT::Math::SMatrix<double,5,4,ROOT::Math::MatRepStd<double, 5, 4> > K = trkCov * ROOT::Math::Transpose(H) * R; SGenMatrix5 M = m_unitMatrix - K * H; if (msgLvl(MSG::VERBOSE)) { - SParVector5 trans_r; SCovMatrix5 trans_R; SGenMatrix5 trans_K; + SParVector5 trans_r; SCovMatrix5 trans_R; SGenMatrix5 trans_K; logGainForm (4, trans_r.Place_at(r,0), trans_R.Place_at(R,0,0), trans_K.Place_at(K,0,0)); } @@ -989,7 +989,7 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_4D (const TrackParameters& TP, // for both signs (add/remove) the chi2 is now calculated like for updated states SCovMatrix4 R2 = SmeasCov - projection_4D(updatedCov,measPar.parameterKey()); - double chiSquared; + double chiSquared; if ( !R2.Invert() ) { ATH_MSG_DEBUG( "matrix (4D) inversion not possible, set chi2 to zero"); chiSquared = 0.f; @@ -1005,7 +1005,7 @@ Trk::KalmanUpdatorSMatrix::calculateFilterStep_4D (const TrackParameters& TP, } // calculations for Kalman updator and inverse Kalman filter -Trk::TrackParameters* +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::calculateFilterStep_5D (const TrackParameters& TP, const SParVector5& trkParOne, const SCovMatrix5& trkCovOne, @@ -1105,9 +1105,9 @@ Trk::FitQualityOnSurface* Trk::KalmanUpdatorSMatrix::makeChi2_1D(const SParVecto if (chiSquared == 0.0) { ATH_MSG_DEBUG( "inversion of the error-on-the-residual failed." ); return nullptr; - } + } chiSquared = r*r/chiSquared; - + return new FitQualityOnSurface(chiSquared, 1); } @@ -1146,7 +1146,7 @@ Trk::FitQualityOnSurface* Trk::KalmanUpdatorSMatrix::makeChi2_5D(const SParVecto SCovMatrix5 ScovOne; SCovMatrix5 ScovTwo; // trafo EDM to new math lib - for (int i=0; i<5; ++i) + for (int i=0; i<5; ++i) for (int j=0; j<=i; ++j) { ScovOne(i,j) = covOne(i,j); ScovTwo(i,j) = covTwo(i,j); @@ -1164,7 +1164,7 @@ Trk::FitQualityOnSurface* Trk::KalmanUpdatorSMatrix::makeChi2_5D(const SParVecto return new FitQualityOnSurface(chiSquared, 5); } -Trk::TrackParameters* +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdatorSMatrix::convertToClonedTrackPars(const Trk::TrackParameters& TP, const SParVector5& par, const SCovMatrix5& covpar, @@ -1175,27 +1175,27 @@ Trk::KalmanUpdatorSMatrix::convertToClonedTrackPars(const Trk::TrackParameters& C->setZero(); for (int i=0; i<5; ++i) { for (int j=0; j<=i; ++j) { - C->fillSymmetric(i,j, covpar(i,j)); + C->fillSymmetric(i,j, covpar(i,j)); } } - - Trk::TrackParameters* resultPar = - TP.associatedSurface().createTrackParameters(par[0],par[1],par[2],par[3],par[4],C); - + + std::unique_ptr<Trk::TrackParameters> resultPar = + TP.associatedSurface().createUniqueTrackParameters(par[0],par[1],par[2],par[3],par[4],C); + if (msgLvl(MSG::VERBOSE) && resultPar) { char reportCalledInterface[80]; char ndtext2[5]; memset(ndtext2, '\0', 5 ); ndtext.copy(ndtext2,2); // convert char to string - if (sign>0) + if (sign>0) sprintf(reportCalledInterface,"%s-%s,%s)", (ndtext=="5D"?"combineStates(TP,TP":"addToState(TP,Meas"), ndtext2,(createFQoS?"Err,FQ":"Err")); - else + else sprintf(reportCalledInterface,"%s,Meas-%s,%s)","removeFromState(TP,", ndtext2,(createFQoS?"Err,FQ":"Err")); logResult((std::string)reportCalledInterface, resultPar->parameters(),*C); } - + return resultPar; } @@ -1204,7 +1204,7 @@ SCovMatrix2 Trk::KalmanUpdatorSMatrix::projection_2D(const SCovMatrix5& M, const if (key == 3) { // shortcut the most-used case SCovMatrix2 S = M.Sub<SCovMatrix2> (0,0); return S; - } + } ROOT::Math::SVector<int,2> iv; for (int i=0,k=0; i<5; ++i) { if (key & (1<<i)) iv(k++)=i; } SCovMatrix2 covSubMatrix; @@ -1214,7 +1214,7 @@ SCovMatrix2 Trk::KalmanUpdatorSMatrix::projection_2D(const SCovMatrix5& M, const } } return covSubMatrix; - + } SCovMatrix2 Trk::KalmanUpdatorSMatrix::projection_2D(const Amg::MatrixX& M, @@ -1235,7 +1235,7 @@ SCovMatrix3 Trk::KalmanUpdatorSMatrix::projection_3D(const SCovMatrix5& M, const { if (key == 7) { // shortcut the most-used case return M.Sub<SCovMatrix3> (0,0); - } + } ROOT::Math::SVector<int,3> iv; for (int i=0,k=0; i<5; ++i) { if (key & (1<<i)) iv(k++)=i; } SCovMatrix3 covSubMatrix; @@ -1245,14 +1245,14 @@ SCovMatrix3 Trk::KalmanUpdatorSMatrix::projection_3D(const SCovMatrix5& M, const } } return covSubMatrix; - + } SCovMatrix4 Trk::KalmanUpdatorSMatrix::projection_4D(const SCovMatrix5& M, const int& key) const { if (key == 15) { // shortcut the most-used case return M.Sub<SCovMatrix4> (0,0); - } + } ROOT::Math::SVector<int,4> iv; for (int i=0,k=0; i<5; ++i) { if (key & (1<<i)) iv(k++)=i; } SCovMatrix4 covSubMatrix; @@ -1262,24 +1262,24 @@ SCovMatrix4 Trk::KalmanUpdatorSMatrix::projection_4D(const SCovMatrix5& M, const } } return covSubMatrix; - + } bool Trk::KalmanUpdatorSMatrix::getStartCov(SCovMatrix5& M, const Trk::TrackParameters& inputParameters, const int isign) const { - + const AmgSymMatrix(5)* covariance = inputParameters.covariance(); if (!covariance) { if (isign<0) { ATH_MSG_WARNING ("MeasuredTrackParameters == Null, can not calculate updated parameter state."); return false; - } + } // no error given - use a huge error matrix for the time ATH_MSG_VERBOSE ("-U- no covTrk at input - assign large error matrix for the time being."); M.SetDiagonal(m_cov0); - + } else { // int k = measTrkPar->localAmg::MatrixX().covariance().cols(); is always 5 for (int i=0; i<5; ++i) { @@ -1312,7 +1312,7 @@ Trk::FitQualityOnSurface* Trk::KalmanUpdatorSMatrix::makeChi2Object(const Amg::V // number of degree of freedom added int numberDoF = covRio.cols(); - + return new FitQualityOnSurface(chiSquared, numberDoF); } @@ -1330,7 +1330,7 @@ bool Trk::KalmanUpdatorSMatrix::correctThetaPhiRange_5D(SParVector5& V,SCovMatri const RangeCheckDef rcd) const { static const SParVector2 thetaMin(0.0, -M_PI); - + // correct theta coordinate if ( V(Trk::theta)<thetaMin((int)rcd) || V(Trk::theta)> M_PI ) { ATH_MSG_DEBUG ("-U- theta angle out of range: theta= "<<V(Trk::theta)<<", phi= "<<V(Trk::phi)); @@ -1368,7 +1368,7 @@ bool Trk::KalmanUpdatorSMatrix::correctThetaPhiRange_5D(SParVector5& V,SCovMatri V(Trk::phi) = std::fmod(V(Trk::phi)-M_PI,2*M_PI)+M_PI; ATH_MSG_DEBUG( " out of range, now corrected to " << V(Trk::phi) ); } - + return true; } @@ -1395,9 +1395,9 @@ void Trk::KalmanUpdatorSMatrix::logInputCov(const SCovMatrix5& covTrk, ATH_MSG_VERBOSE( " covariance matrix " << " " << " " << std::setw(9)<<covTrk(2,2)<<" "<< std::setw(9)<<covTrk(2,3)<<" " << std::setw(9)<<covTrk(2,4)); - ATH_MSG_VERBOSE( " of the PREDICTED track pars " << " " << " " + ATH_MSG_VERBOSE( " of the PREDICTED track pars " << " " << " " << std::setw(9)<<covTrk(3,3)<<" "<< std::setw(9)<<covTrk(3,4)); - ATH_MSG_VERBOSE(" " << " " << " " + ATH_MSG_VERBOSE(" " << " " << " " << std::setw(9)<<covTrk(4,4)<<std::setprecision(6)); int nLocCoord = covRio.cols(); @@ -1423,7 +1423,7 @@ void Trk::KalmanUpdatorSMatrix::logGainForm(int nc, const SParVector5& r, msg(MSG::VERBOSE) // K is a row x col = 5 x nc matrix. << ( i==0 ? "-U- gain mtx K=(" : " (" ) << std::setiosflags(std::ios::fixed | std::ios::showpoint | std::ios::right ) - << std::setw(7) << std::setprecision(4) << K(0,i)<<", " + << std::setw(7) << std::setprecision(4) << K(0,i)<<", " << std::setw(7) << std::setprecision(4) << K(1,i)<<", " << std::setw(7) << std::setprecision(4) << K(2,i)<<", " << std::setw(7) << std::setprecision(4) << K(3,i)<<", " @@ -1431,7 +1431,7 @@ void Trk::KalmanUpdatorSMatrix::logGainForm(int nc, const SParVector5& r, << std::resetiosflags(std::ios::fixed) << "\n"; } -void Trk::KalmanUpdatorSMatrix::logResult(const std::string& methodName, +void Trk::KalmanUpdatorSMatrix::logResult(const std::string& methodName, const AmgVector(5)& par, const AmgSymMatrix(5)& covPar) const { // again some verbose debug output @@ -1441,7 +1441,7 @@ void Trk::KalmanUpdatorSMatrix::logResult(const std::string& methodName, << std::setw(10)<<par[2]<< std::setw(10)<<par[3]<<std::setprecision(4) << std::setw(10)<<par[4] <<"\n"; msg(MSG::VERBOSE) << "-U- new cov" <<std::setiosflags(std::ios::right)<<std::setprecision(3) - << std::setw(9)<<(covPar)(0,0)<<" "<< std::setw(9)<<(covPar)(0,1)<<" " + << std::setw(9)<<(covPar)(0,0)<<" "<< std::setw(9)<<(covPar)(0,1)<<" " << std::setw(9)<<(covPar)(0,2)<<" "<< std::setw(9)<<(covPar)(0,3) << " " << std::setw(9)<<(covPar)(0,4)<< "\n"; msg(MSG::VERBOSE) << " " << " " << " " @@ -1450,10 +1450,10 @@ void Trk::KalmanUpdatorSMatrix::logResult(const std::string& methodName, msg(MSG::VERBOSE) << " covariance matrix " << " " << " " << std::setw(9)<<(covPar)(2,2) <<" "<< std::setw(9)<<(covPar)(2,3) <<" " << std::setw(9)<<(covPar)(2,4) << "\n"; - msg(MSG::VERBOSE) << " of the UPDATED track pars " << " " + msg(MSG::VERBOSE) << " of the UPDATED track pars " << " " << " " <<std::setw(9)<<(covPar)(3,3) << " " << std::setw(9)<<(covPar)(3,4) << "\n"; - msg(MSG::VERBOSE) << " " << " " - << " " + msg(MSG::VERBOSE) << " " << " " + << " " << std::setw(9)<<(covPar)(4,4) <<std::setprecision(6)<< "\n"; } diff --git a/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanWeightUpdator.cxx b/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanWeightUpdator.cxx index 51cb1687a3f14ffc4d613a192d77bb03a0524b55..dcaa88252dbea2ca872af238c72f55bf752a055b 100755 --- a/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanWeightUpdator.cxx +++ b/Tracking/TrkTools/TrkMeasurementUpdator/src/KalmanWeightUpdator.cxx @@ -55,29 +55,29 @@ StatusCode Trk::KalmanWeightUpdator::finalize() { } // updator #1 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanWeightUpdator::addToState ( const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::addToState ( const Trk::TrackParameters& trkPar, const Amg::Vector2D& measmtPos, const Amg::MatrixX& measmtErr) const { FitQualityOnSurface* fitQoS = nullptr; - Trk::TrackParameters* outPar = calculateFilterStep (trkPar, measmtPos, measmtErr,1,fitQoS, false); + std::unique_ptr<Trk::TrackParameters> outPar = calculateFilterStep (trkPar, measmtPos, measmtErr,1,fitQoS, false); if (m_outputlevel <= 0 && outPar) logResult("addToState(TP,LPOS,ERR)",*outPar); return outPar; } // updator #2 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanWeightUpdator::addToState ( const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::addToState ( const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtErr) const { FitQualityOnSurface* fitQoS = nullptr; - Trk::TrackParameters* outPar = calculateFilterStep (trkPar, measmtPar, measmtErr,1,fitQoS, false); + std::unique_ptr<Trk::TrackParameters> outPar = calculateFilterStep (trkPar, measmtPar, measmtErr,1,fitQoS, false); if (m_outputlevel <= 0 && outPar) logResult("addToState(TP,LPAR,ERR)",*outPar); return outPar; } // updator #3 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanWeightUpdator::addToState ( const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::addToState ( const Trk::TrackParameters& trkPar, const Amg::Vector2D& measmtPos, const Amg::MatrixX& measmtErr, FitQualityOnSurface*& fitQoS) const { @@ -85,88 +85,88 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::addToState ( const Trk::TrackPa if (fitQoS) { ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to avoid mem leak!" ); return nullptr; - } - Trk::TrackParameters* outPar = calculateFilterStep (trkPar, measmtPos, measmtErr, 1, fitQoS, true); + } + std::unique_ptr<Trk::TrackParameters> outPar = calculateFilterStep (trkPar, measmtPos, measmtErr, 1, fitQoS, true); if (!outPar) fitQoS = nullptr; if (m_outputlevel <= 0 && outPar) logResult("addToState(TP,LPOS,ERR,FQ)",*outPar); return outPar; - + } // updator #4 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanWeightUpdator::addToState ( const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::addToState ( const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtErr, FitQualityOnSurface*& fitQoS) const { if (fitQoS) { ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to avoid mem leak!" ); return nullptr; - } - Trk::TrackParameters* outPar = calculateFilterStep (trkPar, measmtPar, measmtErr, 1, fitQoS, true); + } + std::unique_ptr<Trk::TrackParameters> outPar = calculateFilterStep (trkPar, measmtPar, measmtErr, 1, fitQoS, true); if (!outPar) fitQoS = nullptr; if (m_outputlevel <= 0 && outPar) logResult("addToState(TP,LPAR,ERR,FQ)",*outPar); return outPar; - + } // inverse updator #1 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanWeightUpdator::removeFromState ( const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::removeFromState ( const Trk::TrackParameters& trkPar, const Amg::Vector2D& measmtPos, const Amg::MatrixX& measmtErr) const { FitQualityOnSurface* fitQoS = nullptr; - Trk::TrackParameters* outPar = calculateFilterStep (trkPar, measmtPos, measmtErr,-1,fitQoS, false); + std::unique_ptr<Trk::TrackParameters> outPar = calculateFilterStep (trkPar, measmtPos, measmtErr,-1,fitQoS, false); if (m_outputlevel<=0 && outPar) logResult("removeFromState(TP,LPOS,ERR)",*outPar); return outPar; } // inverse updator #2 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanWeightUpdator::removeFromState ( const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::removeFromState ( const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtErr) const { FitQualityOnSurface* fitQoS = nullptr; - Trk::TrackParameters* outPar = calculateFilterStep (trkPar, measmtPar, measmtErr,-1,fitQoS,false); + std::unique_ptr<Trk::TrackParameters> outPar = calculateFilterStep (trkPar, measmtPar, measmtErr,-1,fitQoS,false); if (m_outputlevel && outPar) logResult("removeFromState(TP,LPAR,ERR)",*outPar); return outPar; } // inverse updator #3 for Kalman Fitter - version with Amg::Vector2D (for example for PrepRawData) -Trk::TrackParameters* Trk::KalmanWeightUpdator::removeFromState ( const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::removeFromState ( const Trk::TrackParameters& trkPar, const Amg::Vector2D& measmtPos, const Amg::MatrixX& measmtErr, FitQualityOnSurface*& fitQoS) const { if (fitQoS) { ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to avoid mem leak!" ); return nullptr; - } - Trk::TrackParameters* outPar = calculateFilterStep (trkPar, measmtPos, measmtErr, -1, fitQoS, true); + } + std::unique_ptr<Trk::TrackParameters> outPar = calculateFilterStep (trkPar, measmtPos, measmtErr, -1, fitQoS, true); if (!outPar) fitQoS = nullptr; if (m_outputlevel<=0 && outPar) logResult("removeFromState(TP,LPOS,ERR,FQ)",*outPar); return outPar; - + } // inverse updator #4 for Kalman Fitter - version with LocalParameters (for example for RIO_OnTrack) -Trk::TrackParameters* Trk::KalmanWeightUpdator::removeFromState ( const Trk::TrackParameters& trkPar, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::removeFromState ( const Trk::TrackParameters& trkPar, const LocalParameters& measmtPar, const Amg::MatrixX& measmtErr, FitQualityOnSurface*& fitQoS) const { if (fitQoS) { ATH_MSG_WARNING( "expect nil FitQuality pointer, refuse operation to avoid mem leak!" ); return nullptr; - } - Trk::TrackParameters* outPar = calculateFilterStep (trkPar, measmtPar, measmtErr, -1, fitQoS, true); + } + std::unique_ptr<Trk::TrackParameters> outPar = calculateFilterStep (trkPar, measmtPar, measmtErr, -1, fitQoS, true); if (!outPar) fitQoS = nullptr; if (m_outputlevel<=0 && outPar) logResult("removeFrommState(TP,LPAR,ERR,FQ)",*outPar); return outPar; - + } // state-to-state updator, trajectory combination - version without fitQuality -Trk::TrackParameters* Trk::KalmanWeightUpdator::combineStates ( const Trk::TrackParameters& one, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::combineStates ( const Trk::TrackParameters& one, const Trk::TrackParameters& two) const { // remember, either one OR two might have no error, but not both ! if (!one.covariance() && !two.covariance()) { @@ -176,11 +176,11 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::combineStates ( const Trk::Tra // if only one of two has an error, return that one if (!one.covariance()) { if (m_outputlevel<=0) logResult("combineStates(TP,TP)",two); - return two.clone(); + return std::unique_ptr<Trk::TrackParameters>(two.clone()); } if (!two.covariance()) { if (m_outputlevel<=0) logResult("combineStates(TP,TP)",one); - return one.clone(); + return std::unique_ptr<Trk::TrackParameters>(one.clone()); } @@ -194,7 +194,7 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::combineStates ( const Trk::Tra AmgSymMatrix(5) G2 = two.covariance()->inverse(); AmgSymMatrix(5) G = G1 + G2; - // avoid making weighted sum at opposite side of detector. + // avoid making weighted sum at opposite side of detector. // We know that one&two's phis are in range, so lets put them back out of range. Amg::VectorX correctedTwo = two.parameters(); if (std::abs(two.parameters()[Trk::phi] - one.parameters()[Trk::phi])> M_PI) { @@ -211,14 +211,14 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::combineStates ( const Trk::Tra return nullptr; } // return cloned version of Track Parameters (MeasuredPerigee, MeasuredAtA...) - TrackParameters* comb = one.associatedSurface().createTrackParameters(p[Trk::loc1],p[Trk::loc2], - p[Trk::phi],p[Trk::theta],p[Trk::qOverP],covNew); + std::unique_ptr<TrackParameters> comb = one.associatedSurface().createUniqueTrackParameters(p[Trk::loc1],p[Trk::loc2], + p[Trk::phi],p[Trk::theta],p[Trk::qOverP],covNew); if (m_outputlevel<=0 && comb) logResult("combineStates(TP,TP)",*comb); return comb; } // state-to-state updator, trajectory combination - version with fitQuality -Trk::TrackParameters* Trk::KalmanWeightUpdator::combineStates ( const Trk::TrackParameters& one, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::combineStates ( const Trk::TrackParameters& one, const Trk::TrackParameters& two, FitQualityOnSurface*& fitQoS) const { // try if both Track Parameters are measured ones ? @@ -235,12 +235,12 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::combineStates ( const Trk::Tra if (!one.covariance()) { fitQoS = new FitQualityOnSurface(0.f, 5); if (m_outputlevel<=0) logResult("combineStates(TP,TP,FQ)",two); - return two.clone(); + return std::unique_ptr<Trk::TrackParameters>(two.clone()); } if (!two.covariance()) { fitQoS = new FitQualityOnSurface(0.f, 5); if (m_outputlevel<=0) logResult("combineStates(TP,TP,FQ)",one); - return one.clone(); + return std::unique_ptr<Trk::TrackParameters>(one.clone()); } // ... FIXME - TRT is so difficult, need to check that both parameters are in the same frame @@ -253,7 +253,7 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::combineStates ( const Trk::Tra AmgSymMatrix(5) G2 = two.covariance()->inverse(); AmgSymMatrix(5) G = G1 + G2; - // avoid making weighted sum at opposite side of detector. + // avoid making weighted sum at opposite side of detector. // We know that one&two's phis are in range, so lets put them back out of range. Amg::VectorX correctedTwo = two.parameters(); if (std::abs(two.parameters()[Trk::phi] - one.parameters()[Trk::phi])> M_PI) { @@ -270,8 +270,8 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::combineStates ( const Trk::Tra return nullptr; } // return cloned version of Track Parameters (MeasuredPerigee, MeasuredAtA...) - TrackParameters* comb = one.associatedSurface().createTrackParameters(p[Trk::loc1],p[Trk::loc2], - p[Trk::phi],p[Trk::theta],p[Trk::qOverP],covNew); + std::unique_ptr<TrackParameters> comb = one.associatedSurface().createUniqueTrackParameters(p[Trk::loc1],p[Trk::loc2], + p[Trk::phi],p[Trk::theta],p[Trk::qOverP],covNew); // compute fit quality: // chi^2 = (p_2 - p)^T G_2 (p_2 - p) + (p - p_1)^T G_1 (p - p_1) Amg::VectorX r2 = two.parameters() - p; @@ -437,13 +437,13 @@ Trk::KalmanWeightUpdator::predictedStateFitQuality ( const Trk::TrackParamete std::vector<double> Trk::KalmanWeightUpdator::initialErrors() const { std::vector<double> E(5); - for (int i=0; i<5; ++i) E[i] = (m_weight[i]!=0.) ? + for (int i=0; i<5; ++i) E[i] = (m_weight[i]!=0.) ? std::sqrt(1./m_weight[i]) : 1E5 ; return E; } // mathematics for Kalman updator and inverse Kalman filter -Trk::TrackParameters* Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk::TrackParameters& p, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk::TrackParameters& p, const Amg::Vector2D& mpos, const Amg::MatrixX& cov, const int sign, @@ -473,7 +473,7 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk: ATH_MSG_ERROR( "MeasuredTrackParameters == Null, can not calculate " << "updated track state" ); return nullptr; - } + } // no error given - use zero weight for the time GOld.setZero(); ATH_MSG_VERBOSE( "-U- no covTrk at input - " @@ -483,7 +483,7 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk: (GOld)(2,2) = m_weight[2]; (GOld)(3,3) = m_weight[3]; (GOld)(4,4) = m_weight[4]; - + } else { GOld = p.covariance()->inverse(); } @@ -521,13 +521,13 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk: AmgSymMatrix(5)* covNew = new AmgSymMatrix(5)(Gnew.inverse()); // calc new track state: pNew = Gnew^{-1} * ( GOld * pOld +/- H.T * W * m) Amg::VectorX weightedSum = GOld * pOld + sign * H.transpose() * W * m; - + Amg::VectorX pNew = (*covNew) * weightedSum; if ( (!thetaPhiWithinRange(pNew)) ? !correctThetaPhiRange(pNew) : false ) { ATH_MSG_WARNING( "calculateFS(TP,LPAR,ERR): bad angles in filtered state!" ); return nullptr; } - + // compute chi2 if needed if (createFQoS) { // calc Chi2 @@ -538,16 +538,16 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk: //double chiSquared = W.similarity(r) + GOld.similarity(deltaP); fitQoS = makeChi2Object(r, W, 0, deltaP, GOld, 31); } - - TrackParameters* updated = p.associatedSurface().createTrackParameters(pNew[Trk::loc1],pNew[Trk::loc2], + + std::unique_ptr<TrackParameters> updated = p.associatedSurface().createUniqueTrackParameters(pNew[Trk::loc1],pNew[Trk::loc2], pNew[Trk::phi],pNew[Trk::theta], - pNew[Trk::qOverP],covNew); + pNew[Trk::qOverP],covNew); return updated; } // mathematics for Kalman updator and inverse Kalman filter -Trk::TrackParameters* Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk::TrackParameters& p, +std::unique_ptr<Trk::TrackParameters> Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk::TrackParameters& p, const Trk::LocalParameters& m, const Amg::MatrixX& W, const int sign, @@ -573,7 +573,7 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk: if (sign<0) { ATH_MSG_ERROR( "MeasuredTrackParameters == Null, can not calculate updated track state" ); return nullptr; - } + } // no error given - use zero weight for the time GOld.setZero(); ATH_MSG_VERBOSE( "-U- no covTrk at input - " @@ -583,7 +583,7 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk: (GOld)(2,2) = m_weight[2]; (GOld)(3,3) = m_weight[3]; (GOld)(4,4) = m_weight[4]; - + } else { GOld = p.covariance()->inverse(); } @@ -639,9 +639,13 @@ Trk::TrackParameters* Trk::KalmanWeightUpdator::calculateFilterStep ( const Trk: fitQoS = makeChi2Object(r, W, m.parameterKey(), deltaP, GOld, 31); } - TrackParameters* updated = p.associatedSurface().createTrackParameters(pNew[Trk::loc1],pNew[Trk::loc2], - pNew[Trk::phi],pNew[Trk::theta], - pNew[Trk::qOverP],Cnew); + std::unique_ptr<TrackParameters> updated = + p.associatedSurface().createUniqueTrackParameters(pNew[Trk::loc1], + pNew[Trk::loc2], + pNew[Trk::phi], + pNew[Trk::theta], + pNew[Trk::qOverP], + Cnew); return updated; } @@ -721,7 +725,7 @@ void Trk::KalmanWeightUpdator::logInputCov(const Amg::MatrixX& covTrk, int nLocCoord = covRio.cols(); ss << "-U- measurement locPos: "; for (int i=0; i<nLocCoord; i++) ss << rioPar[i] << " "; - + ss << "-U- measurement (err)^2: " <<std::setprecision(4)<<covRio(0,0); for (int i=1; i<nLocCoord; i++) ss << ", "<<covRio(i,i); ss << std::setprecision(6)<<"\n"; diff --git a/Tracking/TrkTools/TrkMeasurementUpdator_xk/TrkMeasurementUpdator_xk/KalmanUpdator_xk.h b/Tracking/TrkTools/TrkMeasurementUpdator_xk/TrkMeasurementUpdator_xk/KalmanUpdator_xk.h index d6e5427c64393436266e3521b6b79251aad6c0e2..44ac2b8bc40eb5f1bbfa8da0dcb3cdc237ff20c1 100755 --- a/Tracking/TrkTools/TrkMeasurementUpdator_xk/TrkMeasurementUpdator_xk/KalmanUpdator_xk.h +++ b/Tracking/TrkTools/TrkMeasurementUpdator_xk/TrkMeasurementUpdator_xk/KalmanUpdator_xk.h @@ -21,11 +21,11 @@ namespace Trk { /** - @class KalmanUpdator_xk - + @class KalmanUpdator_xk + Trk::KalmanUpdator_xk is a set of tools for adding and removing measurements to/from the state vector using xKalman algorithms - @author Igor.Gavrilenko@cern.ch + @author Igor.Gavrilenko@cern.ch */ class LocalParameters ; @@ -34,13 +34,13 @@ namespace Trk { class KalmanUpdator_xk : virtual public IUpdator, virtual public IPatternParametersUpdator, public AthAlgTool - { + { /////////////////////////////////////////////////////////////////// // Public methods: /////////////////////////////////////////////////////////////////// - - public: - + + public: + /////////////////////////////////////////////////////////////////// // Standard Athena tool methods /////////////////////////////////////////////////////////////////// @@ -54,28 +54,28 @@ namespace Trk { // ///////////////////////////////////////////////////////////////// // Main public methods for kalman filter updator tool // ///////////////////////////////////////////////////////////////// - + // ///////////////////////////////////////////////////////////////// // Add and remove without Xi2 calculation // ///////////////////////////////////////////////////////////////// - + //! add without chi2 calculation, PRD-level, EDM track parameters - virtual TrackParameters* addToState + virtual std::unique_ptr<TrackParameters> addToState (const TrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&) const override final; //! add without chi2 calculation, ROT-level, EDM track parameters - virtual TrackParameters* addToState + virtual std::unique_ptr<TrackParameters> addToState (const TrackParameters&,const LocalParameters&,const Amg::MatrixX&) const override final; //! add without chi2 calculation, PRD-level, pattern track parameters - virtual bool addToState + virtual bool addToState (PatternTrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&, PatternTrackParameters&) const override final; //! add without chi2 calculation, ROT-level, pattern track parameters - virtual bool addToState + virtual bool addToState (PatternTrackParameters&,const LocalParameters&,const Amg::MatrixX&, PatternTrackParameters&) const override final; //! add without chi2 calculation, PRD-level, pattern track parameters, specifically 1D - virtual bool addToStateOneDimension + virtual bool addToStateOneDimension (PatternTrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&, PatternTrackParameters&) const override final; @@ -83,15 +83,15 @@ namespace Trk { // Remove without Xi2 calculation /////////////////////////////////////////////////////////////////// - virtual TrackParameters* removeFromState + virtual std::unique_ptr<TrackParameters> removeFromState (const TrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&) const override final; - virtual TrackParameters* removeFromState + virtual std::unique_ptr<TrackParameters> removeFromState (const TrackParameters&,const LocalParameters&,const Amg::MatrixX&) const override final; - virtual bool removeFromState + virtual bool removeFromState (PatternTrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&, PatternTrackParameters&) const override final; - virtual bool removeFromState + virtual bool removeFromState (PatternTrackParameters&,const LocalParameters&,const Amg::MatrixX&, PatternTrackParameters&) const override final; @@ -99,23 +99,23 @@ namespace Trk { // Add with Xi2 calculation /////////////////////////////////////////////////////////////////// - virtual TrackParameters* addToState + virtual std::unique_ptr<TrackParameters> addToState (const TrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&, FitQualityOnSurface*&) const override final; - virtual TrackParameters* addToState + virtual std::unique_ptr<TrackParameters> addToState (const TrackParameters&,const LocalParameters&,const Amg::MatrixX&, FitQualityOnSurface*&) const override final; - virtual std::pair<AmgVector(5),AmgSymMatrix(5)>* updateParameterDifference - (const AmgVector(5)&,const AmgSymMatrix(5)&, const Amg::VectorX&, const Amg::MatrixX&, - const int&,Trk::FitQualityOnSurface*&,bool) const override final; - - virtual bool addToState + virtual std::pair<AmgVector(5),AmgSymMatrix(5)>* updateParameterDifference + (const AmgVector(5)&,const AmgSymMatrix(5)&, const Amg::VectorX&, const Amg::MatrixX&, + const int&,Trk::FitQualityOnSurface*&,bool) const override final; + + virtual bool addToState (PatternTrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&, PatternTrackParameters&,double&,int&) const override final; - virtual bool addToState + virtual bool addToState (PatternTrackParameters&,const LocalParameters&,const Amg::MatrixX&, PatternTrackParameters&,double&,int&) const override final; - virtual bool addToStateOneDimension + virtual bool addToStateOneDimension (PatternTrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&, PatternTrackParameters&,double&,int&) const override final; @@ -123,17 +123,17 @@ namespace Trk { // Remove with Xi2 calculation /////////////////////////////////////////////////////////////////// - virtual TrackParameters* removeFromState + virtual std::unique_ptr<TrackParameters> removeFromState (const TrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&, FitQualityOnSurface*&) const override final; - virtual TrackParameters* removeFromState + virtual std::unique_ptr<TrackParameters> removeFromState (const TrackParameters&,const LocalParameters&,const Amg::MatrixX&, FitQualityOnSurface*&) const override final; - virtual bool removeFromState + virtual bool removeFromState (PatternTrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&, PatternTrackParameters&,double&,int&) const override final; - virtual bool removeFromState + virtual bool removeFromState (PatternTrackParameters&,const LocalParameters&,const Amg::MatrixX&, PatternTrackParameters&,double&,int&) const override; @@ -141,43 +141,43 @@ namespace Trk { // Combine two state with or without Xi2 calculation /////////////////////////////////////////////////////////////////// - virtual TrackParameters* combineStates + virtual std::unique_ptr<TrackParameters> combineStates (const TrackParameters&, const TrackParameters&) const override final; - virtual TrackParameters* combineStates - (const TrackParameters&, const TrackParameters&, + virtual std::unique_ptr<TrackParameters> combineStates + (const TrackParameters&, const TrackParameters&, FitQualityOnSurface*&) const override final; - virtual bool combineStates + virtual bool combineStates (PatternTrackParameters&,PatternTrackParameters&,PatternTrackParameters&) const override final; - virtual bool combineStates + virtual bool combineStates (PatternTrackParameters&,PatternTrackParameters&,PatternTrackParameters&, double&) const override final; /////////////////////////////////////////////////////////////////// // Xi2 calculation /////////////////////////////////////////////////////////////////// - - virtual const FitQualityOnSurface* predictedStateFitQuality + + virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&) const override final; - virtual const FitQualityOnSurface* predictedStateFitQuality + virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&,const LocalParameters&,const Amg::MatrixX&) const override final; - virtual const FitQualityOnSurface* fullStateFitQuality + virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&,const Amg::Vector2D&, const Amg::MatrixX&) const override final; - virtual const FitQualityOnSurface* fullStateFitQuality + virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&,const LocalParameters&,const Amg::MatrixX&) const override final; virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&,const TrackParameters&) const override final; - virtual bool predictedStateFitQuality - (const PatternTrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&,int&,double&) + virtual bool predictedStateFitQuality + (const PatternTrackParameters&,const Amg::Vector2D& ,const Amg::MatrixX&,int&,double&) const override final; - virtual bool predictedStateFitQuality - (const PatternTrackParameters&,const LocalParameters&,const Amg::MatrixX&,int&,double&) + virtual bool predictedStateFitQuality + (const PatternTrackParameters&,const LocalParameters&,const Amg::MatrixX&,int&,double&) const override final; - virtual bool fullStateFitQuality + virtual bool fullStateFitQuality (const PatternTrackParameters&,const Amg::Vector2D&, const Amg::MatrixX&,int&,double&) const override final; - virtual bool fullStateFitQuality + virtual bool fullStateFitQuality (const PatternTrackParameters&,const LocalParameters&,const Amg::MatrixX&,int&,double&) const override final; virtual bool predictedStateFitQuality @@ -185,13 +185,13 @@ namespace Trk { /////////////////////////////////////////////////////////////////// // let the client tools know how the assumptions on the initial - // precision for non-measured track parameters are configured + // precision for non-measured track parameters are configured /////////////////////////////////////////////////////////////////// - + virtual std::vector<double> initialErrors() const override final; protected: - + /////////////////////////////////////////////////////////////////// // Protected methods /////////////////////////////////////////////////////////////////// @@ -199,12 +199,12 @@ namespace Trk { /////////////////////////////////////////////////////////////////// // Updators /////////////////////////////////////////////////////////////////// - - TrackParameters* update + + std::unique_ptr<TrackParameters> update (const TrackParameters&,const Amg::Vector2D&,const Amg::MatrixX&, FitQualityOnSurface*&,int,bool) const; - TrackParameters* update + std::unique_ptr<TrackParameters> update (const TrackParameters&,const LocalParameters&,const Amg::MatrixX&, FitQualityOnSurface*&,int,bool) const; @@ -223,8 +223,8 @@ namespace Trk { /////////////////////////////////////////////////////////////////// // Xi2 calculation /////////////////////////////////////////////////////////////////// - - bool predictedStateFitQuality + + bool predictedStateFitQuality (const double*,const Amg::Vector2D&,const Amg::MatrixX&,int&,double&) const; bool fullStateFitQuality @@ -233,7 +233,7 @@ namespace Trk { /////////////////////////////////////////////////////////////////// // Converters /////////////////////////////////////////////////////////////////// - + bool trackParametersToUpdator (const TrackParameters&,double*,double*) const; @@ -242,14 +242,14 @@ namespace Trk { bool localParametersToUpdator (const LocalParameters&,const Amg::MatrixX&,int&,int&,double*,double*) const; - - TrackParameters* updatorToTrackParameters - (const TrackParameters&,double*,double*) const; + + std::unique_ptr<TrackParameters> updatorToTrackParameters + (const TrackParameters&,double*,double*) const; /////////////////////////////////////////////////////////////////// // Update no measured track parameters /////////////////////////////////////////////////////////////////// - + bool updateNoMeasuredWithOneDim (double*,double*,double*,double*) const; diff --git a/Tracking/TrkTools/TrkMeasurementUpdator_xk/src/KalmanUpdator_xk.cxx b/Tracking/TrkTools/TrkMeasurementUpdator_xk/src/KalmanUpdator_xk.cxx index abbb52f25c02e5331f647ba5bae69aec426610f0..a66c49a9d559c5598f1fa130e671b915ac997462 100755 --- a/Tracking/TrkTools/TrkMeasurementUpdator_xk/src/KalmanUpdator_xk.cxx +++ b/Tracking/TrkTools/TrkMeasurementUpdator_xk/src/KalmanUpdator_xk.cxx @@ -40,7 +40,7 @@ Trk::KalmanUpdator_xk::KalmanUpdator_xk } /////////////////////////////////////////////////////////////////// -// Destructor +// Destructor /////////////////////////////////////////////////////////////////// Trk::KalmanUpdator_xk::~KalmanUpdator_xk() @@ -58,7 +58,7 @@ StatusCode Trk::KalmanUpdator_xk::initialize() msg(MSG::INFO) << "initialize() successful in " << name() << endmsg; if( m_cov0.size()!=5) { - + m_cov0.erase(m_cov0.begin(),m_cov0.end()); m_cov0.push_back( 10.); m_cov0.push_back( 10.); @@ -81,32 +81,32 @@ StatusCode Trk::KalmanUpdator_xk::finalize() /////////////////////////////////////////////////////////////////// // Add local position together with erro matrix without Xi2 calculation /////////////////////////////////////////////////////////////////// - -Trk::TrackParameters* Trk::KalmanUpdator_xk::addToState + +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::addToState (const Trk::TrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E) const { - Trk::FitQualityOnSurface* Q=nullptr; + Trk::FitQualityOnSurface* Q=nullptr; return update(T,P,E,Q, 1,false); } /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::addToState +bool Trk::KalmanUpdator_xk::addToState (Trk::PatternTrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E, Trk::PatternTrackParameters& Ta) const { - int n ; + int n ; double x2; return update(T,P,E, 1,false,Ta,x2,n); } /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::addToStateOneDimension +bool Trk::KalmanUpdator_xk::addToStateOneDimension (Trk::PatternTrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E, @@ -120,24 +120,24 @@ bool Trk::KalmanUpdator_xk::addToStateOneDimension // Remove local position together with erro matrix without Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::removeFromState +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::removeFromState (const Trk::TrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E) const { - Trk::FitQualityOnSurface* Q=nullptr; + Trk::FitQualityOnSurface* Q=nullptr; return update(T,P,E,Q,-1,false); } /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::removeFromState +bool Trk::KalmanUpdator_xk::removeFromState (Trk::PatternTrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E, Trk::PatternTrackParameters& Ta) const { - int n ; + int n ; double x2; return update(T,P,E,-1,false,Ta,x2,n); } @@ -146,24 +146,24 @@ bool Trk::KalmanUpdator_xk::removeFromState // Add local parameters together with error matrix without Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::addToState +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::addToState (const Trk::TrackParameters& T, const Trk::LocalParameters& P, const Amg::MatrixX & E) const { - Trk::FitQualityOnSurface* Q=nullptr; + Trk::FitQualityOnSurface* Q=nullptr; return update(T,P,E,Q, 1,false); } /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::addToState +bool Trk::KalmanUpdator_xk::addToState (Trk::PatternTrackParameters& T, const LocalParameters & P, const Amg::MatrixX & E, Trk::PatternTrackParameters& Ta) const { - int n ; + int n ; double x2; return update(T,P,E, 1,false,Ta,x2,n); } @@ -172,24 +172,24 @@ bool Trk::KalmanUpdator_xk::addToState // Remove local parameters together with error matrix without Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::removeFromState +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::removeFromState (const Trk::TrackParameters& T, const Trk::LocalParameters& P, const Amg::MatrixX & E) const { - Trk::FitQualityOnSurface* Q=nullptr; + Trk::FitQualityOnSurface* Q=nullptr; return update(T,P,E,Q,-1,false); } /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::removeFromState +bool Trk::KalmanUpdator_xk::removeFromState (Trk::PatternTrackParameters& T, const LocalParameters & P, const Amg::MatrixX & E, Trk::PatternTrackParameters& Ta) const { - int n ; + int n ; double x2; return update(T,P,E,-1,false,Ta,x2,n); } @@ -198,7 +198,7 @@ bool Trk::KalmanUpdator_xk::removeFromState // Add local position together with error matrix with Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::addToState +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::addToState (const Trk::TrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E, @@ -209,7 +209,7 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::addToState /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::addToState +bool Trk::KalmanUpdator_xk::addToState (Trk::PatternTrackParameters& T , const Amg::Vector2D & P , const Amg::MatrixX & E , @@ -222,7 +222,7 @@ bool Trk::KalmanUpdator_xk::addToState /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::addToStateOneDimension +bool Trk::KalmanUpdator_xk::addToStateOneDimension (Trk::PatternTrackParameters& T , const Amg::Vector2D & P , const Amg::MatrixX & E , @@ -239,7 +239,7 @@ bool Trk::KalmanUpdator_xk::addToStateOneDimension // Remove local position together with error matrix with Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::removeFromState +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::removeFromState (const Trk::TrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E, @@ -250,7 +250,7 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::removeFromState /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::removeFromState +bool Trk::KalmanUpdator_xk::removeFromState (Trk::PatternTrackParameters& T , const Amg::Vector2D & P , const Amg::MatrixX & E , @@ -265,7 +265,7 @@ bool Trk::KalmanUpdator_xk::removeFromState // Add local parameters together with error matrix with Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::addToState +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::addToState (const Trk::TrackParameters& T, const Trk::LocalParameters& P, const Amg::MatrixX & E, @@ -278,11 +278,11 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::addToState // Add local parameters together with error matrix with Xi2 calculation /////////////////////////////////////////////////////////////////// -std::pair<AmgVector(5),AmgSymMatrix(5)>* Trk::KalmanUpdator_xk::updateParameterDifference +std::pair<AmgVector(5),AmgSymMatrix(5)>* Trk::KalmanUpdator_xk::updateParameterDifference (const AmgVector(5) & T , - const AmgSymMatrix(5) & Et, - const Amg::VectorX & P , - const Amg::MatrixX & Ep, + const AmgSymMatrix(5) & Et, + const Amg::VectorX & P , + const Amg::MatrixX & Ep, const int & K , Trk::FitQualityOnSurface*& Q , bool X) const @@ -295,7 +295,7 @@ std::pair<AmgVector(5),AmgSymMatrix(5)>* Trk::KalmanUpdator_xk::updateParameterD double m[5]; double mv[15]; - m [ 0]=P (0 ); + m [ 0]=P (0 ); mv[ 0]=Ep(0,0); if(n>1) { @@ -323,24 +323,24 @@ std::pair<AmgVector(5),AmgSymMatrix(5)>* Trk::KalmanUpdator_xk::updateParameterD Et(2,0),Et(2,1),Et(2,2), Et(3,0),Et(3,1),Et(3,2),Et(3,3), Et(4,0),Et(4,1),Et(4,2),Et(4,3),Et(4,4)}; - + bool update = false; double x2; if (n==2 && K==3) { update = updateWithTwoDim(1,X,m,mv,p,pv,x2); - if(update && X) Q = new Trk::FitQualityOnSurface(x2,2); + if(update && X) Q = new Trk::FitQualityOnSurface(x2,2); } else if(n==1 && K==1) { update = updateWithOneDim(1,X,m,mv,p,pv,x2); - if(update && X) Q = new Trk::FitQualityOnSurface(x2,1); + if(update && X) Q = new Trk::FitQualityOnSurface(x2,1); } else { update = updateWithAnyDim(1,X,m,mv,p,pv,x2,n,K); - if(update && X) Q = new Trk::FitQualityOnSurface(x2,n); + if(update && X) Q = new Trk::FitQualityOnSurface(x2,n); } if(!update) return nullptr; - testAngles(p,pv); + testAngles(p,pv); AmgVector(5) nT ; nT <<p[0],p[1],p[2],p[3],p[4]; AmgSymMatrix(5) nEt; nEt<< @@ -351,13 +351,13 @@ std::pair<AmgVector(5),AmgSymMatrix(5)>* Trk::KalmanUpdator_xk::updateParameterD pv[10],pv[11],pv[12],pv[13],pv[14]; return new std::pair<AmgVector(5),AmgSymMatrix(5)>(std::make_pair(nT,nEt)); -} +} /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::addToState +bool Trk::KalmanUpdator_xk::addToState (Trk::PatternTrackParameters& T , - const Trk::LocalParameters & P , + const Trk::LocalParameters & P , const Amg::MatrixX & E , Trk::PatternTrackParameters& Ta, double & Q , @@ -370,7 +370,7 @@ bool Trk::KalmanUpdator_xk::addToState // Remove local parameters together with error matrix with Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::removeFromState +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::removeFromState (const Trk::TrackParameters& T, const Trk::LocalParameters& P, const Amg::MatrixX & E, @@ -381,7 +381,7 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::removeFromState /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::removeFromState +bool Trk::KalmanUpdator_xk::removeFromState (Trk::PatternTrackParameters& T , const Trk::LocalParameters & P , const Amg::MatrixX & E , @@ -396,7 +396,7 @@ bool Trk::KalmanUpdator_xk::removeFromState // Combine two state without Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::combineStates +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::combineStates (const Trk::TrackParameters& T1, const Trk::TrackParameters& T2) const { double M[5]; @@ -416,7 +416,7 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::combineStates /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::combineStates +bool Trk::KalmanUpdator_xk::combineStates (Trk::PatternTrackParameters& T1, Trk::PatternTrackParameters& T2, Trk::PatternTrackParameters& T3) const @@ -449,7 +449,7 @@ bool Trk::KalmanUpdator_xk::combineStates // Combine two state with Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::combineStates +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::combineStates (const TrackParameters& T1, const TrackParameters& T2, FitQualityOnSurface*& Q) const { @@ -471,7 +471,7 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::combineStates /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::combineStates +bool Trk::KalmanUpdator_xk::combineStates (Trk::PatternTrackParameters& T1, Trk::PatternTrackParameters& T2, Trk::PatternTrackParameters& T3, @@ -504,9 +504,9 @@ bool Trk::KalmanUpdator_xk::combineStates /////////////////////////////////////////////////////////////////// // Xi2 of Local position /////////////////////////////////////////////////////////////////// - -const Trk::FitQualityOnSurface* -Trk::KalmanUpdator_xk::predictedStateFitQuality + +const Trk::FitQualityOnSurface* +Trk::KalmanUpdator_xk::predictedStateFitQuality (const Trk::TrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E) const @@ -517,14 +517,14 @@ Trk::KalmanUpdator_xk::predictedStateFitQuality double t[5] = {T.parameters()[0],T.parameters()[1], (*v)(0,0),(*v)(1,0),(*v)(1,1)}; - int N; double x2; + int N; double x2; if(predictedStateFitQuality(t,P,E,N,x2)) return new Trk::FitQualityOnSurface(x2,N); return nullptr; } /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::predictedStateFitQuality +bool Trk::KalmanUpdator_xk::predictedStateFitQuality (const Trk::PatternTrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E, @@ -539,14 +539,14 @@ bool Trk::KalmanUpdator_xk::predictedStateFitQuality double t[5] = {p[0],p[1], cov(0, 0),cov(0, 1),cov(1, 1)}; - return predictedStateFitQuality(t,P,E,N,X2); + return predictedStateFitQuality(t,P,E,N,X2); } /////////////////////////////////////////////////////////////////// // Xi2 of Local parameters /////////////////////////////////////////////////////////////////// -const Trk::FitQualityOnSurface* +const Trk::FitQualityOnSurface* Trk::KalmanUpdator_xk::predictedStateFitQuality (const Trk::TrackParameters& T, const Trk::LocalParameters& P, @@ -620,8 +620,8 @@ bool Trk::KalmanUpdator_xk::predictedStateFitQuality /////////////////////////////////////////////////////////////////// // Xi2 of Local position /////////////////////////////////////////////////////////////////// - -const Trk::FitQualityOnSurface* + +const Trk::FitQualityOnSurface* Trk::KalmanUpdator_xk::fullStateFitQuality (const Trk::TrackParameters& T, const Amg::Vector2D & P, @@ -639,7 +639,7 @@ Trk::KalmanUpdator_xk::fullStateFitQuality /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::fullStateFitQuality +bool Trk::KalmanUpdator_xk::fullStateFitQuality (const Trk::PatternTrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E, @@ -654,7 +654,7 @@ bool Trk::KalmanUpdator_xk::fullStateFitQuality double t[5] = {p[0],p[1], cov(0, 0),cov(0, 1),cov(1, 1)}; - return fullStateFitQuality(t,P,E,N,X2); + return fullStateFitQuality(t,P,E,N,X2); } /////////////////////////////////////////////////////////////////// @@ -676,7 +676,7 @@ const Trk::FitQualityOnSurface* Trk::KalmanUpdator_xk::fullStateFitQuality int k; double m[5]; double mv[15]; if(!localParametersToUpdator(P,E,n,k,m,mv)) return nullptr; - + // Xi2 calculation // double r[5]; @@ -684,7 +684,7 @@ const Trk::FitQualityOnSurface* Trk::KalmanUpdator_xk::fullStateFitQuality int ib = m_key[k]; int ie=m_key[k+1]; for(int i=ib; i!=ie; ++i) {w[i-ib] = mv[i-ib]-pv[m_map[i]];} - + bool q=true; if(n!=1) q=invert(n,w,w); else w[0]=1./w[0]; if(q) { @@ -820,7 +820,7 @@ bool Trk::KalmanUpdator_xk::predictedStateFitQuality /////////////////////////////////////////////////////////////////// // let the client tools know how the assumptions on the initial -// precision for non-measured track parameters are configured +// precision for non-measured track parameters are configured /////////////////////////////////////////////////////////////////// std::vector<double> Trk::KalmanUpdator_xk::initialErrors() const @@ -840,11 +840,11 @@ std::vector<double> Trk::KalmanUpdator_xk::initialErrors() const /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// -// Add or remove local position together with error matrix +// Add or remove local position together with error matrix // with or witout Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::update +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::update (const Trk::TrackParameters& T, const Amg::Vector2D & P, const Amg::MatrixX & E, @@ -855,7 +855,7 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::update // Measurement information preparation // double m[2]; - double mv[3]; + double mv[3]; int n = E.rows(); if(n<=0) return nullptr; m [0] = P[0]; mv[0] = E(0,0); @@ -875,38 +875,38 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::update double x2; if (n==2) { update = updateWithTwoDim(O,X,m,mv,p,pv,x2); - if(update && X && !Q) Q = new Trk::FitQualityOnSurface(x2,2); + if(update && X && !Q) Q = new Trk::FitQualityOnSurface(x2,2); } else if(n==1) { update = updateWithOneDim(O,X,m,mv,p,pv,x2); - if(update && X && !Q) Q = new Trk::FitQualityOnSurface(x2,1); + if(update && X && !Q) Q = new Trk::FitQualityOnSurface(x2,1); } if(update) { testAngles(p,pv); return updatorToTrackParameters(T,p,pv); - } + } return nullptr; } // For no measured track parameters // if(O<0) return nullptr; - + if (n==1) { update = updateNoMeasuredWithOneDim(m,mv,p,pv); - if(update && X && !Q) Q = new Trk::FitQualityOnSurface(0.,1); + if(update && X && !Q) Q = new Trk::FitQualityOnSurface(0.,1); } else if(n==2) { update = updateNoMeasuredWithTwoDim(m,mv,p,pv); - if(update && X && !Q) Q = new Trk::FitQualityOnSurface(0.,2); + if(update && X && !Q) Q = new Trk::FitQualityOnSurface(0.,2); } - - if(update) return updatorToTrackParameters(T,p,pv); + + if(update) return updatorToTrackParameters(T,p,pv); return nullptr; } /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::update +bool Trk::KalmanUpdator_xk::update (Trk::PatternTrackParameters& T , const Amg::Vector2D & P , const Amg::MatrixX & E , @@ -919,7 +919,7 @@ bool Trk::KalmanUpdator_xk::update // Measurement information preparation // double m[2]; - double mv[3]; + double mv[3]; N = E.rows(); if(N<=0) return false; m [0] = P[0]; mv[0] = E(0,0); @@ -960,7 +960,7 @@ bool Trk::KalmanUpdator_xk::update /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::updateOneDimension +bool Trk::KalmanUpdator_xk::updateOneDimension (Trk::PatternTrackParameters& T , const Amg::Vector2D & P , const Amg::MatrixX & E , @@ -972,7 +972,7 @@ bool Trk::KalmanUpdator_xk::updateOneDimension // Measurement information preparation // double m[2]; - double mv[3]; + double mv[3]; int N = E.rows(); if(N!=2 ) return false; m [0] = P[0]; m [1] = P[1]; @@ -1012,11 +1012,11 @@ bool Trk::KalmanUpdator_xk::updateOneDimension /////////////////////////////////////////////////////////////////// -// Add or remove local parameters together with error matrix +// Add or remove local parameters together with error matrix // with or witout Xi2 calculation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::update +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::update (const Trk::TrackParameters& T, const Trk::LocalParameters& P, const Amg::MatrixX & E, @@ -1042,15 +1042,15 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::update double x2; if (n==2 && k==3) { update = updateWithTwoDim(O,X,m,mv,p,pv,x2); - if(update && X && !Q) Q = new Trk::FitQualityOnSurface(x2,2); + if(update && X && !Q) Q = new Trk::FitQualityOnSurface(x2,2); } else if(n==1 && k==1) { update = updateWithOneDim(O,X,m,mv,p,pv,x2); - if(update && X && !Q) Q = new Trk::FitQualityOnSurface(x2,1); + if(update && X && !Q) Q = new Trk::FitQualityOnSurface(x2,1); } else { update = updateWithAnyDim(O,X,m,mv,p,pv,x2,n,k); - if(update && X && !Q) Q = new Trk::FitQualityOnSurface(x2,n); + if(update && X && !Q) Q = new Trk::FitQualityOnSurface(x2,n); } if(update) {testAngles(p,pv); return updatorToTrackParameters(T,p,pv);} return nullptr; @@ -1061,15 +1061,15 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::update if(O<0) return nullptr; if (n==1 && k==1) { update = updateNoMeasuredWithOneDim(m,mv,p,pv); - if(update && X && !Q) Q = new Trk::FitQualityOnSurface(0.,1); + if(update && X && !Q) Q = new Trk::FitQualityOnSurface(0.,1); } else if(n==2 && k==3) { update = updateNoMeasuredWithTwoDim(m,mv,p,pv); - if(update && X && !Q) Q = new Trk::FitQualityOnSurface(0.,2); + if(update && X && !Q) Q = new Trk::FitQualityOnSurface(0.,2); } else { update = updateNoMeasuredWithAnyDim(m,mv,p,pv,k); - if(update && X && !Q) Q = new Trk::FitQualityOnSurface(0.,n); + if(update && X && !Q) Q = new Trk::FitQualityOnSurface(0.,n); } if(update) return updatorToTrackParameters(T,p,pv); return nullptr; @@ -1077,7 +1077,7 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::update /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::update +bool Trk::KalmanUpdator_xk::update (Trk::PatternTrackParameters& T , const Trk::LocalParameters & P , const Amg::MatrixX & E , @@ -1092,7 +1092,7 @@ bool Trk::KalmanUpdator_xk::update int k; double m[5]; double mv[15]; if(!localParametersToUpdator(P,E,N,k,m,mv)) return false; - + // Conversion track parameters to updator presentation // double p[5]; @@ -1125,8 +1125,8 @@ bool Trk::KalmanUpdator_xk::update /////////////////////////////////////////////////////////////////// // Xi2 of Local position /////////////////////////////////////////////////////////////////// - -bool Trk::KalmanUpdator_xk::predictedStateFitQuality + +bool Trk::KalmanUpdator_xk::predictedStateFitQuality (const double* T, const Amg::Vector2D & P, const Amg::MatrixX & E, @@ -1136,12 +1136,12 @@ bool Trk::KalmanUpdator_xk::predictedStateFitQuality // Measurement information preparation // double m[2]; - double mv[3]; X2 = 0.; + double mv[3]; X2 = 0.; N = E.rows(); if(N<=0) return false; m [0] = P[0]-T[0]; - mv[0] = E(0,0)+T[2]; + mv[0] = E(0,0)+T[2]; if(N==1) { - + if(mv[0]>0.) X2 = m[0]*m[0]/mv[0]; return true; } @@ -1149,7 +1149,7 @@ bool Trk::KalmanUpdator_xk::predictedStateFitQuality m [1] = P[1]-T[1]; mv[1] = E(1,0)+T[3]; mv[2] = E(1,1)+T[4]; - double d = mv[0]*mv[2]-mv[1]*mv[1]; + double d = mv[0]*mv[2]-mv[1]*mv[1]; if(d>0.) X2 = (m[0]*m[0]*mv[2]+m[1]*m[1]*mv[0]-2.*m[0]*m[1]*mv[1])/d; return true; } @@ -1159,7 +1159,7 @@ bool Trk::KalmanUpdator_xk::predictedStateFitQuality /////////////////////////////////////////////////////////////////// // Xi2 of Local position /////////////////////////////////////////////////////////////////// - + bool Trk::KalmanUpdator_xk::fullStateFitQuality (const double* T, const Amg::Vector2D & P, @@ -1170,12 +1170,12 @@ bool Trk::KalmanUpdator_xk::fullStateFitQuality // Measurement information preparation // double m[2]; - double mv[3]; X2 = 0.; + double mv[3]; X2 = 0.; N = E.rows(); if(N<=0) return false; m [0] = P[0]-T[0]; - mv[0] = E(0,0)-T[2]; + mv[0] = E(0,0)-T[2]; if(N==1) { - + if(mv[0]>0.) X2 = m[0]*m[0]/mv[0]; return true; } @@ -1183,7 +1183,7 @@ bool Trk::KalmanUpdator_xk::fullStateFitQuality m [1] = P[1]-T[1]; mv[1] = E(1,0)-T[3]; mv[2] = E(1,1)-T[4]; - double d = mv[0]*mv[2]-mv[1]*mv[1]; + double d = mv[0]*mv[2]-mv[1]*mv[1]; if(d>0.) X2 = (m[0]*m[0]*mv[2]+m[1]*m[1]*mv[0]-2.*m[0]*m[1]*mv[1])/d; return true; } @@ -1191,7 +1191,7 @@ bool Trk::KalmanUpdator_xk::fullStateFitQuality } /////////////////////////////////////////////////////////////////// -// Add one dimension information to no measured track parameters +// Add one dimension information to no measured track parameters // M and MV is measuremet together with covariance // P and PV is new track parameters together with covarianace /////////////////////////////////////////////////////////////////// @@ -1219,7 +1219,7 @@ bool Trk::KalmanUpdator_xk::updateNoMeasuredWithOneDim } /////////////////////////////////////////////////////////////////// -// Add two dimension information to no measured track parameters +// Add two dimension information to no measured track parameters // M and MV is measuremet together with covariance // P and PV is new track parameters together with covarianace /////////////////////////////////////////////////////////////////// @@ -1248,8 +1248,8 @@ bool Trk::KalmanUpdator_xk::updateNoMeasuredWithTwoDim } /////////////////////////////////////////////////////////////////// -// Add any dimension information (>=1 and <=5) to no measured -// track parameters +// Add any dimension information (>=1 and <=5) to no measured +// track parameters // M and MV is measuremet together with covariance // P and PV is new track parameters together with covarianace // K is key word @@ -1260,7 +1260,7 @@ bool Trk::KalmanUpdator_xk::updateNoMeasuredWithAnyDim { int i=0; - int j=0; + int j=0; while(K) {if(K&1) P[i]=M[j++]; K>>=1; ++i;} if(i==0) return false; PV[ 0] = m_cov0[0]; @@ -1285,7 +1285,7 @@ bool Trk::KalmanUpdator_xk::updateNoMeasuredWithAnyDim } /////////////////////////////////////////////////////////////////// -// Add or remove one dimension information to measured track parameters +// Add or remove one dimension information to measured track parameters // M and MV is measuremet together with covariance // P and PV is new track parameters together with covarianace /////////////////////////////////////////////////////////////////// @@ -1310,7 +1310,7 @@ bool Trk::KalmanUpdator_xk::updateWithOneDim double k4 = PV[10]*w0; if(O<0) {k0=-k0; k1=-k1; k2=-k2; k3=-k3; k4=-k4;} - + // New parameters // P[0]+=(k0*r0); @@ -1321,28 +1321,28 @@ bool Trk::KalmanUpdator_xk::updateWithOneDim // New covariance matrix // - if((PV[14]-= (k4*PV[10]))<=0.) return false; + if((PV[14]-= (k4*PV[10]))<=0.) return false; PV[13]-= (k4*PV[ 6]); PV[12]-= (k4*PV[ 3]); PV[11]-= (k4*PV[ 1]); PV[10]-= (k4*PV[ 0]); - if((PV[ 9]-= (k3*PV[ 6]))<=0.) return false; - PV[ 8]-= (k3*PV[ 3]); - PV[ 7]-= (k3*PV[ 1]); - PV[ 6]-= (k3*PV[ 0]); - if((PV[ 5]-= (k2*PV[ 3]))<=0.) return false; + if((PV[ 9]-= (k3*PV[ 6]))<=0.) return false; + PV[ 8]-= (k3*PV[ 3]); + PV[ 7]-= (k3*PV[ 1]); + PV[ 6]-= (k3*PV[ 0]); + if((PV[ 5]-= (k2*PV[ 3]))<=0.) return false; PV[ 4]-= (k2*PV[ 1]); PV[ 3]-= (k2*PV[ 0]); - if((PV[ 2]-= (k1*PV[ 1]))<=0.) return false; + if((PV[ 2]-= (k1*PV[ 1]))<=0.) return false; PV[ 1]-= (k1*PV[ 0]); - if((PV[ 0]-= (k0*PV[ 0]))<=0.) return false; - + if((PV[ 0]-= (k0*PV[ 0]))<=0.) return false; + if(X) xi2 = r0*r0*w0; return true; } /////////////////////////////////////////////////////////////////// -// Add or remove one dimension information to measured track parameters +// Add or remove one dimension information to measured track parameters // and check boundary for second parameters // M and MV is measuremet together with covariance // P and PV is new track parameters together with covarianace @@ -1368,13 +1368,13 @@ bool Trk::KalmanUpdator_xk::updateWithOneDimWithBoundary double k4 = PV[10]*w0; if(O<0) {k0=-k0; k1=-k1; k2=-k2; k3=-k3; k4=-k4;} - + // Boundary check // double P1 = P[1]+k1*r0 ; double dP = P1-M[1] ; - double W = sqrt(MV[2])*1.732051; - + double W = sqrt(MV[2])*1.732051; + if(fabs(dP) <= W) { P[0]+=(k0*r0); @@ -1392,25 +1392,25 @@ bool Trk::KalmanUpdator_xk::updateWithOneDimWithBoundary // New covariance matrix // - if((PV[14]-= (k4*PV[10]))<=0.) return false; + if((PV[14]-= (k4*PV[10]))<=0.) return false; PV[13]-= (k4*PV[ 6]); PV[12]-= (k4*PV[ 3]); PV[11]-= (k4*PV[ 1]); PV[10]-= (k4*PV[ 0]); - if((PV[ 9]-= (k3*PV[ 6]))<=0.) return false; - PV[ 8]-= (k3*PV[ 3]); - PV[ 7]-= (k3*PV[ 1]); - PV[ 6]-= (k3*PV[ 0]); - if((PV[ 5]-= (k2*PV[ 3]))<=0.) return false; + if((PV[ 9]-= (k3*PV[ 6]))<=0.) return false; + PV[ 8]-= (k3*PV[ 3]); + PV[ 7]-= (k3*PV[ 1]); + PV[ 6]-= (k3*PV[ 0]); + if((PV[ 5]-= (k2*PV[ 3]))<=0.) return false; PV[ 4]-= (k2*PV[ 1]); PV[ 3]-= (k2*PV[ 0]); - if((PV[ 2]-= (k1*PV[ 1]))<=0.) return false; + if((PV[ 2]-= (k1*PV[ 1]))<=0.) return false; PV[ 1]-= (k1*PV[ 0]); return (PV[ 0]-= (k0*PV[ 0])) > 0.; } /////////////////////////////////////////////////////////////////// -// Add or remove two dimension information to measured track parameters +// Add or remove two dimension information to measured track parameters // M and MV is measuremet together with covariance // P and PV is new track parameters together with covarianace /////////////////////////////////////////////////////////////////// @@ -1434,7 +1434,7 @@ bool Trk::KalmanUpdator_xk::updateWithTwoDim // K matrix with (5x2) size // double k0 = PV[ 0]*w0+PV[ 1]*w1; - double k1 = PV[ 0]*w1+PV[ 1]*w2; + double k1 = PV[ 0]*w1+PV[ 1]*w2; double k2 = PV[ 1]*w0+PV[ 2]*w1; double k3 = PV[ 1]*w1+PV[ 2]*w2; double k4 = PV[ 3]*w0+PV[ 4]*w1; @@ -1445,10 +1445,10 @@ bool Trk::KalmanUpdator_xk::updateWithTwoDim double k9 = PV[10]*w1+PV[11]*w2; if(O<0) { - k0=-k0; k1=-k1; k2=-k2; k3=-k3; k4=-k4; + k0=-k0; k1=-k1; k2=-k2; k3=-k3; k4=-k4; k5=-k5; k6=-k6; k7=-k7; k8=-k8; k9=-k9; } - + // New parameters // P[0]+=(k0*r0+k1*r1); @@ -1465,9 +1465,9 @@ bool Trk::KalmanUpdator_xk::updateWithTwoDim PV[11]-= (k8*PV[ 1]+k9*PV[ 2]); PV[10]-= (k8*PV[ 0]+k9*PV[ 1]); if((PV[ 9]-= (k6*PV[ 6]+k7*PV[ 7]))<=0.) return false; - PV[ 8]-= (k6*PV[ 3]+k7*PV[ 4]); - PV[ 7]-= (k6*PV[ 1]+k7*PV[ 2]); - PV[ 6]-= (k6*PV[ 0]+k7*PV[ 1]); + PV[ 8]-= (k6*PV[ 3]+k7*PV[ 4]); + PV[ 7]-= (k6*PV[ 1]+k7*PV[ 2]); + PV[ 6]-= (k6*PV[ 0]+k7*PV[ 1]); if((PV[ 5]-= (k4*PV[ 3]+k5*PV[ 4]))<=0.) return false; PV[ 4]-= (k4*PV[ 1]+k5*PV[ 2]); PV[ 3]-= (k4*PV[ 0]+k5*PV[ 1]); @@ -1475,13 +1475,13 @@ bool Trk::KalmanUpdator_xk::updateWithTwoDim double c1 = (1.-k3)*PV[ 1]-k2*PV[ 0]; if((PV[ 0]-= (k0*PV[ 0]+k1*PV[ 1]))<=0.) return false; PV[ 1] = c1; - + if(X) xi2 = (r0*r0*w0+r1*r1*w2+2.*r0*r1*w1); return true; } /////////////////////////////////////////////////////////////////// -// Add or remove two dimension information to measured track parameters +// Add or remove two dimension information to measured track parameters // without calculation new covariance matrix // M and MV is measuremet together with covariance // P and PV is new track parameters together with covarianace @@ -1506,7 +1506,7 @@ bool Trk::KalmanUpdator_xk::updateWithTwoDimParameters // K matrix with (5x2) size // double k0 = PV[ 0]*w0+PV[ 1]*w1; - double k1 = PV[ 0]*w1+PV[ 1]*w2; + double k1 = PV[ 0]*w1+PV[ 1]*w2; double k2 = PV[ 1]*w0+PV[ 2]*w1; double k3 = PV[ 1]*w1+PV[ 2]*w2; double k4 = PV[ 3]*w0+PV[ 4]*w1; @@ -1517,10 +1517,10 @@ bool Trk::KalmanUpdator_xk::updateWithTwoDimParameters double k9 = PV[10]*w1+PV[11]*w2; if(O<0) { - k0=-k0; k1=-k1; k2=-k2; k3=-k3; k4=-k4; + k0=-k0; k1=-k1; k2=-k2; k3=-k3; k4=-k4; k5=-k5; k6=-k6; k7=-k7; k8=-k8; k9=-k9; } - + // New parameters // P[0]+=(k0*r0+k1*r1); @@ -1533,7 +1533,7 @@ bool Trk::KalmanUpdator_xk::updateWithTwoDimParameters } /////////////////////////////////////////////////////////////////// -// Add or remove two dimension information to measured track parameters +// Add or remove two dimension information to measured track parameters // as one dimension and check boundary for second parameter // M and MV is measuremet together with covariance // P and PV is new track parameters together with covarianace @@ -1557,35 +1557,35 @@ bool Trk::KalmanUpdator_xk::updateWithTwoDimWithBoundary double c = sqrt(c2) ; double s = sc/c ; - // New measurement + // New measurement // double M0 = c*M[0]+s*M[1]; M [ 1] = c*M[1]-s*M[0]; M [ 0] = M0 ; MV[ 0] = V0 ; MV[ 1] = 0. ; - MV[ 2] = V1 ; - + MV[ 2] = V1 ; + // Rotate track parameters and covariance matrix // double P0 = P[0] ; P [ 0] = c*P0 +s*P[1] ; P [ 1] = c*P[1]-s*P0 ; - double B = 2.*sc*PV[ 1] ; + double B = 2.*sc*PV[ 1] ; double PV0 = PV[ 0] ; double PV3 = PV[ 3] ; double PV6 = PV[ 6] ; double PV10= PV[10] ; PV[ 0] = c2*PV0+s2*PV[ 2]+B ; - PV[ 1] = sc*(PV[ 2]-PV0)+PV[ 1]*al; + PV[ 1] = sc*(PV[ 2]-PV0)+PV[ 1]*al; PV[ 2] = s2*PV0+c2*PV[ 2]-B ; PV[ 3] = c*PV3 +s*PV[ 4] ; PV[ 4] = c*PV[ 4]-s*PV3 ; PV[ 6] = c*PV6 +s*PV[ 7] ; PV[ 7] = c*PV[ 7]-s*PV6 ; PV[10] = c*PV10 +s*PV[11] ; - PV[11] = c*PV[11]-s*PV10 ; - + PV[11] = c*PV[11]-s*PV10 ; + if(!updateWithOneDimWithBoundary(O,X,M,MV,P,PV,xi2)) return false; // Back rotation new track parameters and covariance matrix @@ -1595,25 +1595,25 @@ bool Trk::KalmanUpdator_xk::updateWithTwoDimWithBoundary P0 = P[0] ; P [ 0] = c*P0 +s*P[1] ; P [ 1] = c*P[1]-s*P0 ; - B = 2.*sc*PV[ 1] ; + B = 2.*sc*PV[ 1] ; PV0 = PV[ 0] ; PV3 = PV[ 3] ; PV6 = PV[ 6] ; PV10 = PV[10] ; PV[ 0] = c2*PV0+s2*PV[ 2]+B ; - PV[ 1] = sc*(PV[ 2]-PV0)+PV[ 1]*al; + PV[ 1] = sc*(PV[ 2]-PV0)+PV[ 1]*al; PV[ 2] = s2*PV0+c2*PV[ 2]-B ; PV[ 3] = c*PV3 +s*PV[ 4] ; PV[ 4] = c*PV[ 4]-s*PV3 ; PV[ 6] = c*PV6 +s*PV[ 7] ; PV[ 7] = c*PV[ 7]-s*PV6 ; PV[10] = c*PV10 +s*PV[11] ; - PV[11] = c*PV[11]-s*PV10 ; + PV[11] = c*PV[11]-s*PV10 ; return true; } /////////////////////////////////////////////////////////////////// -// Add five dimension information to measured track parameters +// Add five dimension information to measured track parameters // M and MV is measuremet together with covariance // P and PV is new track parameters together with covarianace /////////////////////////////////////////////////////////////////// @@ -1624,12 +1624,12 @@ bool Trk::KalmanUpdator_xk::updateWithFiveDim const double pi2 = 2.*M_PI; const double pi = M_PI; - double w[15]={MV[ 0]+PV[ 0],MV[ 1]+PV[ 1],MV[ 2]+PV[ 2], - MV[ 3]+PV[ 3],MV[ 4]+PV[ 4],MV[ 5]+PV[ 5], - MV[ 6]+PV[ 6],MV[ 7]+PV[ 7],MV[ 8]+PV[ 8], - MV[ 9]+PV[ 9],MV[10]+PV[10],MV[11]+PV[11], + double w[15]={MV[ 0]+PV[ 0],MV[ 1]+PV[ 1],MV[ 2]+PV[ 2], + MV[ 3]+PV[ 3],MV[ 4]+PV[ 4],MV[ 5]+PV[ 5], + MV[ 6]+PV[ 6],MV[ 7]+PV[ 7],MV[ 8]+PV[ 8], + MV[ 9]+PV[ 9],MV[10]+PV[10],MV[11]+PV[11], MV[12]+PV[12],MV[13]+PV[13],MV[14]+PV[14]}; - + if(!invert5(w,w)) return false; double k00 =(PV[ 0]*w[ 0]+PV[ 1]*w[ 1]+PV[ 3]*w[ 3])+(PV[ 6]*w[ 6]+PV[10]*w[10]); @@ -1698,17 +1698,17 @@ bool Trk::KalmanUpdator_xk::updateWithFiveDim if((PV[ 0]-=v0 )<=0.) return false; PV[ 1]-=v1 ; if((PV[ 2]-=v2 )<=0.) return false; - PV[ 3]-=v3 ; - PV[ 4]-=v4 ; + PV[ 3]-=v3 ; + PV[ 4]-=v4 ; if((PV[ 5]-=v5 )<=0.) return false; - PV[ 6]-=v6 ; - PV[ 7]-=v7 ; - PV[ 8]-=v8 ; + PV[ 6]-=v6 ; + PV[ 7]-=v7 ; + PV[ 8]-=v8 ; if((PV[ 9]-=v9 )<=0.) return false; - PV[10]-=v10; - PV[11]-=v11; - PV[12]-=v12; - PV[13]-=v13; + PV[10]-=v10; + PV[11]-=v11; + PV[12]-=v12; + PV[13]-=v13; if((PV[14]-=v14)<=0.) return false; if(X) xi2 = Xi2(5,r,w); @@ -1716,7 +1716,7 @@ bool Trk::KalmanUpdator_xk::updateWithFiveDim } /////////////////////////////////////////////////////////////////// -// Add or remove any dimension information to measured track parameters +// Add or remove any dimension information to measured track parameters // M and MV is measuremet together with covariance // P and PV is new track parameters together with covarianace /////////////////////////////////////////////////////////////////// @@ -1732,9 +1732,9 @@ bool Trk::KalmanUpdator_xk::updateWithAnyDim if(O>0) {s= 1.; for(int i=ib; i!=ie; ++i) {w[i-ib] = MV[i-ib]+PV[m_map[i]];}} else {s=-1.; for(int i=ib; i!=ie; ++i) {w[i-ib] = MV[i-ib]-PV[m_map[i]];}} - + if(N==1) w[0] = 1./w[0]; else if(!invert(N,w,w)) return false; - double v[15]={0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.}; + double v[15]={0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.}; for(int i=ib; i!=ie; ++i) {v[m_map[i]] =w[i-ib];} double k00 =((PV[ 0]*v[ 0]+PV[ 1]*v[ 1]+PV[ 3]*v[ 3])+(PV[ 6]*v[ 6]+PV[10]*v[10]))*s; @@ -1799,13 +1799,13 @@ bool Trk::KalmanUpdator_xk::updateWithAnyDim PV[10]-=v10; PV[11]-=v11; PV[12]-=v12; PV[13]-=v13; PV[14]-=v14; if(PV[0]<=0.||PV[2]<=0.||PV[5]<=0.||PV[9]<=0.||PV[14]<=0.) return false; - + if(X) xi2 = Xi2(5,r,v); return true; } /////////////////////////////////////////////////////////////////// -// Transformation track parameters to updator presentation +// Transformation track parameters to updator presentation // true if it is measured track parameters /////////////////////////////////////////////////////////////////// @@ -1823,15 +1823,15 @@ bool Trk::KalmanUpdator_xk::trackParametersToUpdator if(!v) return false; const AmgSymMatrix(5)& c = *v; - V[ 0] = c(0,0); + V[ 0] = c(0,0); V[ 1] = c(1,0); V[ 2] = c(1,1); V[ 3] = c(2,0); - V[ 4] = c(2,1); + V[ 4] = c(2,1); V[ 5] = c(2,2); - V[ 6] = c(3,0); + V[ 6] = c(3,0); V[ 7] = c(3,1); - V[ 8] = c(3,2); + V[ 8] = c(3,2); V[ 9] = c(3,3); V[10] = c(4,0); V[11] = c(4,1); @@ -1842,7 +1842,7 @@ bool Trk::KalmanUpdator_xk::trackParametersToUpdator } /////////////////////////////////////////////////////////////////// -// Transformation track parameters to updator presentation +// Transformation track parameters to updator presentation // true if it is measured track parameters /////////////////////////////////////////////////////////////////// @@ -1857,7 +1857,7 @@ bool Trk::KalmanUpdator_xk::trackParametersToUpdator P[3] = par[3]; P[4] = par[4]; - if(!T.iscovariance()) return false; + if(!T.iscovariance()) return false; const AmgSymMatrix(5) & cov = *T.covariance(); @@ -1881,8 +1881,8 @@ bool Trk::KalmanUpdator_xk::trackParametersToUpdator /////////////////////////////////////////////////////////////////// // Transformation local parameters to updator presentation -// N - dimension of local parameters,K - key word -// P - parameters, V -covariance +// N - dimension of local parameters,K - key word +// P - parameters, V -covariance /////////////////////////////////////////////////////////////////// bool Trk::KalmanUpdator_xk::localParametersToUpdator @@ -1895,7 +1895,7 @@ bool Trk::KalmanUpdator_xk::localParametersToUpdator //const CLHEP::HepVector& H = L; - P[ 0]=L(0); + P[ 0]=L(0); V[ 0]=C(0,0); if(N>1) { @@ -1921,9 +1921,9 @@ bool Trk::KalmanUpdator_xk::localParametersToUpdator // Track parameters production from updator presentation /////////////////////////////////////////////////////////////////// -Trk::TrackParameters* Trk::KalmanUpdator_xk::updatorToTrackParameters +std::unique_ptr<Trk::TrackParameters> Trk::KalmanUpdator_xk::updatorToTrackParameters (const Trk::TrackParameters& T,double* P,double* V) const -{ +{ AmgSymMatrix(5)* e = new AmgSymMatrix(5); (*e)<< @@ -1932,19 +1932,19 @@ Trk::TrackParameters* Trk::KalmanUpdator_xk::updatorToTrackParameters V[ 3],V[ 4],V[ 5],V[ 8],V[12], V[ 6],V[ 7],V[ 8],V[ 9],V[13], V[10],V[11],V[12],V[13],V[14]; - return T.associatedSurface().createTrackParameters(P[0],P[1],P[2],P[3],P[4],e); + return T.associatedSurface().createUniqueTrackParameters(P[0],P[1],P[2],P[3],P[4],e); } /////////////////////////////////////////////////////////////////// -// Inversion of a positive definite symmetric matrix -// with size (2x2), (3x3), (4x4) and (5x5) +// Inversion of a positive definite symmetric matrix +// with size (2x2), (3x3), (4x4) and (5x5) // Input parameters : n - size of matrix -// a - the elements of the lower triangle of -// the matrix to be inverted -// Output parameters : b - inverted matrix +// a - the elements of the lower triangle of +// the matrix to be inverted +// Output parameters : b - inverted matrix /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::invert(int n,double* a,double* b) const +bool Trk::KalmanUpdator_xk::invert(int n,double* a,double* b) const { if(n==2) return invert2(a,b); if(n==3) return invert3(a,b); @@ -1954,19 +1954,19 @@ bool Trk::KalmanUpdator_xk::invert(int n,double* a,double* b) const } /////////////////////////////////////////////////////////////////// -// Inversion of a positive definite symmetric matrix (2x2) -// using Kramer's rule -// Input parameters : a(0/2) - the elements of the lower triangle of -// the matrix to be inverted -// 0 -// 1 2 -// Output parameters : b(0/2) - inverted matrix +// Inversion of a positive definite symmetric matrix (2x2) +// using Kramer's rule +// Input parameters : a(0/2) - the elements of the lower triangle of +// the matrix to be inverted +// 0 +// 1 2 +// Output parameters : b(0/2) - inverted matrix /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::invert2 (double* a,double* b) const +bool Trk::KalmanUpdator_xk::invert2 (double* a,double* b) const { double d = a[0]*a[2]-a[1]*a[1]; if(d<=0.) return false; d=1./d; - double b0 = a[2]*d; + double b0 = a[2]*d; b[1] =-a[1]*d; b[2] = a[0]*d; b[0] = b0; @@ -1974,17 +1974,17 @@ bool Trk::KalmanUpdator_xk::invert2 (double* a,double* b) const } /////////////////////////////////////////////////////////////////// -// Inversion of a positive definite symmetric matrix (3x3) -// using Kramer's rule -// Input parameters : a(0/5) - the elements of the lower triangle of -// the matrix to be inverted -// 0 -// 1 2 -// 3 4 5 -// Output parameters : b(0/5) - inverted matrix +// Inversion of a positive definite symmetric matrix (3x3) +// using Kramer's rule +// Input parameters : a(0/5) - the elements of the lower triangle of +// the matrix to be inverted +// 0 +// 1 2 +// 3 4 5 +// Output parameters : b(0/5) - inverted matrix /////////////////////////////////////////////////////////////////// -bool Trk::KalmanUpdator_xk::invert3(double* a,double* b) const +bool Trk::KalmanUpdator_xk::invert3(double* a,double* b) const { double b0 = (a[2]*a[5]-a[4]*a[4]); double b1 =-(a[1]*a[5]-a[3]*a[4]); @@ -1992,7 +1992,7 @@ bool Trk::KalmanUpdator_xk::invert3(double* a,double* b) const double b3 = (a[1]*a[4]-a[2]*a[3]); double b4 =-(a[0]*a[4]-a[1]*a[3]); double b5 = (a[0]*a[2]-a[1]*a[1]); - double d = a[0]*b0+a[1]*b1+a[3]*b3; if(d<=0.) return false; + double d = a[0]*b0+a[1]*b1+a[3]*b3; if(d<=0.) return false; b[0] = b0*(d=1./d); b[1] = b1*d; b[2] = b2*d; @@ -2003,15 +2003,15 @@ bool Trk::KalmanUpdator_xk::invert3(double* a,double* b) const } /////////////////////////////////////////////////////////////////// -// Inversion of a positive definite symmetric matrix (4x4) -// using Kramer's rule -// Input parameters : a(0/9) - the elements of the lower triangle of -// the matrix to be inverted -// 0 -// 1 2 -// 3 4 5 -// 6 7 8 9 -// Output parameters : b(0/9) - inverted matrix +// Inversion of a positive definite symmetric matrix (4x4) +// using Kramer's rule +// Input parameters : a(0/9) - the elements of the lower triangle of +// the matrix to be inverted +// 0 +// 1 2 +// 3 4 5 +// 6 7 8 9 +// Output parameters : b(0/9) - inverted matrix /////////////////////////////////////////////////////////////////// bool Trk::KalmanUpdator_xk::invert4(double* a,double* b) const @@ -2030,25 +2030,25 @@ bool Trk::KalmanUpdator_xk::invert4(double* a,double* b) const double d11 = a[4]*a[8]-a[5]*a[7]; double d12 = a[4]*a[9]-a[8]*a[7]; double d13 = a[5]*a[9]-a[8]*a[8]; - + // Determinant calculation // - double c0 = a[2]*d13-a[4]*d12+a[7]*d11; + double c0 = a[2]*d13-a[4]*d12+a[7]*d11; double c1 = a[1]*d13-a[4]*d10+a[7]*d09; double c2 = a[1]*d12-a[2]*d10+a[7]*d08; double c3 = a[1]*d11-a[2]*d09+a[4]*d08; double det = a[0]*c0-a[1]*c1+a[3]*c2-a[6]*c3; - + if (det <= 0.) return false; det = 1./det; - + b[2] = (a[0]*d13-a[3]*d10+a[6]*d09)*det; b[4] = -(a[0]*d12-a[1]*d10+a[6]*d08)*det; b[5] = (a[0]*d07-a[1]*d05+a[6]*d03)*det; b[7] = (a[0]*d11-a[1]*d09+a[3]*d08)*det; b[8] = -(a[0]*d06-a[1]*d04+a[3]*d03)*det; b[9] = (a[0]*d02-a[1]*d01+a[3]*d00)*det; - b[0] = c0 *det; + b[0] = c0 *det; b[1] = -c1 *det; b[3] = c2 *det; b[6] = -c3 *det; @@ -2056,17 +2056,17 @@ bool Trk::KalmanUpdator_xk::invert4(double* a,double* b) const } /////////////////////////////////////////////////////////////////// -// Inversion of a positive definite symmetric matrix (5x5) -// by a modification of the Gauss-Jordan method -// -// Input parameters : a(0/14) - the elements of the lower triangle of -// the matrix to be inverted -// 0 -// 1 2 -// 3 4 5 -// 6 7 8 9 -// 10 11 12 13 14 -// Output parameters : b(0/14) - inverted matrix +// Inversion of a positive definite symmetric matrix (5x5) +// by a modification of the Gauss-Jordan method +// +// Input parameters : a(0/14) - the elements of the lower triangle of +// the matrix to be inverted +// 0 +// 1 2 +// 3 4 5 +// 6 7 8 9 +// 10 11 12 13 14 +// Output parameters : b(0/14) - inverted matrix /////////////////////////////////////////////////////////////////// bool Trk::KalmanUpdator_xk::invert5(double* a,double* b) const @@ -2104,7 +2104,7 @@ bool Trk::KalmanUpdator_xk::invert5(double* a,double* b) const b8 = x5+x2*y4; b9 = x1+x2*y5; x1 = 1./b0; - x2 =-b1*x1; + x2 =-b1*x1; x3 =-b3*x1; x4 = b6*x1; x5 = y2*x1; @@ -2119,7 +2119,7 @@ bool Trk::KalmanUpdator_xk::invert5(double* a,double* b) const b8 = y5+y2*x4; b9 = y1+y2*x5; y1 = 1./b0; - y2 =-b1*y1; + y2 =-b1*y1; y3 = b3*y1; y4 = b6*y1; y5 = x2*y1; @@ -2133,7 +2133,7 @@ bool Trk::KalmanUpdator_xk::invert5(double* a,double* b) const b7 = x4+x2*y3; b8 = x5+x2*y4; b9 = x1+x2*y5; - b[14] = 1./b0; + b[14] = 1./b0; b[10] = b1*b[14]; b[11] = b3*b[14]; b[12] = b6*b[14]; @@ -2152,7 +2152,7 @@ bool Trk::KalmanUpdator_xk::invert5(double* a,double* b) const } /////////////////////////////////////////////////////////////////// -// Xi2 for 2x2, 3x3, 4x4 and 5x5 matrix calculation +// Xi2 for 2x2, 3x3, 4x4 and 5x5 matrix calculation // R - residial and W -weight matrix /////////////////////////////////////////////////////////////////// @@ -2241,27 +2241,27 @@ double Trk::KalmanUpdator_xk::Xi2for5(double* R,double* W) const /////////////////////////////////////////////////////////////////// int Trk::KalmanUpdator_xk::differenceParLoc -(int K,double* L,double* T, double* R) const +(int K,double* L,double* T, double* R) const { const double pi2 = 2.*M_PI; const double pi = M_PI; - + int i = 0; - if(K & 1) {R[i]=L[i]-T[0]; ++i;} + if(K & 1) {R[i]=L[i]-T[0]; ++i;} if(K & 2) {R[i]=L[i]-T[1]; ++i;} if(K & 4) { - R[i]=L[i]-T[2]; + R[i]=L[i]-T[2]; if (R[i] > pi) R[i] = fmod(R[i]+pi,pi2)-pi; else if(R[i] <-pi) R[i] = fmod(R[i]-pi,pi2)+pi; ++i; } if(K & 8) { - R[i]=L[i]-T[3]; + R[i]=L[i]-T[3]; if (R[i] > pi) R[i] = fmod(R[i]+pi,pi2)-pi; else if(R[i] <-pi) R[i] = fmod(R[i]-pi,pi2)+pi; ++i; } - if(K & 16) {R[i]=L[i]-T[4]; ++i;} + if(K & 16) {R[i]=L[i]-T[4]; ++i;} return i; } @@ -2271,20 +2271,20 @@ int Trk::KalmanUpdator_xk::differenceParLoc /////////////////////////////////////////////////////////////////// void Trk::KalmanUpdator_xk::differenceLocPar -(int K,double* L,double* T, double* R) const +(int K,double* L,double* T, double* R) const { const double pi2 = 2.*M_PI; const double pi = M_PI; int i = 0; R[0]=0.; if(K & 1) R[0]=L[i++]-T[0]; - R[1]=0.; if(K & 2) R[1]=L[i++]-T[1]; + R[1]=0.; if(K & 2) R[1]=L[i++]-T[1]; R[2]=0.; if(K & 4) { - R[2]=L[i++]-T[2]; + R[2]=L[i++]-T[2]; if (R[2] > pi) R[2] = fmod(R[2]+pi,pi2)-pi; else if(R[2] <-pi) R[2] = fmod(R[2]-pi,pi2)+pi; } R[3]=0.; if(K & 8){ - R[3]=L[i++]-T[3]; + R[3]=L[i++]-T[3]; if (R[3] > pi) R[3] = fmod(R[3]+pi,pi2)-pi; else if(R[3] <-pi) R[3] = fmod(R[3]-pi,pi2)+pi; } @@ -2302,7 +2302,7 @@ void Trk::KalmanUpdator_xk::mapKeyProduction() for(int K=1; K!= 32; ++K) { unsigned int I[5]={0,0,0,0,0}; - unsigned int m=0; + unsigned int m=0; for(int i=0; i!=5; ++i) {if((K>>i)&1) I[i]=1;} for(int i=0; i!=5; ++i) { @@ -2314,7 +2314,7 @@ void Trk::KalmanUpdator_xk::mapKeyProduction() ///////////////////////////////////////////////////////////////////////////////// // Test angles inside boundaries -// Azimuthal angle p[2] shoud be > -pi and < +pi +// Azimuthal angle p[2] shoud be > -pi and < +pi // Polar angle p[3] shoud be > 0 and < +pi ///////////////////////////////////////////////////////////////////////////////// @@ -2327,14 +2327,14 @@ void Trk::KalmanUpdator_xk::testAngles(double* p,double* v) const // if (p[3] > pi) p[3] = fmod(p[3]+pi,pi2)-pi; else if(p[3] <-pi) p[3] = fmod(p[3]-pi,pi2)+pi; - + if (p[3] < 0.) { p[ 3] = -p[ 3]; p[ 2]+= pi; - v[ 6] = -v[ 6]; - v[ 7] = -v[ 7]; - v[ 8] = -v[ 8]; + v[ 6] = -v[ 6]; + v[ 7] = -v[ 7]; + v[ 8] = -v[ 8]; v[13] = -v[13]; } diff --git a/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/IUpdator.h b/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/IUpdator.h index 3ded01052df5c6bf71eab90a8d5fa49289166a4a..d4a03e594cbc6226418318d0fb0d3e12545f19fc 100755 --- a/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/IUpdator.h +++ b/Tracking/TrkTools/TrkToolInterfaces/TrkToolInterfaces/IUpdator.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration + Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration */ ////////////////////////////////////////////////////////////////// @@ -14,152 +14,220 @@ #ifndef TRK_IUPDATOR_H #define TRK_IUPDATOR_H +#include "EventPrimitives/EventPrimitives.h" #include "GaudiKernel/IAlgTool.h" -#include "TrkParameters/TrackParameters.h" // typedef #include "TrkEventPrimitives/FitQualityOnSurface.h" // typedef -#include "EventPrimitives/EventPrimitives.h" +#include "TrkParameters/TrackParameters.h" // typedef +#include <memory> #include <vector> - static const InterfaceID IID_IUpdator("Trk::IUpdator", 1, 0); namespace Trk { - #ifndef CreateParDef - #define CreateParDef - #define CREATE_PARAMETERS(ref,x,cov) (ref).associatedSurface().createTrackParameters(x[Trk::loc1],x[Trk::loc2],x[Trk::phi],x[Trk::theta],x[Trk::qOverP],cov) - #define CLONEWITHOUTCOV(ref) ref.associatedSurface().createTrackParameters(ref.parameters[Trk::loc1],ref.parameters[Trk::loc2],ref.parameters[Trk::phi],ref.parameters[Trk::theta],ref.parameters[Trk::qOverP],NULL) - #endif - - - class LocalParameters; - - /** @class Trk::IUpdator - - @brief Set of interfaces for methods operating on track states, mainly for Kalman filtering. - - Provides the interface to encapsulate the measurement updating - calculations needed in progressive fitters such as the - TrkKalmanFitter. - The idea is that Updators take care internally of all - calculations needed to update or remove a hit from a state, - and to estimate the chi2 of a state, while the calling - fitter takes care of the iteration strategy itself. - - @author Wolfgang Liebig <http://consult.cern.ch/xwho/people/54608> - */ - - class IUpdator : virtual public IAlgTool { -public: - - /** Algtool infrastructure */ - static const InterfaceID& interfaceID( ) ; - /** updator for Kalman-Filter based algorithms getting the measurement - coordinates from Amg::Vector2D (use for example with PrepRawData) */ - virtual TrackParameters* addToState (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&) const = 0; - /** updator for Kalman-Filter based algorithms getting the measurement - coordinates from LocalParameters (use for example with - MeasurementBase or RIO_OnTrack) */ - virtual TrackParameters* addToState (const TrackParameters&, const LocalParameters&, const Amg::MatrixX&) const = 0; - /** the updator interface with FitQualityOnSurface allows to save the chi2 in - one step with the updating (the chi2 is automatically known during - the updating maths). Version using Amg::Vector2D. */ - virtual TrackParameters* addToState (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&, FitQualityOnSurface*& ) const = 0; - /** the updator interface with FitQualityOnSurface allows to save the chi2 in - one step with the updating (the chi2 is automatically known during - the updating maths). Version using LocalParameters. */ - virtual TrackParameters* addToState (const TrackParameters&, const LocalParameters&, const Amg::MatrixX&, FitQualityOnSurface*& ) const = 0; - - /** the reverse updating or inverse KalmanFilter removes a measurement - from the track state, giving a predicted or unbiased state, here - working with Amg::Vector2D from (for example) PrepRawData objects. - */ - virtual TrackParameters* removeFromState (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&) const = 0; - /** the reverse updating or inverse KalmanFilter removes a measurement - from the track state, giving a predicted or unbiased state, here - working with LocalParameters from (for example) MeasurementBase - or RIO_OnTrack objects. - */ - virtual TrackParameters* removeFromState (const TrackParameters&, const LocalParameters&, const Amg::MatrixX&) const = 0; - /** the reverse updating or inverse KalmanFilter removes a measurement from - the track state, giving a predicted or unbiased state, here working with - with Amg::Vector2D and in addition giving back the fit quality - of the given state. - */ - virtual TrackParameters* removeFromState (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX&, FitQualityOnSurface*&) const = 0; - /** the reverse updating or inverse KalmanFilter removes a measurement - from the track state, giving a predicted or unbiased state, here - working with LocalParameters and in addition giving back the - fit quality of the given state. - */ - virtual TrackParameters* removeFromState (const TrackParameters&, const LocalParameters&, const Amg::MatrixX&, FitQualityOnSurface*&) const = 0; - - /** adds to a track state the parameters from another state using a - statistical combination - use with care! In particular it is the - caller's responsiblility that both states are expressed on the _same_ - surface and that the measurement on this surface is contained in not - more than one of the two states. Method to be used e.g. for Kalman Smoothing - or InDet - Muons track combination. - */ - virtual TrackParameters* combineStates (const TrackParameters&, const TrackParameters&) const = 0; - /** adds to a track state the parameters from another state using a - statistical combination and determines fit quality - use with care! - In particular it is the caller's responsiblility that both states - are expressed on the _same_ surface and that the measurement on - this surface is contained in not more than one of the two states. - Method to be used e.g. for Kalman Smoothing or InDet - Muons track - combination. - */ - virtual TrackParameters* combineStates (const TrackParameters&, const TrackParameters&, FitQualityOnSurface*&) const = 0; - - /** pure AMG interface for reference-track KF, allowing update of parameter differences - */ - virtual std::pair<AmgVector(5), AmgSymMatrix(5)>* updateParameterDifference (const AmgVector(5)&, const AmgSymMatrix(5)&, const Amg::VectorX&, const Amg::MatrixX&, const int&, Trk::FitQualityOnSurface*&, bool ) const = 0; - - /** estimator for FitQuality on Surface from a full track state, - that is a state which contains the current hit (expressed as - Amg::Vector2D). Keep in mind that this job can be done inside - addToState if you have kept the original prediction, thus - saving CPU time. - */ - virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX& ) const = 0; - /** estimator for FitQuality on Surface from a full track state, - that is a state which contains the current hit (expressed as - LocalParameters). Keep in mind that this job can be done inside - addToState if you have kept the original prediction, thus - saving CPU time. +#ifndef CreateParDef +#define CreateParDef +#define CREATE_PARAMETERS(ref, x, cov) \ + (ref).associatedSurface().createUniqueTrackParameters(x[Trk::loc1], \ + x[Trk::loc2], \ + x[Trk::phi], \ + x[Trk::theta], \ + x[Trk::qOverP], \ + cov) +#define CLONEWITHOUTCOV(ref) \ + ref.associatedSurface().createUniqueTrackParameters( \ + ref.parameters[Trk::loc1], \ + ref.parameters[Trk::loc2], \ + ref.parameters[Trk::phi], \ + ref.parameters[Trk::theta], \ + ref.parameters[Trk::qOverP], \ + nullptr) +#endif + +class LocalParameters; + +/** @class Trk::IUpdator + + @brief Set of interfaces for methods operating on track states, mainly for + Kalman filtering. + + Provides the interface to encapsulate the measurement updating + calculations needed in progressive fitters such as the + TrkKalmanFitter. + The idea is that Updators take care internally of all + calculations needed to update or remove a hit from a state, + and to estimate the chi2 of a state, while the calling + fitter takes care of the iteration strategy itself. + + @author Wolfgang Liebig <http://consult.cern.ch/xwho/people/54608> + */ + +class IUpdator : virtual public IAlgTool +{ +public: + /** Algtool infrastructure */ + static const InterfaceID& interfaceID(); + /** updator for Kalman-Filter based algorithms getting the measurement + coordinates from Amg::Vector2D (use for example with PrepRawData) */ + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const = 0; + /** updator for Kalman-Filter based algorithms getting the measurement + coordinates from LocalParameters (use for example with + MeasurementBase or RIO_OnTrack) */ + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const = 0; + /** the updator interface with FitQualityOnSurface allows to save the chi2 in + one step with the updating (the chi2 is automatically known during + the updating maths). Version using Amg::Vector2D. */ + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const = 0; + /** the updator interface with FitQualityOnSurface allows to save the chi2 in + one step with the updating (the chi2 is automatically known during + the updating maths). Version using LocalParameters. */ + virtual std::unique_ptr<TrackParameters> addToState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const = 0; + + /** the reverse updating or inverse KalmanFilter removes a measurement + from the track state, giving a predicted or unbiased state, here + working with Amg::Vector2D from (for example) PrepRawData objects. */ - virtual const FitQualityOnSurface* fullStateFitQuality (const TrackParameters&, const LocalParameters&, const Amg::MatrixX& ) const = 0; - /** estimator for FitQuality on Surface from a predicted track state, - that is a state which does not contain the current hit (expressed as - Amg::Vector2D). Keep in mind that this job is already done inside - addToState if you use the addToState(TP,LP,Err,FQoS) interface, - thus saving CPU time. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const = 0; + /** the reverse updating or inverse KalmanFilter removes a measurement + from the track state, giving a predicted or unbiased state, here + working with LocalParameters from (for example) MeasurementBase + or RIO_OnTrack objects. */ - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, const Amg::Vector2D&, const Amg::MatrixX& ) const = 0; - /** estimator for FitQuality on Surface from a predicted track state, - that is a state which does not contain the current hit (expressed as - LocalParameters). Keep in mind that this job is already done inside - addToState if you use the addToState(TP,LP,Err,FQoS) interface, - thus saving CPU time. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const = 0; + /** the reverse updating or inverse KalmanFilter removes a measurement from + the track state, giving a predicted or unbiased state, here working with + with Amg::Vector2D and in addition giving back the fit quality + of the given state. */ - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, const LocalParameters&, const Amg::MatrixX& ) const = 0; - /** estimator for FitQuality on Surface for the situation when a track - is fitted to the parameters of another trajectory part extrapolated - to the common surface. + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const = 0; + /** the reverse updating or inverse KalmanFilter removes a measurement + from the track state, giving a predicted or unbiased state, here + working with LocalParameters and in addition giving back the + fit quality of the given state. */ - virtual const FitQualityOnSurface* predictedStateFitQuality (const TrackParameters&, const TrackParameters&) const = 0; - - /** let the client tools know how the assumptions on the initial - precision for non-measured track parameters are configured */ - virtual std::vector<double> initialErrors() const = 0; + virtual std::unique_ptr<TrackParameters> removeFromState( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&, + FitQualityOnSurface*&) const = 0; + + /** adds to a track state the parameters from another state using a + statistical combination - use with care! In particular it is the + caller's responsiblility that both states are expressed on the _same_ + surface and that the measurement on this surface is contained in not + more than one of the two states. Method to be used e.g. for Kalman + Smoothing or InDet - Muons track combination. + */ + virtual std::unique_ptr<TrackParameters> combineStates( + const TrackParameters&, + const TrackParameters&) const = 0; + /** adds to a track state the parameters from another state using a + statistical combination and determines fit quality - use with care! + In particular it is the caller's responsiblility that both states + are expressed on the _same_ surface and that the measurement on + this surface is contained in not more than one of the two states. + Method to be used e.g. for Kalman Smoothing or InDet - Muons track + combination. + */ + virtual std::unique_ptr<TrackParameters> combineStates( + const TrackParameters&, + const TrackParameters&, + FitQualityOnSurface*&) const = 0; + + /** pure AMG interface for reference-track KF, allowing update of parameter + * differences + */ + virtual std::pair<AmgVector(5), AmgSymMatrix(5)>* updateParameterDifference( + const AmgVector(5) &, + const AmgSymMatrix(5) &, + const Amg::VectorX&, + const Amg::MatrixX&, + const int&, + Trk::FitQualityOnSurface*&, + bool) const = 0; + + /** estimator for FitQuality on Surface from a full track state, + that is a state which contains the current hit (expressed as + Amg::Vector2D). Keep in mind that this job can be done inside + addToState if you have kept the original prediction, thus + saving CPU time. + */ + virtual const FitQualityOnSurface* fullStateFitQuality( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const = 0; + /** estimator for FitQuality on Surface from a full track state, + that is a state which contains the current hit (expressed as + LocalParameters). Keep in mind that this job can be done inside + addToState if you have kept the original prediction, thus + saving CPU time. + */ + virtual const FitQualityOnSurface* fullStateFitQuality( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const = 0; + /** estimator for FitQuality on Surface from a predicted track state, + that is a state which does not contain the current hit (expressed as + Amg::Vector2D). Keep in mind that this job is already done inside + addToState if you use the addToState(TP,LP,Err,FQoS) interface, + thus saving CPU time. + */ + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const Amg::Vector2D&, + const Amg::MatrixX&) const = 0; + /** estimator for FitQuality on Surface from a predicted track state, + that is a state which does not contain the current hit (expressed as + LocalParameters). Keep in mind that this job is already done inside + addToState if you use the addToState(TP,LP,Err,FQoS) interface, + thus saving CPU time. + */ + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const LocalParameters&, + const Amg::MatrixX&) const = 0; + /** estimator for FitQuality on Surface for the situation when a track + is fitted to the parameters of another trajectory part extrapolated + to the common surface. + */ + virtual const FitQualityOnSurface* predictedStateFitQuality( + const TrackParameters&, + const TrackParameters&) const = 0; + + /** let the client tools know how the assumptions on the initial + precision for non-measured track parameters are configured */ + virtual std::vector<double> initialErrors() const = 0; +}; - }; - } // end of namespace -inline const InterfaceID& Trk::IUpdator::interfaceID() +inline const InterfaceID& +Trk::IUpdator::interfaceID() { - return IID_IUpdator; + return IID_IUpdator; } #endif // TRK_IUPDATOR_H diff --git a/Tracking/TrkValidation/TrkValTools/src/MeasurementVectorNtupleTool.cxx b/Tracking/TrkValidation/TrkValTools/src/MeasurementVectorNtupleTool.cxx index 3050517da861380eac4973df0b60903c600e7e4a..13230e4add6e53aea013351efb1eb5be5c59af9a 100644 --- a/Tracking/TrkValidation/TrkValTools/src/MeasurementVectorNtupleTool.cxx +++ b/Tracking/TrkValidation/TrkValTools/src/MeasurementVectorNtupleTool.cxx @@ -91,7 +91,7 @@ Trk::MeasurementVectorNtupleTool::MeasurementVectorNtupleTool( declareProperty("HoleSearchTool", m_holeSearchTool, "Tool to search for holes on track"); // these are for detector-internal validation, unless an // specific <-> general index hit mapper is there. - declareProperty("PixelNtupleHelperTools", m_PixelNtupleHelperToolHandles, + declareProperty("PixelNtupleHelperTools", m_PixelNtupleHelperToolHandles, "List of Pixel validation tools"); declareProperty("SCTNtupleHelperTools", m_SCTNtupleHelperToolHandles, "List of SCT validation tools"); declareProperty("TRTNtupleHelperTools", m_TRTNtupleHelperToolHandles, "List of TRT validation tools"); @@ -141,7 +141,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::initialize() { if (detStore()->retrieve(m_idHelper, "AtlasID").isFailure()) { ATH_MSG_ERROR ("Could not get AtlasDetectorID helper" ); return StatusCode::FAILURE; - } + } m_detTypeHelper = new MeasurementTypeID(m_idHelper); StatusCode sc(StatusCode::SUCCESS, true); @@ -264,7 +264,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::initialize() { m_GeneralHelperTools.push_back(&(*(*itTools))); m_helperToolWarning[&(*(*itTools))] = false; } - + // get the ResidualPullCalculator if (m_residualPullCalculator.empty()) { msg(MSG::INFO) << "No residual/pull calculator for general hit residuals configured." @@ -290,7 +290,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::initialize() { } } - ATH_MSG_DEBUG ("successfully initialized in " << name()); + ATH_MSG_DEBUG ("successfully initialized in " << name()); return StatusCode::SUCCESS; } @@ -327,20 +327,20 @@ StatusCode Trk::MeasurementVectorNtupleTool::addNtupleItems( TTree* tree ) const ATH_MSG_DEBUG ("added branches to ntuple"); //----------------- // add items *** Note: Documentation is in the header file, doxygen and wikis! *** - // + // tree->Branch("TrackStatesUnbiased", &m_isUnbiased ); m_isUnbiased=999; - + if (!m_residualPullCalculator.empty()) { tree->Branch("pullLocX", &m_pullLocX ); tree->Branch("pullLocY", &m_pullLocY ); tree->Branch("residualLocX", &m_residualLocX ); tree->Branch("residualLocY", &m_residualLocY ); } - + tree->Branch("DetectorType", &m_DetectorType ); tree->Branch("outlierFlag", &m_isOutlier ); - + tree->Branch("nPixelHits", &m_nPixelHits ); tree->Branch("nSCTHits", &m_nSCTHits ); tree->Branch("nTRTHits", &m_nTRTHits ); @@ -348,7 +348,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::addNtupleItems( TTree* tree ) const tree->Branch("nCSCHits", &m_nCSCHits ); tree->Branch("nRPCHits", &m_nRPCHits ); tree->Branch("nTGCHits", &m_nTGCHits ); - + tree->Branch("pixelHitIndex", &m_pixelHitIndex ); tree->Branch("sctHitIndex", &m_sctHitIndex ); tree->Branch("trtHitIndex", &m_trtHitIndex ); @@ -356,7 +356,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::addNtupleItems( TTree* tree ) const tree->Branch("cscHitIndex", &m_cscHitIndex ); tree->Branch("rpcHitIndex", &m_rpcHitIndex ); tree->Branch("tgcHitIndex", &m_tgcHitIndex ); - + ATH_MSG_VERBOSE ("added own branches to ntuple"); StatusCode sc(StatusCode::SUCCESS,true); @@ -476,7 +476,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::fillTrackData ( it!=trackStates->end(); it++) { - + if (!(*it)) { msg(MSG::WARNING) << "TrackStateOnSurface == Null" << endmsg; continue; @@ -496,7 +496,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::fillTrackData ( TrackState::MeasurementType detectorType = m_detTypeHelper->defineType(measurement); const Trk::TrackParameters* theParameters = (*it)->trackParameters(); const Trk::TrackParameters* unbiasedParameters = NULL; - + // ----------------------------------------- // use unbiased track states or normal ones? // unbiased track parameters are tried to retrieve if the updator tool @@ -504,14 +504,14 @@ StatusCode Trk::MeasurementVectorNtupleTool::fillTrackData ( // for the current track (ie. if one trial to get unbiased track states // fails, for all following track states of the current track the biased state // will be used). - if (theParameters && m_updator && (m_isUnbiased==1) + if (theParameters && m_updator && (m_isUnbiased==1) && (detectorType!=TrackState::Pseudo) && (! (*it)->type(Trk::TrackStateOnSurface::Outlier)) ) { if ( theParameters->covariance() ) { // Get unbiased state unbiasedParameters = m_updator->removeFromState( *theParameters, measurement->localParameters(), - measurement->localCovariance()); + measurement->localCovariance()).release(); if (unbiasedParameters) { theParameters = unbiasedParameters; ATH_MSG_VERBOSE ("successfully calculated unbiased state"); @@ -536,7 +536,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::fillTrackData ( } // end if m_updator m_DetectorType->push_back((int)detectorType); - ATH_MSG_VERBOSE ("meas #" << stateIndexCounter << + ATH_MSG_VERBOSE ("meas #" << stateIndexCounter << ": detector technology identified as " << detectorType); if ((fillMeasurementData(measurement, @@ -586,7 +586,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::fillTrackData ( ////////////////////////////////////// /// fill trackparticle data into variables without actually writing the record ////////////////////////////////////// -StatusCode Trk::MeasurementVectorNtupleTool::fillTrackParticleData +StatusCode Trk::MeasurementVectorNtupleTool::fillTrackParticleData ( const Trk::TrackParticleBase&) const { @@ -598,7 +598,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::fillTrackParticleData ////////////////////////////////////// // fill ntuple data of a given proto-trajectory (function used for fitter validation) ////////////////////////////////////// -StatusCode Trk::MeasurementVectorNtupleTool::fillProtoTrajectoryData +StatusCode Trk::MeasurementVectorNtupleTool::fillProtoTrajectoryData ( const Trk::ProtoTrajectory&, const int, const Trk::Perigee*, @@ -752,7 +752,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::fillMeasurementData( m_trkParametersWarning = true; } } - + m_isOutlier->push_back(isOutlier? 1 : 0); if (!m_residualPullCalculator.empty()) { // -------------------------------------- @@ -780,7 +780,7 @@ StatusCode Trk::MeasurementVectorNtupleTool::fillMeasurementData( if (!m_pullWarning && !isOutlier) { // warn only once!!! m_pullWarning = true; msg(MSG::WARNING) << "no covariance of the track parameters given, can not compute pull!" << endmsg; - msg(MSG::INFO) << "Detector type "<< detectorType + msg(MSG::INFO) << "Detector type "<< detectorType << (isOutlier? " (flagged as outlier)" : "(not an outlier)") << endmsg; msg(MSG::INFO) << "you may want to use the jobOption 'IgnoreMissingTrackCovarianceForPulls' to calculate it anyhow." << endmsg; msg(MSG::INFO) << "No further warnings will be given for this type of situation." << endmsg;