File indexing completed on 2025-08-06 08:16:10
0001 #include "TPCDaqDefs.h"
0002
0003 #include <TCanvas.h>
0004 #include <TF1.h>
0005 #include <TGraph.h>
0006 #include <TPaveText.h>
0007 #include <TStyle.h>
0008 #include <TVirtualFitter.h>
0009
0010 #include <cassert>
0011 #include <cmath>
0012 #include <iostream>
0013 #include <limits>
0014 #include <string>
0015
0016 using namespace std;
0017
0018 namespace TPCDaqDefs
0019 {
0020
0021 namespace FEEv1
0022 {
0023 SampleFit_PowerLawDoubleExp_PDFMaker::SampleFit_PowerLawDoubleExp_PDFMaker()
0024 {
0025 gStyle->SetOptFit(1111);
0026
0027 m_canvas = new TCanvas("SampleFit_PowerLawDoubleExp_PDFMaker", "SampleFit_PowerLawDoubleExp_PDFMaker");
0028 m_pavedtext = new TPaveText(.05, .1, .95, .8);
0029
0030 m_pavedtext->AddText("SampleFit_PowerLawDoubleExp Fit output");
0031 m_pavedtext->AddText("A double-component power-law exponential fit of time-dependent ADC pulses.");
0032 m_pavedtext->AddText("Magenta curve is the sum of the two component, the red and blue curves.");
0033 m_pavedtext->AddText("Red dot denote the max points");
0034 m_pavedtext->Draw();
0035
0036 m_canvas->Print("SampleFit_PowerLawDoubleExp.pdf(");
0037 }
0038 SampleFit_PowerLawDoubleExp_PDFMaker::~SampleFit_PowerLawDoubleExp_PDFMaker()
0039 {
0040 if (m_pavedtext) delete m_pavedtext;
0041 if (m_canvas) delete m_canvas;
0042
0043 m_canvas = new TCanvas("SampleFit_PowerLawDoubleExp_PDFMaker", "SampleFit_PowerLawDoubleExp_PDFMaker");
0044 m_pavedtext = new TPaveText(.05, .1, .95, .8);
0045
0046 m_pavedtext->AddText("SampleFit_PowerLawDoubleExp Fit output");
0047 m_pavedtext->AddText("End of pages");
0048 m_pavedtext->Draw();
0049
0050 m_canvas->Print("SampleFit_PowerLawDoubleExp.pdf)");
0051 }
0052
0053 void SampleFit_PowerLawDoubleExp_PDFMaker::MakeSectionPage(const string &title)
0054 {
0055 if (m_pavedtext) delete m_pavedtext;
0056 if (m_canvas) delete m_canvas;
0057
0058 m_canvas = new TCanvas("SampleFit_PowerLawDoubleExp_PDFMaker", "SampleFit_PowerLawDoubleExp_PDFMaker");
0059
0060 m_pavedtext = new TPaveText(.05, .1, .95, .8);
0061
0062 m_pavedtext->AddText(title.c_str());
0063 m_pavedtext->Draw();
0064
0065 m_canvas->Print("SampleFit_PowerLawDoubleExp.pdf");
0066 }
0067
0068 bool SampleFit_PowerLawDoubleExp(
0069 const std::vector<double> &samples,
0070 double &peak,
0071 double &peak_sample,
0072 double &pedestal,
0073 std::map<int, double> ¶meters_io,
0074 const int verbosity)
0075 {
0076 static const int n_parameter = 7;
0077
0078
0079 int peakPos = 0.;
0080
0081
0082 const int n_samples = samples.size();
0083
0084 TGraph gpulse(n_samples);
0085 for (int i = 0; i < n_samples; i++)
0086 {
0087 (gpulse.GetX())[i] = i;
0088
0089 (gpulse.GetY())[i] = samples[i];
0090 }
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101 pedestal = gpulse.GetY()[0];
0102 double peakval = pedestal;
0103 const double risetime = 1.5;
0104
0105 for (int iSample = 0; iSample < n_samples - risetime * 3; iSample++)
0106 {
0107 if (abs(gpulse.GetY()[iSample] - pedestal) > abs(peakval - pedestal))
0108 {
0109 peakval = gpulse.GetY()[iSample];
0110 peakPos = iSample;
0111 }
0112 }
0113 peakval -= pedestal;
0114
0115 if (verbosity)
0116 {
0117 cout << "SampleFit_PowerLawDoubleExp - "
0118 << "pedestal = " << pedestal << ", "
0119 << "peakval = " << peakval << ", "
0120 << "peakPos = " << peakPos << endl;
0121 }
0122
0123
0124 struct default_values_t
0125 {
0126 default_values_t(double default_value, double min_value, double max_value)
0127 : def(default_value)
0128 , min(min_value)
0129 , max(max_value)
0130 {
0131 }
0132 double def;
0133 double min;
0134 double max;
0135 };
0136
0137 vector<default_values_t> default_values(n_parameter, default_values_t(numeric_limits<double>::signaling_NaN(), numeric_limits<double>::signaling_NaN(), numeric_limits<double>::signaling_NaN()));
0138
0139 default_values[0] = default_values_t(peakval * .7, peakval * -1.5, peakval * 1.5);
0140 default_values[1] = default_values_t(peakPos - risetime, peakPos - 3 * risetime, peakPos + risetime);
0141 default_values[2] = default_values_t(5., 1, 10.);
0142 default_values[3] = default_values_t(risetime, risetime * .2, risetime * 10);
0143 default_values[4] = default_values_t(pedestal, pedestal - abs(peakval), pedestal + abs(peakval));
0144
0145
0146 default_values[5] = default_values_t(0, 0, 0);
0147 default_values[6] = default_values_t(risetime, risetime, risetime);
0148
0149
0150 TF1 fits("f_SignalShape_PowerLawDoubleExp", SignalShape_PowerLawDoubleExp, 0., n_samples, n_parameter);
0151 fits.SetParNames("Amplitude", "Sample Start", "Power", "Peak Time 1", "Pedestal", "Amplitude ratio", "Peak Time 2");
0152
0153 for (int i = 0; i < n_parameter; ++i)
0154 {
0155 if (parameters_io.find(i) == parameters_io.end())
0156 {
0157 fits.SetParameter(i, default_values[i].def);
0158
0159 if (default_values[i].min < default_values[i].max)
0160 {
0161 fits.SetParLimits(i, default_values[i].min, default_values[i].max);
0162 }
0163 else
0164 {
0165 fits.FixParameter(i, default_values[i].def);
0166 }
0167
0168 if (verbosity)
0169 {
0170 cout << "SampleFit_PowerLawDoubleExp - parameter [" << i << "]: "
0171 << "default value = " << default_values[i].def
0172 << ", min value = " << default_values[i].min
0173 << ", max value = " << default_values[i].max << endl;
0174 }
0175 }
0176 else
0177 {
0178
0179 fits.SetParameter(i, parameters_io[i]);
0180 fits.FixParameter(i, parameters_io[i]);
0181
0182 if (verbosity)
0183 {
0184 cout << "SampleFit_PowerLawDoubleExp - parameter [" << i << "]: fixed to " << parameters_io[i] << endl;
0185 }
0186 }
0187 }
0188
0189 if (verbosity <= 1)
0190 gpulse.Fit(&fits, "QRN0W", "goff", 0., (double) n_samples);
0191 else
0192 gpulse.Fit(&fits, "RN0VW+", "goff", 0., (double) n_samples);
0193
0194
0195 pedestal = fits.GetParameter(4);
0196
0197 const double peakpos1 = fits.GetParameter(3);
0198 const double peakpos2 = fits.GetParameter(6);
0199 double max_peakpos = fits.GetParameter(1) + (peakpos1 > peakpos2 ? peakpos1 : peakpos2);
0200 if (max_peakpos > n_samples - 1) max_peakpos = n_samples - 1;
0201
0202 if (fits.GetParameter(0) > 0)
0203 peak_sample = fits.GetMaximumX(fits.GetParameter(1), max_peakpos);
0204 else
0205 peak_sample = fits.GetMinimumX(fits.GetParameter(1), max_peakpos);
0206
0207 peak = fits.Eval(peak_sample) - pedestal;
0208
0209 if (verbosity)
0210 {
0211 static int id = 0;
0212 ++id;
0213
0214 string c_name(string("SampleFit_PowerLawDoubleExp_") + to_string(id));
0215
0216 TCanvas *canvas = new TCanvas(
0217 c_name.c_str(), c_name.c_str());
0218 canvas->Update();
0219
0220 TGraph *g_plot = static_cast<TGraph *>(gpulse.DrawClone("ap*l"));
0221 g_plot->SetTitle((string("ADC data and fit #") + to_string(id) + string(";Sample number;ADC value")).c_str());
0222
0223 fits.SetLineColor(kMagenta);
0224 fits.DrawClone("same");
0225 fits.Print();
0226
0227 TF1 f1("f_SignalShape_PowerLawExp1", SignalShape_PowerLawExp, 0., n_samples, 5);
0228 f1.SetParameters(
0229 fits.GetParameter(0) * (1 - fits.GetParameter(5)) / pow(fits.GetParameter(3), fits.GetParameter(2)) * exp(fits.GetParameter(2)),
0230 fits.GetParameter(1),
0231 fits.GetParameter(2),
0232 fits.GetParameter(2) / fits.GetParameter(3),
0233 fits.GetParameter(4));
0234 f1.SetLineColor(kBlue);
0235 f1.DrawClone("same");
0236
0237 TF1 f2("f_SignalShape_PowerLawExp2", SignalShape_PowerLawExp, 0., n_samples, 5);
0238 f2.SetParameters(
0239 fits.GetParameter(0) * fits.GetParameter(5) / pow(fits.GetParameter(6), fits.GetParameter(2)) * exp(fits.GetParameter(2)),
0240 fits.GetParameter(1),
0241 fits.GetParameter(2),
0242 fits.GetParameter(2) / fits.GetParameter(6),
0243 fits.GetParameter(4));
0244 f2.SetLineColor(kRed);
0245 f2.DrawClone("same");
0246
0247 TGraph g_max(1);
0248
0249 g_max.GetX()[0] = peak_sample;
0250 g_max.GetY()[0] = peak + pedestal;
0251
0252 g_max.SetMarkerStyle(kFullCircle);
0253 g_max.SetMarkerSize(2);
0254 g_max.SetMarkerColor(kRed);
0255
0256 static_cast<TGraph *>(g_max.DrawClone("p"));
0257
0258 canvas->Update();
0259
0260
0261
0262
0263
0264 canvas->Print("SampleFit_PowerLawDoubleExp.pdf");
0265 }
0266
0267 for (int i = 0; i < n_parameter; ++i)
0268 {
0269 parameters_io[i] = fits.GetParameter(i);
0270 }
0271
0272 if (verbosity)
0273 {
0274 cout << "SampleFit_PowerLawDoubleExp - "
0275 << "peak_sample = " << peak_sample << ", "
0276 << "max_peakpos = " << max_peakpos << ", "
0277 << "fits.GetParameter(1) = " << fits.GetParameter(1) << ", "
0278 << "peak = " << peak << ", "
0279 << "pedestal = " << pedestal << endl;
0280 }
0281
0282 return true;
0283 }
0284
0285 double
0286 SignalShape_PowerLawExp(double *x, double *par)
0287 {
0288 double pedestal = par[4];
0289
0290 if (x[0] < par[1])
0291 return pedestal;
0292
0293 double signal = par[0] * pow((x[0] - par[1]), par[2]) * exp(-(x[0] - par[1]) * par[3]);
0294 return pedestal + signal;
0295 }
0296
0297 double
0298 SignalShape_PowerLawDoubleExp(double *x, double *par)
0299 {
0300 double pedestal = par[4];
0301
0302 if (x[0] < par[1])
0303 return pedestal;
0304
0305
0306
0307
0308 double signal =
0309 par[0]
0310 * pow((x[0] - par[1]), par[2])
0311 * (((1. - par[5]) / pow(par[3], par[2]) * exp(par[2])) * exp(-(x[0] - par[1]) * (par[2] / par[3]))
0312 + (par[5] / pow(par[6], par[2]) * exp(par[2])) * exp(-(x[0] - par[1]) * (par[2] / par[6]))
0313 );
0314 return pedestal + signal;
0315 }
0316
0317 pair<int, int> SAMPAChan2PadXY(uint32_t fee_channel)
0318 {
0319 static const int pad_map_to_xy[512][2] = {
0320 {-1, 0},
0321 {-1, 1},
0322 {-1, 2},
0323 {1, 2},
0324 {1, 1},
0325 {1, 4},
0326 {1, 3},
0327 {2, 1},
0328 {1, 5},
0329 {2, 3},
0330 {2, 2},
0331 {2, 5},
0332 {2, 4},
0333 {3, 2},
0334 {3, 1},
0335 {3, 4},
0336 {3, 3},
0337 {4, 1},
0338 {3, 5},
0339 {4, 3},
0340 {4, 2},
0341 {4, 5},
0342 {4, 4},
0343 {5, 2},
0344 {5, 1},
0345 {5, 4},
0346 {5, 3},
0347 {6, 1},
0348 {5, 5},
0349 {6, 3},
0350 {6, 2},
0351 {6, 5},
0352 {6, 4},
0353 {7, 2},
0354 {7, 1},
0355 {7, 4},
0356 {7, 3},
0357 {8, 1},
0358 {7, 5},
0359 {8, 3},
0360 {8, 2},
0361 {8, 5},
0362 {8, 4},
0363 {9, 2},
0364 {9, 1},
0365 {9, 4},
0366 {9, 3},
0367 {10, 1},
0368 {9, 5},
0369 {10, 3},
0370 {10, 2},
0371 {10, 5},
0372 {10, 4},
0373 {11, 2},
0374 {11, 1},
0375 {11, 4},
0376 {11, 3},
0377 {12, 1},
0378 {11, 5},
0379 {12, 3},
0380 {12, 2},
0381 {12, 5},
0382 {12, 4},
0383 {13, 2},
0384 {13, 1},
0385 {13, 4},
0386 {13, 3},
0387 {14, 1},
0388 {13, 5},
0389 {14, 3},
0390 {14, 2},
0391 {14, 5},
0392 {14, 4},
0393 {15, 2},
0394 {15, 1},
0395 {15, 4},
0396 {15, 3},
0397 {16, 1},
0398 {15, 5},
0399 {16, 3},
0400 {16, 2},
0401 {16, 5},
0402 {16, 4},
0403 {17, 2},
0404 {17, 1},
0405 {17, 4},
0406 {17, 3},
0407 {18, 1},
0408 {17, 5},
0409 {18, 3},
0410 {18, 2},
0411 {18, 5},
0412 {18, 4},
0413 {19, 2},
0414 {19, 1},
0415 {19, 4},
0416 {19, 3},
0417 {20, 1},
0418 {19, 5},
0419 {20, 3},
0420 {20, 2},
0421 {20, 5},
0422 {20, 4},
0423 {21, 2},
0424 {21, 1},
0425 {21, 4},
0426 {21, 3},
0427 {22, 1},
0428 {21, 5},
0429 {22, 3},
0430 {22, 2},
0431 {22, 5},
0432 {22, 4},
0433 {23, 2},
0434 {23, 1},
0435 {23, 4},
0436 {23, 3},
0437 {24, 1},
0438 {23, 5},
0439 {24, 3},
0440 {24, 2},
0441 {24, 5},
0442 {24, 4},
0443 {-1, 3},
0444 {-1, 4},
0445 {-1, 5},
0446 {-1, 6},
0447 {-1, 7},
0448 {-9, 2},
0449 {-3, 1},
0450 {-3, 2},
0451 {25, 2},
0452 {25, 1},
0453 {25, 4},
0454 {25, 3},
0455 {26, 1},
0456 {25, 5},
0457 {26, 3},
0458 {26, 2},
0459 {26, 5},
0460 {26, 4},
0461 {27, 2},
0462 {27, 1},
0463 {27, 4},
0464 {27, 3},
0465 {28, 1},
0466 {27, 5},
0467 {28, 3},
0468 {28, 2},
0469 {28, 5},
0470 {28, 4},
0471 {29, 2},
0472 {29, 1},
0473 {29, 4},
0474 {29, 3},
0475 {30, 1},
0476 {29, 5},
0477 {30, 3},
0478 {30, 2},
0479 {30, 5},
0480 {30, 4},
0481 {31, 2},
0482 {31, 1},
0483 {31, 4},
0484 {31, 3},
0485 {32, 1},
0486 {31, 5},
0487 {32, 3},
0488 {32, 2},
0489 {32, 5},
0490 {32, 4},
0491 {33, 2},
0492 {33, 1},
0493 {33, 4},
0494 {33, 3},
0495 {34, 1},
0496 {33, 5},
0497 {34, 3},
0498 {34, 2},
0499 {34, 5},
0500 {34, 4},
0501 {35, 2},
0502 {35, 1},
0503 {35, 4},
0504 {35, 3},
0505 {36, 1},
0506 {35, 5},
0507 {36, 3},
0508 {36, 2},
0509 {36, 5},
0510 {36, 4},
0511 {37, 2},
0512 {37, 1},
0513 {37, 4},
0514 {37, 3},
0515 {38, 1},
0516 {37, 5},
0517 {38, 3},
0518 {38, 2},
0519 {38, 5},
0520 {38, 4},
0521 {39, 2},
0522 {39, 1},
0523 {39, 4},
0524 {39, 3},
0525 {40, 1},
0526 {39, 5},
0527 {40, 3},
0528 {40, 2},
0529 {40, 5},
0530 {40, 4},
0531 {41, 2},
0532 {41, 1},
0533 {41, 4},
0534 {41, 3},
0535 {42, 1},
0536 {41, 5},
0537 {42, 3},
0538 {42, 2},
0539 {42, 5},
0540 {42, 4},
0541 {43, 2},
0542 {43, 1},
0543 {43, 4},
0544 {43, 3},
0545 {44, 1},
0546 {43, 5},
0547 {44, 3},
0548 {44, 2},
0549 {44, 5},
0550 {44, 4},
0551 {45, 2},
0552 {45, 1},
0553 {45, 4},
0554 {45, 3},
0555 {46, 1},
0556 {45, 5},
0557 {46, 3},
0558 {46, 2},
0559 {46, 5},
0560 {46, 4},
0561 {47, 2},
0562 {47, 1},
0563 {47, 4},
0564 {47, 3},
0565 {48, 1},
0566 {47, 5},
0567 {48, 3},
0568 {48, 2},
0569 {48, 5},
0570 {48, 4},
0571 {-3, 3},
0572 {-3, 4},
0573 {-3, 5},
0574 {-3, 6},
0575 {-3, 7},
0576 {-5, 0},
0577 {-5, 1},
0578 {-5, 2},
0579 {48, 6},
0580 {-5, 3},
0581 {48, 8},
0582 {48, 7},
0583 {48, 10},
0584 {48, 9},
0585 {47, 7},
0586 {47, 6},
0587 {47, 9},
0588 {47, 8},
0589 {46, 6},
0590 {47, 10},
0591 {46, 8},
0592 {46, 7},
0593 {46, 10},
0594 {46, 9},
0595 {45, 7},
0596 {45, 6},
0597 {45, 9},
0598 {45, 8},
0599 {44, 6},
0600 {45, 10},
0601 {44, 8},
0602 {44, 7},
0603 {44, 10},
0604 {44, 9},
0605 {43, 7},
0606 {43, 6},
0607 {43, 9},
0608 {43, 8},
0609 {42, 6},
0610 {43, 10},
0611 {42, 8},
0612 {42, 7},
0613 {42, 10},
0614 {42, 9},
0615 {41, 7},
0616 {41, 6},
0617 {41, 9},
0618 {41, 8},
0619 {40, 6},
0620 {41, 10},
0621 {40, 8},
0622 {40, 7},
0623 {40, 10},
0624 {40, 9},
0625 {39, 7},
0626 {39, 6},
0627 {39, 9},
0628 {39, 8},
0629 {38, 6},
0630 {39, 10},
0631 {38, 8},
0632 {38, 7},
0633 {38, 10},
0634 {38, 9},
0635 {37, 7},
0636 {37, 6},
0637 {37, 9},
0638 {37, 8},
0639 {36, 6},
0640 {37, 10},
0641 {36, 8},
0642 {36, 7},
0643 {36, 10},
0644 {36, 9},
0645 {35, 7},
0646 {35, 6},
0647 {35, 9},
0648 {35, 8},
0649 {34, 6},
0650 {35, 10},
0651 {34, 8},
0652 {34, 7},
0653 {34, 10},
0654 {34, 9},
0655 {33, 7},
0656 {33, 6},
0657 {33, 9},
0658 {33, 8},
0659 {32, 6},
0660 {33, 10},
0661 {32, 8},
0662 {32, 7},
0663 {32, 10},
0664 {32, 9},
0665 {31, 7},
0666 {31, 6},
0667 {31, 9},
0668 {31, 8},
0669 {30, 6},
0670 {31, 10},
0671 {30, 8},
0672 {30, 7},
0673 {30, 10},
0674 {30, 9},
0675 {29, 7},
0676 {29, 6},
0677 {29, 9},
0678 {29, 8},
0679 {28, 6},
0680 {29, 10},
0681 {28, 8},
0682 {28, 7},
0683 {28, 10},
0684 {28, 9},
0685 {27, 7},
0686 {27, 6},
0687 {27, 9},
0688 {27, 8},
0689 {26, 6},
0690 {27, 10},
0691 {26, 8},
0692 {26, 7},
0693 {26, 10},
0694 {26, 9},
0695 {25, 7},
0696 {25, 6},
0697 {25, 9},
0698 {25, 8},
0699 {-9, 0},
0700 {25, 10},
0701 {-5, 5},
0702 {-5, 6},
0703 {-5, 7},
0704 {-7, 0},
0705 {-7, 1},
0706 {-7, 2},
0707 {24, 6},
0708 {-7, 3},
0709 {24, 8},
0710 {24, 7},
0711 {24, 10},
0712 {24, 9},
0713 {23, 7},
0714 {23, 6},
0715 {23, 9},
0716 {23, 8},
0717 {22, 6},
0718 {23, 10},
0719 {22, 8},
0720 {22, 7},
0721 {22, 10},
0722 {22, 9},
0723 {21, 7},
0724 {21, 6},
0725 {21, 9},
0726 {21, 8},
0727 {20, 6},
0728 {21, 10},
0729 {20, 8},
0730 {20, 7},
0731 {20, 10},
0732 {20, 9},
0733 {19, 7},
0734 {19, 6},
0735 {19, 9},
0736 {19, 8},
0737 {18, 6},
0738 {19, 10},
0739 {18, 8},
0740 {18, 7},
0741 {18, 10},
0742 {18, 9},
0743 {17, 7},
0744 {17, 6},
0745 {17, 9},
0746 {17, 8},
0747 {16, 6},
0748 {17, 10},
0749 {16, 8},
0750 {16, 7},
0751 {16, 10},
0752 {16, 9},
0753 {15, 7},
0754 {15, 6},
0755 {15, 9},
0756 {15, 8},
0757 {14, 6},
0758 {15, 10},
0759 {14, 8},
0760 {14, 7},
0761 {14, 10},
0762 {14, 9},
0763 {13, 7},
0764 {13, 6},
0765 {13, 9},
0766 {13, 8},
0767 {12, 6},
0768 {13, 10},
0769 {12, 8},
0770 {12, 7},
0771 {12, 10},
0772 {12, 9},
0773 {11, 7},
0774 {11, 6},
0775 {11, 9},
0776 {11, 8},
0777 {10, 6},
0778 {11, 10},
0779 {10, 8},
0780 {10, 7},
0781 {10, 10},
0782 {10, 9},
0783 {9, 7},
0784 {9, 6},
0785 {9, 9},
0786 {9, 8},
0787 {8, 6},
0788 {9, 10},
0789 {8, 8},
0790 {8, 7},
0791 {8, 10},
0792 {8, 9},
0793 {7, 7},
0794 {7, 6},
0795 {7, 9},
0796 {7, 8},
0797 {6, 6},
0798 {7, 10},
0799 {6, 8},
0800 {6, 7},
0801 {6, 10},
0802 {6, 9},
0803 {5, 7},
0804 {5, 6},
0805 {5, 9},
0806 {5, 8},
0807 {4, 6},
0808 {5, 10},
0809 {4, 8},
0810 {4, 7},
0811 {4, 10},
0812 {4, 9},
0813 {3, 7},
0814 {3, 6},
0815 {3, 9},
0816 {3, 8},
0817 {2, 6},
0818 {3, 10},
0819 {2, 8},
0820 {2, 7},
0821 {2, 10},
0822 {2, 9},
0823 {1, 7},
0824 {1, 6},
0825 {1, 9},
0826 {1, 8},
0827 {0, 6},
0828 {1, 10},
0829 {-7, 5},
0830 {-7, 6},
0831 {-7, 7}};
0832
0833 static const int sampa_chan_to_pad[] = {
0834 287,
0835 286,
0836 285,
0837 284,
0838 283,
0839 282,
0840 281,
0841 280,
0842 279,
0843 278,
0844 277,
0845 276,
0846 275,
0847 274,
0848 273,
0849 272,
0850 271,
0851 270,
0852 269,
0853 268,
0854 267,
0855 266,
0856 265,
0857 264,
0858 263,
0859 262,
0860 261,
0861 260,
0862 259,
0863 258,
0864 257,
0865 256,
0866 319,
0867 318,
0868 317,
0869 316,
0870 315,
0871 314,
0872 313,
0873 312,
0874 311,
0875 310,
0876 309,
0877 308,
0878 307,
0879 306,
0880 305,
0881 304,
0882 303,
0883 302,
0884 301,
0885 300,
0886 299,
0887 298,
0888 297,
0889 296,
0890 295,
0891 294,
0892 293,
0893 292,
0894 291,
0895 290,
0896 289,
0897 288,
0898 351,
0899 350,
0900 349,
0901 348,
0902 347,
0903 346,
0904 345,
0905 344,
0906 343,
0907 342,
0908 341,
0909 340,
0910 339,
0911 338,
0912 337,
0913 336,
0914 335,
0915 334,
0916 333,
0917 332,
0918 331,
0919 330,
0920 329,
0921 328,
0922 327,
0923 326,
0924 325,
0925 324,
0926 323,
0927 322,
0928 321,
0929 320,
0930 383,
0931 382,
0932 381,
0933 380,
0934 379,
0935 378,
0936 377,
0937 376,
0938 375,
0939 374,
0940 373,
0941 372,
0942 371,
0943 370,
0944 369,
0945 368,
0946 367,
0947 366,
0948 365,
0949 364,
0950 363,
0951 362,
0952 361,
0953 360,
0954 359,
0955 358,
0956 357,
0957 356,
0958 355,
0959 354,
0960 353,
0961 352,
0962 415,
0963 414,
0964 413,
0965 412,
0966 411,
0967 410,
0968 409,
0969 408,
0970 407,
0971 406,
0972 405,
0973 404,
0974 403,
0975 402,
0976 401,
0977 400,
0978 399,
0979 398,
0980 397,
0981 396,
0982 395,
0983 394,
0984 393,
0985 392,
0986 391,
0987 390,
0988 389,
0989 388,
0990 387,
0991 386,
0992 385,
0993 384,
0994 447,
0995 446,
0996 445,
0997 444,
0998 443,
0999 442,
1000 441,
1001 440,
1002 439,
1003 438,
1004 437,
1005 436,
1006 435,
1007 434,
1008 433,
1009 432,
1010 431,
1011 430,
1012 429,
1013 428,
1014 427,
1015 426,
1016 425,
1017 424,
1018 423,
1019 422,
1020 421,
1021 420,
1022 419,
1023 418,
1024 417,
1025 416,
1026 479,
1027 478,
1028 477,
1029 476,
1030 475,
1031 474,
1032 473,
1033 472,
1034 471,
1035 470,
1036 469,
1037 468,
1038 467,
1039 466,
1040 465,
1041 464,
1042 463,
1043 462,
1044 461,
1045 460,
1046 459,
1047 458,
1048 457,
1049 456,
1050 455,
1051 454,
1052 453,
1053 452,
1054 451,
1055 450,
1056 449,
1057 448,
1058 511,
1059 510,
1060 509,
1061 508,
1062 507,
1063 506,
1064 505,
1065 504,
1066 503,
1067 502,
1068 501,
1069 500,
1070 499,
1071 498,
1072 497,
1073 496,
1074 495,
1075 494,
1076 493,
1077 492,
1078 491,
1079 490,
1080 489,
1081 488,
1082 487,
1083 486,
1084 485,
1085 484,
1086 483,
1087 482,
1088 481,
1089 480,
1090 0
1091 };
1092
1093 if (fee_channel >= 256)
1094 fee_channel = 256;
1095
1096 const int pad_number = sampa_chan_to_pad[fee_channel];
1097 const int pad_x = pad_map_to_xy[pad_number][0];
1098 const int pad_y = pad_map_to_xy[pad_number][1];
1099
1100 return make_pair(pad_x, pad_y);
1101 }
1102
1103 }
1104
1105 }