3030#include " Common/TableProducer/PID/pidTPCBase.h" // IWYU pragma: keep
3131#include " Tools/ML/model.h"
3232
33+ #include < CommonConstants/MathConstants.h>
3334#include < DataFormatsParameters/GRPLHCIFData.h>
3435#include < Framework/AnalysisDataModel.h>
3536#include < Framework/AnalysisHelpers.h>
@@ -445,6 +446,13 @@ class pidTPCModule
445446 template <typename TCCDB , typename M, typename T, typename B>
446447 std::vector<float > createNetworkPrediction (TCCDB & ccdb, soa::Join<aod::Collisions, aod::EvSels> const & collisions, M const & mults, T const & tracks, B const & bcs, const size_t size)
447448 {
449+ constexpr int NParticleTypes = 9 ;
450+ constexpr double OneToKilo = 1 .e -3 ;
451+ constexpr double MultiplicityNorm = 11000 .;
452+ constexpr double HadronicRateNormPp = 1500 .;
453+ constexpr double HadronicRateNormAa = 50 .;
454+ constexpr double Ft0cOccupancyNorm = 60000 .;
455+ constexpr int NumberOfTpcSectors = 18 ;
448456
449457 std::vector<float > networkPrediction;
450458
@@ -505,7 +513,7 @@ class pidTPCModule
505513 const uint64_t trackPropSize = inputDimensions * size;
506514 const uint64_t predictionSize = outputDimensions * size;
507515
508- networkPrediction = std::vector<float >(predictionSize * 9 ); // For each mass hypotheses
516+ networkPrediction = std::vector<float >(predictionSize * NParticleTypes ); // For each mass hypotheses
509517 const float nNclNormalization = response->GetNClNormalization ();
510518 float durationNetwork = 0 ;
511519
@@ -520,22 +528,22 @@ class pidTPCModule
520528 for (const auto & collision : collisions) {
521529 const auto & bc = collision.template bc_as <B>();
522530 if (irSource.compare (" " ) != 0 ) {
523- hadronicRateForCollision[i] = mRateFetcher .fetch (ccdb.service , bc.timestamp (), bc.runNumber (), irSource) * 1 . e - 3 ;
531+ hadronicRateForCollision[i] = mRateFetcher .fetch (ccdb.service , bc.timestamp (), bc.runNumber (), irSource) * OneToKilo ;
524532 } else {
525533 hadronicRateForCollision[i] = 0 .0f ;
526534 }
527535 i++;
528536 }
529537 auto bc = bcs.begin ();
530538 if (irSource.compare (" " ) != 0 ) {
531- hadronicRateBegin = mRateFetcher .fetch (ccdb.service , bc.timestamp (), bc.runNumber (), irSource) * 1 . e - 3 ; // kHz
539+ hadronicRateBegin = mRateFetcher .fetch (ccdb.service , bc.timestamp (), bc.runNumber (), irSource) * OneToKilo;
532540 } else {
533541 hadronicRateBegin = 0 .0f ;
534542 }
535543
536544 // Filling a std::vector<float> to be evaluated by the network
537545 // Evaluation on single tracks brings huge overhead: Thus evaluation is done on one large vector
538- static constexpr int NParticleTypes = 9 ;
546+
539547 constexpr int ExpectedInputDimensionsNNV2 = 7 ;
540548 constexpr int ExpectedInputDimensionsNNV3 = 8 ;
541549 constexpr int ExpectedInputDimensionsNNV4 = 9 ;
@@ -556,46 +564,46 @@ class pidTPCModule
556564 trackProperties[counterTrackProps + 1 ] = trk.tgl ();
557565 trackProperties[counterTrackProps + 2 ] = trk.signed1Pt ();
558566 trackProperties[counterTrackProps + 3 ] = o2::track::pid_constants::sMasses [j];
559- trackProperties[counterTrackProps + 4 ] = (trk.has_collision () && mults.size () > 0 ) ? mults[trk.collisionId ()] / 11000 . : 1 .;
567+ trackProperties[counterTrackProps + 4 ] = (trk.has_collision () && mults.size () > 0 ) ? mults[trk.collisionId ()] / MultiplicityNorm : 1 .;
560568 trackProperties[counterTrackProps + 5 ] = std::sqrt (nNclNormalization / trk.tpcNClsFound ());
561569 if (inputDimensions == ExpectedInputDimensionsNNV2 && networkVersion == NetworkVersionV2) {
562- trackProperties[counterTrackProps + 6 ] = (trk.has_collision () && mults.size () > 0 ) ? collisions.iteratorAt (trk.collisionId ()).ft0cOccupancyInTimeRange () / 60000 . : 1 .;
570+ trackProperties[counterTrackProps + 6 ] = (trk.has_collision () && mults.size () > 0 ) ? collisions.iteratorAt (trk.collisionId ()).ft0cOccupancyInTimeRange () / Ft0cOccupancyNorm : 1 .;
563571 }
564572 if (inputDimensions == ExpectedInputDimensionsNNV3 && networkVersion == NetworkVersionV3) {
565- trackProperties[counterTrackProps + 6 ] = (trk.has_collision () && mults.size () > 0 ) ? collisions.iteratorAt (trk.collisionId ()).ft0cOccupancyInTimeRange () / 60000 . : 1 .;
573+ trackProperties[counterTrackProps + 6 ] = (trk.has_collision () && mults.size () > 0 ) ? collisions.iteratorAt (trk.collisionId ()).ft0cOccupancyInTimeRange () / Ft0cOccupancyNorm : 1 .;
566574 if (trk.has_collision () && mults.size () > 0 ) {
567575 if (collsys == CollisionSystemType::kCollSyspp ) {
568- trackProperties[counterTrackProps + 7 ] = hadronicRateForCollision[trk.collisionId ()] / 1500 . ;
576+ trackProperties[counterTrackProps + 7 ] = hadronicRateForCollision[trk.collisionId ()] / HadronicRateNormPp ;
569577 } else {
570- trackProperties[counterTrackProps + 7 ] = hadronicRateForCollision[trk.collisionId ()] / 50 . ;
578+ trackProperties[counterTrackProps + 7 ] = hadronicRateForCollision[trk.collisionId ()] / HadronicRateNormAa ;
571579 }
572580 } else {
573581 // asign Hadronic Rate at beginning of run if track does not belong to a collision
574582 if (collsys == CollisionSystemType::kCollSyspp ) {
575- trackProperties[counterTrackProps + 7 ] = hadronicRateBegin / 1500 . ;
583+ trackProperties[counterTrackProps + 7 ] = hadronicRateBegin / HadronicRateNormPp ;
576584 } else {
577- trackProperties[counterTrackProps + 7 ] = hadronicRateBegin / 50 . ;
585+ trackProperties[counterTrackProps + 7 ] = hadronicRateBegin / HadronicRateNormAa ;
578586 }
579587 }
580588 }
581589
582590 if (inputDimensions == ExpectedInputDimensionsNNV4 && networkVersion == NetworkVersionV4) {
583- trackProperties[counterTrackProps + 6 ] = (trk.has_collision () && mults.size () > 0 ) ? collisions.iteratorAt (trk.collisionId ()).ft0cOccupancyInTimeRange () / 60000 . : 1 .;
591+ trackProperties[counterTrackProps + 6 ] = (trk.has_collision () && mults.size () > 0 ) ? collisions.iteratorAt (trk.collisionId ()).ft0cOccupancyInTimeRange () / Ft0cOccupancyNorm : 1 .;
584592 if (trk.has_collision () && mults.size () > 0 ) {
585593 if (collsys == CollisionSystemType::kCollSyspp ) {
586- trackProperties[counterTrackProps + 7 ] = hadronicRateForCollision[trk.collisionId ()] / 1500 . ;
594+ trackProperties[counterTrackProps + 7 ] = hadronicRateForCollision[trk.collisionId ()] / HadronicRateNormPp ;
587595 } else {
588- trackProperties[counterTrackProps + 7 ] = hadronicRateForCollision[trk.collisionId ()] / 50 . ;
596+ trackProperties[counterTrackProps + 7 ] = hadronicRateForCollision[trk.collisionId ()] / HadronicRateNormAa ;
589597 }
590598 } else {
591599 // asign Hadronic Rate at beginning of run if track does not belong to a collision
592600 if (collsys == CollisionSystemType::kCollSyspp ) {
593- trackProperties[counterTrackProps + 7 ] = hadronicRateBegin / 1500 . ;
601+ trackProperties[counterTrackProps + 7 ] = hadronicRateBegin / HadronicRateNormPp ;
594602 } else {
595- trackProperties[counterTrackProps + 7 ] = hadronicRateBegin / 50 . ;
603+ trackProperties[counterTrackProps + 7 ] = hadronicRateBegin / HadronicRateNormAa ;
596604 }
597605 }
598- trackProperties[counterTrackProps + 8 ] = std::fmod (std::fmod (trk.phi (), 2 * M_PI ) + 2 * M_PI , M_PI / 9.0 );
606+ trackProperties[counterTrackProps + 8 ] = std::fmod (std::fmod (trk.phi (), o2::constants::math::TwoPI ) + o2::constants::math::TwoPI, o2::constants::math::TwoPI / NumberOfTpcSectors );
599607 }
600608 counterTrackProps += inputDimensions;
601609 }
@@ -616,8 +624,8 @@ class pidTPCModule
616624 trackProperties.clear ();
617625
618626 const auto stopNetworkTotal = std::chrono::high_resolution_clock::now ();
619- LOG (debug) << " Neural Network for the TPC PID response correction: Time per track (eval ONNX): " << durationNetwork / (size * 9 ) << " ns ; Total time (eval ONNX): " << durationNetwork / 1000000000 << " s" ;
620- LOG (debug) << " Neural Network for the TPC PID response correction: Time per track (eval + overhead): " << std::chrono::duration<float , std::ratio<1 , 1000000000 >>(stopNetworkTotal - startNetworkTotal).count () / (size * 9 ) << " ns ; Total time (eval + overhead): " << std::chrono::duration<float , std::ratio<1 , 1000000000 >>(stopNetworkTotal - startNetworkTotal).count () / 1000000000 << " s" ;
627+ LOG (debug) << " Neural Network for the TPC PID response correction: Time per track (eval ONNX): " << durationNetwork / (size * NParticleTypes ) << " ns ; Total time (eval ONNX): " << durationNetwork / 1000000000 << " s" ;
628+ LOG (debug) << " Neural Network for the TPC PID response correction: Time per track (eval + overhead): " << std::chrono::duration<float , std::ratio<1 , 1000000000 >>(stopNetworkTotal - startNetworkTotal).count () / (size * NParticleTypes ) << " ns ; Total time (eval + overhead): " << std::chrono::duration<float , std::ratio<1 , 1000000000 >>(stopNetworkTotal - startNetworkTotal).count () / 1000000000 << " s" ;
621629
622630 return networkPrediction;
623631 }
0 commit comments