@@ -81,6 +81,12 @@ DECLARE_SOA_COLUMN(IsEventReject, isEventReject, int);
81
81
DECLARE_SOA_COLUMN (RunNumber, runNumber, int );
82
82
DECLARE_SOA_INDEX_COLUMN (McCollision, mcCollision);
83
83
} // namespace full
84
+ namespace ml
85
+ {
86
+ DECLARE_SOA_COLUMN (BdtOutputBkg, bdtOutputBkg, float );
87
+ DECLARE_SOA_COLUMN (BdtOutputPrompt, bdtOutputPrompt, float );
88
+ DECLARE_SOA_COLUMN (BdtOutputNonPrompt, bdtOutputNonPrompt, float );
89
+ } // namespace ml
84
90
85
91
DECLARE_SOA_TABLE (HfCandD0Lites, " AOD" , " HFCANDD0LITE" ,
86
92
hf_cand::Chi2PCA,
@@ -201,6 +207,11 @@ DECLARE_SOA_TABLE(HfCandD0FullPs, "AOD", "HFCANDD0FULLP",
201
207
full::OriginMcGen,
202
208
full::McParticleId);
203
209
210
+ DECLARE_SOA_TABLE (HfCandD0Mls, " AOD" , " HFCANDD0ML" ,
211
+ ml::BdtOutputBkg,
212
+ ml::BdtOutputNonPrompt,
213
+ ml::BdtOutputPrompt);
214
+
204
215
} // namespace o2::aod
205
216
206
217
// / Writes the full information in an output TTree
@@ -209,6 +220,7 @@ struct HfTreeCreatorD0ToKPi {
209
220
Produces<o2::aod::HfCandD0FullEvs> rowCandidateFullEvents;
210
221
Produces<o2::aod::HfCandD0FullPs> rowCandidateFullParticles;
211
222
Produces<o2::aod::HfCandD0Lites> rowCandidateLite;
223
+ Produces<o2::aod::HfCandD0Mls> rowCandidateMl;
212
224
213
225
Configurable<bool > fillCandidateLiteTable{" fillCandidateLiteTable" , false , " Switch to fill lite table with candidate properties" };
214
226
// parameters for production of training samples
@@ -219,7 +231,9 @@ struct HfTreeCreatorD0ToKPi {
219
231
220
232
// using TracksWPid = soa::Join<aod::Tracks, aod::TracksPidPi, aod::PidTpcTofFullPi, aod::TracksPidKa, aod::PidTpcTofFullKa>;
221
233
using SelectedCandidatesMc = soa::Filtered<soa::Join<aod::HfCand2ProngWPid, aod::HfCand2ProngMcRec, aod::HfSelD0>>;
234
+ using SelectedCandidatesMcMl = soa::Filtered<soa::Join<aod::HfCand2ProngWPid, aod::HfCand2ProngMcRec, aod::HfSelD0, aod::HfMlD0>>;
222
235
using SelectedCandidatesMcKf = soa::Filtered<soa::Join<aod::HfCand2ProngWPid, aod::HfCand2ProngKF, aod::HfCand2ProngMcRec, aod::HfSelD0>>;
236
+ using SelectedCandidatesMcKfMl = soa::Filtered<soa::Join<aod::HfCand2ProngWPid, aod::HfCand2ProngKF, aod::HfCand2ProngMcRec, aod::HfSelD0, aod::HfMlD0>>;
223
237
using MatchedGenCandidatesMc = soa::Filtered<soa::Join<aod::McParticles, aod::HfCand2ProngMcGen>>;
224
238
225
239
Filter filterSelectCandidates = aod::hf_sel_candidate_d0::isSelD0 >= 1 || aod::hf_sel_candidate_d0::isSelD0bar >= 1 ;
@@ -230,9 +244,17 @@ struct HfTreeCreatorD0ToKPi {
230
244
Partition<SelectedCandidatesMcKf> reconstructedCandSigKF = nabs(aod::hf_cand_2prong::flagMcMatchRec) == static_cast <int8_t >(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK));
231
245
Partition<SelectedCandidatesMcKf> reconstructedCandBkgKF = nabs(aod::hf_cand_2prong::flagMcMatchRec) != static_cast <int8_t >(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK));
232
246
247
+ Partition<SelectedCandidatesMcMl> reconstructedCandSigMl = nabs(aod::hf_cand_2prong::flagMcMatchRec) == static_cast <int8_t >(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK));
248
+ Partition<SelectedCandidatesMcMl> reconstructedCandBkgMl = nabs(aod::hf_cand_2prong::flagMcMatchRec) != static_cast <int8_t >(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK));
249
+ Partition<SelectedCandidatesMcKfMl> reconstructedCandSigKFMl = nabs(aod::hf_cand_2prong::flagMcMatchRec) == static_cast <int8_t >(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK));
250
+ Partition<SelectedCandidatesMcKfMl> reconstructedCandBkgKFMl = nabs(aod::hf_cand_2prong::flagMcMatchRec) != static_cast <int8_t >(BIT(aod::hf_cand_2prong::DecayType::D0ToPiK));
251
+
233
252
void init (InitContext const &)
234
253
{
235
- std::array<bool , 8 > doprocess{doprocessDataWithDCAFitterN, doprocessDataWithKFParticle, doprocessMcWithDCAFitterOnlySig, doprocessMcWithDCAFitterOnlyBkg, doprocessMcWithDCAFitterAll, doprocessMcWithKFParticleOnlySig, doprocessMcWithKFParticleOnlyBkg, doprocessMcWithKFParticleAll};
254
+ std::array<bool , 16 > doprocess{doprocessDataWithDCAFitterN, doprocessDataWithKFParticle, doprocessMcWithDCAFitterOnlySig, doprocessMcWithDCAFitterOnlyBkg,
255
+ doprocessMcWithDCAFitterAll, doprocessMcWithKFParticleOnlySig, doprocessMcWithKFParticleOnlyBkg, doprocessMcWithKFParticleAll,
256
+ doprocessDataWithDCAFitterNMl, doprocessDataWithKFParticleMl, doprocessMcWithDCAFitterOnlySigMl, doprocessMcWithDCAFitterOnlyBkgMl,
257
+ doprocessMcWithDCAFitterAllMl, doprocessMcWithKFParticleOnlySigMl, doprocessMcWithKFParticleOnlyBkgMl, doprocessMcWithKFParticleAllMl};
236
258
if (std::accumulate (doprocess.begin (), doprocess.end (), 0 ) != 1 ) {
237
259
LOGP (fatal, " Only one process function can be enabled at a time." );
238
260
}
@@ -251,7 +273,7 @@ struct HfTreeCreatorD0ToKPi {
251
273
runNumber);
252
274
}
253
275
254
- template <typename T>
276
+ template <bool applyMl, typename T>
255
277
auto fillTable (const T& candidate, int candFlag, double invMass, double cosThetaStar, double topoChi2,
256
278
double ct, double y, double e, int8_t flagMc, int8_t origin)
257
279
{
@@ -356,9 +378,23 @@ struct HfTreeCreatorD0ToKPi {
356
378
origin,
357
379
candidate.globalIndex ());
358
380
}
381
+ if constexpr (applyMl) {
382
+ if (candidate.isSelD0 ()) {
383
+ rowCandidateMl (
384
+ candidate.mlProbD0 ()[0 ],
385
+ candidate.mlProbD0 ()[1 ],
386
+ candidate.mlProbD0 ()[2 ]);
387
+ }
388
+ if (candidate.isSelD0bar ()) {
389
+ rowCandidateMl (
390
+ candidate.mlProbD0bar ()[0 ],
391
+ candidate.mlProbD0bar ()[1 ],
392
+ candidate.mlProbD0bar ()[2 ]);
393
+ }
394
+ }
359
395
}
360
396
361
- template <int reconstructionType, typename CandType>
397
+ template <int reconstructionType, bool applyMl, typename CandType>
362
398
void processData (aod::Collisions const & collisions,
363
399
CandType const & candidates,
364
400
aod::Tracks const &, aod::BCs const &)
@@ -375,6 +411,9 @@ struct HfTreeCreatorD0ToKPi {
375
411
} else {
376
412
rowCandidateFull.reserve (candidates.size ());
377
413
}
414
+ if constexpr (applyMl) {
415
+ rowCandidateMl.reserve (candidates.size ());
416
+ }
378
417
for (const auto & candidate : candidates) {
379
418
if (downSampleBkgFactor < 1 .) {
380
419
float pseudoRndm = candidate.ptProng0 () * 1000 . - static_cast <int64_t >(candidate.ptProng0 () * 1000 );
@@ -396,10 +435,10 @@ struct HfTreeCreatorD0ToKPi {
396
435
massD0bar = hfHelper.invMassD0barToKPi (candidate);
397
436
}
398
437
if (candidate.isSelD0 ()) {
399
- fillTable (candidate, 0 , massD0, hfHelper.cosThetaStarD0 (candidate), topolChi2PerNdf, ctD, yD, eD, 0 , 0 );
438
+ fillTable<applyMl> (candidate, 0 , massD0, hfHelper.cosThetaStarD0 (candidate), topolChi2PerNdf, ctD, yD, eD, 0 , 0 );
400
439
}
401
440
if (candidate.isSelD0bar ()) {
402
- fillTable (candidate, 1 , massD0bar, hfHelper.cosThetaStarD0bar (candidate), topolChi2PerNdf, ctD, yD, eD, 0 , 0 );
441
+ fillTable<applyMl> (candidate, 1 , massD0bar, hfHelper.cosThetaStarD0bar (candidate), topolChi2PerNdf, ctD, yD, eD, 0 , 0 );
403
442
}
404
443
}
405
444
}
@@ -409,20 +448,38 @@ struct HfTreeCreatorD0ToKPi {
409
448
aod::Tracks const & tracks,
410
449
aod::BCs const & bcs)
411
450
{
412
- processData<aod::hf_cand::VertexerType::DCAFitter>(collisions, candidates, tracks, bcs);
451
+ processData<aod::hf_cand::VertexerType::DCAFitter, false >(collisions, candidates, tracks, bcs);
413
452
}
414
453
PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processDataWithDCAFitterN, " Process data with DCAFitterN" , true );
415
454
455
+ void processDataWithDCAFitterNMl (aod::Collisions const & collisions,
456
+ soa::Filtered<soa::Join<aod::HfCand2ProngWPid, aod::HfSelD0, aod::HfMlD0>> const & candidates,
457
+ aod::Tracks const & tracks,
458
+ aod::BCs const & bcs)
459
+ {
460
+ processData<aod::hf_cand::VertexerType::DCAFitter, true >(collisions, candidates, tracks, bcs);
461
+ }
462
+ PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processDataWithDCAFitterNMl, " Process data with DCAFitterN and ML" , false );
463
+
416
464
void processDataWithKFParticle (aod::Collisions const & collisions,
417
465
soa::Filtered<soa::Join<aod::HfCand2ProngWPid, aod::HfCand2ProngKF, aod::HfSelD0>> const & candidates,
418
466
aod::Tracks const & tracks,
419
467
aod::BCs const & bcs)
420
468
{
421
- processData<aod::hf_cand::VertexerType::KfParticle>(collisions, candidates, tracks, bcs);
469
+ processData<aod::hf_cand::VertexerType::KfParticle, false >(collisions, candidates, tracks, bcs);
422
470
}
423
471
PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processDataWithKFParticle, " Process data with KFParticle" , false );
424
472
425
- template <int reconstructionType, bool onlyBkg, bool onlySig, typename CandType>
473
+ void processDataWithKFParticleMl (aod::Collisions const & collisions,
474
+ soa::Filtered<soa::Join<aod::HfCand2ProngWPid, aod::HfCand2ProngKF, aod::HfSelD0, aod::HfMlD0>> const & candidates,
475
+ aod::Tracks const & tracks,
476
+ aod::BCs const & bcs)
477
+ {
478
+ processData<aod::hf_cand::VertexerType::KfParticle, true >(collisions, candidates, tracks, bcs);
479
+ }
480
+ PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processDataWithKFParticleMl, " Process data with KFParticle and ML" , false );
481
+
482
+ template <int reconstructionType, bool onlyBkg, bool onlySig, bool applyMl, typename CandType>
426
483
void processMc (aod::Collisions const & collisions,
427
484
aod::McCollisions const &,
428
485
CandType const & candidates,
@@ -442,6 +499,9 @@ struct HfTreeCreatorD0ToKPi {
442
499
} else {
443
500
rowCandidateFull.reserve (candidates.size ());
444
501
}
502
+ if constexpr (applyMl) {
503
+ rowCandidateMl.reserve (candidates.size ());
504
+ }
445
505
for (const auto & candidate : candidates) {
446
506
if constexpr (onlyBkg) {
447
507
if (TESTBIT (std::abs (candidate.flagMcMatchRec ()), aod::hf_cand_2prong::DecayType::D0ToPiK)) {
@@ -473,10 +533,10 @@ struct HfTreeCreatorD0ToKPi {
473
533
massD0bar = hfHelper.invMassD0barToKPi (candidate);
474
534
}
475
535
if (candidate.isSelD0 ()) {
476
- fillTable (candidate, 0 , massD0, hfHelper.cosThetaStarD0 (candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec (), candidate.originMcRec ());
536
+ fillTable<applyMl> (candidate, 0 , massD0, hfHelper.cosThetaStarD0 (candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec (), candidate.originMcRec ());
477
537
}
478
538
if (candidate.isSelD0bar ()) {
479
- fillTable (candidate, 1 , massD0bar, hfHelper.cosThetaStarD0bar (candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec (), candidate.originMcRec ());
539
+ fillTable<applyMl> (candidate, 1 , massD0bar, hfHelper.cosThetaStarD0bar (candidate), topolChi2PerNdf, ctD, yD, eD, candidate.flagMcMatchRec (), candidate.originMcRec ());
480
540
}
481
541
}
482
542
@@ -504,64 +564,130 @@ struct HfTreeCreatorD0ToKPi {
504
564
aod::Tracks const & tracks,
505
565
aod::BCs const & bcs)
506
566
{
507
- processMc<aod::hf_cand::VertexerType::DCAFitter, false , true >(collisions, mcCollisions, reconstructedCandSig, mcParticles, tracks, bcs);
567
+ processMc<aod::hf_cand::VertexerType::DCAFitter, false , true , false >(collisions, mcCollisions, reconstructedCandSig, mcParticles, tracks, bcs);
508
568
}
509
569
PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithDCAFitterOnlySig, " Process MC with DCAFitterN only for signals" , false );
510
570
571
+ void processMcWithDCAFitterOnlySigMl (aod::Collisions const & collisions,
572
+ aod::McCollisions const & mcCollisions,
573
+ SelectedCandidatesMcMl const &,
574
+ MatchedGenCandidatesMc const & mcParticles,
575
+ aod::Tracks const & tracks,
576
+ aod::BCs const & bcs)
577
+ {
578
+ processMc<aod::hf_cand::VertexerType::DCAFitter, false , true , true >(collisions, mcCollisions, reconstructedCandSigMl, mcParticles, tracks, bcs);
579
+ }
580
+ PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithDCAFitterOnlySigMl, " Process MC with DCAFitterN only for signals and ML" , false );
581
+
511
582
void processMcWithDCAFitterOnlyBkg (aod::Collisions const & collisions,
512
583
aod::McCollisions const & mcCollisions,
513
584
SelectedCandidatesMc const &,
514
585
MatchedGenCandidatesMc const & mcParticles,
515
586
aod::Tracks const & tracks,
516
587
aod::BCs const & bcs)
517
588
{
518
- processMc<aod::hf_cand::VertexerType::DCAFitter, true , false >(collisions, mcCollisions, reconstructedCandBkg, mcParticles, tracks, bcs);
589
+ processMc<aod::hf_cand::VertexerType::DCAFitter, true , false , false >(collisions, mcCollisions, reconstructedCandBkg, mcParticles, tracks, bcs);
519
590
}
520
591
PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithDCAFitterOnlyBkg, " Process MC with DCAFitterN only for background" , false );
521
592
593
+ void processMcWithDCAFitterOnlyBkgMl (aod::Collisions const & collisions,
594
+ aod::McCollisions const & mcCollisions,
595
+ SelectedCandidatesMcMl const &,
596
+ MatchedGenCandidatesMc const & mcParticles,
597
+ aod::Tracks const & tracks,
598
+ aod::BCs const & bcs)
599
+ {
600
+ processMc<aod::hf_cand::VertexerType::DCAFitter, true , false , true >(collisions, mcCollisions, reconstructedCandBkgMl, mcParticles, tracks, bcs);
601
+ }
602
+ PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithDCAFitterOnlyBkgMl, " Process MC with DCAFitterN only for background with ML" , false );
603
+
522
604
void processMcWithDCAFitterAll (aod::Collisions const & collisions,
523
605
aod::McCollisions const & mcCollisions,
524
606
SelectedCandidatesMc const & candidates,
525
607
MatchedGenCandidatesMc const & mcParticles,
526
608
aod::Tracks const & tracks,
527
609
aod::BCs const & bcs)
528
610
{
529
- processMc<aod::hf_cand::VertexerType::DCAFitter, false , false >(collisions, mcCollisions, candidates, mcParticles, tracks, bcs);
611
+ processMc<aod::hf_cand::VertexerType::DCAFitter, false , false , false >(collisions, mcCollisions, candidates, mcParticles, tracks, bcs);
530
612
}
531
613
PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithDCAFitterAll, " Process MC with DCAFitterN" , false );
532
614
615
+ void processMcWithDCAFitterAllMl (aod::Collisions const & collisions,
616
+ aod::McCollisions const & mcCollisions,
617
+ SelectedCandidatesMcMl const & candidates,
618
+ MatchedGenCandidatesMc const & mcParticles,
619
+ aod::Tracks const & tracks,
620
+ aod::BCs const & bcs)
621
+ {
622
+ processMc<aod::hf_cand::VertexerType::DCAFitter, false , false , true >(collisions, mcCollisions, candidates, mcParticles, tracks, bcs);
623
+ }
624
+ PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithDCAFitterAllMl, " Process MC with DCAFitterN with ML" , false );
625
+
533
626
void processMcWithKFParticleOnlySig (aod::Collisions const & collisions,
534
627
aod::McCollisions const & mcCollisions,
535
628
SelectedCandidatesMcKf const &,
536
629
MatchedGenCandidatesMc const & mcParticles,
537
630
aod::Tracks const & tracks,
538
631
aod::BCs const & bcs)
539
632
{
540
- processMc<aod::hf_cand::VertexerType::KfParticle, false , true >(collisions, mcCollisions, reconstructedCandSigKF, mcParticles, tracks, bcs);
633
+ processMc<aod::hf_cand::VertexerType::KfParticle, false , true , false >(collisions, mcCollisions, reconstructedCandSigKF, mcParticles, tracks, bcs);
541
634
}
542
635
PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithKFParticleOnlySig, " Process MC with KFParticle only for signals" , false );
543
636
637
+ void processMcWithKFParticleOnlySigMl (aod::Collisions const & collisions,
638
+ aod::McCollisions const & mcCollisions,
639
+ SelectedCandidatesMcKfMl const &,
640
+ MatchedGenCandidatesMc const & mcParticles,
641
+ aod::Tracks const & tracks,
642
+ aod::BCs const & bcs)
643
+ {
644
+ processMc<aod::hf_cand::VertexerType::KfParticle, false , true , true >(collisions, mcCollisions, reconstructedCandSigKFMl, mcParticles, tracks, bcs);
645
+ }
646
+ PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithKFParticleOnlySigMl, " Process MC with KFParticle only for signals with ML" , false );
647
+
544
648
void processMcWithKFParticleOnlyBkg (aod::Collisions const & collisions,
545
649
aod::McCollisions const & mcCollisions,
546
650
SelectedCandidatesMcKf const &,
547
651
MatchedGenCandidatesMc const & mcParticles,
548
652
aod::Tracks const & tracks,
549
653
aod::BCs const & bcs)
550
654
{
551
- processMc<aod::hf_cand::VertexerType::KfParticle, true , false >(collisions, mcCollisions, reconstructedCandBkgKF, mcParticles, tracks, bcs);
655
+ processMc<aod::hf_cand::VertexerType::KfParticle, true , false , false >(collisions, mcCollisions, reconstructedCandBkgKF, mcParticles, tracks, bcs);
552
656
}
553
657
PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithKFParticleOnlyBkg, " Process MC with KFParticle only for background" , false );
554
658
659
+ void processMcWithKFParticleOnlyBkgMl (aod::Collisions const & collisions,
660
+ aod::McCollisions const & mcCollisions,
661
+ SelectedCandidatesMcKfMl const &,
662
+ MatchedGenCandidatesMc const & mcParticles,
663
+ aod::Tracks const & tracks,
664
+ aod::BCs const & bcs)
665
+ {
666
+ processMc<aod::hf_cand::VertexerType::KfParticle, true , false , true >(collisions, mcCollisions, reconstructedCandBkgKFMl, mcParticles, tracks, bcs);
667
+ }
668
+ PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithKFParticleOnlyBkgMl, " Process MC with KFParticle only for background with ML" , false );
669
+
555
670
void processMcWithKFParticleAll (aod::Collisions const & collisions,
556
671
aod::McCollisions const & mcCollisions,
557
672
SelectedCandidatesMcKf const & candidates,
558
673
MatchedGenCandidatesMc const & mcParticles,
559
674
aod::Tracks const & tracks,
560
675
aod::BCs const & bcs)
561
676
{
562
- processMc<aod::hf_cand::VertexerType::KfParticle, false , false >(collisions, mcCollisions, candidates, mcParticles, tracks, bcs);
677
+ processMc<aod::hf_cand::VertexerType::KfParticle, true , false , false >(collisions, mcCollisions, candidates, mcParticles, tracks, bcs);
563
678
}
564
679
PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithKFParticleAll, " Process MC with KFParticle" , false );
680
+
681
+ void processMcWithKFParticleAllMl (aod::Collisions const & collisions,
682
+ aod::McCollisions const & mcCollisions,
683
+ SelectedCandidatesMcKfMl const & candidates,
684
+ MatchedGenCandidatesMc const & mcParticles,
685
+ aod::Tracks const & tracks,
686
+ aod::BCs const & bcs)
687
+ {
688
+ processMc<aod::hf_cand::VertexerType::KfParticle, false , false , true >(collisions, mcCollisions, candidates, mcParticles, tracks, bcs);
689
+ }
690
+ PROCESS_SWITCH (HfTreeCreatorD0ToKPi, processMcWithKFParticleAllMl, " Process MC with KFParticle with ML" , false );
565
691
};
566
692
567
693
WorkflowSpec defineDataProcessing (ConfigContext const & cfgc)
0 commit comments