38 {
40 static const std::set<Feature_t, std::less<>> featurePool{
41 std::make_unique<NodeFeature>("localX",
43 return bucket[
index]->localPosition().x();
44 }),
45 std::make_unique<NodeFeature>("localY",
47 return bucket[
index]->localPosition().y();
48 bucket[
index]->localPosition().y();
49 }),
50 std::make_unique<NodeFeature>("localZ",
52 return bucket[
index]->localPosition().z();
53 }),
54 std::make_unique<NodeFeature>("stationIndex",
55 [](
const Bucket_t& bucket,
size_t index) {
56 return bucket[
index]->msSector()->idHelperSvc()->stationName(bucket[index]->
identify());
57 }),
58 std::make_unique<NodeFeature>("stationPhi",
59 [](
const Bucket_t& bucket,
size_t index) {
60 return bucket[
index]->msSector()->idHelperSvc()->stationPhi(bucket[index]->
identify());
61 }),
62 std::make_unique<NodeFeature>("stationEta",
63 [](
const Bucket_t& bucket,
size_t index) {
64 return bucket[
index]->msSector()->idHelperSvc()->stationEta(bucket[index]->
identify());
65 }),
66 std::make_unique<NodeFeature>("driftR",
67 [](
const Bucket_t& bucket,
size_t index) {
68 return bucket[
index]->driftRadius();
69 }),
70 std::make_unique<NodeFeature>("relative_layer",
71 [](
const Bucket_t& bucket,
size_t index) {
72 const double relLayNum = (1 + 1.*bucket.layerNum(index)) / (bucket.nStripLayers() + bucket.nMdtLayers());
73 return relLayNum;
74 }),
75 std::make_unique<NodeFeature>("neighbors",
76 [](
const Bucket_t& bucket,
size_t index) {
77 constexpr double radCut2 = (50.*Gaudi::Units::cm * 50.*Gaudi::Units::cm);
79 for (
size_t other =0 ;
other < bucket.size(); ++
other){
80 n+=
index !=
other && (bucket[
index]->localPosition() - bucket[other]->localPosition()).perp2() < radCut2;
81 }
83 }),
84 std::make_unique<NodeFeature>("bucket_density",
85 [](
const Bucket_t& bucket,
size_t ) {
86
87 return 1.*bucket.size() / std::max(bucket.coveredMax() - bucket.coveredMin(), 1. * Gaudi::Units::cm);
88 }),
89 std::make_unique<NodeFeature>("isolation",
90 [](
const Bucket_t& bucket,
size_t index) {
91 unsigned int neighbors = 0;
92 constexpr double radCut2 = (50.*Gaudi::Units::cm * 50.*Gaudi::Units::cm);
93 for (
size_t other =0 ;
other < bucket.size(); ++
other){
94 neighbors+=
index !=
other && (bucket[
index]->localPosition() - bucket[other]->localPosition()).perp2() < radCut2;
95 }
96
97 float bucket_density = 1.f*bucket.size() / std::max(bucket.coveredMax() - bucket.coveredMin(), 1. * Gaudi::Units::cm);
98 return neighbors / bucket_density;
99 }),
100
101 std::make_unique<NodeFeature>("covX",
102 [](
const Bucket_t& bucket,
size_t index) {
103 return bucket[
index]->covariance()[Acts::toUnderlying(CovIdx::phiCov)];
104 }),
105 std::make_unique<NodeFeature>("covY",
106 [](
const Bucket_t& bucket,
size_t index) {
107 return bucket[
index]->covariance()[Acts::toUnderlying(CovIdx::etaCov)];
108 }),
109 };
110 const auto feat_itr = featurePool.find(featName);
111 if(feat_itr != featurePool.end()){
112 if (
log.level() <= MSG::DEBUG) {
113 log<<MSG::DEBUG<<
"Found graph feature "<<featName<<
"."<<
endmsg;
114 }
115 return *feat_itr;
116 }
117 std::stringstream available{};
118 for (
const Feature_t& known : featurePool) {
119 available<<known->name()<<", ";
120 }
121 log<<MSG::ERROR<<
"The feature "<<featName<<
" is unknown to the feature factory. "
122 <<" Please check for typos w.r.t "<<available.str()<<". Otherwise augment "
123 <<__FILE__<<
" with your desired feature "<<
endmsg;
124 return nullptr;
125 }
NodeFeatureList::Feature_t Feature_t
const Identifier & identify(const UncalibratedMeasurement *meas)
Returns the associated identifier from the muon measurement.