5 #include <TStopwatch.h>
7 #include "PixTestPhOptimization.hh"
17 PixTestPhOptimization::PixTestPhOptimization(
PixSetup *a, std::string name ) :
PixTest(a, name), fParNtrig(-1), fParDAC(
"nada"), fParDacVal(100), fFlagSinglePix(true), fSafetyMarginUp(10), fSafetyMarginLow(15) {
27 std::transform(parName.begin(), parName.end(), parName.begin(), ::tolower);
28 for (
unsigned int i = 0; i <
fParameters.size(); ++i) {
31 sval.erase(
remove(sval.begin(), sval.end(),
' '), sval.end());
32 if (!parName.compare(
"ntrig")) {
34 fParNtrig = atoi( sval.c_str() );
35 LOG(logDEBUG) <<
" setting fParNtrig ->" << fParNtrig
36 <<
"<- from sval = " << sval;
38 if (!parName.compare(
"safetymarginup")) {
39 fSafetyMarginUp = atoi( sval.c_str() );
40 LOG(logDEBUG) <<
" setting fSafetyMarginUp ->" << fSafetyMarginUp
41 <<
"<- from sval = " << sval;
43 if (!parName.compare(
"safetymarginlow")) {
44 fSafetyMarginLow = atoi( sval.c_str() );
45 LOG(logDEBUG) <<
" setting fSafetyMarginLow ->" << fSafetyMarginLow
46 <<
"<- from sval = " << sval;
48 if (!parName.compare(
"singlepix")) {
49 fFlagSinglePix = atoi( sval.c_str() );
50 LOG(logDEBUG) <<
" setting fFlagSinglePix ->" << fFlagSinglePix
51 <<
"<- from sval = " << sval;
53 if (!parName.compare(
"dac")) {
56 LOG(logDEBUG) <<
" setting fParDAC ->" << fParDAC
57 <<
"<- from sval = " << sval;
60 if (!parName.compare(
"dacval")) {
62 fParDacVal = atoi(sval.c_str());
63 LOG(logDEBUG) <<
" setting fParDacVal ->" << fParDacVal
64 <<
"<- from sval = " << sval;
67 if (!parName.compare(
"pix")) {
69 if (string::npos != s1) {
70 str1 = sval.substr(0, s1);
71 pixc = atoi(str1.c_str());
72 str2 = sval.substr(s1+1);
73 pixr = atoi(str2.c_str());
74 fPIX.push_back(make_pair(pixc, pixr));
76 LOG(logDEBUG) <<
" adding to FPIX ->" << pixc <<
"/" << pixr <<
" fPIX.size() = " <<
fPIX.size() ;
79 LOG(logDEBUG) <<
" clear fPIX: " <<
fPIX.size();
88 void PixTestPhOptimization::init() {
89 fDirectory = gFile->GetDirectory(fName.c_str());
96 void PixTestPhOptimization::bookHist(
string ) {}
98 PixTestPhOptimization::~PixTestPhOptimization() {}
105 bigBanner(Form(
"PixTestPhOptimization::doTest() Ntrig = %d, singlePix = %d", fParNtrig, (fFlagSinglePix?1:0)));
119 std::vector<std::pair<uint8_t, pair<int,int> > > badPixels;
120 BlacklistPixels(badPixels, 10);
126 pair<int, pxar::pixel> maxpixel;
127 pair<int, pxar::pixel> minpixel;
128 map<int, pxar::pixel> maxpixels;
129 map<int, pxar::pixel> minpixels;
130 map<int, int> minVcal;
133 for (
unsigned int iroc = 0; iroc < rocIds.size(); ++iroc){
134 LOG(logDEBUG)<<
"**********Ph range will be optimised on a single random pixel***********";
136 randomPix= *(RandomPixel(badPixels, rocIds[iroc]));
137 LOG(logDEBUG)<<
"In doTest(), randomCol "<<(int)randomPix.
column()<<
", randomRow "<<(int)randomPix.
row()<<
", pixel "<<randomPix;
138 maxpixel.first = rocIds[iroc];
139 maxpixel.second.
setRoc(rocIds[iroc]);
140 maxpixel.second.setColumn(randomPix.
column());
141 maxpixel.second.setRow(randomPix.
row());
142 minpixel.first = iroc;
143 minpixel.second.setRoc(rocIds[iroc]);
144 minpixel.second.setColumn(randomPix.
column());
145 minpixel.second.setRow(randomPix.
row());
146 LOG(logDEBUG)<<
"random pixel: "<<maxpixel.second<<
", "<<minpixel.second<<
"is not on the blacklist";
147 maxpixels.insert(maxpixel);
148 minpixels.insert(minpixel);
152 LOG(logDEBUG)<<
"**********Ph range will be optimised on the whole ROC***********";
154 GetMaxPhPixel(maxpixels, badPixels);
156 GetMinPhPixel(minpixels, minVcal, badPixels);
159 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
160 LOG(logDEBUG)<<
"vcal min "<<minVcal[roc_it]<<
" on ROC"<<(int)rocIds[roc_it];
164 std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > > dacdac_max;
165 std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > > dacdac_min;
166 MaxPhVsDacDac(dacdac_max, maxpixels);
167 MinPhVsDacDac(dacdac_min, minpixels, minVcal);
171 map<uint8_t, int> ps_opt, po_opt;
172 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
173 po_opt[rocIds[roc_it]] = 120;
175 ps_opt = InsideRangePH(po_opt, dacdac_max, dacdac_min);
177 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
178 if(ps_opt[rocIds[roc_it]]==999){
179 LOG(logDEBUG)<<
"PH optimization failed on ROC "<<(int)rocIds[roc_it]<<endl<<
"Please run PreTest or try PhOptimization on a random pixel";
183 po_opt = CentrePhRange(po_opt, ps_opt, dacdac_max, dacdac_min);
186 ps_opt = StretchPH(po_opt, ps_opt, dacdac_max, dacdac_min);
190 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
191 fApi->
setDAC(
"phscale",ps_opt[rocIds[roc_it]], rocIds[roc_it] );
192 fApi->
setDAC(
"phoffset",po_opt[rocIds[roc_it]], rocIds[roc_it]);
198 DrawPhMaps(minVcal, badPixels);
199 DrawPhCurves(maxpixels, minpixels, po_opt, ps_opt);
209 string psString(
""), poString(
"");
210 for (
unsigned int i = 0; i < rocIds.size(); ++i) {
211 psString += Form(
" %3d",
fApi->
_dut->
getDAC(rocIds[i],
"phscale"));
212 poString += Form(
" %3d",
fApi->
_dut->
getDAC(rocIds[i],
"phoffset"));
215 int seconds = t.RealTime();
216 LOG(logINFO) <<
"PixTestPhOptimization::doTest() done, duration: " << seconds <<
" seconds";
217 LOG(logINFO) <<
"PH scale (per ROC): " << psString;
218 LOG(logINFO) <<
"PH offset (per ROC): " << poString;
222 void PixTestPhOptimization::BlacklistPixels(std::vector<std::pair<uint8_t, pair<int, int> > > &badPixels,
int aliveTrig){
227 vector<uint8_t> vVcal =
getDacs(
"vcal");
228 vector<uint8_t> vCreg =
getDacs(
"ctrlreg");
232 std::pair<uint8_t, pair<int, int> > badPix;
234 for(uint8_t rocid = 0; rocid<rocIds.size(); rocid++){
235 for(
int r=0; r<80; r++){
236 for(
int c=0; c<52; c++){
237 eff = testEff[rocid]->GetBinContent( testEff[rocid]->FindFixBin((
double)c + 0.5, (
double)r+0.5) );
239 LOG(logDEBUG)<<
"Pixel ["<<(int)rocIds[rocid]<<
", "<<(
int)c<<
", "<<(int)r<<
"] has eff "<<eff<<
"/"<<aliveTrig;
240 badPix.first = rocIds[rocid];
241 badPix.second.first = c;
242 badPix.second.second = r;
243 LOG(logDEBUG)<<
"bad Pixel found and blacklisted: ["<<(int)badPix.first<<
", "<<(
int)badPix.second.first<<
", "<<(int)badPix.second.second<<
"]";
244 (badPixels).push_back(badPix);
251 LOG(logDEBUG)<<
"Number of bad pixels found: "<<badPixels.size();
255 pxar::pixel* PixTestPhOptimization::RandomPixel(std::vector<std::pair<uint8_t, pair<int, int> > > &badPixels, uint8_t iroc){
260 srand(
int(time(NULL)));
261 int random_col=-1, random_row=-1;
263 random_col = rand() % 52;
264 random_row = rand() % 80;
265 LOG(logDEBUG)<<
"random pixel: ["<<iroc<<
", "<<random_col<<
", "<<random_row<<
"]";
267 for(std::vector<std::pair<uint8_t, pair<int, int> > >::iterator bad_it = badPixels.begin(); bad_it != badPixels.end(); bad_it++){
268 if(bad_it->first == iroc && bad_it->second.first == random_col && bad_it->second.second == random_row){
272 LOG(logDEBUG)<<
"is the random pixel good? "<<isPixGood;
276 randPixel->
setRow(random_row);
277 LOG(logDEBUG)<<
"In RandomPixel(), rocId "<<iroc<<
", randomCol "<<(int)randPixel->
column()<<
", randomRow "<<(int)randPixel->
row()<<
", pixel "<<randPixel;
281 void PixTestPhOptimization::GetMaxPhPixel(map<int, pxar::pixel > &maxpixels, std::vector<std::pair<uint8_t, pair<int,int> > > &badPixels){
289 int init_phScale =200;
291 pair<int, pxar::pixel> maxpixel;
292 maxpixel.second.setValue(0);
293 std::vector<pxar::pixel> result;
294 while((maxph>254 || maxph==0) && flag_maxPh<52){
307 LOG(logCRITICAL) <<
"pXar execption: "<< e.what();
310 done = (cnt>5) || done;
314 LOG(logDEBUG) <<
"result size "<<result.size()<<endl;
316 for(std::vector<pxar::pixel>::iterator px = result.begin(); px != result.end(); px++) {
318 for(std::vector<std::pair<uint8_t, pair<int, int> > >::iterator bad_it = badPixels.begin(); bad_it != badPixels.end(); bad_it++){
319 if(bad_it->second.first == px->column() && bad_it->second.second == px->row() && bad_it->first == px->roc()){
323 if(isPixGood && px->value() > maxph){
332 for(
unsigned int iroc=0; iroc< rocIds.size(); iroc++){
334 for(std::vector<pxar::pixel>::iterator px = result.begin(); px != result.end(); px++) {
336 if(px->value() > maxph && px->roc() == rocIds[iroc]){
337 for(std::vector<std::pair<uint8_t, pair<int, int> > >::iterator bad_it = badPixels.begin(); bad_it != badPixels.end(); bad_it++){
338 if(bad_it->second.first == px->column() && bad_it->second.second == px->row() && bad_it->first == px->roc()){
344 maxpixel = make_pair(iroc,*px);
349 maxpixels.insert(maxpixel);
350 LOG(logDEBUG) <<
"maxPh " << maxph <<
" for ROC "<<maxpixel.first<<
" on pixel "<<maxpixel.second << endl ;
354 void PixTestPhOptimization::GetMinPhPixel(map<int, pxar::pixel > &minpixels, map<int, int> &minVcal, std::vector<std::pair<uint8_t, pair<int,int> > > &badPixels){
362 int init_phScale = 100;
364 pair<int, pxar::pixel> minpixel;
365 minpixel.second.setValue(0);
366 std::vector<pxar::pixel> result;
367 while(minph<1 && flag_minPh<52){
377 while (!(done && size !=0)) {
380 size = result.size();
384 LOG(logCRITICAL) <<
"pXar execption: "<< e.what();
387 done = (cnt>5) || done;
390 LOG(logDEBUG) <<
"result size "<<result.size()<<endl;
392 for(std::vector<pxar::pixel>::iterator px = result.begin(); px != result.end(); px++) {
394 for(std::vector<std::pair<uint8_t, pair<int, int> > >::iterator bad_it = badPixels.begin(); bad_it != badPixels.end(); bad_it++){
395 if(bad_it->second.first == px->column() && bad_it->second.second == px->row() && bad_it->first == px->roc()){
400 if(isPixGood && px->value() < minph){
409 for(
unsigned int iroc=0; iroc< rocIds.size(); iroc++){
411 for(std::vector<pxar::pixel>::iterator px = result.begin(); px != result.end(); px++) {
413 if(px->value() < minph && px->roc() == rocIds[iroc]){
414 for(std::vector<std::pair<uint8_t, pair<int, int> > >::iterator bad_it = badPixels.begin(); bad_it != badPixels.end(); bad_it++){
415 if(bad_it->second.first == px->column() && bad_it->second.second == px->row() && bad_it->first == px->roc()){
421 minpixel = make_pair(iroc,*px);
426 minpixels.insert(minpixel);
427 LOG(logDEBUG) <<
"minPh " << minph <<
" for ROC "<<minpixel.first<<
" on pixel "<<minpixel.second << endl ;
434 vector<pair<uint8_t, vector<pixel> > > results;
435 pair<int, int> vcalmin;
437 h1 =
bookTH1D(
"h1",
"h1", 256, 0., 256.);
438 unsigned int NRocs = rocIds.size();
439 for(
unsigned int roc_it = 0; roc_it < NRocs; roc_it++){
440 for(
unsigned int roc_kt = 0; roc_kt < NRocs; roc_kt++){
448 fApi->
_dut->
testPixel(minpixels[rocIds[roc_it]].column(), minpixels[rocIds[roc_it]].row(),
true);
449 fApi->
_dut->
maskPixel(minpixels[rocIds[roc_it]].column(), minpixels[rocIds[roc_it]].row(),
false);
450 LOG(logDEBUG)<<
"enabling pixels "<<(int)minpixels[roc_it].column()<<
", "<<(int)minpixels[roc_it].row()<<
", "<<(int)minpixels[roc_it].roc()<<
" "<<(int)roc_it;
451 for(
unsigned int roc_jt = 0; roc_jt < NRocs; roc_jt++){
468 LOG(logCRITICAL) <<
"pXar execption: "<< e.what();
471 done = (cnt>5) || done;
474 LOG(logDEBUG)<<
"size of results "<<results.size();
475 for (
unsigned int i = 0; i < results.size(); ++i) {
477 pair<uint8_t, vector<pixel> > v = results[i];
480 vector<pixel> vpix = v.second;
482 for (
unsigned int ipix = 0; ipix < vpix.size(); ++ipix) {
484 h1->Fill(idac, vpix[ipix].value());
487 vcalthr =
static_cast<int>( h1->GetBinCenter( h1->FindFirstBinAbove(1.) ) );
488 vcalmin = make_pair(roc_it, vcalthr);
489 minVcal.insert(vcalmin);
492 for(
unsigned int roc_kt = 0; roc_kt < NRocs; roc_kt++){
495 for(
unsigned int roc_kt = 0; roc_kt < NRocs; roc_kt++){
500 map<uint8_t, int> PixTestPhOptimization::InsideRangePH(map<uint8_t,int> &po_opt, std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > > &dacdac_max, std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > > &dacdac_min){
502 map<uint8_t, int> ps_opt;
505 bool lowEd=
false, upEd=
false;
506 int upEd_dist=255, lowEd_dist=255;
507 int safetyMargin = 40;
509 map<uint8_t, int> bestDist;
510 LOG(logDEBUG) <<
"dacdac at max vcal has size "<<dacdac_max.size()<<endl;
511 LOG(logDEBUG) <<
"dacdac at min vcal has size "<<dacdac_min.size()<<endl;
513 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
514 bestDist[rocIds[roc_it]] = 255;
515 LOG(logDEBUG)<<
"Bestdist at roc_it "<<roc_it<<
" initialized with "<<bestDist[roc_it]<<
" "<<bestDist[rocIds[roc_it]];
516 ps_opt[rocIds[roc_it]] = 999;
518 std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > >::iterator dacit_max = dacdac_max.begin();
519 std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > >::iterator dacit_min = dacdac_min.begin();
529 LOG(logDEBUG)<<
"InsideRange() subtest";
530 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
531 for(dacit_max = dacdac_max.begin(); dacit_max != dacdac_max.end(); dacit_max++){
532 if(dacit_max->first == po_opt[rocIds[roc_it]]){
533 for(dacit_min = dacdac_min.begin(); dacit_min != dacdac_min.end(); dacit_min++)
534 if(dacit_min->first == po_opt[rocIds[roc_it]] && dacit_min->second.first == dacit_max->second.first){
535 pixsize_max = dacit_max->second.second.size();
536 pixsize_min = dacit_min->second.second.size();
537 for(
int pix=0; pix < pixsize_max; pix++){
538 if((dacit_max->second.second[pix].roc()!=rocIds[roc_it] || dacit_min->second.second[pix].roc()!=rocIds[roc_it]) && dacit_max->second.second[pix].roc() != dacit_min->second.second[pix].roc()){
543 maxPh=dacit_max->second.second[pix].value();
544 minPh=dacit_min->second.second[pix].value();
545 if(dacit_max->second.second[pix].roc() != dacit_min->second.second[pix].roc()){
546 LOG(logDEBUG) <<
"InsideRangePH: ROC ids do not correspond";
548 lowEd = (minPh > safetyMargin);
549 upEd = (maxPh < 255 - safetyMargin);
550 lowEd_dist = abs(minPh - safetyMargin);
551 upEd_dist = abs(maxPh - (255 - safetyMargin));
552 dist = (upEd_dist > lowEd_dist ) ? (upEd_dist) : (lowEd_dist);
553 if(dist < bestDist[dacit_max->second.second[pix].roc()] && upEd && lowEd){
554 LOG(logDEBUG)<<
"New distance "<<dist<<
" is smaller than previous bestDist "<<bestDist[dacit_max->second.second[pix].roc()]<<
" and edges are ok, so... ";
555 ps_opt[dacit_max->second.second[pix].roc()] = dacit_max->second.first;
556 bestDist[dacit_max->second.second[pix].roc()]=dist;
557 LOG(logDEBUG)<<
"... new bestDist is "<<bestDist[dacit_max->second.second[pix].roc()]<<
" for ps_opt = "<<ps_opt[dacit_max->second.second[pix].roc()];
565 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
566 LOG(logDEBUG)<<
"opt step 1: po fixed to"<<po_opt[rocIds[roc_it]]<<
" and scale adjusted to "<<ps_opt[rocIds[roc_it]]<<
" for ROC "<<(int)rocIds[roc_it]<<
", with distance "<<bestDist[rocIds[roc_it]];
571 map<uint8_t, int> PixTestPhOptimization::CentrePhRange(map<uint8_t, int> &po_opt, map<uint8_t, int> &ps_opt, std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > > &dacdac_max, std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > > &dacdac_min){
573 LOG(logDEBUG)<<
"Welcome to CentrePhRange()";
577 map<uint8_t, int> bestDist;
579 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
580 bestDist[rocIds[roc_it]] = 255;
582 std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > >::iterator dacit_max = dacdac_max.begin();
583 std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > >::iterator dacit_min = dacdac_min.begin();
586 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
588 for(dacit_max = dacdac_max.begin(); dacit_max != dacdac_max.end(); dacit_max++){
589 if(dacit_max->second.first != ps_opt[rocIds[roc_it]])
continue;
590 for(dacit_min = dacdac_min.begin(); dacit_min != dacdac_min.end(); dacit_min++){
591 if(dacit_min->second.first == ps_opt[rocIds[roc_it]] && dacit_min->first == dacit_max->first){
592 pixsize_max = dacit_max->second.second.size();
593 pixsize_min = dacit_min->second.second.size();
594 for(
int pix=0; pix < pixsize_max; pix++){
595 if(dacit_max->second.second[pix].roc()!=rocIds[roc_it] || dacit_min->second.second[pix].roc()!=rocIds[roc_it])
continue;
596 maxPh=dacit_max->second.second[pix].value();
597 minPh=dacit_min->second.second[pix].value();
598 if(dacit_max->second.second[pix].roc() != dacit_min->second.second[pix].roc()){
599 LOG(logDEBUG) <<
"CentrePhRange: ROC ids do not correspond";
601 dist = abs(minPh - (255 - maxPh));
602 if (dist < bestDist[dacit_max->second.second[pix].roc()]){
603 po_opt[dacit_max->second.second[pix].roc()] = dacit_max->first;
604 bestDist[dacit_max->second.second[pix].roc()] = dist;
611 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
612 LOG(logDEBUG)<<
"opt centring step: po "<<po_opt[rocIds[roc_it]]<<
" and scale "<<ps_opt[rocIds[roc_it]]<<
", with distance "<<bestDist[rocIds[roc_it]]<<
" on ROC "<<(int)rocIds[roc_it];
617 map<uint8_t, int> PixTestPhOptimization::StretchPH(map<uint8_t, int> &po_opt, map<uint8_t, int> &ps_opt, std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > > &dacdac_max, std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > > &dacdac_min){
621 bool lowEd=
false, upEd=
false;
622 int upEd_dist=255, lowEd_dist=255;
623 int safetyMarginUp = fSafetyMarginUp;
624 int safetyMarginLow = fSafetyMarginLow;
625 LOG(logDEBUG)<<
"safety margin for stretching set to "<<fSafetyMarginLow<<
" (lower edge) and "<<fSafetyMarginUp<<
"(upper edge)";
627 map<uint8_t, int> bestDist;
629 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
630 bestDist[rocIds[roc_it]] = 255;
632 std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > >::iterator dacit_max = dacdac_max.begin();
633 std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > >::iterator dacit_min = dacdac_min.begin();
634 while(dacit_max != dacdac_max.end() || dacit_min != dacdac_min.end()){
635 for(
unsigned int pix=0; pix < dacit_min->second.second.size() && pix < dacit_max->second.second.size(); pix++){
636 if(dacit_max->first == po_opt[dacit_max->second.second[pix].roc()] && dacit_min->first == po_opt[dacit_min->second.second[pix].roc()]){
637 maxPh=dacit_max->second.second[pix].value();
638 minPh=dacit_min->second.second[pix].value();
639 if(dacit_max->second.second[pix].roc() != dacit_min->second.second[pix].roc()){
640 LOG(logDEBUG) <<
"CentrePhRange: ROC ids do not correspond";
642 lowEd = (minPh > safetyMarginLow);
643 upEd = (maxPh < 255 - safetyMarginUp);
644 upEd_dist = abs(maxPh - (255 - safetyMarginUp));
645 lowEd_dist = abs(minPh - safetyMarginLow);
646 dist = (upEd_dist < lowEd_dist ) ? (upEd_dist) : (lowEd_dist);
647 if(dist < bestDist[dacit_max->second.second[pix].roc()] && lowEd && upEd){
648 ps_opt[dacit_max->second.second[pix].roc()] = dacit_max->second.first;
649 bestDist[dacit_max->second.second[pix].roc()]=dist;
656 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
657 LOG(logDEBUG)<<
"opt final step: po fixed to"<<po_opt[rocIds[roc_it]]<<
" and scale adjusted to "<<ps_opt[rocIds[roc_it]]<<
", with distance "<<bestDist[rocIds[roc_it]]<<
" on ROC "<<(int)rocIds[roc_it];
662 void PixTestPhOptimization::DrawPhMaps(std::map<int, int> &minVcal, std::vector<std::pair<uint8_t, std::pair<int, int> > > &badPixels){
669 std::vector<pxar::pixel> result_map;
670 map<int, TH2D* > h2_PhMaps;
671 map<int, TH1D* > h1_PhMaps;
679 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
680 name = Form(
"PH_mapHiVcal_C%d", rocIds[roc_it]);
681 title = Form(
"PH_mapHiVcal_C%d", rocIds[roc_it]);
682 h2_PhMap =
bookTH2D(name, name, 52, 0., 52., 80, 0., 80.);
683 h2_PhMaps.insert(make_pair(rocIds[roc_it], h2_PhMap));
684 fHistList.push_back(h2_PhMaps[rocIds[roc_it]]);
685 fHistOptions.insert( make_pair(h2_PhMaps[rocIds[roc_it]],
"colz") );
687 for (
unsigned int i = 0; i < result_map.size(); ++i) {
688 h2_PhMaps[ (int) result_map[i].roc() ]->Fill( result_map[i].column(), result_map[i].row(), result_map[i].value());
691 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
692 h2_PhMaps[ (int) rocIds[roc_it] ]->GetZaxis()->SetRangeUser(h2_PhMaps[ (
int) rocIds[roc_it] ]->GetMinimum(), 255. );
693 h1_PhMap =
distribution( h2_PhMaps[ (
int) rocIds[roc_it] ], 255, 0., 255.);
694 h1_PhMaps.insert( make_pair(rocIds[roc_it], h1_PhMap) );
695 fHistList.push_back(h1_PhMaps[rocIds[roc_it]]);
699 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
701 fApi->
setDAC(
"vcal",minVcal[roc_it]+10, rocIds[roc_it] );
703 map<int, TH2D* > h2_PhMapsMin;
704 map<int, TH1D* > h1_PhMapsMin;
708 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
709 name = Form(
"PH_mapLowVcal_C%d", rocIds[roc_it]);
710 title = Form(
"PH_mapLowVcal_C%d", rocIds[roc_it]);
711 h2_PhMap =
bookTH2D(name, name, 52, 0., 52., 80, 0., 80.);
712 h2_PhMapsMin.insert(make_pair(rocIds[roc_it], h2_PhMap));
713 fHistList.push_back(h2_PhMapsMin[rocIds[roc_it]]);
714 fHistOptions.insert( make_pair(h2_PhMapsMin[rocIds[roc_it]],
"colz") );
716 for (
unsigned int i = 0; i < result_map.size(); ++i) {
717 h2_PhMapsMin[ (int) result_map[i].roc() ]->Fill( result_map[i].column(), result_map[i].row(), result_map[i].value());
720 for(std::vector<std::pair<uint8_t, pair<int, int> > >::iterator bad_it = badPixels.begin(); bad_it != badPixels.end(); bad_it++){
721 h2_PhMaps[ bad_it->first] ->SetBinContent( h2_PhMaps[ bad_it->first] ->FindFixBin(bad_it->second.first, bad_it->second.second), 0);
722 h2_PhMapsMin[ bad_it->first] ->SetBinContent( h2_PhMapsMin[ bad_it->first] ->FindFixBin(bad_it->second.first, bad_it->second.second), 0);
725 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
726 name = Form(
"PH_distr_LowVcal_C%d", rocIds[roc_it]);
727 title = Form(
"PH_distr_LowVcal_C%d", rocIds[roc_it]);
728 h2_PhMapsMin[ (int) rocIds[roc_it] ]->GetZaxis()->SetRangeUser(0., h2_PhMapsMin[ (
int) rocIds[roc_it] ]->GetMaximum() );
729 h1_PhMap =
distribution( h2_PhMapsMin[ (
int) rocIds[roc_it] ], 255, 0., 255.);
730 h1_PhMapsMin.insert( make_pair(rocIds[roc_it], h1_PhMap) );
731 fHistList.push_back(h1_PhMapsMin[rocIds[roc_it]]);
735 void PixTestPhOptimization::DrawPhCurves(map<int, pxar::pixel > &maxpixels, map<int, pxar::pixel > &minpixels, std::map<uint8_t, int> &po_opt, std::map<uint8_t, int> &ps_opt){
739 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
742 vector<pair<uint8_t, vector<pixel> > > results;
743 for(
unsigned int roc_it = 0; roc_it < rocIds.size(); roc_it++){
746 name = Form(
"PH_c%d_r%d_C%d", maxpixels[roc_it].column(), maxpixels[roc_it].row(), rocIds[roc_it]);
747 title = Form(
"PH_c%d_r%d_C%d, phscale = %d, phoffset = %d, maxpixel", maxpixels[roc_it].column(), maxpixels[roc_it].row(), rocIds[roc_it], ps_opt[rocIds[roc_it]], po_opt[rocIds[roc_it]]);
748 h1 =
bookTH1D(name, name, 256, 0., 256.);
751 fApi->
_dut->
testPixel(maxpixels[roc_it].column(), maxpixels[roc_it].row(),
true, roc_it);
752 fApi->
_dut->
maskPixel(maxpixels[roc_it].column(), maxpixels[roc_it].row(),
false, roc_it);
760 LOG(logCRITICAL) <<
"pXar execption: "<< e.what();
763 done = (cnt>5) || done;
766 for (
unsigned int i = 0; i < results.size(); ++i) {
767 pair<uint8_t, vector<pixel> > v = results[i];
769 vector<pixel> vpix = v.second;
770 for (
unsigned int ipix = 0; ipix < vpix.size(); ++ipix) {
771 h1->Fill(idac, vpix[ipix].value());
775 setTitles(h1, title.c_str(),
"average PH");
780 name = Form(
"PH_c%d_r%d_C%d", minpixels[roc_it].column(), minpixels[roc_it].row(), rocIds[roc_it]);
781 title = Form(
"PH_c%d_r%d_C%d, phscale = %d, phoffset = %d, minpixel", minpixels[roc_it].column(), minpixels[roc_it].row(), rocIds[roc_it], ps_opt[rocIds[roc_it]], po_opt[rocIds[roc_it]]);
782 h1 =
bookTH1D(name, name, 256, 0., 256.);
785 fApi->
_dut->
testPixel(minpixels[roc_it].column(), minpixels[roc_it].row(),
true, roc_it);
786 fApi->
_dut->
maskPixel(minpixels[roc_it].column(), minpixels[roc_it].row(),
false, roc_it);
794 LOG(logCRITICAL) <<
"pXar execption: "<< e.what();
797 done = (cnt>5) || done;
800 for (
unsigned int i = 0; i < results.size(); ++i) {
801 pair<uint8_t, vector<pixel> > v = results[i];
803 vector<pixel> vpix = v.second;
804 for (
unsigned int ipix = 0; ipix < vpix.size(); ++ipix) {
805 h1->Fill(idac, vpix[ipix].value());
809 setTitles(h1, title.c_str(),
"average PH");
814 void PixTestPhOptimization::MaxPhVsDacDac(std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > > &dacdac_max, map<int, pxar::pixel> maxpixels){
818 for(std::map<int, pxar::pixel>::iterator maxp_it = maxpixels.begin(); maxp_it != maxpixels.end(); maxp_it++){
833 LOG(logCRITICAL) <<
"pXar execption: "<< e.what();
836 done = (cnt>5) || done;
840 for( std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > >::iterator dacit_max = dacdac_max.begin(); dacit_max < dacdac_max.end(); dacit_max+=10){
841 LOG(logDEBUG)<<
"size "<<(int)(dacdac_max.end() - dacdac_max.begin())<<
"pos "<<(
int)(dacdac_max.end() - dacit_max)<<
" sizepix "<<(
int)dacit_max->second.second.size();
855 void PixTestPhOptimization::MinPhVsDacDac(std::vector< std::pair<uint8_t, std::pair<uint8_t, std::vector<pxar::pixel> > > > &dacdac_min, map<int, pxar::pixel> minpixels, std::map<int, int> &minVcal){
860 for(std::map<int, pxar::pixel>::iterator minp_it = minpixels.begin(); minp_it != minpixels.end(); minp_it++){
866 for(std::map<int, int>::iterator ivcal = minVcal.begin(); ivcal != minVcal.end(); ivcal++){
878 LOG(logCRITICAL) <<
"pXar execption: "<< e.what();
881 done = (cnt>5) || done;
900 void PixTestPhOptimization::SetMinThr(){
902 string trimfile =
fPixSetup->getConfigParameters()->getTrimParameterFileName() +
fPixSetup->getConfigParameters()->getTrimVcalSufix();
903 trimfile.erase(0,14);
904 if(0!=(trimfile.compare(
""))){
905 fMinThr = atoi(trimfile.c_str());
908 LOG(logINFO)<<
"***::: The test requires a TRIMMED module, but no TrimParameterFile is loaded :::***";
909 LOG(logINFO)<<
"Vcal lower sample point will be set to 40";
std::vector< TH2D * > efficiencyMaps(std::string name, uint16_t ntrig=10, uint16_t FLAGS=FLAG_FORCE_MASKED)
returns TH2D's with hit maps
std::vector< pixel > getPulseheightMap(uint16_t flags, uint16_t nTriggers)
std::map< TH1 *, std::string > fHistOptions
options can be stored with each histogram
void setDacs(std::string dacName, std::vector< uint8_t > dacVector)
set on all ROCs the DAC dacName
std::vector< std::pair< uint8_t, std::vector< pixel > > > getPulseheightVsDAC(std::string dacName, uint8_t dacMin, uint8_t dacMax, uint16_t flags, uint16_t nTriggers)
bool setDAC(std::string dacName, uint8_t dacValue, uint8_t rocI2C)
PixSetup * fPixSetup
all necessary stuff in one place
void doTest()
function connected to "DoTest" button of PixTab
std::vector< std::pair< int, int > > fPIX
range of enabled pixels for time-consuming tests
void testPixel(uint8_t column, uint8_t row, bool enable)
std::vector< std::pair< std::string, std::string > > fParameters
the parameters of this test
int getIdxFromId(int id)
provide the mapping between ROC index and ID
void maskAllPixels(bool mask, uint8_t rocid)
void clearSelectedPixels()
clear selected pixel list
TDirectory * fDirectory
where the root histograms will end up
void setROCEnable(size_t rocId, bool enable)
void restoreDacs(bool verbose=false)
restore all DACs
void addSelectedPixels(std::string sval)
add a selected pixel to the internal parameter list
TH1D * distribution(TH2D *, int nbins, double xmin, double xmax)
creates a 1D distribution of a map
bool setTestParameter(std::string parname, std::string value)
change the local parameter
std::vector< std::pair< uint8_t, std::pair< uint8_t, std::vector< pixel > > > > getPulseheightVsDACDAC(std::string dac1name, uint8_t dac1min, uint8_t dac1max, std::string dac2name, uint8_t dac2min, uint8_t dac2max, uint16_t flags, uint16_t nTriggers)
std::vector< uint8_t > getEnabledRocIDs()
void testAllPixels(bool enable)
std::list< TH1 * >::iterator fDisplayedHist
pointer to the histogram currently displayed
void setColumn(uint8_t column)
TH1D * bookTH1D(std::string sname, std::string title, int nbins, double xmin, double xmax)
book a TH1D, adding version information to the name and title
virtual std::string getHistOption(TH1 *)
get the hist display options (if stored in fHistOptions)
void cacheDacs(bool verbose=false)
cache all DACs
std::list< TH1 * > fHistList
list of histograms available in PixTab::next and PixTab::previous
void setTitles(TH1 *h, const char *sx, const char *sy, float size=0.05, float xoff=1.1, float yoff=1.1, float lsize=0.05, int font=42)
utility to set histogram titles
virtual bool setParameter(std::string parName, std::string sval)
set the string value of a parameter
std::vector< uint8_t > getDacs(std::string dacName)
return from all ROCs the DAC dacName
void saveDacs()
save DACs to file
TH2D * bookTH2D(std::string sname, std::string title, int nbinsx, double xmin, double xmax, int nbinsy, double ymin, double max)
book a TH2D, adding version information to the name and title
void maskPixel(uint8_t column, uint8_t row, bool mask)
void update()
signal to PixTab to update the canvas
uint8_t getDAC(size_t rocId, std::string dacName)
pxar::pxarCore * fApi
pointer to the API
void init()
sets all test parameters