9#include <tracking/modules/spacePointCreator/SpacePoint2TrueHitConnectorModule.h>
10#include <framework/datastore/StoreObjPtr.h>
11#include <framework/dataobjects/EventMetaData.h>
12#include <framework/core/Environment.h>
14#include <pxd/dataobjects/PXDCluster.h>
15#include <svd/dataobjects/SVDCluster.h>
16#include <mdst/dataobjects/MCParticle.h>
23#include <unordered_map>
24#include <tracking/spacePointCreation/MapHelperFunctions.h>
28#include <Math/Vector3D.h>
38 setDescription(
"Module that tries to find the appropriate TrueHit to each SpacePoint and to register a relation between them for making MC information for SpacePoints more easily accessible for Modules that need it. Module can also be used to filter out 'fishy' SpacePoints.");
42 "Set to false if you do not want to create separate StoreArrays for processed SpacePoints. (i.e. a relation from SpacePoint to TrueHit will be set in the passed StoreArray. NOTE: this StoreArray will contain SpacePoints with a relation to TrueHits and such without after this module). The Names of the output StoreArrays will be the names of the input StoreArrays with 'outputSuffix' (module parameter) appended to them",
46 "If set to true, the module simply registers a relation for all TrueHits that are related to a SpacePoint (resp. its Clusters). In this way the module can be used to find all related TrueHits and then the user can decide what to do with these TrueHits (otherwise this module does some decision making). Setting this to true means that all checks (e.g. 'minWeight', 'maxPosSigma', ...) are omitted! NOTE that some of the information is lost in this way (e.g. how many of the Clusters of a SpacePoint have been related to a TrueHit)!",
50 "Analyze the positions of SpacePoints and corresponding TrueHits. NOTE: if enabled a root file gets created!",
false);
53 "Set to true if only relations to TrueHits that are related to a primary particle should get registered.",
false);
56 "Require that the TrueHit is close to the SpacePoint (in local coordinates). The meaning of 'close' can be defined with the parameters 'maxPosSigma' and 'maxGlobalPosDiff'.",
59 std::vector<std::string> defaultInList;
60 defaultInList.push_back(std::string(
""));
62 "Container names of TrueHits. NOTE: need one name per 'DetectorType' (i.e. unique entries in 'DetectorType)!", defaultInList);
65 "detector types to determine which entries in 'TrueHitNames' and 'SpacePointNames' belong to which detector type. Entries have to be 'SVD' or 'PXD'. NOTE: if more 'SpacePointNames' than 'DetectorTypes' get passed, the last entry in 'DetectorTypes' is assumed to be valid for all remaining 'SpacePointNames'!");
67 "Container names of Clusters. NOTE: need one name per 'DetectorType' (i.e. unique entries in 'DetectorType')!", defaultInList);
69 std::vector<std::string> defaultRootFName = {
"PositionAnalysis",
"RECREATE" };
71 "Filename and write-mode ('RECREATE' or 'UPDATE'). If given more than 2 strings this module will cause termination",
75 "Suffix that will be appended to the container names if 'storeSeperate' is set to true", std::string(
"_relTH"));
78 "max difference of global position coordinates between TrueHit and SpacePoint (in each direction) in cm.", 0.05);
81 addParam(
"maxPosSigma",
m_PARAMmaxPosSigma,
"Define the maximum local position difference in units of PitchSize / sqrt(12).", 4.);
83 "Define a minimal weight a relation between a Cluster and a TrueHit has to have for the TrueHit to be considered as possible candidate.",
93 "SpacePoint2TrueHitConnector::initialize: parameter positionAnalysis (and therefore root-output) is enabled and basf2 is running in multi-threaded mode - this can cause nondeterministic behavior! "
95 <<
" you can suppress multi-threading for this module by writing:"
97 <<
"main.add_module('SpacePoint2TrueHitConnector').set_property_flags(0) "
99 <<
"into the steering file!");
106 B2INFO(
"SpacePoint2TrueHitConnector -------------------------- initialize --------------------------------");
113 B2FATAL(
"Passed " << nTHNames <<
" TrueHitNames and " << nDetTypes <<
" DetectorTypes but number of passed SpacePointArrays is " <<
116 if ((nTHNames != nDetTypes) || (nClNames != nTHNames)) {
117 B2FATAL(
"Passed " << nTHNames <<
" TrueHitNames and " << nClNames <<
"ClusterNames but " << nDetTypes <<
" DetectorTypes!");
123 if (detType.compare(std::string(
"SVD")) != 0 && detType.compare(std::string(
"PXD")) != 0) {
124 B2FATAL(
"Found entry " << detType <<
" in DetectorTypes, but only 'PXD' and 'SVD' are allowed!");
126 if (detType.compare(std::string(
"SVD")) == 0) {
156 B2WARNING(
"'outputSuffix' is empty and 'storeSeperate' is set to true. This would lead to StoreArrays with the same name. Resetting to 'outputSuffix' to '_relTH'!");
188 B2WARNING(
"'maxPosSigma' is set to a value below 0: " <<
m_PARAMmaxPosSigma <<
"! Resetting to default (4)!");
199 const int eventCtr = eventMetaDataPtr->getEvent();
200 B2DEBUG(20,
"SpacePoint2TrueHitConnector::event(). Processing event " << eventCtr <<
" -----------------------");
207 const int nSpacePoints = spacePoints.
getEntries();
209 std::string detTypeStr = detType ==
c_SVD ?
"SVD" :
"PXD";
211 " for this event. detType: " << detTypeStr);
215 for (
int iSP = 0; iSP < nSpacePoints; ++iSP) {
217 B2DEBUG(21,
"Processing SpacePoint " << iSP <<
" from " << nSpacePoints);
219 baseMapT trueHitMap = processSpacePoint<baseMapT>(spacePoint, detType);
220 if (trueHitMap.empty())
continue;
223 B2DEBUG(23,
"Found " << nUniqueTHs <<
" TrueHits (unique) related to SpacePoint " << spacePoint->
getArrayIndex() <<
" from Array "
225 unsigned int iRels = nUniqueTHs > 4 ? 4 : nUniqueTHs - 1;
230 std::string mapCont =
printMap(trueHitMap);
231 B2DEBUG(24,
"The TrueHits and their weights for spacePoint " << spacePoint->
getArrayIndex() <<
": " + mapCont);
239 std::pair<VXDTrueHit*, double> trueHitwWeight;
241 if (detType ==
c_PXD) trueHitwWeight = getTHwithWeight<baseMapT, PXDTrueHit>(trueHitMap,
m_PXDTrueHits, spacePoint,
c_PXD);
242 else trueHitwWeight = getTHwithWeight<baseMapT, SVDTrueHit>(trueHitMap,
m_SVDTrueHits, spacePoint,
c_SVD);
244 if (trueHitwWeight.first !=
nullptr) {
246 thIndex = trueHitwWeight.first->getArrayIndex();
248 B2DEBUG(20,
"Could not relate one TrueHit to SpacePoint " << spacePoint->
getArrayIndex() <<
".");
265 B2RESULT(
"SpacePoint2TrueHitConnector: Got " << sumSpacePoints <<
" SpacePoints in " <<
m_nContainers <<
266 " containers and registered " << sumRelations <<
" relations to TrueHits");
268 std::stringstream contSumm;
269 contSumm <<
"Container-wise summary: \n";
271 for (
unsigned int iCont = 0; iCont <
m_nContainers; ++iCont) {
272 contSumm <<
"In Container " << iCont <<
" (container name: " <<
m_inputSpacePoints[iCont].first.getName() <<
") " <<
274 " relations were registered.\nNumber of related TrueHits to a SpacePoint are:\n";
275 for (
unsigned int i = 0; i <
m_nRelTrueHitsCtr[iCont].size() - 1; ++i) { contSumm << i + 1 <<
" related TrueHits to a SpacePoint : " <<
m_nRelTrueHitsCtr[iCont].at(i) <<
"\n"; }
276 contSumm <<
" more than 4 related TrueHits to a SpacePoint: " <<
m_nRelTrueHitsCtr[iCont].at(4) <<
"\n";
278 iCont) <<
" were probably ghost hits in this container!\n";
279 contSumm <<
m_noTrueHitCtr[iCont] <<
" SpacePoints had no relation to a TrueHit at all.\n";
281 B2DEBUG(20, contSumm.str());
285 std::stringstream furtherSummary;
294 B2DEBUG(20, furtherSummary.str());
305template<
typename MapType>
311 if (detType ==
c_PXD) {
316 }
catch (NoClusterToSpacePoint& anE) {
317 B2WARNING(
"Caught an exception while trying to relate SpacePoints and TrueHits: " << anE.what());
320 B2ERROR(
"Caught undefined exception while trying to relate SpacePoints and TrueHits");
324 B2DEBUG(25,
"trueHitMap.size() before return in processSpacePoint: " << trueHitMap.size());
329template<
typename MapType,
typename ClusterType,
typename TrueHitType>
331 std::string trueHitName)
336 if (spacePointClusters.
size() == 0) {
337 B2DEBUG(20,
"Found no related Cluster for SpacePoint " << spacePoint->
getArrayIndex() <<
" from Array " <<
339 throw NoClusterToSpacePoint();
341 B2DEBUG(24,
"Found " << spacePointClusters.
size() <<
" related Clusters to SpacePoint " << spacePoint->
getArrayIndex() <<
345 short noTrueHits = 0;
346 for (
size_t iCl = 0; iCl < spacePointClusters.
size(); ++iCl) {
348 const ClusterType* cluster = spacePointClusters[iCl];
350 if (clusterTrueHits.
size() == 0) {
351 B2DEBUG(20,
"Found no related TrueHit for Cluster " << cluster->getArrayIndex() <<
" contained by SpacePoint " <<
355 B2DEBUG(26,
"Found " << clusterTrueHits.
size() <<
" related TrueHits to Cluster " << cluster->getArrayIndex() <<
" from Array " <<
356 cluster->getArrayName());
358 for (
unsigned int i = 0; i < clusterTrueHits.
size(); ++i) {
363 int index = clusterTrueHits[i]->getArrayIndex();
364 if (trueHitsMap.find(index) == trueHitsMap.end()) {
366 B2DEBUG(29,
"Added new TrueHitInfo to map. Index " << index);
368 if (spacePointClusters.
weight(iCl) > 0) {
369 trueHitsMap[index].setUWeight(clusterTrueHits.
weight(i));
370 B2DEBUG(29,
"Added UCluster to TrueHitInfo with index " << index);
372 trueHitsMap[index].setVWeight(clusterTrueHits.
weight(i));
373 B2DEBUG(29,
"Added VCluster to TrueHitInfo with index " << index);
425template<
typename MapType>
428 B2DEBUG(23,
"Registering all possible relations for SpacePoint " << spacePoint->
getArrayIndex() <<
" from Array " <<
439 std::vector<TrueHitInfo> trueHitInfos =
getAllValues(trueHitMap);
441 std::sort(trueHitInfos.begin(), trueHitInfos.end());
444 if (detType ==
c_PXD) registerTrueHitRelation<PXDTrueHit>(newSP, info.m_Id, 1,
m_PXDTrueHits);
447 registerTrueHitRelation<SVDTrueHit>(newSP, info.m_Id, weight,
m_SVDTrueHits);
453template<
typename TrueHitType>
455 std::pair<TrueHitType*, double> trueHitwWeight,
e_detTypes detType)
457 TrueHitType* trueHit = trueHitwWeight.first;
458 B2DEBUG(23,
"Registering relation to TrueHit " << trueHit->getArrayIndex() <<
" from Array " << trueHit->getArrayName());
470 B2DEBUG(23,
"Added Relation to TrueHit " << trueHit->getArrayIndex() <<
" from Array " << trueHit->getArrayName() <<
471 " for SpacePoint " << spacePoint->
getArrayIndex() <<
" (weight = " << trueHitwWeight.second <<
")");
475template<
typename ClusterType>
479 B2DEBUG(27,
"Registering the Relations to Clusters of SpacePoint " << origSpacePoint->
getArrayIndex() <<
" in Array " <<
483 std::vector<std::pair<ClusterType*, double> > clustersAndWeights = getRelatedClusters<ClusterType>(origSpacePoint, clusterName);
484 for (
auto aCluster : clustersAndWeights) {
485 newSpacePoint->
addRelationTo(aCluster.first, aCluster.second);
486 B2DEBUG(27,
"Registered Relation to Cluster " << aCluster.first->getArrayIndex() <<
" with weight " << aCluster.second);
491template<
typename ClusterType>
493 std::string clusterName)
495 std::vector<std::pair<ClusterType*, double> > indsAndWeights;
498 for (
unsigned int iCl = 0; iCl < relClusters.
size(); ++iCl) {
499 indsAndWeights.push_back(std::make_pair(relClusters[iCl], relClusters.
weight(iCl)));
503 if (indsAndWeights.empty()) { B2ERROR(
"No Clusters related to SpacePoint " << spacePoint->
getArrayIndex() <<
"!"); }
505 return indsAndWeights;
509template<
typename TrueHitType>
513 TrueHitType* trueHit = trueHits[index];
516 B2DEBUG(23,
"Added Relation to TrueHit " << index <<
" from Array " << trueHits.
getName() <<
" for SpacePoint " <<
517 spacePoint->
getArrayIndex() <<
" (weight = " << weight <<
")");
522template<
typename MapType>
526 B2DEBUG(28,
"Doing position analysis for SpacePoint " << spacePoint->
getArrayIndex() <<
" from Array " <<
531 std::pair<unsigned short int, unsigned short int> clusterSizes =
getClusterSizes(spacePoint, detType);
532 std::pair<double, double> positionError =
getLocalError(spacePoint);
537 if (setUV.first) relationStatus.
addStatus(c_SpacePointU);
538 if (setUV.second) relationStatus.
addStatus(c_SpacePointV);
540 const std::vector<TrueHitInfo> trueHitInfos =
getAllValues(trueHitMap);
541 unsigned int nRelations = trueHitInfos.size();
542 if (nRelations != 1) relationStatus.
addStatus(c_nonUniqueRelation);
543 else relationStatus.
addStatus(c_clearHit);
545 B2DEBUG(29,
"SpacePoint has assigned U: " << setUV.first <<
", V: " << setUV.second <<
". Possible TrueHits: " << nRelations);
547 std::pair<double, double> spLocalPos =
getLocalPos(spacePoint);
548 unsigned short int vxdId = spacePoint->
getVxdID();
552 bool onceU =
false, onceV =
false;
553 bool twoClusters =
false;
555 onceU = onceU || info.m_U;
556 onceV = onceV || info.m_V;
557 twoClusters = twoClusters || (info.getNClusters() == 2);
559 bool allSet = onceU && onceV;
562 if (!allSet) relationStatus.
addStatus(c_noiseCluster);
563 if (allSet && !twoClusters) relationStatus.
addStatus(c_ghostHit);
567 unsigned short int overAllStatus = relationStatus.
getStatus();
574 std::pair<ROOT::Math::XYZVector, ROOT::Math::XYZVector> trueHitPos =
getTrueHitPositions(trueHit);
576 double weightU = info.m_wU;
577 double weightV = info.m_wV;
580 if (mcParticle !=
nullptr) {
584 if (info.m_Id == index) relationStatus.
addStatus(c_registeredRelation);
614 B2DEBUG(29,
"Branch contents of this entry:\nSPLocalU: " << spLocalPos.first <<
". SPLocalV: " << spLocalPos.second <<
"\n" << \
615 "SPGlobalX: " << spacePoint->
X() <<
", SPGlobalY: " << spacePoint->
Y() <<
", SPGlobalZ " << spacePoint->
Z() <<
"\n" << \
616 "THLocalU: " << trueHitPos.first.X() <<
", THLocalV: " << trueHitPos.first.Y() <<
"\n" << \
617 "THGlobalX: " << trueHitPos.second.X() <<
", THGlobalY: " << trueHitPos.second.Y() <<
", THGlobalZ: " << trueHitPos.second.Z() <<
619 "weight1: " << weightU <<
", weight2: " << weightV <<
", VxdID: " << vxdId <<
", nRelations: " << nRelations <<
", relStatus: " <<
625template<
typename MapType,
typename TrueHitType>
626std::pair<TrueHitType*, double>
630 std::vector<TrueHitInfo> trueHitInfos =
getAllValues(aMap);
631 std::pair<TrueHitType*, double> THwithWeight(
nullptr, 0.0);
633 if (trueHitInfos.empty())
return THwithWeight;
634 std::sort(trueHitInfos.begin(), trueHitInfos.end());
637 size_t nRelations = trueHitInfos.size();
639 B2DEBUG(23,
"Trying to select one TrueHit for SpacePoint " << spacePoint->
getArrayIndex() <<
" from Array " <<
640 spacePoint->
getArrayName() <<
". SpacePoint has " << nClusters <<
" Clusters.");
641 B2DEBUG(25,
"There are " << nRelations <<
" possible candidates.");
645 std::stringstream output;
646 output <<
"The candidates are: ";
647 for (
auto& info : trueHitInfos) { output << info; }
648 B2DEBUG(29, output.str());
650 std::pair<double, double> spacePointLocal =
getLocalPos(spacePoint);
653 B2DEBUG(29,
"SpacePoint " << spacePoint->
getArrayIndex() <<
" U: " << spacePointLocal.first <<
" V: " << spacePointLocal.second <<
654 " assigned: " << assignedLocal.first <<
", " << assignedLocal.second);
657 for (
int key : uniqueKeys) {
658 TrueHitType* trueHit = trueHits[key];
660 MCParticle* mcParticle = trueHit->template getRelatedFrom<MCParticle>(
"ALL");
662 int mcPartId = -1, pdgCode = 0;
663 bool primary =
false;
665 if (mcParticle !=
nullptr) {
668 pdgCode = mcParticle->
getPDG();
671 B2DEBUG(29,
"TrueHit " << key <<
" U: " << trueHit->getU() <<
", V: " << trueHit->getV() <<
" mc Particle Id: " << mcPartId <<
672 ", primary " << primary <<
", pdg: " << pdgCode);
678 bool ghostHit =
false;
680 B2DEBUG(28,
"Now checking trueHit: " << info);
681 if (nClusters == info.getNClusters()) {
682 TrueHitType* trueHit = trueHits[info.m_Id];
685 return std::make_pair(trueHit, weight);
688 B2DEBUG(28,
"The number of related Clusters ( = " << nClusters <<
") and the number of associated weights ( = " <<
689 info.getNClusters() <<
") do not match! This indicates a ghost hit");
700template <
typename TrueHitType>
703 B2DEBUG(25,
"Checking TrueHit " << trueHit->getArrayIndex() <<
" from Array " << trueHit->getArrayName() <<
" and SpacePoint " <<
707 MCParticle* mcPart = trueHit->template getRelatedFrom<MCParticle>(
"ALL");
708 bool primaryPart =
false;
711 B2DEBUG(25,
"TrueHit is not related to a primary particle but 'requirePrimary' is set to true!");
718 B2DEBUG(29,
"Not checking positions because 'requireProximity' is set to false");
722 const VxdID trueHitVxdId = trueHit->getSensorID();
724 B2DEBUG(29,
"Comparing the VxdIDs, SpacePoint: " << spacePointVxdId <<
", TrueHit: " << trueHitVxdId);
725 if (spacePointVxdId != trueHitVxdId) {
726 B2DEBUG(25,
"SpacePoint and TrueHit do not have the same VxdID. spacePoint: " << spacePointVxdId <<
", trueHit: " << trueHitVxdId);
735 B2DEBUG(29,
"maximum residual in U: " << maxUres <<
", in V: " << maxVres);
737 const ROOT::Math::XYZVector trueHitLocalPos = ROOT::Math::XYZVector(trueHit->getU(), trueHit->getV(), 0);
738 const ROOT::Math::XYZVector trueHitGlobalPos = SensorInfoBase.
pointToGlobal(trueHitLocalPos,
true);
740 std::pair<double, double> spacePointLocal =
getLocalPos(spacePoint);
744 if (setCoordinates.first) {
745 B2DEBUG(29,
"Comparing the U-coordinates, SpacePoint: " << spacePointLocal.first <<
", TrueHit: " << trueHitLocalPos.X() <<
746 " -> diff: " << spacePointLocal.first - trueHitLocalPos.X());
747 if (pow(spacePointLocal.first - trueHitLocalPos.X(), 2) > maxUres * maxUres) {
748 B2DEBUG(25,
"The local position difference in U direction is " << spacePointLocal.first - trueHitLocalPos.X() <<
749 " but maximum local position difference is set to: " << maxUres);
753 if (setCoordinates.second) {
754 B2DEBUG(29,
"Comparing the V-coordinates, SpacePoint: " << spacePointLocal.second <<
", TrueHit: " << trueHitLocalPos.Y() <<
755 " -> diff: " << spacePointLocal.second - trueHitLocalPos.Y());
756 if (pow(spacePointLocal.second - trueHitLocalPos.Y(), 2) > maxVres * maxVres) {
757 B2DEBUG(25,
"The local position difference in V direction is " << spacePointLocal.second - trueHitLocalPos.Y() <<
758 " but maximum local position difference is set to: " << maxVres);
764 if (setCoordinates.first && setCoordinates.second) {
765 B2DEBUG(29,
"Comparing the global positions, SpacePoint: (" << spacePoint->
X() <<
"," << spacePoint->
Y() <<
"," << spacePoint->
Z()
766 <<
"), TrueHit: (" << trueHitGlobalPos.X() <<
"," << trueHitGlobalPos.Y() <<
"," << trueHitGlobalPos.Z() <<
")");
770 B2DEBUG(25,
"The position differences are for X: " << spacePoint->
X() - trueHitGlobalPos.X() <<
", Y: " << spacePoint->
Y() -
771 trueHitGlobalPos.Y() <<
" Z: " << spacePoint->
Z() - trueHitGlobalPos.Z() <<
" but the maximum position difference is set to: " <<
776 B2DEBUG(20,
"For SpacePoint " << spacePoint->
getArrayIndex() <<
777 " one of the local coordinates was not assigned. The global positions and the un-assigned local coordinate were not compared!");
794template<
typename TrueHitType>
798 const ROOT::Math::XYZVector localPos = ROOT::Math::XYZVector(trueHit->getU(), trueHit->getV(), 0);
800 const VxdID trueHitVxdId = trueHit->getSensorID();
802 const ROOT::Math::XYZVector globalPos = SensorInfoBase.
pointToGlobal(localPos,
true);
804 return std::make_pair(localPos, globalPos);
813 output +=
"'" + entry +
"' ";
815 B2FATAL(
"CurlingTrackCandSplitter::initialize() : rootFileName is set wrong: entries are: " << output);
820 m_treePtr =
new TTree(
"PosAnaTree",
"Position Analysis");
866 std::pair<unsigned short int, unsigned short int> clusterSizes = { 0, 0 };
867 if (detType ==
c_PXD) {
868 std::vector<std::pair<PXDCluster*, double> > relClusters = getRelatedClusters<PXDCluster>(spacePoint,
m_PXDClusters.
getName());
869 return std::make_pair(relClusters[0].first->getUSize(), relClusters[0].first->getVSize());
871 std::vector<std::pair<SVDCluster*, double> > relClusters = getRelatedClusters<SVDCluster>(spacePoint,
m_SVDClusters.
getName());
872 for (
auto cluster : relClusters) {
873 if (cluster.first->isUCluster()) clusterSizes.first = cluster.first->getSize();
874 else clusterSizes.second = cluster.first->getSize();
882 auto detType = spacePoint->
getType();
883 std::pair<double, double> errors = { -1., -1. };
885 std::vector<std::pair<PXDCluster*, double> > relClusters = getRelatedClusters<PXDCluster>(spacePoint,
m_PXDClusters.
getName());
886 errors.first = relClusters[0].first->getUSigma();
887 errors.second = relClusters[0].first->getVSigma();
889 std::vector<std::pair<SVDCluster*, double> > relClusters = getRelatedClusters<SVDCluster>(spacePoint,
m_SVDClusters.
getName());
890 for (
auto cluster : relClusters) {
891 if (cluster.first->isUCluster()) { errors.first = cluster.first->getPositionSigma(); }
892 else { errors.second = cluster.first->getPositionSigma(); }
895 B2ERROR(
"Detector type not known in SpacePoint2TrueHitConnector::getLocalError() !");
907 bool bothClusters = trueHitInfo.
m_U && trueHitInfo.
m_V;
910 short addWeight = 20 - (bothClusters ? 20 : isUAssigned ? 10 : 0);
912 return addWeight + (bothClusters ? 2 : 1);
DataType Z() const
access variable Z (= .at(2) without boundary check)
DataType X() const
access variable X (= .at(0) without boundary check)
DataType Y() const
access variable Y (= .at(1) without boundary check)
@ c_DontWriteOut
Object/array should be NOT saved by output modules.
@ c_ErrorIfAlreadyRegistered
If the object/array was already registered, produce an error (aborting initialisation).
@ c_Event
Different object in each event, all objects/arrays are invalidated after event() function has been ca...
static Environment & Instance()
Static method to get a reference to the Environment instance.
@ c_Debug
Debug: for code development.
static LogSystem & Instance()
Static method to get a reference to the LogSystem instance.
A Class to store the Monte Carlo particle information.
@ c_PrimaryParticle
bit 0: Particle is primary particle.
bool hasStatus(unsigned short int bitmask) const
Return if specific status bit is set.
int getArrayIndex() const
Get 0-based index of the particle in the corresponding MCParticle list.
int getPDG() const
Return PDG code of particle.
void setDescription(const std::string &description)
Sets the description of the module.
void setPropertyFlags(unsigned int propertyFlags)
Sets the flags for the module properties.
const std::string & getName() const
Returns the name of the module.
@ c_ParallelProcessingCertified
This module can be run in parallel processing mode safely (All I/O must be done through the data stor...
Class for type safe access to objects that are referred to in relations.
size_t size() const
Get number of relations.
float weight(int index) const
Get weight with index.
void addRelationTo(const RelationsInterface< BASE > *object, float weight=1.0, const std::string &namedRelation="") const
Add a relation from this object to another object (with caching).
std::string getArrayName() const
Get name of array this object is stored in, or "" if not found.
int getArrayIndex() const
Returns this object's array index (in StoreArray), or -1 if not found.
FROM * getRelatedFrom(const std::string &name="", const std::string &namedRelation="") const
Get the object from which this object has a relation.
RelationVector< TO > getRelationsTo(const std::string &name="", const std::string &namedRelation="") const
Get the relations that point from this object to another store array.
TTree * m_treePtr
pointer to tree in root file
std::vector< std::string > m_PARAMclusterNames
names of containers of Clusters
std::pair< TrueHitType *, double > getTHwithWeight(const MapType &aMap, Belle2::StoreArray< TrueHitType > trueHits, Belle2::SpacePoint *spacePoint, e_detTypes detType)
get the TrueHit from information that is stored in the map (conditions are checked in the following o...
SpacePoint2TrueHitConnectorModule()
Constructor.
std::vector< std::string > m_PARAMtrueHitNames
names of containers of TrueHits
std::vector< unsigned int > m_SpacePointsCtr
Number of SpacePoints presented to the module.
std::vector< std::string > m_PARAMdetectorTypes
detector type names as strings to determine which name belongs to which detector type
void initialize() override
initialize: initialize counters, check StoreArrays, register StoreArrays, ...
unsigned int m_nContainers
number of passed containers -> storing the size of an input vector for not having to obtain it every ...
void reRegisterClusterRelations(Belle2::SpacePoint *origSpacePoint, Belle2::SpacePoint *newSpacePoint, std::string clusterName="ALL")
register all the relations to Clusters that origSpacePoint had for newSpacePoint
RootVariables m_rootVariables
Root variables used for collecting data eventwise.
std::vector< unsigned int > m_rejectedRelsCtr
Number of SpacePoints that were not related to a TrueHit (i.e.
void event() override
event: try to find the appropriate TrueHit to all SpacePoints
MapType getRelatedTrueHits(Belle2::SpacePoint *spacePoint, std::string clusterName="ALL", std::string trueHitName="ALL")
get all the related TrueHits to the SpacePoint, including their weights in a map (multimap!...
std::pair< double, double > getLocalError(Belle2::SpacePoint *spacePoint)
get the position error of SpacePoints in local coordinates
void registerAllRelations(Belle2::SpacePoint *spacePoint, MapType trueHitMap, e_detTypes detType)
register a Relation to all the TrueHits in the trueHitMap for the passed SpacePoint
std::vector< unsigned int > m_noClusterCtr
Number of SpacePoints without relation to a Cluster (i.e.
std::vector< std::pair< Belle2::StoreArray< Belle2::SpacePoint >, e_detTypes > > m_inputSpacePoints
StoreArray of all input SpacePoints.
double m_PARAMmaxGlobalDiff
maximum difference of global position coordinates for each direction between TrueHit and SpacePoint
void initializeRootFile()
initialize the root file that is used for output
std::unordered_map< int, TrueHitInfo > baseMapT
typedef for shorter notation throughout the module
std::vector< unsigned int > m_regRelationsCtr
Number of registered relations.
e_detTypes
enum to distinguish the detectortypes
unsigned int m_weightTooSmallCtr
Count the omitted relations because of a too small weight.
void terminate() override
terminate: print some summary information
unsigned int m_iCont
'helper variable' needed to not have to pass one integer down to processSpacePoint only to have a han...
std::vector< std::pair< ClusterType *, double > > getRelatedClusters(Belle2::SpacePoint *spacePoint, std::string clusterName="ALL")
get the pointers to the related Clusters and the weight of the original Relations between the spacePo...
std::vector< std::array< unsigned int, 5 > > m_nRelTrueHitsCtr
counting different numbers of related TrueHits (to a SpacePoint) with one variable
void closeRootFile()
close root file
void positionAnalysis(Belle2::SpacePoint *spacePoint, const MapType &trueHitMap, const int &index, e_detTypes detType)
Analyze the position of SpacePoints and corresponding TrueHits.
bool m_PARAMstoreSeparate
switch for storing the SpacePoints that can be related to a TrueHit into separate StoreArrays,...
unsigned int m_rejectedNoPrimaryCtr
Count how many times a relation was rejected because TrueHit was not related to primary.
std::vector< Belle2::StoreArray< Belle2::SpacePoint > > m_outputSpacePoints
StoreArray of all output SpacePoints.
std::pair< unsigned short int, unsigned short int > getClusterSizes(Belle2::SpacePoint *spacePoint, e_detTypes detType)
get the sizes of the related Clusters of a SpacePoint
MapType processSpacePoint(Belle2::SpacePoint *spacePoint, e_detTypes detType)
process a SpacePoint.
std::vector< e_detTypes > m_detectorTypes
storing the detector types for each container in vector, needed in initialize
std::vector< std::string > m_PARAMrootFileName
name and update status of root file
double m_maxGlobalDiff
storing the squared value of m_PARAMmaxGlobalDiff here to not alter the parameter input
void registerTrueHitRelation(Belle2::SpacePoint *spacePoint, int index, double weight, Belle2::StoreArray< TrueHitType > trueHits)
register the relation between a SpacePoint and the TrueHit (passed by index in the corresponding True...
std::vector< unsigned int > m_noTrueHitCtr
Number of SpacePoints that contained a Cluster to which no TrueHit could be found (i....
std::string m_PARAMoutputSuffix
suffix that will be appended to the StoreArray names of the output StoreArrays
Belle2::StoreArray< Belle2::SVDTrueHit > m_SVDTrueHits
SVDTrueHits StoreArray used throughout the module.
bool m_PARAMrequirePrimary
require the TrueHit to be related to a primary particle in order for the relation to get registered!
double m_PARAMmaxPosSigma
defining th maximum difference of local coordinates in units of PitchSize / sqrt(12)
Belle2::StoreArray< Belle2::PXDTrueHit > m_PXDTrueHits
PXDTrueHits StoreArray used throughout the module.
Belle2::StoreArray< Belle2::PXDCluster > m_PXDClusters
PXDTClusters StoreArray used throughout the module.
bool m_PARAMregisterAll
switch for registereing all relations for all TrueHits for all SpacePoints (there can be more than 1 ...
Belle2::StoreArray< Belle2::SVDCluster > m_SVDClusters
PXDClusters StoreArray used throughout the module.
void registerOneRelation(Belle2::SpacePoint *spacePoint, std::pair< TrueHitType *, double > trueHitwWeight, e_detTypes)
register Relation between SpacePoint and TrueHit (and if necessary also between SpacePoint and Cluste...
double calculateRelationWeight(const TrueHitInfo &trueHitInfo, Belle2::SpacePoint *spacePoint)
calculate the Relation weight to be used (for SVD only, although method works with PXD as well!...
std::pair< ROOT::Math::XYZVector, ROOT::Math::XYZVector > getTrueHitPositions(TrueHitType *trueHit)
get the local (.first) and global (.second) position of a TrueHit (passed by index)
bool m_PARAMrequireProximity
require the TrueHit to be close to the SpacePoint.
std::vector< std::string > m_PARAMspacePointNames
names of containers of SpacePoints
std::pair< double, double > getLocalPos(Belle2::SpacePoint *spacePoint)
get the local position of a SpacePoint
void initializeCounters()
initialize all counters to 0 WARNING: only call in constructor of module!
TFile * m_rootFilePtr
pointer to root file
bool compatibleCombination(Belle2::SpacePoint *spacePoint, TrueHitType *trueHit)
compares the TrueHit and the SpacePoint positions (global) to decide whether they are compatible NOTE...
bool m_PARAMpositionAnalysis
switch for doing the analysis of positions of SpacePoints and TrueHits
double m_PARAMminWeight
define a minimal weight a relation between Cluster and TrueHit.
std::vector< unsigned int > m_ghostHitCtr
Number of SpacePoints that are considered ghost hits.
SpacePoint typically is build from 1 PXDCluster or 1-2 SVDClusters.
unsigned short getNClustersAssigned() const
Returns the number of Clusters assigned to this SpacePoint.
double getNormalizedLocalV() const
Return normalized local coordinates of the cluster in v (0 <= posV <= 1).
std::pair< bool, bool > getIfClustersAssigned() const
Returns, if u(v)-coordinate is based on cluster information.
VxdID getVxdID() const
Return the VxdID of the sensor on which the the cluster of the SpacePoint lives.
const B2Vector3D & getPositionError() const
return the hitErrors in sigma of the global position
Belle2::VXD::SensorInfoBase::SensorType getType() const
Return SensorType (PXD, SVD, ...) on which the SpacePoint lives.
static std::pair< double, double > convertNormalizedToLocalCoordinates(const std::pair< double, double > &hitNormalized, Belle2::VxdID vxdID, const Belle2::VXD::SensorInfoBase *aSensorInfo=nullptr)
converts a hit in sensor-independent relative coordinates into local coordinate of given sensor.
double Z() const
return the z-value of the global position of the SpacePoint
double X() const
return the x-value of the global position of the SpacePoint
double getNormalizedLocalU() const
Return normalized local coordinates of the cluster in u (0 <= posU <= 1).
double Y() const
return the y-value of the global position of the SpacePoint
const std::string & getName() const
Return name under which the object is saved in the DataStore.
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
Accessor to arrays stored in the data store.
int getEntries() const
Get the number of objects in the array.
Type-safe access to single objects in the data store.
Class VXDTrueHit - Records of tracks that either enter or leave the sensitive volume.
const SensorInfoBase & getSensorInfo(Belle2::VxdID id) const
Return a referecne to the SensorInfo of a given SensorID.
static GeoCache & getInstance()
Return a reference to the singleton instance.
Base class to provide Sensor Information for PXD and SVD.
double getUPitch(double v=0) const
Return the pitch of the sensor.
ROOT::Math::XYZVector pointToGlobal(const ROOT::Math::XYZVector &local, bool reco=false) const
Convert a point from local to global coordinates.
double getVPitch(double v=0) const
Return the pitch of the sensor.
Class to uniquely identify a any structure of the PXD and SVD.
helper class for setting up a bitfield that can be used to store several flags in one variable TODO: ...
void setStatus(T __statusBits)
set the status of the bitfield (CAUTION: overwrites any previously defined status!...
void addStatus(T __statusBits)
add a status to the bitfield (if it has not already been added)
const T getStatus() const
get the status of the bitfield
void addParam(const std::string &name, T ¶mVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
double sqrt(double a)
sqrt for double
std::vector< typename MapType::key_type > getUniqueKeys(const MapType &aMap)
get the unique keys of a map (i.e.
unsigned int getUniqueSize(const MapType &aMap)
get the number of unique keys inside the map NOTE: for non-multimap this is the same as ....
std::vector< typename MapType::mapped_type > getAllValues(const MapType &aMap)
get all values in the map (i.e.
std::string printMap(const MapType &aMap)
get the contents of the map as string.
Abstract base class for different kinds of events.
helper struct to access root variables inside the module
std::vector< unsigned int > ClusterSizeV
size of the v-cluster (resp.
std::vector< double > WeightV
weight of the relation between the V-Cluster of the SpacePoint and the TrueHit
std::vector< double > SpacePointErrorZ
positiion error of SpacePoint in Z direction (global)
std::vector< double > TrueHitULocal
TrueHit local U-position.
std::vector< double > TrueHitXGlobal
TrueHit global X-position.
std::vector< double > SpacePointErrorX
positiion error of SpacePoint in X direction (global)
std::vector< double > SpacePointVLocal
SpacePoint local V-position.
std::vector< unsigned int > ClusterSizeU
size of the u-cluster (resp.
std::vector< double > TrueHitVLocal
TrueHit local V-position.
std::vector< double > SpacePointErrorY
positiion error of SpacePoint in Y direction (global)
std::vector< unsigned int > NRelations
Number of related TrueHits to a SpacePoint.
std::vector< double > SpacePointXGlobal
SpacePoint global X-position.
std::vector< unsigned short int > HitVxdID
VxdID of the SpacePoint/TrueHit.
std::vector< double > SpacePointErrorU
position error of SpacePoint in U direction
std::vector< unsigned short int > RelationStatus
different flags of the relation stored in here (see c_relationStatus)
std::vector< double > SpacePointYGlobal
SpacePoint global Y-position.
std::vector< double > SpacePointULocal
SpacePoint local U-position.
std::vector< double > SpacePointZGlobal
SpacePoint global Z-position.
std::vector< double > TrueHitYGlobal
TrueHit global Y-position.
std::vector< double > SpacePointErrorV
position error of SpacePoint in V direction
std::vector< double > WeightU
weight of the relation between the U-Cluster of the SpacePoint and the TrueHit
std::vector< double > TrueHitZGlobal
TrueHit global Z-position.
helper struct that holds information that is needed for the registration of the relation between Spac...
bool m_U
if true, U-Cluster is used by SpacePoint
bool m_V
if true, V-Cluster is used by SpacePoint