Back to home page

sPhenix code displayed by LXR

 
 

    


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 //! TPC v1 FEE test stand decoder
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(");  //open multiplage 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)");  //close multiplage 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> &parameters_io,
0074     const int verbosity)
0075 {
0076   static const int n_parameter = 7;
0077 
0078   // inital guesses
0079   int peakPos = 0.;
0080 
0081   //  assert(samples.size() == n_samples);
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   //Saturation correction - Abhisek
0093   //  for (int ipoint = 0; ipoint < gpulse.GetN(); ipoint++)
0094   //    if ((gpulse.GetY())[ipoint] >= ((1 << 10) - 10)  // drop point if touching max or low limit on ADCs
0095   //        or (not isnormal((gpulse.GetY())[ipoint])))
0096   //    {
0097   //      gpulse.RemovePoint(ipoint);
0098   //      ipoint--;
0099   //    }
0100 
0101   pedestal = gpulse.GetY()[0];  //(double) PEDESTAL;
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   // build default value
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   //  default_values[5] = default_values_t(0.3, 0, 1);
0145   //  default_values[6] = default_values_t(5, risetime * .2, risetime * 10);
0146   default_values[5] = default_values_t(0, 0, 0);  // disable 2nd component
0147   default_values[6] = default_values_t(risetime, risetime, risetime);
0148 
0149   // fit function
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 //      fits.SetParLimits(i, parameters_io[i], parameters_io[i]);
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   // store results
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     //    if (id == 1)
0261     //    {
0262     //      canvas->Print("SampleFit_PowerLawDoubleExp.pdf(");
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   //                        + ((x[0] - 1.5 * par[1]) > 0) * par[5];  // quick fix on exting tails on the signal function
0290   if (x[0] < par[1])
0291     return pedestal;
0292   //double  signal = (-1)*par[0]*pow((x[0]-par[1]),par[2])*exp(-(x[0]-par[1])*par[3]);
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   //                        + ((x[0] - 1.5 * par[1]) > 0) * par[5];  // quick fix on exting tails on the signal function
0302   if (x[0] < par[1])
0303     return pedestal;
0304   //double  signal = (-1)*par[0]*pow((x[0]-par[1]),par[2])*exp(-(x[0]-par[1])*par[3]);
0305   //  peak / pow(fits.GetParameter(2) / fits.GetParameter(3), fits.GetParameter(2)) * exp(fits.GetParameter(2)) = fits.GetParameter(0);  // exact peak height is (p0*Power(p2/p3,p2))/Power(E,p2)
0306   //  fits.GetParameter(2) / peak_shift =  fits.GetParameter(3);  // signal peak time
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},   //0
0321       {-1, 1},   //1
0322       {-1, 2},   //2
0323       {1, 2},    //3
0324       {1, 1},    //4
0325       {1, 4},    //5
0326       {1, 3},    //6
0327       {2, 1},    //7
0328       {1, 5},    //8
0329       {2, 3},    //9
0330       {2, 2},    //10
0331       {2, 5},    //11
0332       {2, 4},    //12
0333       {3, 2},    //13
0334       {3, 1},    //14
0335       {3, 4},    //15
0336       {3, 3},    //16
0337       {4, 1},    //17
0338       {3, 5},    //18
0339       {4, 3},    //19
0340       {4, 2},    //20
0341       {4, 5},    //21
0342       {4, 4},    //22
0343       {5, 2},    //23
0344       {5, 1},    //24
0345       {5, 4},    //25
0346       {5, 3},    //26
0347       {6, 1},    //27
0348       {5, 5},    //28
0349       {6, 3},    //29
0350       {6, 2},    //30
0351       {6, 5},    //31
0352       {6, 4},    //32
0353       {7, 2},    //33
0354       {7, 1},    //34
0355       {7, 4},    //35
0356       {7, 3},    //36
0357       {8, 1},    //37
0358       {7, 5},    //38
0359       {8, 3},    //39
0360       {8, 2},    //40
0361       {8, 5},    //41
0362       {8, 4},    //42
0363       {9, 2},    //43
0364       {9, 1},    //44
0365       {9, 4},    //45
0366       {9, 3},    //46
0367       {10, 1},   //47
0368       {9, 5},    //48
0369       {10, 3},   //49
0370       {10, 2},   //50
0371       {10, 5},   //51
0372       {10, 4},   //52
0373       {11, 2},   //53
0374       {11, 1},   //54
0375       {11, 4},   //55
0376       {11, 3},   //56
0377       {12, 1},   //57
0378       {11, 5},   //58
0379       {12, 3},   //59
0380       {12, 2},   //60
0381       {12, 5},   //61
0382       {12, 4},   //62
0383       {13, 2},   //63
0384       {13, 1},   //64
0385       {13, 4},   //65
0386       {13, 3},   //66
0387       {14, 1},   //67
0388       {13, 5},   //68
0389       {14, 3},   //69
0390       {14, 2},   //70
0391       {14, 5},   //71
0392       {14, 4},   //72
0393       {15, 2},   //73
0394       {15, 1},   //74
0395       {15, 4},   //75
0396       {15, 3},   //76
0397       {16, 1},   //77
0398       {15, 5},   //78
0399       {16, 3},   //79
0400       {16, 2},   //80
0401       {16, 5},   //81
0402       {16, 4},   //82
0403       {17, 2},   //83
0404       {17, 1},   //84
0405       {17, 4},   //85
0406       {17, 3},   //86
0407       {18, 1},   //87
0408       {17, 5},   //88
0409       {18, 3},   //89
0410       {18, 2},   //90
0411       {18, 5},   //91
0412       {18, 4},   //92
0413       {19, 2},   //93
0414       {19, 1},   //94
0415       {19, 4},   //95
0416       {19, 3},   //96
0417       {20, 1},   //97
0418       {19, 5},   //98
0419       {20, 3},   //99
0420       {20, 2},   //100
0421       {20, 5},   //101
0422       {20, 4},   //102
0423       {21, 2},   //103
0424       {21, 1},   //104
0425       {21, 4},   //105
0426       {21, 3},   //106
0427       {22, 1},   //107
0428       {21, 5},   //108
0429       {22, 3},   //109
0430       {22, 2},   //110
0431       {22, 5},   //111
0432       {22, 4},   //112
0433       {23, 2},   //113
0434       {23, 1},   //114
0435       {23, 4},   //115
0436       {23, 3},   //116
0437       {24, 1},   //117
0438       {23, 5},   //118
0439       {24, 3},   //119
0440       {24, 2},   //120
0441       {24, 5},   //121
0442       {24, 4},   //122
0443       {-1, 3},   //123
0444       {-1, 4},   //124
0445       {-1, 5},   //125
0446       {-1, 6},   //126
0447       {-1, 7},   //127
0448       {-9, 2},   //128
0449       {-3, 1},   //129
0450       {-3, 2},   //130
0451       {25, 2},   //131
0452       {25, 1},   //132
0453       {25, 4},   //133
0454       {25, 3},   //134
0455       {26, 1},   //135
0456       {25, 5},   //136
0457       {26, 3},   //137
0458       {26, 2},   //138
0459       {26, 5},   //139
0460       {26, 4},   //140
0461       {27, 2},   //141
0462       {27, 1},   //142
0463       {27, 4},   //143
0464       {27, 3},   //144
0465       {28, 1},   //145
0466       {27, 5},   //146
0467       {28, 3},   //147
0468       {28, 2},   //148
0469       {28, 5},   //149
0470       {28, 4},   //150
0471       {29, 2},   //151
0472       {29, 1},   //152
0473       {29, 4},   //153
0474       {29, 3},   //154
0475       {30, 1},   //155
0476       {29, 5},   //156
0477       {30, 3},   //157
0478       {30, 2},   //158
0479       {30, 5},   //159
0480       {30, 4},   //160
0481       {31, 2},   //161
0482       {31, 1},   //162
0483       {31, 4},   //163
0484       {31, 3},   //164
0485       {32, 1},   //165
0486       {31, 5},   //166
0487       {32, 3},   //167
0488       {32, 2},   //168
0489       {32, 5},   //169
0490       {32, 4},   //170
0491       {33, 2},   //171
0492       {33, 1},   //172
0493       {33, 4},   //173
0494       {33, 3},   //174
0495       {34, 1},   //175
0496       {33, 5},   //176
0497       {34, 3},   //177
0498       {34, 2},   //178
0499       {34, 5},   //179
0500       {34, 4},   //180
0501       {35, 2},   //181
0502       {35, 1},   //182
0503       {35, 4},   //183
0504       {35, 3},   //184
0505       {36, 1},   //185
0506       {35, 5},   //186
0507       {36, 3},   //187
0508       {36, 2},   //188
0509       {36, 5},   //189
0510       {36, 4},   //190
0511       {37, 2},   //191
0512       {37, 1},   //192
0513       {37, 4},   //193
0514       {37, 3},   //194
0515       {38, 1},   //195
0516       {37, 5},   //196
0517       {38, 3},   //197
0518       {38, 2},   //198
0519       {38, 5},   //199
0520       {38, 4},   //200
0521       {39, 2},   //201
0522       {39, 1},   //202
0523       {39, 4},   //203
0524       {39, 3},   //204
0525       {40, 1},   //205
0526       {39, 5},   //206
0527       {40, 3},   //207
0528       {40, 2},   //208
0529       {40, 5},   //209
0530       {40, 4},   //210
0531       {41, 2},   //211
0532       {41, 1},   //212
0533       {41, 4},   //213
0534       {41, 3},   //214
0535       {42, 1},   //215
0536       {41, 5},   //216
0537       {42, 3},   //217
0538       {42, 2},   //218
0539       {42, 5},   //219
0540       {42, 4},   //220
0541       {43, 2},   //221
0542       {43, 1},   //222
0543       {43, 4},   //223
0544       {43, 3},   //224
0545       {44, 1},   //225
0546       {43, 5},   //226
0547       {44, 3},   //227
0548       {44, 2},   //228
0549       {44, 5},   //229
0550       {44, 4},   //230
0551       {45, 2},   //231
0552       {45, 1},   //232
0553       {45, 4},   //233
0554       {45, 3},   //234
0555       {46, 1},   //235
0556       {45, 5},   //236
0557       {46, 3},   //237
0558       {46, 2},   //238
0559       {46, 5},   //239
0560       {46, 4},   //240
0561       {47, 2},   //241
0562       {47, 1},   //242
0563       {47, 4},   //243
0564       {47, 3},   //244
0565       {48, 1},   //245
0566       {47, 5},   //246
0567       {48, 3},   //247
0568       {48, 2},   //248
0569       {48, 5},   //249
0570       {48, 4},   //250
0571       {-3, 3},   //251
0572       {-3, 4},   //252
0573       {-3, 5},   //253
0574       {-3, 6},   //254
0575       {-3, 7},   //255
0576       {-5, 0},   //256
0577       {-5, 1},   //257
0578       {-5, 2},   //258
0579       {48, 6},   //259
0580       {-5, 3},   //260
0581       {48, 8},   //261
0582       {48, 7},   //262
0583       {48, 10},  //263
0584       {48, 9},   //264
0585       {47, 7},   //265
0586       {47, 6},   //266
0587       {47, 9},   //267
0588       {47, 8},   //268
0589       {46, 6},   //269
0590       {47, 10},  //270
0591       {46, 8},   //271
0592       {46, 7},   //272
0593       {46, 10},  //273
0594       {46, 9},   //274
0595       {45, 7},   //275
0596       {45, 6},   //276
0597       {45, 9},   //277
0598       {45, 8},   //278
0599       {44, 6},   //279
0600       {45, 10},  //280
0601       {44, 8},   //281
0602       {44, 7},   //282
0603       {44, 10},  //283
0604       {44, 9},   //284
0605       {43, 7},   //285
0606       {43, 6},   //286
0607       {43, 9},   //287
0608       {43, 8},   //288
0609       {42, 6},   //289
0610       {43, 10},  //290
0611       {42, 8},   //291
0612       {42, 7},   //292
0613       {42, 10},  //293
0614       {42, 9},   //294
0615       {41, 7},   //295
0616       {41, 6},   //296
0617       {41, 9},   //297
0618       {41, 8},   //298
0619       {40, 6},   //299
0620       {41, 10},  //300
0621       {40, 8},   //301
0622       {40, 7},   //302
0623       {40, 10},  //303
0624       {40, 9},   //304
0625       {39, 7},   //305
0626       {39, 6},   //306
0627       {39, 9},   //307
0628       {39, 8},   //308
0629       {38, 6},   //309
0630       {39, 10},  //310
0631       {38, 8},   //311
0632       {38, 7},   //312
0633       {38, 10},  //313
0634       {38, 9},   //314
0635       {37, 7},   //315
0636       {37, 6},   //316
0637       {37, 9},   //317
0638       {37, 8},   //318
0639       {36, 6},   //319
0640       {37, 10},  //320
0641       {36, 8},   //321
0642       {36, 7},   //322
0643       {36, 10},  //323
0644       {36, 9},   //324
0645       {35, 7},   //325
0646       {35, 6},   //326
0647       {35, 9},   //327
0648       {35, 8},   //328
0649       {34, 6},   //329
0650       {35, 10},  //330
0651       {34, 8},   //331
0652       {34, 7},   //332
0653       {34, 10},  //333
0654       {34, 9},   //334
0655       {33, 7},   //335
0656       {33, 6},   //336
0657       {33, 9},   //337
0658       {33, 8},   //338
0659       {32, 6},   //339
0660       {33, 10},  //340
0661       {32, 8},   //341
0662       {32, 7},   //342
0663       {32, 10},  //343
0664       {32, 9},   //344
0665       {31, 7},   //345
0666       {31, 6},   //346
0667       {31, 9},   //347
0668       {31, 8},   //348
0669       {30, 6},   //349
0670       {31, 10},  //350
0671       {30, 8},   //351
0672       {30, 7},   //352
0673       {30, 10},  //353
0674       {30, 9},   //354
0675       {29, 7},   //355
0676       {29, 6},   //356
0677       {29, 9},   //357
0678       {29, 8},   //358
0679       {28, 6},   //359
0680       {29, 10},  //360
0681       {28, 8},   //361
0682       {28, 7},   //362
0683       {28, 10},  //363
0684       {28, 9},   //364
0685       {27, 7},   //365
0686       {27, 6},   //366
0687       {27, 9},   //367
0688       {27, 8},   //368
0689       {26, 6},   //369
0690       {27, 10},  //370
0691       {26, 8},   //371
0692       {26, 7},   //372
0693       {26, 10},  //373
0694       {26, 9},   //374
0695       {25, 7},   //375
0696       {25, 6},   //376
0697       {25, 9},   //377
0698       {25, 8},   //378
0699       {-9, 0},   //379
0700       {25, 10},  //380
0701       {-5, 5},   //381
0702       {-5, 6},   //382
0703       {-5, 7},   //383
0704       {-7, 0},   //384
0705       {-7, 1},   //385
0706       {-7, 2},   //386
0707       {24, 6},   //387
0708       {-7, 3},   //388
0709       {24, 8},   //389
0710       {24, 7},   //390
0711       {24, 10},  //391
0712       {24, 9},   //392
0713       {23, 7},   //393
0714       {23, 6},   //394
0715       {23, 9},   //395
0716       {23, 8},   //396
0717       {22, 6},   //397
0718       {23, 10},  //398
0719       {22, 8},   //399
0720       {22, 7},   //400
0721       {22, 10},  //401
0722       {22, 9},   //402
0723       {21, 7},   //403
0724       {21, 6},   //404
0725       {21, 9},   //405
0726       {21, 8},   //406
0727       {20, 6},   //407
0728       {21, 10},  //408
0729       {20, 8},   //409
0730       {20, 7},   //410
0731       {20, 10},  //411
0732       {20, 9},   //412
0733       {19, 7},   //413
0734       {19, 6},   //414
0735       {19, 9},   //415
0736       {19, 8},   //416
0737       {18, 6},   //417
0738       {19, 10},  //418
0739       {18, 8},   //419
0740       {18, 7},   //420
0741       {18, 10},  //421
0742       {18, 9},   //422
0743       {17, 7},   //423
0744       {17, 6},   //424
0745       {17, 9},   //425
0746       {17, 8},   //426
0747       {16, 6},   //427
0748       {17, 10},  //428
0749       {16, 8},   //429
0750       {16, 7},   //430
0751       {16, 10},  //431
0752       {16, 9},   //432
0753       {15, 7},   //433
0754       {15, 6},   //434
0755       {15, 9},   //435
0756       {15, 8},   //436
0757       {14, 6},   //437
0758       {15, 10},  //438
0759       {14, 8},   //439
0760       {14, 7},   //440
0761       {14, 10},  //441
0762       {14, 9},   //442
0763       {13, 7},   //443
0764       {13, 6},   //444
0765       {13, 9},   //445
0766       {13, 8},   //446
0767       {12, 6},   //447
0768       {13, 10},  //448
0769       {12, 8},   //449
0770       {12, 7},   //450
0771       {12, 10},  //451
0772       {12, 9},   //452
0773       {11, 7},   //453
0774       {11, 6},   //454
0775       {11, 9},   //455
0776       {11, 8},   //456
0777       {10, 6},   //457
0778       {11, 10},  //458
0779       {10, 8},   //459
0780       {10, 7},   //460
0781       {10, 10},  //461
0782       {10, 9},   //462
0783       {9, 7},    //463
0784       {9, 6},    //464
0785       {9, 9},    //465
0786       {9, 8},    //466
0787       {8, 6},    //467
0788       {9, 10},   //468
0789       {8, 8},    //469
0790       {8, 7},    //470
0791       {8, 10},   //471
0792       {8, 9},    //472
0793       {7, 7},    //473
0794       {7, 6},    //474
0795       {7, 9},    //475
0796       {7, 8},    //476
0797       {6, 6},    //477
0798       {7, 10},   //478
0799       {6, 8},    //479
0800       {6, 7},    //480
0801       {6, 10},   //481
0802       {6, 9},    //482
0803       {5, 7},    //483
0804       {5, 6},    //484
0805       {5, 9},    //485
0806       {5, 8},    //486
0807       {4, 6},    //487
0808       {5, 10},   //488
0809       {4, 8},    //489
0810       {4, 7},    //490
0811       {4, 10},   //491
0812       {4, 9},    //492
0813       {3, 7},    //493
0814       {3, 6},    //494
0815       {3, 9},    //495
0816       {3, 8},    //496
0817       {2, 6},    //497
0818       {3, 10},   //498
0819       {2, 8},    //499
0820       {2, 7},    //500
0821       {2, 10},   //501
0822       {2, 9},    //502
0823       {1, 7},    //503
0824       {1, 6},    //504
0825       {1, 9},    //505
0826       {1, 8},    //506
0827       {0, 6},    //507
0828       {1, 10},   //508
0829       {-7, 5},   //509
0830       {-7, 6},   //510
0831       {-7, 7}};
0832 
0833   static const int sampa_chan_to_pad[] = {
0834       287,  //0
0835       286,  //1
0836       285,  //2
0837       284,  //3
0838       283,  //4
0839       282,  //5
0840       281,  //6
0841       280,  //7
0842       279,  //8
0843       278,  //9
0844       277,  //10
0845       276,  //11
0846       275,  //12
0847       274,  //13
0848       273,  //14
0849       272,  //15
0850       271,  //16
0851       270,  //17
0852       269,  //18
0853       268,  //19
0854       267,  //20
0855       266,  //21
0856       265,  //22
0857       264,  //23
0858       263,  //24
0859       262,  //25
0860       261,  //26
0861       260,  //27
0862       259,  //28
0863       258,  //29
0864       257,  //30
0865       256,  //31
0866       319,  //32
0867       318,  //33
0868       317,  //34
0869       316,  //35
0870       315,  //36
0871       314,  //37
0872       313,  //38
0873       312,  //39
0874       311,  //40
0875       310,  //41
0876       309,  //42
0877       308,  //43
0878       307,  //44
0879       306,  //45
0880       305,  //46
0881       304,  //47
0882       303,  //48
0883       302,  //49
0884       301,  //50
0885       300,  //51
0886       299,  //52
0887       298,  //53
0888       297,  //54
0889       296,  //55
0890       295,  //56
0891       294,  //57
0892       293,  //58
0893       292,  //59
0894       291,  //60
0895       290,  //61
0896       289,  //62
0897       288,  //63
0898       351,  //64
0899       350,  //65
0900       349,  //66
0901       348,  //67
0902       347,  //68
0903       346,  //69
0904       345,  //70
0905       344,  //71
0906       343,  //72
0907       342,  //73
0908       341,  //74
0909       340,  //75
0910       339,  //76
0911       338,  //77
0912       337,  //78
0913       336,  //79
0914       335,  //80
0915       334,  //81
0916       333,  //82
0917       332,  //83
0918       331,  //84
0919       330,  //85
0920       329,  //86
0921       328,  //87
0922       327,  //88
0923       326,  //89
0924       325,  //90
0925       324,  //91
0926       323,  //92
0927       322,  //93
0928       321,  //94
0929       320,  //95
0930       383,  //96
0931       382,  //97
0932       381,  //98
0933       380,  //99
0934       379,  //100
0935       378,  //101
0936       377,  //102
0937       376,  //103
0938       375,  //104
0939       374,  //105
0940       373,  //106
0941       372,  //107
0942       371,  //108
0943       370,  //109
0944       369,  //110
0945       368,  //111
0946       367,  //112
0947       366,  //113
0948       365,  //114
0949       364,  //115
0950       363,  //116
0951       362,  //117
0952       361,  //118
0953       360,  //119
0954       359,  //120
0955       358,  //121
0956       357,  //122
0957       356,  //123
0958       355,  //124
0959       354,  //125
0960       353,  //126
0961       352,  //127
0962       415,  //128
0963       414,  //129
0964       413,  //130
0965       412,  //131
0966       411,  //132
0967       410,  //133
0968       409,  //134
0969       408,  //135
0970       407,  //136
0971       406,  //137
0972       405,  //138
0973       404,  //139
0974       403,  //140
0975       402,  //141
0976       401,  //142
0977       400,  //143
0978       399,  //144
0979       398,  //145
0980       397,  //146
0981       396,  //147
0982       395,  //148
0983       394,  //149
0984       393,  //150
0985       392,  //151
0986       391,  //152
0987       390,  //153
0988       389,  //154
0989       388,  //155
0990       387,  //156
0991       386,  //157
0992       385,  //158
0993       384,  //159
0994       447,  //160
0995       446,  //161
0996       445,  //162
0997       444,  //163
0998       443,  //164
0999       442,  //165
1000       441,  //166
1001       440,  //167
1002       439,  //168
1003       438,  //169
1004       437,  //170
1005       436,  //171
1006       435,  //172
1007       434,  //173
1008       433,  //174
1009       432,  //175
1010       431,  //176
1011       430,  //177
1012       429,  //178
1013       428,  //179
1014       427,  //180
1015       426,  //181
1016       425,  //182
1017       424,  //183
1018       423,  //184
1019       422,  //185
1020       421,  //186
1021       420,  //187
1022       419,  //188
1023       418,  //189
1024       417,  //190
1025       416,  //191
1026       479,  //192
1027       478,  //193
1028       477,  //194
1029       476,  //195
1030       475,  //196
1031       474,  //197
1032       473,  //198
1033       472,  //199
1034       471,  //200
1035       470,  //201
1036       469,  //202
1037       468,  //203
1038       467,  //204
1039       466,  //205
1040       465,  //206
1041       464,  //207
1042       463,  //208
1043       462,  //209
1044       461,  //210
1045       460,  //211
1046       459,  //212
1047       458,  //213
1048       457,  //214
1049       456,  //215
1050       455,  //216
1051       454,  //217
1052       453,  //218
1053       452,  //219
1054       451,  //220
1055       450,  //221
1056       449,  //222
1057       448,  //223
1058       511,  //224
1059       510,  //225
1060       509,  //226
1061       508,  //227
1062       507,  //228
1063       506,  //229
1064       505,  //230
1065       504,  //231
1066       503,  //232
1067       502,  //233
1068       501,  //234
1069       500,  //235
1070       499,  //236
1071       498,  //237
1072       497,  //238
1073       496,  //239
1074       495,  //240
1075       494,  //241
1076       493,  //242
1077       492,  //243
1078       491,  //244
1079       490,  //245
1080       489,  //246
1081       488,  //247
1082       487,  //248
1083       486,  //249
1084       485,  //250
1085       484,  //251
1086       483,  //252
1087       482,  //253
1088       481,  //254
1089       480,  //255
1090       0     //256 , the invalid ID
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 }  // namespace FEEv1
1104 
1105 }  // namespace TPCDaqDefs