11 #include <svd/modules/svdCrossTalkCalibrationsCollector/SVDCrossTalkCalibrationsCollectorModule.h>
13 #include <svd/modules/svdCrossTalkFinder/SVDCrossTalkFinderHelperFunctions.h>
15 #include <vxd/geometry/GeoCache.h>
30 setDescription(
"This module collects the list of channels exhibiting crossTalk readout.");
35 "SVDShaperDigit collection name",
string(
""));
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);
69 std::string sensorName;
75 for (
auto& sensors : geo.
getSensors(ladders)) {
76 for (
int side = 0; side <= 1; side++) {
79 if (layers.getLayerNumber() == 3 or side == 1) {
80 sensorHist =
new TH1F(sensorName.c_str(),
"", 768, 0, 768);
82 sensorHist =
new TH1F(sensorName.c_str(),
"", 512, 0, 512);
98 vector<std::string> highOccChips_uSide ;
99 vector<std::string> highOccChips_vSide ;
100 vector<std::string> highOccChipsStripNum_uSide ;
101 vector<std::string> highOccChipsStripNum_vSide ;
102 vector<std::string> clusterStrips_uSide ;
103 vector<std::string> clusterStrips_vSide ;
104 vector<std::string> clusterChips_uSide ;
105 vector<std::string> clusterChips_vSide ;
106 vector<int> strips_uSide;
107 vector<int> strips_vSide;
112 if (svdShaperDigit.getSensorID().getLayerNumber() == 3 or svdShaperDigit.getSensorID().getSensorNumber() == 1) {
116 int side = svdShaperDigit.isUStrip();
117 std::string sensorName;
120 double sensorAverage = 0.;
122 int stripID = svdShaperDigit.getCellID();
123 std::string sensorStripNum = sensorName +
"." + std::to_string(stripID);
128 int adjacentStrip = 0;
129 if (!strips_uSide.empty()) {
130 adjacentStrip = stripID - strips_uSide.back();
132 strips_uSide.push_back(stripID);
133 if (!highOccChips_uSide.empty() && sensorName == highOccChips_uSide.back() && adjacentStrip == 1) {
134 clusterChips_uSide.push_back(sensorName);
135 if (clusterStrips_uSide.empty() || clusterStrips_uSide.back() != sensorStripNum) {
136 clusterStrips_uSide.push_back(highOccChipsStripNum_uSide.back());
138 clusterStrips_uSide.push_back(sensorStripNum);
140 highOccChipsStripNum_uSide.push_back(sensorStripNum);
141 highOccChips_uSide.push_back(sensorName);
145 int adjacentStrip = 0;
146 if (!strips_vSide.empty()) {
147 adjacentStrip = stripID - strips_vSide.back();
149 strips_vSide.push_back(stripID);
150 if (!highOccChips_vSide.empty() && sensorName == highOccChips_vSide.back() && adjacentStrip == 1) {
151 if (clusterStrips_vSide.empty() || clusterStrips_vSide.back() != sensorStripNum) {
152 clusterStrips_vSide.push_back(highOccChipsStripNum_vSide.back());
154 clusterStrips_vSide.push_back(sensorStripNum);
156 highOccChipsStripNum_vSide.push_back(sensorStripNum);
157 highOccChips_vSide.push_back(sensorName);
162 std::sort(clusterChips_uSide.begin(), clusterChips_uSide.end());
163 clusterChips_uSide.erase(unique(clusterChips_uSide.begin(), clusterChips_uSide.end()), clusterChips_uSide.end());
164 int numberOfClusterChips = std::distance(clusterChips_uSide.begin(), std::unique(clusterChips_uSide.begin(),
165 clusterChips_uSide.end()));
170 std::string sensorID = svdShaperDigit.getSensorID();
171 std::string digitID = sensorID +
"." + std::to_string(svdShaperDigit.isUStrip());
172 std::string stripID = digitID +
"." + std::to_string(svdShaperDigit.getCellID());
173 if (std::find(clusterStrips_uSide.begin(), clusterStrips_uSide.end(), stripID) != clusterStrips_uSide.end()) {
174 std::string sensorName;
175 occupancyPDFName(svdShaperDigit.getSensorID(), svdShaperDigit.isUStrip(), sensorName);
177 xTalkStrip->Fill(svdShaperDigit.getCellID(), 1);
179 if (std::find(clusterStrips_vSide.begin(), clusterStrips_vSide.end(), stripID) != clusterStrips_vSide.end()) {
180 std::string sensorName;
181 occupancyPDFName(svdShaperDigit.getSensorID(), svdShaperDigit.isUStrip(), sensorName);
183 xTalkStrip->Fill(svdShaperDigit.getCellID(), 1);
197 std::string sensorName;
200 for (
auto& ladders : geo.
getLadders(layers)) {
201 for (
auto& sensors : geo.
getSensors(ladders)) {
202 for (
int side = 0; side <= 1; side++) {
207 m_layer = sensors.getLayerNumber();
208 m_ladder = sensors.getLadderNumber();
209 m_sensor = sensors.getSensorNumber();
212 getObjectPtr<TTree>(
"HTreeCrossTalkCalib")->Fill();
214 sensorOnMap->Delete();
226 if (side == 1) nBins = 768;
229 for (
int i = 0; i < nBins; i++) {
232 mean = count / nBins;