11 #include <svd/modules/svdCrossTalkFinder/SVDCrossTalkFinderModule.h>
12 #include <svd/modules/svdCrossTalkFinder/SVDCrossTalkFinderHelperFunctions.h>
14 #include <vxd/geometry/GeoCache.h>
21 SVDCrossTalkFinderModule::SVDCrossTalkFinderModule() :
Module()
24 setDescription(
"Detect SVDRecoDigits created from cross-talk present in the origami sensors");
29 "SVDRecoDigit collection name",
string(
""));
32 "Create cross-talk strip channel payload",
true);
35 "Filename of root file for calibration payload", std::string(
"crossTalkStripsCalibration.root"));
37 addParam(
"uSideOccupancyFactor", m_uSideOccupancyFactor,
38 "Multiple of the average occupancy for high occupancy strip classification", 2);
41 "Multiple of the average occupancy for high occupancy strip classification", 2);
44 "Number of APV chips with at least one high occupancy strips in event required for cross talk flag", 30);
53 std::string sensorName;
59 for (
auto& sensors : geo.
getSensors(ladders)) {
60 for (
int side = 0; side <= 1; side++) {
63 if (layers.getLayerNumber() == 3 or side == 1) {
64 sensorHist =
new TH1F(sensorName.c_str(),
"", 768, 0, 768);
66 sensorHist =
new TH1F(sensorName.c_str(),
"", 512, 0, 512);
87 vector<std::string> highOccChips_uSide ;
88 vector<std::string> highOccChips_vSide ;
89 vector<std::string> highOccChipsStripNum_uSide ;
90 vector<std::string> highOccChipsStripNum_vSide ;
91 vector<std::string> clusterStrips_uSide ;
92 vector<std::string> clusterStrips_vSide ;
93 vector<std::string> clusterChips_uSide ;
94 vector<int> strips_uSide;
95 vector<int> strips_vSide;
99 if (svdRecoDigit.getSensorID().getLayerNumber() == 3 or svdRecoDigit.getSensorID().getSensorNumber() == 1) {
103 int side = svdRecoDigit.isUStrip();
104 std::string sensorName;
107 double sensorAverage = 0.;
108 calculateAverage(svdRecoDigit.getSensorID(), sensorAverage, side);
109 int stripID = svdRecoDigit.getCellID();
110 std::string sensorStripNum = sensorName +
"." + std::to_string(stripID);
114 if (side == 1 && stripOccupancy > (m_uSideOccupancyFactor * sensorAverage)) {
116 int adjacentStrip = 0;
117 if (!strips_uSide.empty()) {
118 adjacentStrip = stripID - strips_uSide.back();
120 strips_uSide.push_back(stripID);
121 if (!highOccChips_uSide.empty() && sensorName == highOccChips_uSide.back() && adjacentStrip == 1) {
122 clusterChips_uSide.push_back(sensorName);
123 if (clusterStrips_uSide.empty() || clusterStrips_uSide.back() != sensorStripNum) {
124 clusterStrips_uSide.push_back(highOccChipsStripNum_uSide.back());
126 clusterStrips_uSide.push_back(sensorStripNum);
128 highOccChipsStripNum_uSide.push_back(sensorStripNum);
129 highOccChips_uSide.push_back(sensorName);
133 int adjacentStrip = 0;
134 if (!strips_vSide.empty()) {
135 adjacentStrip = stripID - strips_vSide.back();
137 strips_vSide.push_back(stripID);
138 if (!highOccChips_vSide.empty() && sensorName == highOccChips_vSide.back() && adjacentStrip == 1) {
139 if (clusterStrips_vSide.empty() || clusterStrips_vSide.back() != sensorStripNum) {
140 clusterStrips_vSide.push_back(highOccChipsStripNum_vSide.back());
142 clusterStrips_vSide.push_back(sensorStripNum);
144 highOccChipsStripNum_vSide.push_back(sensorStripNum);
145 highOccChips_vSide.push_back(sensorName);
150 std::sort(clusterChips_uSide.begin(), clusterChips_uSide.end());
151 clusterChips_uSide.erase(unique(clusterChips_uSide.begin(), clusterChips_uSide.end()), clusterChips_uSide.end());
152 int numberOfClusterChips = std::distance(clusterChips_uSide.begin(), std::unique(clusterChips_uSide.begin(),
153 clusterChips_uSide.end()));
159 std::string sensorID = svdRecoDigit.getSensorID();
160 std::string digitID = sensorID +
"." + std::to_string(svdRecoDigit.isUStrip());
161 std::string stripID = digitID +
"." + std::to_string(svdRecoDigit.getCellID());
163 if (std::find(clusterStrips_uSide.begin(), clusterStrips_uSide.end(), stripID) != clusterStrips_uSide.end()) {
164 std::string sensorName;
165 occupancyPDFName(svdRecoDigit.getSensorID(), svdRecoDigit.isUStrip(), sensorName);
168 if (xTalkStrip->GetBinContent(svdRecoDigit.getCellID()) < 1.) xTalkStrip->Fill(svdRecoDigit.getCellID(),
true);
170 if (std::find(clusterStrips_vSide.begin(), clusterStrips_vSide.end(), stripID) != clusterStrips_vSide.end()) {
171 std::string sensorName;
172 occupancyPDFName(svdRecoDigit.getSensorID(), svdRecoDigit.isUStrip(), sensorName);
174 if (xTalkStrip->GetBinContent(svdRecoDigit.getCellID()) < 1.) xTalkStrip->Fill(svdRecoDigit.getCellID(),
true);
186 B2INFO(
"SVDCrossTalkFinderModule::terminate");
191 std::string sensorName;
194 for (
auto& ladders : geo.
getLadders(layers)) {
195 for (
auto& sensors : geo.
getSensors(ladders)) {
196 for (
int side = 0; side <= 1; side++) {
200 sensorOnMap->Write();
211 void SVDCrossTalkFinderModule::calculateAverage(
const VxdID& sensorID,
double& mean,
int side)
214 if (side == 1) nBins = 768;
217 for (
int i = 0; i < nBins; i++) {
220 mean = count / nBins;