35 B2INFO(
"Creating efficiencies for every layer");
37 unsigned short wireID;
38 unsigned short layerID;
43 efftree->SetBranchAddress(
"wireID", &wireID);
44 efftree->SetBranchAddress(
"layerID", &layerID);
45 efftree->SetBranchAddress(
"z", &z);
46 efftree->SetBranchAddress(
"isFound", &isFound);
49 B2INFO(
"Building empty efficiency objects");
51 B2INFO(
"Wire Topology found");
53 B2INFO(
"CDC Geometry found");
56 unsigned short layerNo = wireLayer.getICLayer();
62 unsigned short nzbins = 30 - layerNo / 7;
64 double widbins[2] = { -0.5, cdcgeo.
nWiresInLayer(layerNo) - 0.5};
65 double zbins[2] = {wireLayer.getBackwardZ(), wireLayer.getForwardZ()};
67 TEfficiency* effInLayer =
new TEfficiency(Form(
"effLayer_%d", layerNo), Form(
"Hit efficiency pf L%d ; z (cm) ; IWire ", layerNo),
68 nzbins, zbins[0], zbins[1], nwidbins, widbins[0], widbins[1]);
70 B2INFO(
"Teff for layer " << layerNo <<
" was successfully listed.");
72 TFile* outputCollection =
new TFile(
"LayerEfficiencies.root",
"RECREATE");
75 B2INFO(
"Filling the efficiencies");
76 const Long64_t nEntries = efftree->GetEntries();
77 B2INFO(
"Number of entries in tree: " << nEntries);
78 for (Long64_t i = 0; i < nEntries; i++) {
80 TEfficiency* efficiencyInLayer = (TEfficiency*)
m_efficiencyList->At(layerID);
81 efficiencyInLayer->Fill(isFound, z, wireID);
84 B2INFO(
"TEfficiencies successfully filled.");
85 outputCollection->Close();
86 B2INFO(
"TEfficiencies successfully saved");
88 if (nEntries > 1000)
return true;
94 B2INFO(
"Beginning detection of bad wires");
96 B2INFO(
"Wire Topology found");
99 unsigned short layerNo = wireLayer.getICLayer();
100 B2INFO(
"Checking layer " << layerNo);
104 auto passed = (TH2F*)efficiencyInLayer->GetPassedHistogram();
105 auto total = (TH2F*)efficiencyInLayer->GetTotalHistogram();
108 if (!total->GetEntries())
continue;
111 double minFitRange = wireLayer.getBackwardZ() + 30;
112 double maxFitRange = wireLayer.getForwardZ() - 30;
113 TF1* constantFunction =
new TF1(
"constantFunction",
"pol0", minFitRange, maxFitRange);
116 auto passedProjectedX = passed->ProjectionX(
"projectionx1");
117 auto totalProjectedX = total->ProjectionX(
"projectionx2");
118 TEfficiency* efficiencyProjectedX =
new TEfficiency(*passedProjectedX, *totalProjectedX);
120 unsigned short minFitBin = passedProjectedX->FindBin(minFitRange) + 1;
121 unsigned short maxFitBin = passedProjectedX->FindBin(maxFitRange) - 1;
124 auto passedProjectedY = passed->ProjectionY(
"projectiony1", minFitRange, maxFitRange);
125 auto totalProjectedY = total->ProjectionY(
"projectiony2", minFitRange, maxFitRange);
126 TEfficiency* efficiencyProjectedY =
new TEfficiency(*passedProjectedY, *totalProjectedY);
129 float totalAverage = 0;
130 int nonZeroWires = 0;
131 for (
int i = 0; i <= passedProjectedY->GetNbinsX(); ++i) {
132 float efficiencyAtBin = efficiencyProjectedY->GetEfficiency(i);
133 if (efficiencyAtBin > 0.2) {
134 totalAverage += efficiencyAtBin;
139 nonZeroWires > 0 ? totalAverage /= nonZeroWires : totalAverage == 0;
141 TGraphAsymmErrors* graphEfficiencyProjected = efficiencyProjectedX->CreateGraph();
143 B2INFO(
"Successfully determined average properties of layer " << layerNo);
144 B2INFO(
"Looping over wires");
147 for (
int i = 0; i <= passed->GetNbinsY(); ++i) {
150 auto singleWirePassed = passed->ProjectionX(
"single wire projection passed", i, i);
151 auto singleWireTotal = total->ProjectionX(
"single wire projection total", i, i);
154 if (!singleWirePassed->Integral(minFitBin, maxFitBin)) {
155 double wireID = passed->GetYaxis()->GetBinCenter(i);
157 if (wireID < 0 || wireID >= maxWires) {
158 B2ERROR(
"Invalid wireID: " << wireID <<
" for LayerID: " << layerNo
159 <<
". Max wires: " << maxWires);
166 TEfficiency* singleWireEfficiency =
new TEfficiency(*singleWirePassed, *singleWireTotal);
167 TGraphAsymmErrors* graphSingleWireEfficiency = singleWireEfficiency->CreateGraph();
170 TFitResultPtr singleWireFitResults = graphSingleWireEfficiency->Fit(constantFunction,
"SQR");
171 double singleWireEfficiencyFromFit = (singleWireFitResults.Get())->Value(0);
172 double singleWireUpErrorFromFit = (singleWireFitResults.Get())->UpperError(0);
175 float p_value =
chiTest(graphSingleWireEfficiency, graphEfficiencyProjected, minFitRange, maxFitRange);
177 bool averageCondition = (0.95 * totalAverage) > (singleWireEfficiencyFromFit + 3 * singleWireUpErrorFromFit);
178 bool pvalueCondition = p_value < 0.01;
179 bool generalCondition = singleWireEfficiencyFromFit < 0.4;
180 if (generalCondition || (averageCondition && pvalueCondition)) {
181 double wireID = passed->GetYaxis()->GetBinCenter(i);
182 m_badWireList->setWire(layerNo, round(wireID), singleWireEfficiencyFromFit);
185 B2INFO(
"Bad wires for " << layerNo <<
" recorded");
189 B2INFO(
"Bad wire list successfully saved.");
197 unsigned short ndof = 0;
200 int numOfEntries1 = graph1->GetN();
201 int numOfEntries2 = graph2->GetN();
205 for (
int index1 = 0; index1 < numOfEntries1; ++index1) {
207 if (graph1->GetX()[index1] < minValue)
continue;
208 if (graph1->GetX()[index1] > maxValue)
continue;
209 for (
int index2 = 0; index2 < numOfEntries2; ++index2) {
210 if (graph1->GetX()[index1] == graph2->GetX()[index2]) {
212 double chiNumerator = pow(graph1->GetY()[index1] - graph2->GetY()[index2], 2);
213 double chiDenominator = pow(graph1->GetErrorYhigh(index1), 2) + pow(graph1->GetErrorYlow(index1), 2);
214 chi += chiNumerator / chiDenominator;
220 return TMath::Prob(chi, ndof);