Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-05-09 22:40:19

0001 #include "RecoTracker/LSTCore/interface/alpaka/LST.h"
0002 
0003 #include "LSTEvent.h"
0004 
0005 using namespace ALPAKA_ACCELERATOR_NAMESPACE::lst;
0006 
0007 #include "Math/Vector3D.h"
0008 #include "Math/VectorUtil.h"
0009 using XYZVector = ROOT::Math::XYZVector;
0010 
0011 namespace {
0012   using namespace ALPAKA_ACCELERATOR_NAMESPACE::lst;
0013   std::vector<unsigned int> getHitIdxs(short trackCandidateType,
0014                                        Params_pT5::ArrayUxHits const& tcHitIndices,
0015                                        unsigned int const* hitIndices) {
0016     std::vector<unsigned int> hits;
0017 
0018     unsigned int maxNHits = 0;
0019     if (trackCandidateType == LSTObjType::pT5)
0020       maxNHits = Params_pT5::kHits;
0021     else if (trackCandidateType == LSTObjType::pT3)
0022       maxNHits = Params_pT3::kHits;
0023     else if (trackCandidateType == LSTObjType::T5)
0024       maxNHits = Params_T5::kHits;
0025     else if (trackCandidateType == LSTObjType::pLS)
0026       maxNHits = Params_pLS::kHits;
0027 
0028     for (unsigned int i = 0; i < maxNHits; i++) {
0029       unsigned int hitIdxDev = tcHitIndices[i];
0030       unsigned int hitIdx =
0031           (trackCandidateType == LSTObjType::pLS)
0032               ? hitIdxDev
0033               : hitIndices[hitIdxDev];  // Hit indices are stored differently in the standalone for pLS.
0034 
0035       // For p objects, the 3rd and 4th hit maybe the same,
0036       // due to the way pLS hits are stored in the standalone.
0037       // This is because pixel seeds can be either triplets or quadruplets.
0038       if (trackCandidateType != LSTObjType::T5 && hits.size() == 3 &&
0039           hits.back() == hitIdx)  // Remove duplicate 4th hits.
0040         continue;
0041 
0042       hits.push_back(hitIdx);
0043     }
0044 
0045     return hits;
0046   }
0047 
0048 }  // namespace
0049 
0050 void LST::getOutput(LSTEvent& event) {
0051   out_tc_hitIdxs_.clear();
0052   out_tc_len_.clear();
0053   out_tc_seedIdx_.clear();
0054   out_tc_trackCandidateType_.clear();
0055 
0056   auto const hitsBase = event.getTrimmedHitsBase(false);  // sync on next line
0057   auto const& trackCandidates = event.getTrackCandidates(/*inCMSSW*/ true, /*sync*/ true);
0058 
0059   unsigned int nTrackCandidates = trackCandidates.nTrackCandidates();
0060 
0061   for (unsigned int idx = 0; idx < nTrackCandidates; idx++) {
0062     short trackCandidateType = trackCandidates.trackCandidateType()[idx];
0063     std::vector<unsigned int> hit_idx =
0064         getHitIdxs(trackCandidateType, trackCandidates.hitIndices()[idx], hitsBase.idxs());
0065 
0066     out_tc_hitIdxs_.push_back(hit_idx);
0067     out_tc_len_.push_back(hit_idx.size());
0068     out_tc_seedIdx_.push_back(trackCandidates.pixelSeedIndex()[idx]);
0069     out_tc_trackCandidateType_.push_back(trackCandidateType);
0070   }
0071 }
0072 
0073 void LST::run(Queue& queue,
0074               bool verbose,
0075               float const ptCut,
0076               LSTESData<Device> const* deviceESData,
0077               LSTInputDeviceCollection const* lstInputDC,
0078               bool no_pls_dupclean,
0079               bool tc_pls_triplets) {
0080   auto event = LSTEvent(verbose, ptCut, queue, deviceESData);
0081 
0082   event.addInputToEvent(lstInputDC);
0083   event.addHitToEvent();
0084   event.addPixelSegmentToEventStart();
0085   event.createMiniDoublets();
0086   if (verbose) {
0087     alpaka::wait(queue);  // event calls are asynchronous: wait before printing
0088     printf("# of Mini-doublets produced: %d\n", event.getNumberOfMiniDoublets());
0089     printf("# of Mini-doublets produced barrel layer 1: %d\n", event.getNumberOfMiniDoubletsByLayerBarrel(0));
0090     printf("# of Mini-doublets produced barrel layer 2: %d\n", event.getNumberOfMiniDoubletsByLayerBarrel(1));
0091     printf("# of Mini-doublets produced barrel layer 3: %d\n", event.getNumberOfMiniDoubletsByLayerBarrel(2));
0092     printf("# of Mini-doublets produced barrel layer 4: %d\n", event.getNumberOfMiniDoubletsByLayerBarrel(3));
0093     printf("# of Mini-doublets produced barrel layer 5: %d\n", event.getNumberOfMiniDoubletsByLayerBarrel(4));
0094     printf("# of Mini-doublets produced barrel layer 6: %d\n", event.getNumberOfMiniDoubletsByLayerBarrel(5));
0095     printf("# of Mini-doublets produced endcap layer 1: %d\n", event.getNumberOfMiniDoubletsByLayerEndcap(0));
0096     printf("# of Mini-doublets produced endcap layer 2: %d\n", event.getNumberOfMiniDoubletsByLayerEndcap(1));
0097     printf("# of Mini-doublets produced endcap layer 3: %d\n", event.getNumberOfMiniDoubletsByLayerEndcap(2));
0098     printf("# of Mini-doublets produced endcap layer 4: %d\n", event.getNumberOfMiniDoubletsByLayerEndcap(3));
0099     printf("# of Mini-doublets produced endcap layer 5: %d\n", event.getNumberOfMiniDoubletsByLayerEndcap(4));
0100   }
0101 
0102   event.createSegmentsWithModuleMap();
0103   if (verbose) {
0104     alpaka::wait(queue);  // event calls are asynchronous: wait before printing
0105     printf("# of Segments produced: %d\n", event.getNumberOfSegments());
0106     printf("# of Segments produced layer 1-2:  %d\n", event.getNumberOfSegmentsByLayerBarrel(0));
0107     printf("# of Segments produced layer 2-3:  %d\n", event.getNumberOfSegmentsByLayerBarrel(1));
0108     printf("# of Segments produced layer 3-4:  %d\n", event.getNumberOfSegmentsByLayerBarrel(2));
0109     printf("# of Segments produced layer 4-5:  %d\n", event.getNumberOfSegmentsByLayerBarrel(3));
0110     printf("# of Segments produced layer 5-6:  %d\n", event.getNumberOfSegmentsByLayerBarrel(4));
0111     printf("# of Segments produced endcap layer 1:  %d\n", event.getNumberOfSegmentsByLayerEndcap(0));
0112     printf("# of Segments produced endcap layer 2:  %d\n", event.getNumberOfSegmentsByLayerEndcap(1));
0113     printf("# of Segments produced endcap layer 3:  %d\n", event.getNumberOfSegmentsByLayerEndcap(2));
0114     printf("# of Segments produced endcap layer 4:  %d\n", event.getNumberOfSegmentsByLayerEndcap(3));
0115     printf("# of Segments produced endcap layer 5:  %d\n", event.getNumberOfSegmentsByLayerEndcap(4));
0116   }
0117 
0118   event.createTriplets();
0119   if (verbose) {
0120     alpaka::wait(queue);  // event calls are asynchronous: wait before printing
0121     printf("# of T3s produced: %d\n", event.getNumberOfTriplets());
0122     printf("# of T3s produced layer 1-2-3: %d\n", event.getNumberOfTripletsByLayerBarrel(0));
0123     printf("# of T3s produced layer 2-3-4: %d\n", event.getNumberOfTripletsByLayerBarrel(1));
0124     printf("# of T3s produced layer 3-4-5: %d\n", event.getNumberOfTripletsByLayerBarrel(2));
0125     printf("# of T3s produced layer 4-5-6: %d\n", event.getNumberOfTripletsByLayerBarrel(3));
0126     printf("# of T3s produced endcap layer 1-2-3: %d\n", event.getNumberOfTripletsByLayerEndcap(0));
0127     printf("# of T3s produced endcap layer 2-3-4: %d\n", event.getNumberOfTripletsByLayerEndcap(1));
0128     printf("# of T3s produced endcap layer 3-4-5: %d\n", event.getNumberOfTripletsByLayerEndcap(2));
0129     printf("# of T3s produced endcap layer 1: %d\n", event.getNumberOfTripletsByLayerEndcap(0));
0130     printf("# of T3s produced endcap layer 2: %d\n", event.getNumberOfTripletsByLayerEndcap(1));
0131     printf("# of T3s produced endcap layer 3: %d\n", event.getNumberOfTripletsByLayerEndcap(2));
0132     printf("# of T3s produced endcap layer 4: %d\n", event.getNumberOfTripletsByLayerEndcap(3));
0133     printf("# of T3s produced endcap layer 5: %d\n", event.getNumberOfTripletsByLayerEndcap(4));
0134   }
0135 
0136   event.createQuintuplets();
0137   if (verbose) {
0138     alpaka::wait(queue);  // event calls are asynchronous: wait before printing
0139     printf("# of Quintuplets produced: %d\n", event.getNumberOfQuintuplets());
0140     printf("# of Quintuplets produced layer 1-2-3-4-5-6: %d\n", event.getNumberOfQuintupletsByLayerBarrel(0));
0141     printf("# of Quintuplets produced layer 2: %d\n", event.getNumberOfQuintupletsByLayerBarrel(1));
0142     printf("# of Quintuplets produced layer 3: %d\n", event.getNumberOfQuintupletsByLayerBarrel(2));
0143     printf("# of Quintuplets produced layer 4: %d\n", event.getNumberOfQuintupletsByLayerBarrel(3));
0144     printf("# of Quintuplets produced layer 5: %d\n", event.getNumberOfQuintupletsByLayerBarrel(4));
0145     printf("# of Quintuplets produced layer 6: %d\n", event.getNumberOfQuintupletsByLayerBarrel(5));
0146     printf("# of Quintuplets produced endcap layer 1: %d\n", event.getNumberOfQuintupletsByLayerEndcap(0));
0147     printf("# of Quintuplets produced endcap layer 2: %d\n", event.getNumberOfQuintupletsByLayerEndcap(1));
0148     printf("# of Quintuplets produced endcap layer 3: %d\n", event.getNumberOfQuintupletsByLayerEndcap(2));
0149     printf("# of Quintuplets produced endcap layer 4: %d\n", event.getNumberOfQuintupletsByLayerEndcap(3));
0150     printf("# of Quintuplets produced endcap layer 5: %d\n", event.getNumberOfQuintupletsByLayerEndcap(4));
0151   }
0152 
0153   event.addPixelSegmentToEventFinalize();
0154 
0155   event.pixelLineSegmentCleaning(no_pls_dupclean);
0156 
0157   event.createPixelQuintuplets();
0158   if (verbose) {
0159     alpaka::wait(queue);  // event calls are asynchronous: wait before printing
0160     printf("# of Pixel Quintuplets produced: %d\n", event.getNumberOfPixelQuintuplets());
0161   }
0162 
0163   event.createPixelTriplets();
0164   if (verbose) {
0165     alpaka::wait(queue);  // event calls are asynchronous: wait before printing
0166     printf("# of Pixel T3s produced: %d\n", event.getNumberOfPixelTriplets());
0167   }
0168 
0169   event.createTrackCandidates(no_pls_dupclean, tc_pls_triplets);
0170   if (verbose) {
0171     alpaka::wait(queue);  // event calls are asynchronous: wait before printing
0172     printf("# of TrackCandidates produced: %d\n", event.getNumberOfTrackCandidates());
0173     printf("        # of Pixel TrackCandidates produced: %d\n", event.getNumberOfPixelTrackCandidates());
0174     printf("        # of pT5 TrackCandidates produced: %d\n", event.getNumberOfPT5TrackCandidates());
0175     printf("        # of pT3 TrackCandidates produced: %d\n", event.getNumberOfPT3TrackCandidates());
0176     printf("        # of pLS TrackCandidates produced: %d\n", event.getNumberOfPLSTrackCandidates());
0177     printf("        # of T5 TrackCandidates produced: %d\n", event.getNumberOfT5TrackCandidates());
0178   }
0179 
0180   getOutput(event);
0181 }