11 #include <reconstruction/calibration/CDCDedxWireGainAlgorithm.h>
20 #include <TPaveText.h>
44 setDescription(
"A calibration algorithm for CDC dE/dx wire gains");
55 auto ttree = getObjectPtr<TTree>(
"tree");
64 B2FATAL(
"There is no valid payload for CDCDedxBadWires");
67 B2FATAL(
"There is no valid payload for CDCDedxWireGain");
69 std::vector<int>* wire = 0;
70 std::vector<double>* dedxhit = 0;
71 ttree->SetBranchAddress(
"wire", &wire);
72 ttree->SetBranchAddress(
"dedxhit", &dedxhit);
75 std::vector<std::vector<double>> wirededx(14336, std::vector<double>());
76 for (
int i = 0; i < ttree->GetEntries(); ++i) {
78 for (
unsigned int j = 0; j < wire->size(); ++j) {
79 wirededx[wire->at(j)].push_back(dedxhit->at(j));
84 Int_t lBinILayer = 25, hBinILayer = 75;
85 Int_t lBinOLayer = 25, hBinOLayer = 75;
94 for (
unsigned int jwire = 0; jwire < 14336; ++jwire) {
95 for (
unsigned int jdedxhit = 0; jdedxhit < wirededx[jwire].size(); ++jdedxhit) {
96 double ihitdedx = wirededx[jwire][jdedxhit];
97 if (jwire > 0 && jwire < 160 * 8)hILayer->Fill(ihitdedx);
98 else hOLayer->Fill(ihitdedx);
105 TCanvas* ctem =
new TCanvas(
"Layerhisto",
"Inner and Outer Layer dedxhit dist", 900, 400);
108 hILayer->SetFillColor(kYellow);
109 double lowedge = hILayer->GetXaxis()->GetBinLowEdge(lBinILayer);
110 double upedge = hILayer->GetXaxis()->GetBinUpEdge(hBinILayer);
111 hILayer->SetTitle(Form(
"%s, trunc range: %0.02f - %0.02f", hILayer->GetTitle(), lowedge, upedge));
112 hILayer->Draw(
"histo");
113 TH1D* hILayerClone = (TH1D*)hILayer->Clone(Form(
"hILClone_frun%d",
fStartRun));
114 hILayerClone->GetXaxis()->SetRange(lBinILayer, hBinILayer);
115 hILayerClone->SetFillColor(kAzure + 1);
116 hILayerClone->Draw(
"same histo");
118 lowedge = hOLayer->GetXaxis()->GetBinLowEdge(lBinOLayer);
119 upedge = hOLayer->GetXaxis()->GetBinUpEdge(hBinOLayer);
120 hOLayer->SetTitle(Form(
"%s trunc range: %0.02f - %0.02f", hOLayer->GetTitle(), lowedge, upedge));
121 hOLayer->SetFillColor(kYellow);
122 hOLayer->Draw(
"histo");
123 TH1D* hOLayerClone = (TH1D*)hOLayer->Clone(Form(
"hOLClone_frun%d",
fStartRun));
124 hOLayerClone->GetXaxis()->SetRange(lBinOLayer, hBinOLayer);
125 hOLayerClone->SetFillColor(kAzure + 1);
126 hOLayerClone->Draw(
"same histo");
127 ctem->SaveAs(Form(
"cdcdedx_wiregain_layerdists_frun%d.pdf",
fStartRun));
133 TCanvas* ctmp =
new TCanvas(
"tmp",
"tmp", 1200, 1200);
134 std::stringstream psname; psname << Form(
"cdcdedx_wiregain_wiredists_frun%d.pdf[",
fStartRun);
137 ctmp->SetBatch(kTRUE);
138 ctmp->Print(psname.str().c_str());
139 psname.str(
""); psname << Form(
"cdcdedx_wiregain_wiredists_frun%d.pdf",
fStartRun);
143 double iWireTruncMean[14336];
144 for (Int_t jwire = 0; jwire < 14336; jwire++) {
145 iWireTruncMean[jwire] = 1.0;
151 for (
unsigned int jwire = 0; jwire < 14336; ++jwire) {
153 htempPerWire->SetName(Form(
"htempPerWire_%d_run%d", jwire,
fStartRun));
154 htempPerWire->SetTitle(Form(
"dedxhit-dist, wire # = %d (start run: %d);dedxhit;entries", jwire,
fStartRun));
155 for (
unsigned int jdedxhit = 0; jdedxhit < wirededx[jwire].size(); ++jdedxhit) {
156 htempPerWire->Fill(wirededx[jwire][jdedxhit]);
159 double truncMean = 1.0;
160 int startfrom = 1, endat = 1;
162 if (htempPerWire->Integral() <= 50 ||
m_DBBadWires->getBadWireStatus(jwire)) {
164 }
else if (htempPerWire->Integral() > 50 && htempPerWire->Integral() < 1000) {
168 if (jwire < 160 * 8) {
169 startfrom = lBinILayer; endat = hBinILayer;
171 startfrom = lBinOLayer; endat = hBinOLayer;
177 double binweights = 0.0, sumofbc = 0.0;
178 for (
int ibin = startfrom; ibin <= endat; ibin++) {
179 if (htempPerWire->GetBinContent(ibin) > 0) {
180 binweights += (htempPerWire->GetBinContent(ibin) * htempPerWire->GetBinCenter(ibin));
181 sumofbc += htempPerWire->GetBinContent(ibin);
184 if (sumofbc > 0)truncMean = binweights / sumofbc;
185 else truncMean = 1.0;
188 if (truncMean < 0)truncMean = 0.0;
189 iWireTruncMean[jwire] = truncMean;
192 ctmp->cd(jwire % 16 + 1);
193 htempPerWire->SetFillColor(kYellow);
194 htempPerWire->SetTitle(Form(
"%s, rel. #mu_{truc} %0.04f", htempPerWire->GetTitle(), iWireTruncMean[jwire]));
195 htempPerWire->DrawCopy(
"hist");
196 TH1D* htempPerWireClone = (TH1D*)htempPerWire->Clone(Form(
"htempPerWireClone_%d_frun%d", jwire,
fStartRun));
197 htempPerWireClone->GetXaxis()->SetRange(startfrom, endat);
198 htempPerWireClone->SetFillColor(kAzure + 1);
199 htempPerWireClone->Draw(
"same histo");
201 if ((jwire + 1) % 16 == 0)ctmp->Print(psname.str().c_str());
203 htempPerWire->Reset();
208 psname.str(
""); psname << Form(
"cdcdedx_wiregain_wiredists_frun%d.pdf]",
fStartRun);
209 ctmp->Print(psname.str().c_str());
212 TCanvas* cstats =
new TCanvas(
"cstats",
"cstats", 1000, 500);
213 cstats->SetBatch(kTRUE);
214 cstats->Divide(2, 1);
216 auto hestats = getObjectPtr<TH1I>(
"hestats");
218 hestats->SetName(Form(
"hestats_frun%d",
fStartRun));
219 hestats->SetStats(0);
220 hestats->DrawCopy(
"");
223 auto htstats = getObjectPtr<TH1I>(
"htstats");
225 hestats->SetName(Form(
"htstats_frun%d",
fStartRun));
226 htstats->DrawCopy(
"");
227 hestats->SetStats(0);
229 cstats->Print(Form(
"cdcdedx_wiregain_stats_frun%d.pdf",
fStartRun));
235 std::vector<double> dedxTruncmean;
236 for (Int_t jwire = 0; jwire < 14336; jwire++) {
237 dedxTruncmean.push_back(iWireTruncMean[jwire]);
257 B2INFO(
"Saving merged wiregains for (Exp, Run) : (" << expRun.first <<
"," << expRun.second <<
")");
258 for (
unsigned int iwire = 0; iwire < 14336; iwire++) {
260 double rel = dedxTruncmean.at(iwire);
261 if (pre != 0.0)dedxTruncmean.at(iwire) *= (double)
m_DBWireGains->getWireGain(iwire);
262 B2INFO(
"WG for wire [" << iwire <<
"], previous = " << pre <<
", relative = " << rel <<
", merged = " << dedxTruncmean.at(iwire));
265 B2INFO(
"Saving relative wiregains for (Exp, Run) : (" << expRun.first <<
"," << expRun.second <<
")");
268 double layeravg = 1.0;
271 for (
unsigned int iwire = 0; iwire < 14336; iwire++) {
273 if (layeravg != 0.0) {
274 dedxTruncmean.at(iwire) /= layeravg;
282 TCanvas* cLConst =
new TCanvas(
"cLConst",
"cLConst", 1600, 1000);
283 std::stringstream psnameL; psnameL << Form(
"cdcdedx_wiregain_layerconst_frun%d.pdf[",
fStartRun);
284 cLConst->Divide(2, 2);
285 cLConst->SetBatch(kTRUE);
286 cLConst->Print(psnameL.str().c_str());
287 psnameL.str(
""); psnameL << Form(
"cdcdedx_wiregain_layerconst_frun%d.pdf",
fStartRun);
289 TH1D* hWGConst =
new TH1D(Form(
"hWGConst_frun%d",
fStartRun), Form(
"wiregain constant (start run: %d); wire numbers;<dedxhit>",
291 if (
isMergePayload)hWGConst->SetTitle(Form(
"abs-const: %s", hWGConst->GetTitle()));
292 else hWGConst->SetTitle(Form(
"rel-const: %s", hWGConst->GetTitle()));
294 TH1D* hWGConstVar =
new TH1D(Form(
"hWGConstVar_frun%d",
fStartRun), Form(
"wiregain variation (start run: %d); wire gains; nentries",
296 if (
isMergePayload)hWGConstVar->SetTitle(Form(
"abs-const: %s", hWGConstVar->GetTitle()));
297 else hWGConstVar->SetTitle(Form(
"rel-const: %s", hWGConstVar->GetTitle()));
299 std::ofstream fBadWG;
300 fBadWG.open(Form(
"cdcdedx_wiregain_badwire_frun%d.txt",
fStartRun));
302 std::ofstream fDeadWG_New;
303 fDeadWG_New.open(Form(
"cdcdedx_wiregain_deadwire_frun%d_new.txt",
fStartRun));
305 std::ofstream fDeadWG_Old;
306 fDeadWG_Old.open(Form(
"cdcdedx_wiregain_deadwire_frun%d_old.txt",
fStartRun));
308 int toWire = 0, countwire = 0;
309 int cnewdeadwires = 0, colddeadwires = 0, cbadwires = 0;
310 for (
int iLayer = 0; iLayer < 56; iLayer++) {
312 int iSuperLayer = (iLayer - 2) / 6;
313 if (iSuperLayer <= 0)iSuperLayer = 1;
314 int nWireiLayer = 160 + (iSuperLayer - 1) * 32;
316 int fromWire = countwire;
317 toWire = toWire + nWireiLayer;
319 TH1D* hLayerConst =
new TH1D(Form(
"hWireConst_L%d_frun%d", iLayer,
fStartRun),
"blah-blah", nWireiLayer, fromWire * 1.0,
321 if (
isMergePayload)hLayerConst->SetTitle(Form(
"abs-const: Layer = %d (start run: %d); wire numbers;<dedxhit>", iLayer,
fStartRun));
322 else hLayerConst->SetTitle(Form(
"rel-const: Layer = %d (start run: %d); wire numbers;<dedxhit>", iLayer,
fStartRun));
324 int iwire = 0, cnewdeadLwires = 0, colddeadLwires = 0, cbadLwires = 0;
325 for (
int jwire = fromWire; jwire < toWire; jwire++) {
330 hLayerConst->SetBinContent(iwire, dedxTruncmean.at(jwire));
331 if (iLayer < 32 && (iwire % 10 == 0))hLayerConst->GetXaxis()->SetBinLabel(iwire, Form(
"w%d", jwire));
332 else if (iLayer >= 32 && (iwire % 15 == 0))hLayerConst->GetXaxis()->SetBinLabel(iwire, Form(
"w%d", jwire));
334 hWGConstVar->Fill(dedxTruncmean.at(jwire));
335 hWGConst->SetBinContent(countwire, dedxTruncmean.at(jwire));
341 fBadWG << jwire <<
"\n";
345 if (dedxTruncmean.at(jwire) == 0 && !
m_DBBadWires->getBadWireStatus(jwire)) {
348 fDeadWG_New << jwire <<
"\n";
355 fDeadWG_Old << jwire <<
"\n";
358 if ((countwire) % 500 == 0)hWGConst->GetXaxis()->SetBinLabel(countwire, Form(
"w%d", countwire));
361 cLConst->cd(iLayer % 4 + 1);
362 gStyle->SetOptStat(
"ne");
363 double fraclbad = (100.0 * (cnewdeadLwires + cbadLwires)) / nWireiLayer;
364 if (
isLayerScale)hLayerConst->SetTitle(Form(
"%s, avg = %0.04f, nDeadwires = %d->%d(%0.02f%%)", hLayerConst->GetTitle(),
365 flayerAvg.at(iLayer) / layeravg, colddeadLwires + cbadLwires, cnewdeadLwires + cbadLwires, fraclbad));
366 else hLayerConst->SetTitle(Form(
"%s, nDeadwires = %d->%d(%0.02f%%)", hLayerConst->GetTitle(), colddeadLwires + cbadLwires,
367 cnewdeadLwires + cbadLwires,
369 if (iLayer < 8)hLayerConst->GetYaxis()->SetRangeUser(-0.1, 4.0);
370 else hLayerConst->GetYaxis()->SetRangeUser(-0.1, 2.0);
371 hLayerConst->SetFillColorAlpha(kAzure, 0.10);
372 hLayerConst->LabelsOption(
"u",
"X");
373 hLayerConst->DrawCopy(
"hist");
375 TLine* tlc =
new TLine();
376 tlc->SetLineColor(kRed);
377 tlc->SetX1(fromWire); tlc->SetX2(toWire);
378 tlc->SetY1(
flayerAvg.at(iLayer) / layeravg); tlc->SetY2(
flayerAvg.at(iLayer) / layeravg);
379 tlc->DrawClone(
"same");
382 if ((iLayer + 1) % 4 == 0)cLConst->Print(psnameL.str().c_str());
383 hLayerConst->Reset();
387 psnameL.str(
""); psnameL << Form(
"cdcdedx_wiregain_layerconst_frun%d.pdf]",
fStartRun);
388 cLConst->Print(psnameL.str().c_str());
391 TCanvas* cConst =
new TCanvas(
"cConst",
"cConst", 900, 500);
394 hWGConst->LabelsOption(
"u",
"X");
395 hWGConst->GetYaxis()->SetRangeUser(-0.1, hWGConst->GetMaximum() * 1.05);
396 double fracabad = (100.0 * (cnewdeadwires + cbadwires)) / 14336.0;
397 if (
isMergePayload)hWGConst->SetTitle(Form(
"merged %s, nDeadwires = %d->%d (%0.02f%%)", hWGConst->GetTitle(),
398 colddeadwires + cbadwires,
399 cnewdeadwires + cbadwires, fracabad));
400 else hWGConst->SetTitle(Form(
"relative %s, nDeadwires = %d->%d (%0.02f%%)", hWGConst->GetTitle(), colddeadwires + cbadwires,
401 cnewdeadwires + cbadwires,
404 hWGConst->LabelsDeflate();
406 cConst->SaveAs(Form(
"cdcdedx_wiregain_allconstants_frun%d.pdf",
fStartRun));
409 TCanvas* cConstvar =
new TCanvas(
"cConstvar",
"cConstvar", 500, 400);
411 if (
isMergePayload)hWGConstVar->SetTitle(Form(
"merged %s, nDeadwires = %d->%d (%0.02f%%)", hWGConstVar->GetTitle(),
412 colddeadwires + cbadwires,
413 cnewdeadwires + cbadwires,
415 else hWGConstVar->SetTitle(Form(
"relative %s, bad wire = %d->%d (%0.02f)", hWGConstVar->GetTitle(), colddeadwires + cbadwires,
416 cnewdeadwires + cbadwires,
419 hWGConstVar->SetFillColorAlpha(kAzure, 0.10);
420 hWGConstVar->Draw(
"");
421 cConstvar->SaveAs(Form(
"cdcdedx_wiregain_constantsvar_frun%d.pdf",
fStartRun));
432 B2INFO(
"dE/dx Calibration done for " << dedxTruncmean.size() <<
" CDC wires");
441 double TotalInt = htemp->Integral();
442 if (TotalInt <= 0 || htemp->GetNbinsX() <= 0) {
443 binlow = 1.0; binhigh = 1.0;
446 binlow = 1.0; binhigh = 1.0;
447 double sumPer5 = 0.0, sumPer75 = 0.0;
448 for (
int ibin = 1; ibin <= htemp->GetNbinsX(); ibin++) {
450 if (sumPer5 <=
fTrucMin * TotalInt) {
451 sumPer5 += htemp->GetBinContent(ibin);
455 if (sumPer75 <=
fTrucMax * TotalInt) {
456 sumPer75 += htemp->GetBinContent(ibin);
466 double jLayerMeanAvg = 0.0, OutLayerMeanSum = 0.0;
468 int countwire = 0, OutActLayer = 0;
470 TH1D* hLayerAvg =
new TH1D(Form(
"hLayerAvg_frun%d",
fStartRun),
471 Form(
"Layer vs trunc mean avg (star run: %d); layer numbers;<dedxhit>",
fStartRun), 56, -0.5, 55.5);
473 for (
int iLayer = 0; iLayer < 56; iLayer++) {
475 int iSuperLayer = (iLayer - 2) / 6;
476 if (iSuperLayer <= 0)iSuperLayer = 1;
477 int nWireiLayer = 160 + (iSuperLayer - 1) * 32;
479 int fromWire = countwire;
480 toWire = toWire + nWireiLayer;
482 double jLayerMeanSum = 0.0;
483 int jLayerActWires = 0;
484 std::cout <<
"iLayer = " << iLayer <<
", from wire = " << fromWire <<
", to wire = " << toWire << std::endl;
485 for (
int jwire = fromWire; jwire < toWire; jwire++) {
487 if (tempWire.at(jwire) > 0.) {
488 jLayerMeanSum += tempWire.at(jwire);
493 if (jLayerActWires > 0)jLayerMeanAvg = jLayerMeanSum / jLayerActWires;
494 else jLayerMeanAvg = 0.0;
497 hLayerAvg->SetBinContent(iLayer + 1, jLayerMeanAvg);
498 if ((iLayer + 1) % 2 == 0)hLayerAvg->GetXaxis()->SetBinLabel(iLayer + 1, Form(
"L%d", iLayer));
499 std::cout <<
" \t --> sum = " << jLayerMeanSum <<
", active wires = " << jLayerActWires
500 <<
", average = " << jLayerMeanAvg << std::endl;
502 if (iLayer >= 8 && jLayerMeanAvg > 0.0) {
503 OutLayerMeanSum += jLayerMeanAvg;
508 double OutLayerMeanAvg = 1.0;
509 if (OutActLayer > 0) OutLayerMeanAvg = OutLayerMeanSum / OutActLayer;
512 TCanvas* cLAvg =
new TCanvas(
"clayerAvg",
"clayerAvg", 800, 500);
515 gStyle->SetOptStat(
"ne");
516 hLayerAvg->LabelsOption(
"u",
"X");
517 hLayerAvg->SetLineColor(kBlue);
518 hLayerAvg->GetYaxis()->SetRangeUser(-0.1, hLayerAvg->GetMaximum() * 1.20);
519 if (
isMergePayload)hLayerAvg->SetTitle(Form(
"%s, avg = %0.04f (abs)", hLayerAvg->GetTitle(), OutLayerMeanAvg));
520 else hLayerAvg->SetTitle(Form(
"%s, avg = %0.04f (rel)", hLayerAvg->GetTitle(), OutLayerMeanAvg));
521 hLayerAvg->LabelsDeflate();
523 TLine* tl =
new TLine();
524 tl->SetLineColor(kRed);
525 tl->SetX1(-0.5); tl->SetX2(55.5);
526 tl->SetY1(OutLayerMeanAvg); tl->SetY2(OutLayerMeanAvg);
527 tl->DrawClone(
"same");
528 cLAvg->SaveAs(Form(
"cdcdedx_wiregain_layeravg_frun%d.pdf",
fStartRun));
531 return OutLayerMeanAvg;
537 TCanvas* cCDCWires =
new TCanvas(Form(
"cCDCWires_frun%d",
fStartRun),
"CDC dE/dx bad wire status", 800, 800);
539 hxyAll->SetMarkerStyle(20);
540 hxyAll->SetMarkerSize(0.2);
541 hxyAll->SetMarkerColor(kGray);
548 hxyBad->SetTitle(
"");
549 hxyBad->SetMarkerStyle(20);
550 hxyBad->SetMarkerSize(0.3);
551 hxyBad->SetMarkerColor(kBlue);
553 hxyBad->Draw(
"same");
558 hxyOldDead->SetTitle(
"");
559 hxyOldDead->SetMarkerStyle(20);
560 hxyOldDead->SetMarkerSize(0.3);
561 hxyOldDead->SetMarkerColor(kBlack);
562 hxyOldDead->SetStats(0);
563 hxyOldDead->Draw(
"same");
568 hxyNewDead->SetTitle(
"");
569 hxyNewDead->SetMarkerStyle(20);
570 hxyNewDead->SetMarkerSize(0.25);
571 hxyNewDead->SetMarkerColor(kRed);
572 hxyNewDead->SetStats(0);
573 hxyNewDead->Draw(
"same");
576 auto legend =
new TLegend(0.72, 0.80, 0.90, 0.92);
577 legend->SetBorderSize(0);
578 legend->SetLineWidth(3);
579 legend->SetHeader(Form(
"Total Bad: %d (~%0.02f%%)", nDeadwires + Badwires, 100.*(nDeadwires + Badwires) / 14336.0));
580 legend->AddEntry(hxyBad, Form(
"badadc %d" , Badwires),
"p");
581 legend->AddEntry(hxyOldDead, Form(
"olddead %d" , oDeadwires),
"p");
582 legend->AddEntry(hxyNewDead, Form(
"newdead %d" , nDeadwires),
"p");
585 gStyle->SetLegendTextSize(0.025);
586 TPaveText* pt =
new TPaveText(-0.30993, -1.470968, -0.3102707, -1.304516,
"br");
588 pt->SetFillStyle(3001);
591 pt->SetTextSize(0.02258064);
592 TText* t1 = pt->AddText(
"CDC-wire map: counter-clockwise and start from +x");
593 t1->SetTextColor(kGray + 1);
596 cCDCWires->SaveAs(Form(
"cdcdedx_wiregain_wirestatus_frun%d.pdf",
fStartRun));
603 int wire, nwire, twire;
604 double radius, phi, x, y;
606 std::ifstream infile;
607 infile.open(Form(
"%s", badFileName.Data()));
609 TH2F* temp =
new TH2F(Form(
"temp_%s_frun%d", suffix.Data(),
fStartRun), Form(
"wire status (start run: %d)",
fStartRun), 2400, -1.2,
610 1.2, 2400, -1.2, 1.2);
611 if (!infile.fail()) {
613 while (infile >> bwires) {
617 wire = bwires - twire ;
618 phi = 2.*TMath::Pi() * (float(wire) / float(nwire));
619 x = radius * cos(phi);
620 y = radius * sin(phi);
624 for (
int iwires = 0; iwires < 14336; iwires++) {
628 wire = iwires - twire ;
629 phi = 2.*TMath::Pi() * (float(wire) / float(nwire));
630 x = radius * cos(phi);
631 y = radius * sin(phi);
642 16.80, 17.80, 18.80, 19.80, 20.80, 21.80, 22.80, 23.80,
643 25.70, 27.52, 29.34, 31.16, 32.98, 34.80,
644 36.52, 38.34, 40.16, 41.98, 43.80, 45.57,
645 47.69, 49.46, 51.28, 53.10, 54.92, 56.69,
646 58.41, 60.18, 62.00, 63.82, 65.64, 67.41,
647 69.53, 71.30, 73.12, 74.94, 76.76, 78.53,
648 80.25, 82.02, 83.84, 85.66, 87.48, 89.25,
649 91.37, 93.14, 94.96, 96.78, 98.60, 100.37,
650 102.09, 103.86, 105.68, 107.50, 109.32, 111.14
653 Int_t totalWireiLayer = 0 ;
655 for (Int_t iLayer = 0; iLayer < 56; iLayer++) {
656 int iSuperLayer = (iLayer - 2) / 6;
657 if (iSuperLayer <= 0)iSuperLayer = 1;
658 int nWireiLayer = 160 + (iSuperLayer - 1) * 32;
659 totalWireiLayer += nWireiLayer;
661 if (iWire < totalWireiLayer) {
662 if (what ==
"layer")myreturn = iLayer;
663 else if (what ==
"nwirelayer") myreturn = nWireiLayer;
664 else if (what ==
"twire") myreturn = totalWireiLayer - nWireiLayer;
665 else if (what ==
"rwire") myreturn = r[iLayer] / 100.;
666 else std::cout <<
"Invalid return :0 " << std::endl;