@@ -481,6 +481,10 @@ class pidTPCModule
481481 IdxModPhi
482482 };
483483
484+ constexpr int OldestNNVersionWithFt0c{2 };
485+ constexpr int OldestNNVersionWithHadronicRate{3 };
486+ constexpr int OldestNNVersionWithModPhi{4 };
487+
484488 std::vector<float > networkPrediction;
485489
486490 const auto startNetworkTotal = std::chrono::high_resolution_clock::now ();
@@ -551,6 +555,8 @@ class pidTPCModule
551555 LOG (fatal) << " createNetworkPrediction(): networkVersion '" << networkVersion << " ' and number of features " << inputDimensions << " are not compatible according to nnVersionsDictionary" ;
552556 }
553557
558+ const int hadronicRateNorm = collsys == CollisionSystemType::kCollSyspp ? HadronicRateNormPp : HadronicRateNormAa;
559+
554560 networkPrediction = std::vector<float >(predictionSize * NParticleTypes); // For each mass hypotheses
555561 const float nNclNormalization = response->GetNClNormalization ();
556562 float durationNetwork = 0 ;
@@ -581,13 +587,6 @@ class pidTPCModule
581587
582588 // Filling a std::vector<float> to be evaluated by the network
583589 // Evaluation on single tracks brings huge overhead: Thus evaluation is done on one large vector
584-
585- constexpr int ExpectedInputDimensionsNNV2 = 7 ;
586- constexpr int ExpectedInputDimensionsNNV3 = 8 ;
587- constexpr int ExpectedInputDimensionsNNV4 = 9 ;
588- constexpr auto NetworkVersionV2 = " 2" ;
589- constexpr auto NetworkVersionV3 = " 3" ;
590- constexpr auto NetworkVersionV4 = " 4" ;
591590 for (int j = 0 ; j < NParticleTypes; j++) { // Loop over particle number for which network correction is used
592591 for (auto const & trk : tracks) {
593592 if (!trk.hasTPC ()) {
@@ -598,49 +597,21 @@ class pidTPCModule
598597 continue ;
599598 }
600599 }
600+ const bool isGoodTrack = trk.has_collision () && mults.size () > 0 ;
601601 trackProperties[counterTrackProps + IdxTpcInnerParam] = trk.tpcInnerParam ();
602602 trackProperties[counterTrackProps + IdxTgl] = trk.tgl ();
603603 trackProperties[counterTrackProps + IdxSigned1Pt] = trk.signed1Pt ();
604604 trackProperties[counterTrackProps + IdxMass] = o2::track::pid_constants::sMasses [j];
605- trackProperties[counterTrackProps + IdxMultiplicity] = (trk. has_collision () && mults. size () > 0 ) ? mults[trk.collisionId ()] / MultiplicityNorm : 1 .;
605+ trackProperties[counterTrackProps + IdxMultiplicity] = isGoodTrack ? mults[trk.collisionId ()] / MultiplicityNorm : 1 .;
606606 trackProperties[counterTrackProps + IdxNClusters] = std::sqrt (nNclNormalization / trk.tpcNClsFound ());
607- if (inputDimensions == ExpectedInputDimensionsNNV2 && networkVersion == NetworkVersionV2 ) {
608- trackProperties[counterTrackProps + IdxFt0cOcc] = (trk. has_collision () && mults. size () > 0 ) ? collisions.iteratorAt (trk.collisionId ()).ft0cOccupancyInTimeRange () / Ft0cOccupancyNorm : 1 .;
607+ if (nnVersion >= OldestNNVersionWithFt0c ) {
608+ trackProperties[counterTrackProps + IdxFt0cOcc] = isGoodTrack ? collisions.iteratorAt (trk.collisionId ()).ft0cOccupancyInTimeRange () / Ft0cOccupancyNorm : 1 .;
609609 }
610- if (inputDimensions == ExpectedInputDimensionsNNV3 && networkVersion == NetworkVersionV3) {
611- trackProperties[counterTrackProps + IdxFt0cOcc] = (trk.has_collision () && mults.size () > 0 ) ? collisions.iteratorAt (trk.collisionId ()).ft0cOccupancyInTimeRange () / Ft0cOccupancyNorm : 1 .;
612- if (trk.has_collision () && mults.size () > 0 ) {
613- if (collsys == CollisionSystemType::kCollSyspp ) {
614- trackProperties[counterTrackProps + IdxHadronicRate] = hadronicRateForCollision[trk.collisionId ()] / HadronicRateNormPp;
615- } else {
616- trackProperties[counterTrackProps + IdxHadronicRate] = hadronicRateForCollision[trk.collisionId ()] / HadronicRateNormAa;
617- }
618- } else {
619- // asign Hadronic Rate at beginning of run if track does not belong to a collision
620- if (collsys == CollisionSystemType::kCollSyspp ) {
621- trackProperties[counterTrackProps + IdxHadronicRate] = hadronicRateBegin / HadronicRateNormPp;
622- } else {
623- trackProperties[counterTrackProps + IdxHadronicRate] = hadronicRateBegin / HadronicRateNormAa;
624- }
625- }
610+ if (nnVersion >= OldestNNVersionWithHadronicRate) {
611+ const float hadronicRate = isGoodTrack ? hadronicRateForCollision[trk.collisionId ()] : hadronicRateBegin;
612+ trackProperties[counterTrackProps + IdxHadronicRate] = hadronicRate / hadronicRateNorm;
626613 }
627-
628- if (inputDimensions == ExpectedInputDimensionsNNV4 && networkVersion == NetworkVersionV4) {
629- trackProperties[counterTrackProps + IdxFt0cOcc] = (trk.has_collision () && mults.size () > 0 ) ? collisions.iteratorAt (trk.collisionId ()).ft0cOccupancyInTimeRange () / Ft0cOccupancyNorm : 1 .;
630- if (trk.has_collision () && mults.size () > 0 ) {
631- if (collsys == CollisionSystemType::kCollSyspp ) {
632- trackProperties[counterTrackProps + IdxHadronicRate] = hadronicRateForCollision[trk.collisionId ()] / HadronicRateNormPp;
633- } else {
634- trackProperties[counterTrackProps + IdxHadronicRate] = hadronicRateForCollision[trk.collisionId ()] / HadronicRateNormAa;
635- }
636- } else {
637- // asign Hadronic Rate at beginning of run if track does not belong to a collision
638- if (collsys == CollisionSystemType::kCollSyspp ) {
639- trackProperties[counterTrackProps + IdxHadronicRate] = hadronicRateBegin / HadronicRateNormPp;
640- } else {
641- trackProperties[counterTrackProps + IdxHadronicRate] = hadronicRateBegin / HadronicRateNormAa;
642- }
643- }
614+ if (nnVersion >= OldestNNVersionWithModPhi) {
644615 trackProperties[counterTrackProps + IdxModPhi] = std::fmod (std::fmod (trk.phi (), o2::constants::math::TwoPI) + o2::constants::math::TwoPI, o2::constants::math::TwoPI / NumberOfTpcSectors);
645616 }
646617 counterTrackProps += inputDimensions;
0 commit comments