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>
39 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 accesible for Modules that need it. Module can also be used to filter out 'fishy' SpacePoints.");
40 setPropertyFlags(c_ParallelProcessingCertified);
42 addParam(
"storeSeperate", m_PARAMstoreSeparate,
43 "Set to false if you do not want to create seperate 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 addParam(
"registerAll", m_PARAMregisterAll,
47 "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 ommitted! 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 addParam(
"positionAnalysis", m_PARAMpositionAnalysis,
51 "Analyze the positions of SpacePoints and corresponding TrueHits. NOTE: if enabled a root file gets created!",
false);
53 addParam(
"requirePrimary", m_PARAMrequirePrimary,
54 "Set to true if only relations to TrueHits that are related to a primary particle should get registered.",
false);
56 addParam(
"requireProximity", m_PARAMrequireProximity,
57 "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'.",
60 std::vector<std::string> defaultInList;
61 defaultInList.push_back(std::string(
""));
62 addParam(
"TrueHitNames", m_PARAMtrueHitNames,
63 "Container names of TrueHits. NOTE: need one name per 'DetectorType' (i.e. unique entries in 'DetectorType)!", defaultInList);
64 addParam(
"SpacePointNames", m_PARAMspacePointNames,
"Container names of SpacePoints.", {
"SVDSpacePoints",
"PXDSpacePoints"});
65 addParam(
"DetectorTypes", m_PARAMdetectorTypes,
66 "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 addParam(
"ClusterNames", m_PARAMclusterNames,
68 "Container names of Clusters. NOTE: need one name per 'DetectorType' (i.e. unique entries in 'DetectorType')!", defaultInList);
70 std::vector<std::string> defaultRootFName = {
"PositionAnalysis",
"RECREATE" };
71 addParam(
"rootFileName", m_PARAMrootFileName,
72 "Filename and write-mode ('RECREATE' or 'UPDATE'). If given more than 2 strings this module will cause termination",
75 addParam(
"outputSuffix", m_PARAMoutputSuffix,
76 "Suffix that will be appended to the container names if 'storeSeperate' is set to true", std::string(
"_relTH"));
78 addParam(
"maxGlobalPosDiff", m_PARAMmaxGlobalDiff,
79 "max difference of global position coordinates between TrueHit and SpacePoint (in each direction) in cm.", 0.05);
82 addParam(
"maxPosSigma", m_PARAMmaxPosSigma,
"Define the maximum local position difference in units of PitchSize / sqrt(12).", 4.);
83 addParam(
"minWeight", m_PARAMminWeight,
84 "Define a minimal weight a relation between a Cluster and a TrueHit has to have for the TrueHit to be considered as possible candidate.",
89 m_rootFilePtr =
nullptr;
92 if (m_PARAMpositionAnalysis ==
true and Environment::Instance().getNumberProcesses() > 0) {
94 "SpacePoint2TrueHitConnector::initialize: parameter positionAnalysis (and therefore root-output) is enabled and basf2 is running in multi-threaded mode - this can cause nondeterministic behavior! "
96 <<
" you can suppress multi-threading for this module by writing:"
98 <<
"main.add_module('SpacePoint2TrueHitConnector').set_property_flags(0) "
100 <<
"into the steering file!");
105 void SpacePoint2TrueHitConnectorModule::initialize()
107 B2INFO(
"SpacePoint2TrueHitConnector -------------------------- initialize --------------------------------");
114 B2FATAL(
"Passed " << nTHNames <<
" TrueHitNames and " << nDetTypes <<
" DetectorTypes but number of passed SpacePointArrays is " <<
117 if ((nTHNames != nDetTypes) || (nClNames != nTHNames)) {
118 B2FATAL(
"Passed " << nTHNames <<
" TrueHitNames and " << nClNames <<
"ClusterNames but " << nDetTypes <<
" DetectorTypes!");
124 if (detType.compare(std::string(
"SVD")) != 0 && detType.compare(std::string(
"PXD")) != 0) {
125 B2FATAL(
"Found entry " << detType <<
" in DetectorTypes, but only 'PXD' and 'SVD' are allowed!");
127 if (detType.compare(std::string(
"SVD")) == 0) {
157 B2WARNING(
"'outputSuffix' is empty and 'storeSeperate' is set to true. This would lead to StoreArrays with the same name. Resetting to 'outputSuffix' to '_relTH'!");
189 B2WARNING(
"'maxPosSigma' is set to a value below 0: " <<
m_PARAMmaxPosSigma <<
"! Resetting to default (4)!");
200 const int eventCtr = eventMetaDataPtr->getEvent();
201 B2DEBUG(10,
"SpacePoint2TrueHitConnector::event(). Processing event " << eventCtr <<
" -----------------------");
208 const int nSpacePoints = spacePoints.
getEntries();
210 std::string detTypeStr = detType ==
c_SVD ?
"SVD" :
"PXD";
212 " for this event. detType: " << detTypeStr);
216 for (
int iSP = 0; iSP < nSpacePoints; ++iSP) {
218 B2DEBUG(49,
"Processing SpacePoint " << iSP <<
" from " << nSpacePoints);
220 baseMapT trueHitMap = processSpacePoint<baseMapT>(spacePoint, detType);
221 if (trueHitMap.empty())
continue;
224 B2DEBUG(50,
"Found " << nUniqueTHs <<
" TrueHits (unique) related to SpacePoint " << spacePoint->
getArrayIndex() <<
" from Array "
226 unsigned int iRels = nUniqueTHs > 4 ? 4 : nUniqueTHs - 1;
231 std::string mapCont =
printMap(trueHitMap);
232 B2DEBUG(250,
"The TrueHits and their weights for spacePoint " << spacePoint->
getArrayIndex() <<
": " + mapCont);
240 pair<VXDTrueHit*, double> trueHitwWeight;
242 if (detType ==
c_PXD) trueHitwWeight = getTHwithWeight<baseMapT, PXDTrueHit>(trueHitMap,
m_PXDTrueHits, spacePoint,
c_PXD);
243 else trueHitwWeight = getTHwithWeight<baseMapT, SVDTrueHit>(trueHitMap,
m_SVDTrueHits, spacePoint,
c_SVD);
245 if (trueHitwWeight.first !=
nullptr) {
247 thIndex = trueHitwWeight.first->getArrayIndex();
249 B2DEBUG(10,
"Could not relate one TrueHit to SpacePoint " << spacePoint->
getArrayIndex() <<
".");
266 B2RESULT(
"SpacePoint2TrueHitConnector: Got " << sumSpacePoints <<
" SpacePoints in " <<
m_nContainers <<
267 " containers and registered " << sumRelations <<
" relations to TrueHits");
269 stringstream contSumm;
270 contSumm <<
"Container-wise summary: \n";
272 for (
unsigned int iCont = 0; iCont <
m_nContainers; ++iCont) {
273 contSumm <<
"In Container " << iCont <<
" (container name: " <<
m_inputSpacePoints[iCont].first.getName() <<
") " <<
275 " relations were registered.\nNumber of related TrueHits to a SpacePoint are:\n";
276 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"; }
277 contSumm <<
" more than 4 related TrueHits to a SpacePoint: " <<
m_nRelTrueHitsCtr[iCont].at(4) <<
"\n";
279 iCont) <<
" were probably ghost hits in this container!\n";
280 contSumm <<
m_noTrueHitCtr[iCont] <<
" SpacePoints had no relation to a TrueHit at all.\n";
282 B2DEBUG(1, contSumm.str());
286 stringstream furtherSummary;
295 B2DEBUG(2, furtherSummary.str());
306 template<
typename MapType>
312 if (detType ==
c_PXD) {
317 }
catch (NoClusterToSpacePoint& anE) {
318 B2WARNING(
"Caught an exception while trying to relate SpacePoints and TrueHits: " << anE.what());
321 B2ERROR(
"Caught undefined exception while trying to relate SpacePoints and TrueHits");
325 B2DEBUG(499,
"trueHitMap.size() before return in processSpacePoint: " << trueHitMap.size());
330 template<
typename MapType,
typename ClusterType,
typename TrueHitType>
332 std::string trueHitName)
337 if (spacePointClusters.
size() == 0) {
338 B2DEBUG(1,
"Found no related Cluster for SpacePoint " << spacePoint->
getArrayIndex() <<
" from Array " <<
340 throw NoClusterToSpacePoint();
342 B2DEBUG(75,
"Found " << spacePointClusters.
size() <<
" related Clusters to SpacePoint " << spacePoint->
getArrayIndex() <<
346 short noTrueHits = 0;
347 for (
size_t iCl = 0; iCl < spacePointClusters.
size(); ++iCl) {
349 const ClusterType* cluster = spacePointClusters[iCl];
351 if (clusterTrueHits.
size() == 0) {
352 B2DEBUG(3,
"Found no related TrueHit for Cluster " << cluster->getArrayIndex() <<
" contained by SpacePoint " <<
356 B2DEBUG(80,
"Found " << clusterTrueHits.
size() <<
" related TrueHits to Cluster " << cluster->getArrayIndex() <<
" from Array " <<
357 cluster->getArrayName());
359 for (
unsigned int i = 0; i < clusterTrueHits.
size(); ++i) {
364 int index = clusterTrueHits[i]->getArrayIndex();
365 if (trueHitsMap.find(index) == trueHitsMap.end()) {
367 B2DEBUG(499,
"Added new TrueHitInfo to map. Index " << index);
369 if (spacePointClusters.
weight(iCl) > 0) {
370 trueHitsMap[index].setUWeight(clusterTrueHits.
weight(i));
371 B2DEBUG(499,
"Added UCluster to TrueHitInfo with index " << index);
373 trueHitsMap[index].setVWeight(clusterTrueHits.
weight(i));
374 B2DEBUG(499,
"Added VCluster to TrueHitInfo with index " << index);
426 template<
typename MapType>
429 B2DEBUG(50,
"Registering all possible relations for SpacePoint " << spacePoint->
getArrayIndex() <<
" from Array " <<
440 std::vector<TrueHitInfo> trueHitInfos =
getAllValues(trueHitMap);
442 std::sort(trueHitInfos.begin(), trueHitInfos.end());
445 if (detType ==
c_PXD) registerTrueHitRelation<PXDTrueHit>(newSP, info.m_Id, 1,
m_PXDTrueHits);
448 registerTrueHitRelation<SVDTrueHit>(newSP, info.m_Id, weight,
m_SVDTrueHits);
454 template<
typename TrueHitType>
456 std::pair<TrueHitType*, double> trueHitwWeight,
e_detTypes detType)
458 TrueHitType* trueHit = trueHitwWeight.first;
459 B2DEBUG(50,
"Registering relation to TrueHit " << trueHit->getArrayIndex() <<
" from Array " << trueHit->getArrayName());
471 B2DEBUG(50,
"Added Relation to TrueHit " << trueHit->getArrayIndex() <<
" from Array " << trueHit->getArrayName() <<
472 " for SpacePoint " << spacePoint->
getArrayIndex() <<
" (weight = " << trueHitwWeight.second <<
")");
476 template<
typename ClusterType>
480 B2DEBUG(100,
"Registering the Relations to Clusters of SpacePoint " << origSpacePoint->
getArrayIndex() <<
" in Array " <<
484 vector<pair<ClusterType*, double> > clustersAndWeights = getRelatedClusters<ClusterType>(origSpacePoint, clusterName);
485 for (
auto aCluster : clustersAndWeights) {
486 newSpacePoint->
addRelationTo(aCluster.first, aCluster.second);
487 B2DEBUG(100,
"Registered Relation to Cluster " << aCluster.first->getArrayIndex() <<
" with weight " << aCluster.second);
492 template<
typename ClusterType>
494 std::string clusterName)
496 vector<pair<ClusterType*, double> > indsAndWeights;
499 for (
unsigned int iCl = 0; iCl < relClusters.
size(); ++iCl) {
500 indsAndWeights.push_back(make_pair(relClusters[iCl], relClusters.
weight(iCl)));
504 if (indsAndWeights.empty()) { B2ERROR(
"No Clusters related to SpacePoint " << spacePoint->
getArrayIndex() <<
"!"); }
506 return indsAndWeights;
510 template<
typename TrueHitType>
514 TrueHitType* trueHit = trueHits[index];
517 B2DEBUG(50,
"Added Relation to TrueHit " << index <<
" from Array " << trueHits.
getName() <<
" for SpacePoint " <<
518 spacePoint->
getArrayIndex() <<
" (weight = " << weight <<
")");
523 template<
typename MapType>
527 B2DEBUG(250,
"Doing position analysis for SpacePoint " << spacePoint->
getArrayIndex() <<
" from Array " <<
532 pair<unsigned short int, unsigned short int> clusterSizes =
getClusterSizes(spacePoint, detType);
533 pair<double, double> positionError =
getLocalError(spacePoint);
538 if (setUV.first) relationStatus.
addStatus(c_SpacePointU);
539 if (setUV.second) relationStatus.
addStatus(c_SpacePointV);
541 const vector<TrueHitInfo> trueHitInfos =
getAllValues(trueHitMap);
542 unsigned int nRelations = trueHitInfos.size();
543 if (nRelations != 1) relationStatus.
addStatus(c_nonUniqueRelation);
544 else relationStatus.
addStatus(c_clearHit);
546 B2DEBUG(999,
"SpacePoint has assigned U: " << setUV.first <<
", V: " << setUV.second <<
". Possible TrueHits: " << nRelations);
548 pair<double, double> spLocalPos =
getLocalPos(spacePoint);
549 unsigned short int vxdId = spacePoint->
getVxdID();
553 bool onceU =
false, onceV =
false;
554 bool twoClusters =
false;
556 onceU = onceU || info.m_U;
557 onceV = onceV || info.m_V;
558 twoClusters = twoClusters || (info.getNClusters() == 2);
560 bool allSet = onceU && onceV;
563 if (!allSet) relationStatus.
addStatus(c_noiseCluster);
564 if (allSet && !twoClusters) relationStatus.
addStatus(c_ghostHit);
568 unsigned short int overAllStatus = relationStatus.
getStatus();
577 double weightU = info.m_wU;
578 double weightV = info.m_wV;
581 if (mcParticle !=
nullptr) {
585 if (info.m_Id == index) relationStatus.
addStatus(c_registeredRelation);
615 B2DEBUG(999,
"Branch contents of this entry:\nSPLocalU: " << spLocalPos.first <<
". SPLocalV: " << spLocalPos.second <<
"\n" << \
616 "SPGlobalX: " << spacePoint->
X() <<
", SPGlobalY: " << spacePoint->
Y() <<
", SPGlobalZ " << spacePoint->
Z() <<
"\n" << \
617 "THLocalU: " << trueHitPos.first.X() <<
", THLocalV: " << trueHitPos.first.Y() <<
"\n" << \
618 "THGlobalX: " << trueHitPos.second.X() <<
", THGlobalY: " << trueHitPos.second.Y() <<
", THGlobalZ: " << trueHitPos.second.Z() <<
620 "weight1: " << weightU <<
", weight2: " << weightV <<
", VxdID: " << vxdId <<
", nRelations: " << nRelations <<
", relStatus: " <<
626 template<
typename MapType,
typename TrueHitType>
627 std::pair<TrueHitType*, double>
632 std::pair<TrueHitType*, double> THwithWeight(
nullptr, 0.0);
634 if (trueHitInfos.empty())
return THwithWeight;
635 std::sort(trueHitInfos.begin(), trueHitInfos.end());
638 size_t nRelations = trueHitInfos.size();
640 B2DEBUG(50,
"Trying to select one TrueHit for SpacePoint " << spacePoint->
getArrayIndex() <<
" from Array " <<
641 spacePoint->
getArrayName() <<
". SpacePoint has " << nClusters <<
" Clusters.");
642 B2DEBUG(150,
"There are " << nRelations <<
" possible candidates.");
647 output <<
"The candidates are: ";
648 for (
auto& info : trueHitInfos) { output << info; }
649 B2DEBUG(999, output.str());
651 std::pair<double, double> spacePointLocal =
getLocalPos(spacePoint);
654 B2DEBUG(999,
"SpacePoint " << spacePoint->
getArrayIndex() <<
" U: " << spacePointLocal.first <<
" V: " << spacePointLocal.second <<
655 " assigned: " << assignedLocal.first <<
", " << assignedLocal.second);
658 for (
int key : uniqueKeys) {
659 TrueHitType* trueHit = trueHits[key];
661 MCParticle* mcParticle = trueHit->template getRelatedFrom<MCParticle>(
"ALL");
663 int mcPartId = -1, pdgCode = 0;
664 bool primary =
false;
666 if (mcParticle !=
nullptr) {
669 pdgCode = mcParticle->
getPDG();
672 B2DEBUG(999,
"TrueHit " << key <<
" U: " << trueHit->getU() <<
", V: " << trueHit->getV() <<
" mc Particle Id: " << mcPartId <<
673 ", primary " << primary <<
", pdg: " << pdgCode);
679 bool ghostHit =
false;
681 B2DEBUG(499,
"Now checking trueHit: " << info);
682 if (nClusters == info.getNClusters()) {
683 TrueHitType* trueHit = trueHits[info.m_Id];
686 return make_pair(trueHit, weight);
689 B2DEBUG(499,
"The number of related Clusters ( = " << nClusters <<
") and the number of associated weights ( = " <<
690 info.getNClusters() <<
") do not match! This indicates a ghost hit");
701 template <
typename TrueHitType>
704 B2DEBUG(150,
"Checking TrueHit " << trueHit->getArrayIndex() <<
" from Array " << trueHit->getArrayName() <<
" and SpacePoint " <<
708 MCParticle* mcPart = trueHit->template getRelatedFrom<MCParticle>(
"ALL");
709 bool primaryPart =
false;
712 B2DEBUG(150,
"TrueHit is not related to a primary particle but 'requirePrimary' is set to true!");
719 B2DEBUG(999,
"Not checking positions because 'requireProximity' is set to false");
723 const VxdID trueHitVxdId = trueHit->getSensorID();
725 B2DEBUG(999,
"Comparing the VxdIDs, SpacePoint: " << spacePointVxdId <<
", TrueHit: " << trueHitVxdId);
726 if (spacePointVxdId != trueHitVxdId) {
727 B2DEBUG(150,
"SpacePoint and TrueHit do not have the same VxdID. spacePoint: " << spacePointVxdId <<
", trueHit: " << trueHitVxdId);
736 B2DEBUG(999,
"maximum residual in U: " << maxUres <<
", in V: " << maxVres);
738 const TVector3 trueHitLocalPos = TVector3(trueHit->getU(), trueHit->getV(), 0);
739 const TVector3 trueHitGlobalPos = SensorInfoBase.
pointToGlobal(trueHitLocalPos,
true);
741 std::pair<double, double> spacePointLocal =
getLocalPos(spacePoint);
745 if (setCoordinates.first) {
746 B2DEBUG(999,
"Comparing the U-coordinates, SpacePoint: " << spacePointLocal.first <<
", TrueHit: " << trueHitLocalPos.X() <<
747 " -> diff: " << spacePointLocal.first - trueHitLocalPos.X());
748 if (pow(spacePointLocal.first - trueHitLocalPos.X(), 2) > maxUres * maxUres) {
749 B2DEBUG(150,
"The local position difference in U direction is " << spacePointLocal.first - trueHitLocalPos.X() <<
750 " but maximum local position difference is set to: " << maxUres);
754 if (setCoordinates.second) {
755 B2DEBUG(999,
"Comparing the V-coordinates, SpacePoint: " << spacePointLocal.second <<
", TrueHit: " << trueHitLocalPos.Y() <<
756 " -> diff: " << spacePointLocal.second - trueHitLocalPos.Y());
757 if (pow(spacePointLocal.second - trueHitLocalPos.Y(), 2) > maxVres * maxVres) {
758 B2DEBUG(150,
"The local position difference in V direction is " << spacePointLocal.second - trueHitLocalPos.Y() <<
759 " but maximum local position difference is set to: " << maxVres);
765 if (setCoordinates.first && setCoordinates.second) {
766 B2DEBUG(999,
"Comparing the global positions, SpacePoint: (" << spacePoint->
X() <<
"," << spacePoint->
Y() <<
"," << spacePoint->
Z()
767 <<
"), TrueHit: (" << trueHitGlobalPos.X() <<
"," << trueHitGlobalPos.Y() <<
"," << trueHitGlobalPos.Z() <<
")");
771 B2DEBUG(150,
"The position differences are for X: " << spacePoint->
X() - trueHitGlobalPos.X() <<
", Y: " << spacePoint->
Y() -
772 trueHitGlobalPos.Y() <<
" Z: " << spacePoint->
Z() - trueHitGlobalPos.Z() <<
" but the maximum position difference is set to: " <<
777 B2DEBUG(5,
"For SpacePoint " << spacePoint->
getArrayIndex() <<
778 " one of the local coordinates was not assigned. The global positions and the un-assigned local coordinate were not compared!");
795 template<
typename TrueHitType>
799 const TVector3 localPos = TVector3(trueHit->getU(), trueHit->getV(), 0);
801 const VxdID trueHitVxdId = trueHit->getSensorID();
803 const TVector3 globalPos = SensorInfoBase.
pointToGlobal(localPos,
true);
805 return make_pair(localPos, globalPos);
814 output +=
"'" + entry +
"' ";
816 B2FATAL(
"CurlingTrackCandSplitter::initialize() : rootFileName is set wrong: entries are: " << output);
821 m_treePtr =
new TTree(
"PosAnaTree",
"Position Analysis");
867 std::pair<unsigned short int, unsigned short int> clusterSizes = { 0, 0 };
868 if (detType ==
c_PXD) {
869 vector<pair<PXDCluster*, double> > relClusters = getRelatedClusters<PXDCluster>(spacePoint,
m_PXDClusters.
getName());
870 return make_pair(relClusters[0].first->getUSize(), relClusters[0].first->getVSize());
872 vector<pair<SVDCluster*, double> > relClusters = getRelatedClusters<SVDCluster>(spacePoint,
m_SVDClusters.
getName());
873 for (
auto cluster : relClusters) {
874 if (cluster.first->isUCluster()) clusterSizes.first = cluster.first->getSize();
875 else clusterSizes.second = cluster.first->getSize();
883 auto detType = spacePoint->
getType();
884 pair<double, double> errors = { -1., -1. };
886 vector<pair<PXDCluster*, double> > relClusters = getRelatedClusters<PXDCluster>(spacePoint,
m_PXDClusters.
getName());
887 errors.first = relClusters[0].first->getUSigma();
888 errors.second = relClusters[0].first->getVSigma();
890 vector<pair<SVDCluster*, double> > relClusters = getRelatedClusters<SVDCluster>(spacePoint,
m_SVDClusters.
getName());
891 for (
auto cluster : relClusters) {
892 if (cluster.first->isUCluster()) { errors.first = cluster.first->getPositionSigma(); }
893 else { errors.second = cluster.first->getPositionSigma(); }
896 B2ERROR(
"Detector type not known in SpacePoint2TrueHitConnector::getLocalError() !");
908 bool bothClusters = trueHitInfo.
m_U && trueHitInfo.
m_V;
911 short addWeight = 20 - (bothClusters ? 20 : isUAssigned ? 10 : 0);
913 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...
@ 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.
const std::string & getName() const
Returns the name of the module.
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.
RelationVector< TO > getRelationsTo(const std::string &name="", const std::string &namedRelation="") const
Get the relations that point from this object to another store array.
FROM * getRelatedFrom(const std::string &name="", const std::string &namedRelation="") const
Get the object from which this object has a relation.
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
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 @retuns .first is U position error,...
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::pair< TVector3, TVector3 > getTrueHitPositions(TrueHitType *trueHit)
get the local (.first) and global (.second) position of a TrueHit (passed by index)
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 correspoinding Tru...
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 neccessary also between SpacePoint and Clust...
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!...
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).
VxdID getVxdID() const
Return the VxdID of the sensor on which the the cluster of the SpacePoint lives.
const B2Vector3< double > & getPositionError() const
return the hitErrors in sigma of the global position
std::pair< bool, bool > getIfClustersAssigned() const
Returns, if u(v)-coordinate is based on cluster information.
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
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
const std::string & getName() const
Return name under which the object is saved in the DataStore.
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.
double getVPitch(double v=0) const
Return the pitch of the sensor.
TVector3 pointToGlobal(const TVector3 &local, bool reco=false) const
Convert a point from local to global coordinates.
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
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
std::vector< typename MapType::key_type > getUniqueKeys(const MapType &aMap)
get the unique keys of a map (i.e.
std::string printMap(const MapType &aMap)
get the contents of the map as string.
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.
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