1124{
1125 std::vector<int> v_dvtrk_id;
1126 std::vector<float> v_dvtrk_pt;
1127 std::vector<float> v_dvtrk_eta;
1128 std::vector<float> v_dvtrk_phi;
1129 std::vector<int> v_dvtrk_n_hits_inner;
1130 std::vector<int> v_dvtrk_n_hits_pix;
1131 std::vector<int> v_dvtrk_n_hits_sct;
1132 std::vector<float> v_dvtrk_a0beam;
1133 std::unordered_map<Identifier, int> umap_fittedTrack_identifier;
1134 int fittedTrack_id = -1;
1135
1136 static constexpr float TRKCUT_PTGEV_HITDV = 0.5;
1137
1138 for (const auto track: tracks) {
1139 float shift_x = 0; float shift_y = 0;
1141 SG::ReadCondHandle<InDet::BeamSpotData> beamSpotHandle {
m_beamSpotKey, ctx };
1143 }
1144 trackInfo theTrackInfo;
1145 bool igt =
FTF::isGoodTrackUTT(track, theTrackInfo, shift_x, shift_y, TRKCUT_PTGEV_HITDV);
1146 if (not igt) {continue;}
1147
1148 fittedTrack_id++;
1150
1151
1153 m =
track->measurementsOnTrack()->begin(),
1154 me =
track->measurementsOnTrack()->end ();
1155 for(;
m!=me; ++
m ) {
1156 const Trk::PrepRawData* prd = ((const Trk::RIO_OnTrack*)(*m))->prepRawData();
1157 if( prd == nullptr ) continue;
1158 Identifier id_prd = prd->
identify();
1159 if( umap_fittedTrack_identifier.find(id_prd) == umap_fittedTrack_identifier.end() ) {
1160 umap_fittedTrack_identifier.insert(std::make_pair(id_prd,fittedTrack_id));
1161 }
1162 }
1164 v_dvtrk_id.push_back(fittedTrack_id);
1165 v_dvtrk_pt.push_back(theTrackInfo.
ptGeV*Gaudi::Units::GeV);
1166 v_dvtrk_eta.push_back(theTrackInfo.
eta);
1167 v_dvtrk_phi.push_back(
phi);
1168 v_dvtrk_n_hits_inner.push_back(theTrackInfo.
n_hits_inner);
1169 v_dvtrk_n_hits_pix.push_back(theTrackInfo.
n_hits_pix);
1170 v_dvtrk_n_hits_sct.push_back(theTrackInfo.
n_hits_sct);
1171 v_dvtrk_a0beam.push_back(theTrackInfo.
a0beam);
1172 }
1173 ATH_MSG_DEBUG(
"Nr of selected tracks / all = " << fittedTrack_id <<
" / " << tracks.size());
1174 ATH_MSG_DEBUG(
"Nr of Identifiers used by selected tracks = " << umap_fittedTrack_identifier.size());
1175
1176
1177 int n_sp = 0;
1178 int n_sp_usedByTrk = 0;
1179
1180 std::unordered_map<Identifier, int> umap_sp_identifier;
1181 umap_sp_identifier.reserve(1.3*convertedSpacePoints.size());
1182
1183 auto add_to_sp_map = [&](const Trk::PrepRawData* prd) {
1184 if (prd) {
1185 Identifier id_prd = prd->
identify();
1186 if( umap_sp_identifier.find(id_prd) == umap_sp_identifier.end() ) {
1187 umap_sp_identifier.insert(std::make_pair(id_prd,-1));
1188 }
1189 }
1190 };
1191
1192 for(unsigned int iSp=0; iSp<convertedSpacePoints.size(); ++iSp) {
1193 bool isPix = convertedSpacePoints[iSp].isPixel();
1194 bool isSct = convertedSpacePoints[iSp].isSCT();
1195 if( ! isPix && ! isSct ) continue;
1196 const Trk::SpacePoint*
sp = convertedSpacePoints[iSp].offlineSpacePoint();
1197 add_to_sp_map(
sp->clusterList().first);
1198 add_to_sp_map(
sp->clusterList().second);
1199 }
1200 int n_id_usedByTrack = 0;
1201 for(auto it=umap_sp_identifier.begin(); it!=umap_sp_identifier.end(); ++it) {
1202 Identifier id_sp =
it->first;
1203 if( umap_fittedTrack_identifier.find(id_sp) != umap_fittedTrack_identifier.end() ) {
1204 umap_sp_identifier[id_sp] = umap_fittedTrack_identifier[id_sp];
1205 ++n_id_usedByTrack;
1206 }
1207 }
1208 ATH_MSG_DEBUG(
"Nr of SPs / Identifiers (all) / Identifiers (usedByTrack) = " << convertedSpacePoints.size() <<
" / " << umap_sp_identifier.size() <<
" / " << n_id_usedByTrack);
1209
1210 auto sp_map_used_id = [&](const Trk::PrepRawData* prd) {
1211 int usedTrack_id = -1;
1212 if (prd) {
1213 Identifier id_prd = prd->
identify();
1214 if( umap_sp_identifier.find(id_prd) != umap_sp_identifier.end() ) {
1215 usedTrack_id = umap_sp_identifier[id_prd];
1216 }
1217 }
1218 return usedTrack_id;
1219 };
1220
1221 std::vector<float> v_sp_eta;
1222 v_sp_eta.reserve(convertedSpacePoints.size());
1223 std::vector<float> v_sp_r;
1224 v_sp_r.reserve(convertedSpacePoints.size());
1225 std::vector<float> v_sp_phi;
1226 v_sp_phi.reserve(convertedSpacePoints.size());
1227 std::vector<int> v_sp_layer;
1228 v_sp_layer.reserve(convertedSpacePoints.size());
1229 std::vector<bool> v_sp_isPix;
1230 v_sp_isPix.reserve(convertedSpacePoints.size());
1231 std::vector<bool> v_sp_isSct;
1232 v_sp_isSct.reserve(convertedSpacePoints.size());
1233 std::vector<int> v_sp_usedTrkId;
1234 v_sp_usedTrkId.reserve(convertedSpacePoints.size());
1235
1236 for(
const auto&
sp : convertedSpacePoints) {
1238 bool isSct =
sp.isSCT();
1239 if( ! isPix && ! isSct ) continue;
1240 const Trk::SpacePoint* osp =
sp.offlineSpacePoint();
1241
1242 int usedTrack_id = -1;
1243 int usedTrack_id_first = sp_map_used_id(osp->
clusterList().first);
1244 if (usedTrack_id_first != -1) {
1245 usedTrack_id = usedTrack_id_first;
1246 }
1247 int usedTrack_id_second = sp_map_used_id(osp->
clusterList().second);
1248 if (usedTrack_id_second != -1) {
1249 usedTrack_id = usedTrack_id_second;
1250 }
1251
1252
1253 n_sp++;
1254 if( usedTrack_id != -1 ) n_sp_usedByTrk++;
1256 float sp_r =
sp.r();
1257
1259 float sp_eta = pos_sp.eta();
1260 float sp_phi = pos_sp.phi();
1261
1262 v_sp_eta.push_back(sp_eta);
1263 v_sp_r.push_back(sp_r);
1264 v_sp_phi.push_back(sp_phi);
1265 v_sp_layer.push_back(layer);
1266 v_sp_isPix.push_back(isPix);
1267 v_sp_isSct.push_back(isSct);
1268 v_sp_usedTrkId.push_back(usedTrack_id);
1269
1270 ATH_MSG_VERBOSE(
"+++ SP eta / phi / layer / ixPix / usedTrack_id = " << sp_eta <<
" / " << sp_phi <<
" / " << layer <<
" / " << isPix <<
" / " << usedTrack_id);
1271
1272 }
1273 ATH_MSG_DEBUG(
"Nr of SPs / all = " << n_sp <<
" / " << convertedSpacePoints.size());
1274 ATH_MSG_DEBUG(
"Nr of SPs used by selected tracks = " << n_sp_usedByTrk);
1275
1276
1277 std::vector<float> v_seeds_eta;
1278 std::vector<float> v_seeds_phi;
1279 std::vector<int16_t> v_seeds_type;
1280
1282
1283
1284 const unsigned int L1JET_ET_CUT = 27;
1285
1287 const DataVector<xAOD::jFexSRJetRoI> *jetRoiCollection = jetRoiCollectionHandle.cptr();
1288 if (!jetRoiCollectionHandle.isValid()){
1290 return StatusCode::FAILURE;
1291 }
1294 if( jetRoI == nullptr ) continue;
1295
1296 if( jetRoI->
et() >= L1JET_ET_CUT ) {
1297 v_seeds_eta.push_back(jetRoI->
eta());
1298 v_seeds_phi.push_back(jetRoI->
phi());
1299 v_seeds_type.push_back(0);
1300 }
1301 }
1302 ATH_MSG_DEBUG(
"Nr of L1_J" << L1JET_ET_CUT <<
" seeds = " << v_seeds_eta.size());
1303
1304
1305 std::vector<float> v_spseeds_eta;
1306 std::vector<float> v_spseeds_phi;
1307 ATH_CHECK(
findSPSeeds(ctx, v_sp_eta, v_sp_phi, v_sp_layer, v_sp_usedTrkId, v_spseeds_eta, v_spseeds_phi) );
1309 for(
size_t idx=0;
idx<v_spseeds_eta.size(); ++
idx) {
1310 v_seeds_eta.push_back(v_spseeds_eta[idx]);
1311 v_seeds_phi.push_back(v_spseeds_phi[idx]);
1312 v_seeds_type.push_back(1);
1313 }
1314 ATH_MSG_DEBUG(
"Nr of SP + L1_J" << L1JET_ET_CUT <<
" seeds = " << v_seeds_eta.size());
1315 }
1316
1317
1318
1319
1320 const int N_MAX_SEEDS = 200;
1321 int n_seeds = std::min(N_MAX_SEEDS,(int)v_seeds_eta.size());
1322 hitDVSeedsContainer.reserve(n_seeds);
1323 for(auto iSeed=0; iSeed < n_seeds; ++iSeed) {
1325 seed.eta = v_seeds_eta[iSeed];
1326 seed.phi = v_seeds_phi[iSeed];
1327 seed.type = v_seeds_type[iSeed];
1328 hitDVSeedsContainer.push_back(seed);
1329 }
1330
1331
1332 const float TRKCUT_DELTA_R_TO_SEED = 1.0;
1333 hitDVTrksContainer.reserve(v_dvtrk_pt.size());
1334 for(unsigned int iTrk=0; iTrk<v_dvtrk_pt.size(); ++iTrk) {
1335 float trk_eta = v_dvtrk_eta[iTrk];
1336 float trk_phi = v_dvtrk_phi[iTrk];
1338 bool isNearSeed = false;
1339 for (unsigned int iSeed=0; iSeed<v_seeds_eta.size(); ++iSeed) {
1340 float seed_eta = v_seeds_eta[iSeed];
1341 float seed_phi = v_seeds_phi[iSeed];
1342 float dR2 =
deltaR2(trk_eta,trk_phi,seed_eta,seed_phi);
1343 if( dR2 <= TRKCUT_DELTA_R_TO_SEED*TRKCUT_DELTA_R_TO_SEED ) { isNearSeed = true; break; }
1344 }
1345 if( ! isNearSeed ) continue;
1346 }
1347 HitDVTrk hitDVTrk;
1348 hitDVTrk.
id = v_dvtrk_id[iTrk];
1349 hitDVTrk.
pt = v_dvtrk_pt[iTrk];
1350 hitDVTrk.
eta = v_dvtrk_eta[iTrk];
1351 hitDVTrk.
phi = v_dvtrk_phi[iTrk];
1353 hitDVTrk.
n_hits_pix = v_dvtrk_n_hits_pix[iTrk];
1354 hitDVTrk.
n_hits_sct = v_dvtrk_n_hits_sct[iTrk];
1355 hitDVTrk.
a0beam = v_dvtrk_a0beam[iTrk];
1356
1357 hitDVTrksContainer.push_back(hitDVTrk);
1358 }
1359
1360
1361 const float SPCUT_DELTA_R_TO_SEED = 1.0;
1362 const size_t n_sp_max = std::min<size_t>(100000, v_sp_eta.size());
1363 size_t n_sp_stored = 0;
1364
1365 hitDVSPsContainer.reserve(n_sp_max);
1366
1367 for(size_t iSp=0; iSp<v_sp_eta.size(); ++iSp) {
1369 const float sp_eta = v_sp_eta[iSp];
1370 const float sp_phi = v_sp_phi[iSp];
1371 bool isNearSeed = false;
1372 for (size_t iSeed=0; iSeed<v_seeds_eta.size(); ++iSeed) {
1373 const float seed_eta = v_seeds_eta[iSeed];
1374 const float seed_phi = v_seeds_phi[iSeed];
1375 const float dR2 =
deltaR2(sp_eta, sp_phi, seed_eta, seed_phi);
1376 if( dR2 <= SPCUT_DELTA_R_TO_SEED*SPCUT_DELTA_R_TO_SEED ) { isNearSeed = true; break; }
1377 }
1378 if( ! isNearSeed ) continue;
1379 }
1380 if( n_sp_stored >= n_sp_max ) break;
1381 HitDVSpacePoint hitDVSP;
1382 hitDVSP.
eta = v_sp_eta[iSp];
1383 hitDVSP.
r = v_sp_r[iSp];
1384 hitDVSP.
phi = v_sp_phi[iSp];
1385 hitDVSP.
layer = v_sp_layer[iSp];
1386 hitDVSP.
isPix = v_sp_isPix[iSp];
1387 hitDVSP.
isSct = v_sp_isSct[iSp];
1388 hitDVSP.
usedTrkId = v_sp_usedTrkId[iSp];
1389 hitDVSPsContainer.push_back(hitDVSP);
1390 ++n_sp_stored;
1391 }
1393
1394 return StatusCode::SUCCESS;
1395}
Scalar phi() const
phi method
size_t size() const
Number of registered mappings.
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
const T * at(size_type n) const
Access an element, as an rvalue.
SG::ReadHandleKey< xAOD::jFexSRJetRoIContainer > m_jetRoiCollectionKey
SG::ReadCondHandleKey< InDet::BeamSpotData > m_beamSpotKey
Identifier identify() const
return the identifier
const std::pair< const PrepRawData *, const PrepRawData * > & clusterList() const
return the pair of cluster pointers by reference
virtual const Amg::Vector3D & globalPosition() const override final
Interface method to get the global Position.
unsigned int et() const
Methods that require combining results or applying scales.
Eigen::Matrix< double, 3, 1 > Vector3D
void getBeamSpotShift(float &shift_x, float &shift_y, const InDet::BeamSpotData &beamSpotHandle)
bool isGoodTrackUTT(const Trk::Track *track, trackInfo &theTrackInfo, const float shift_x, const float shift_y, float trkcut_ptgev)
jFexSRJetRoI_v1 jFexSRJetRoI
Define the latest version of the jFexSRJetRoI class.