30 return StatusCode::SUCCESS;
37 std::string tree_str =
"FPGATrackSimHoughRootOutput_reg" +
m_region.value();
38 m_tree =
new TTree(tree_str.c_str(), tree_str.c_str());
90 std::string truthtree_str =
"FPGATrackSimTruthTree_reg" +
m_region.value();
91 m_truthtree =
new TTree(truthtree_str.c_str(), truthtree_str.c_str());
121 std::string offltree_str =
"FPGATrackSimOfflineTree_reg" +
m_region.value();
122 m_offlinetree =
new TTree(offltree_str.c_str(), offltree_str.c_str());
145 return StatusCode::SUCCESS;
149 StatusCode FPGATrackSimHoughRootOutputTool::fillTree(
const std::vector<FPGATrackSimTrack> &track_cands,
const std::vector<FPGATrackSimTruthTrack> &truthTracks,
const std::vector<FPGATrackSimOfflineTrack> &offlineTracks,
const std::vector<std::shared_ptr<const FPGATrackSimHit>> &hits_2nd,
const bool writeOutNonSPStripHits,
const bool roadsAreSecondStage)
160 std::vector<float> tmp_hits_x;
161 std::vector<float> tmp_hits_y;
162 std::vector<float> tmp_hits_z;
163 std::vector<float> tmp_hits_R;
164 std::vector<float> tmp_hits_phi;
165 std::vector<int> tmp_hits_layer_disk;
166 std::vector<bool> tmp_hits_mapped;
167 std::vector<bool> tmp_hits_isPixel;
168 std::vector<bool> tmp_hits_isStrip;
169 std::vector<bool> tmp_hits_isClustered;
170 std::vector<bool> tmp_hits_isSpacepoint;
171 std::vector<float> tmp_hits_barcodefrac;
172 std::vector<int> tmp_hits_barcode;
173 std::vector<float> tmp_hits_zIdeal;
174 std::vector<float> tmp_hits_gphiIdeal;
175 std::vector<long> tmp_hits_fineID;
176 std::vector<int> tmp_hits_volumeID;
178 std::vector<float> tmp_hits_x_sorted;
179 std::vector<float> tmp_hits_y_sorted;
180 std::vector<float> tmp_hits_z_sorted;
181 std::vector<float> tmp_hits_R_sorted;
182 std::vector<float> tmp_hits_phi_sorted;
183 std::vector<int> tmp_hits_layer_disk_sorted;
184 std::vector<bool> tmp_hits_isPixel_sorted;
185 std::vector<bool> tmp_hits_isStrip_sorted;
186 std::vector<bool> tmp_hits_isClustered_sorted;
187 std::vector<bool> tmp_hits_isSpacepoint_sorted;
188 std::vector<float> tmp_hits_barcodefrac_sorted;
189 std::vector<int> tmp_hits_barcode_sorted;
190 std::vector<float> tmp_hits_zIdeal_sorted;
191 std::vector<float> tmp_hits_gphiIdeal_sorted;
192 std::vector<long> tmp_hits_fineID_sorted;
193 std::vector<int> tmp_hits_volumeID_sorted;
195 std::vector<bool> tmp_hits_mapped_sorted;
196 bool has_strip_nonspacepoint;
201 for (
const auto &
track : truthTracks) {
203 if (
track.getStatus() != 1)
continue;
210 tmp_hits_phi.clear();
211 tmp_hits_layer_disk.clear();
212 tmp_hits_mapped.clear();
213 tmp_hits_isPixel.clear();
214 tmp_hits_isStrip.clear();
215 tmp_hits_isClustered.clear();
216 tmp_hits_isSpacepoint.clear();
217 tmp_hits_barcodefrac.clear();
218 tmp_hits_barcode.clear();
219 tmp_hits_zIdeal.clear();
220 tmp_hits_gphiIdeal.clear();
221 tmp_hits_fineID.clear();
223 tmp_hits_x_sorted.clear();
224 tmp_hits_y_sorted.clear();
225 tmp_hits_z_sorted.clear();
226 tmp_hits_R_sorted.clear();
227 tmp_hits_phi_sorted.clear();
228 tmp_hits_layer_disk_sorted.clear();
229 tmp_hits_mapped_sorted.clear();
230 tmp_hits_isPixel_sorted.clear();
231 tmp_hits_isStrip_sorted.clear();
232 tmp_hits_isClustered_sorted.clear();
233 tmp_hits_isSpacepoint_sorted.clear();
234 tmp_hits_barcodefrac_sorted.clear();
235 tmp_hits_barcode_sorted.clear();
236 tmp_hits_zIdeal_sorted.clear();
237 tmp_hits_gphiIdeal_sorted.clear();
238 tmp_hits_fineID_sorted.clear();
239 tmp_hits_volumeID.clear();
241 has_strip_nonspacepoint =
false;
244 std::vector<float> idealized_coords;
249 for (
auto hit : hits_2nd) {
251 if (hit->getBarcode() ==
track.getBarcode()) {
253 if (hit->isPixel() == 0 && hit->getHitType() !=
HitType::spacepoint) {has_strip_nonspacepoint =
true;}
258 const bool ok = truth.
best(tbarcode, tfrac);
259 if (tfrac < 1.0) {
continue; }
261 tmp_hits_barcode.push_back((
int)(tbarcode.second));
262 tmp_hits_barcodefrac.push_back(tfrac);
265 tmp_hits_barcode.push_back(-1);
266 tmp_hits_barcodefrac.push_back(-1);
269 tmp_hits_x.push_back(hit->getX());
270 tmp_hits_y.push_back(hit->getY());
271 tmp_hits_z.push_back(hit->getZ());
272 tmp_hits_R.push_back(hit->getR());
273 tmp_hits_phi.push_back(hit->getGPhi());
274 tmp_hits_layer_disk.push_back(hit->getLayerDisk(
true));
276 tmp_hits_mapped.push_back(hit->isMapped());
277 tmp_hits_isPixel.push_back(hit->isPixel());
278 tmp_hits_isStrip.push_back(hit->isStrip());
279 tmp_hits_isClustered.push_back(hit->isClustered());
281 tmp_hits_fineID.push_back(
getFineID(*hit));
285 tmp_hits_zIdeal.push_back(idealized_coords[0]);
286 tmp_hits_gphiIdeal.push_back(idealized_coords[1]);
289 tmp_hits_isSpacepoint.push_back(
true);
292 tmp_hits_isSpacepoint.push_back(
false);
300 if ( (! writeOutNonSPStripHits & has_strip_nonspacepoint)) {
301 ATH_MSG_DEBUG(
"Truth Track is not written to HoughRootOutput file, because it contains a non-SP strip hit!");
305 std::vector<int> sorting_index(tmp_hits_R.size(), 0);
306 for (
unsigned int i = 0 ;
i != sorting_index.size() ;
i++) {
307 sorting_index[
i] =
i;
309 sort(sorting_index.begin(), sorting_index.end(),
310 [&](
const int&
a,
const int&
b) {
311 return (tmp_hits_R[a] < tmp_hits_R[b]);
315 for (
unsigned int i = 0 ;
i != sorting_index.size() ;
i++) {
316 tmp_hits_x_sorted.push_back(tmp_hits_x[sorting_index[
i]]);
317 tmp_hits_y_sorted.push_back(tmp_hits_y[sorting_index[
i]]);
318 tmp_hits_z_sorted.push_back(tmp_hits_z[sorting_index[
i]]);
319 tmp_hits_R_sorted.push_back(tmp_hits_R[sorting_index[
i]]);
320 tmp_hits_phi_sorted.push_back(tmp_hits_phi[sorting_index[
i]]);
321 tmp_hits_layer_disk_sorted.push_back(tmp_hits_layer_disk[sorting_index[
i]]);
322 tmp_hits_isPixel_sorted.push_back(tmp_hits_isPixel[sorting_index[
i]]);
323 tmp_hits_isStrip_sorted.push_back(tmp_hits_isStrip[sorting_index[
i]]);
324 tmp_hits_isClustered_sorted.push_back(tmp_hits_isClustered[sorting_index[
i]]);
325 tmp_hits_isSpacepoint_sorted.push_back(tmp_hits_isSpacepoint[sorting_index[
i]]);
326 tmp_hits_barcode_sorted.push_back(tmp_hits_barcode[sorting_index[
i]]);
327 tmp_hits_barcodefrac_sorted.push_back(tmp_hits_barcodefrac[sorting_index[
i]]);
328 tmp_hits_zIdeal_sorted.push_back(tmp_hits_zIdeal[sorting_index[
i]]);
329 tmp_hits_gphiIdeal_sorted.push_back(tmp_hits_gphiIdeal[sorting_index[
i]]);
330 tmp_hits_fineID_sorted.push_back(tmp_hits_fineID[sorting_index[
i]]);
331 tmp_hits_volumeID_sorted.push_back(tmp_hits_volumeID[sorting_index[
i]]);
332 tmp_hits_mapped_sorted.push_back(tmp_hits_mapped[sorting_index[
i]]);
372 for (
const auto &
track : offlineTracks) {
384 int nhole(0), nmeasurement(0), ninert(0), nbrem(0), nscatter(0), nperigee(0), noutlier(0), nother(0);
385 for (
const auto& hit :
track.getOfflineHits()) {
408 std::vector<FPGATrackSimMultiTruth> mtv;
412 for (
size_t iroad = 0; iroad < track_cands.size(); iroad++) {
416 if (roadsAreSecondStage) {
423 m_roadChi2.push_back(track_cands[iroad].getChi2ndof());
442 mtv.push_back( truth );
446 const bool ok = truth.
best(tbarcode,tfrac);
449 m_barcode.push_back((
int)(tbarcode.second));
459 std::shared_ptr<const FPGATrackSimHit> hit_ptr = std::make_shared<const FPGATrackSimHit>(hit);
462 m_x.push_back(hit.getX());
463 m_y.push_back(hit.getY());
464 m_z.push_back(hit.getZ());
467 m_layerID.push_back(hit.getLayerDisk(
true));
468 m_etaID.push_back(hit.getEtaModule(
true));
470 m_gphi.push_back(hit.getGPhi());
471 m_zIdeal.push_back(idealized_coords[0]);
473 m_isPixel.push_back(hit.isPixel() ? 1 : 0);
474 m_layer.push_back(hit.getLayer());
480 m_ID.push_back(hit.getIdentifierHash());
491 const bool ok = mt.
best(tbarcode,tfrac);
506 for (
const auto &
track : truthTracks) {
508 if (
track.getStatus() != 1)
continue;
526 return StatusCode::SUCCESS;
531 StatusCode FPGATrackSimHoughRootOutputTool::fillTree(
const std::vector<std::shared_ptr<const FPGATrackSimRoad>> &roads,
const std::vector<FPGATrackSimTruthTrack> &truthTracks,
const std::vector<FPGATrackSimOfflineTrack> &offlineTracks,
const std::vector<std::shared_ptr<const FPGATrackSimHit>> &hits_2nd,
const bool writeOutNonSPStripHits,
const float minChi2,
const int maxOverlappingHits,
const bool roadsAreSecondStage)
537 std::vector<FPGATrackSimTrack> track_cands;
539 for (
size_t iroad = 0; iroad < roads.size(); iroad++) {
541 std::shared_ptr<const FPGATrackSimRoad> road = roads[iroad];
542 std::vector<FPGATrackSimTrack> track_cand;
543 if (road ==
nullptr)
continue;
547 if (roadsAreSecondStage) {
565 if (roadsAreSecondStage) {
585 for (
auto const &tr : track_cand) {
586 track_cands.push_back(tr);
592 for (
auto const &cand : track_cands) {
593 if (cand.passedOR()) {
600 return fillTree(track_cands, truthTracks, offlineTracks, hits_2nd, writeOutNonSPStripHits, roadsAreSecondStage);