00001 #include "TrimRangeDisplayer.h"
00002 #include "DisplayManager.h"
00003 #include "DisplayInfo.h"
00004
00005 #include "SctData/TrimRangeTestResult.h"
00006 #include "SctData/FitScanResult.h"
00007 #include "Sct/SctParameters.h"
00008
00009 #include <TGraph.h>
00010 #include <TCanvas.h>
00011 #include <TH2.h>
00012 #include <TF1.h>
00013 #include <TLatex.h>
00014 #include <TLine.h>
00015
00016 #include <iomanip>
00017 #include <algorithm>
00018
00019 using namespace Sct;
00020 using namespace SctData;
00021 using namespace std;
00022 using namespace boost;
00023
00024 namespace SctDataDisplay {
00025
00026 class TrimDisplayData : public DisplayData {
00027 public:
00028 vector<shared_ptr<TCanvas> > canvas;
00029 };
00030
00031 bool TrimRangeDisplayer::inMap = DisplayManager::addToMap("SctData::TrimRangeTestResult", shared_ptr<Displayer>(new TrimRangeDisplayer()));
00032
00033 shared_ptr<DisplayData> TrimRangeDisplayer::display(shared_ptr<const Sct::Serializable> serial, const DisplayInfo& info, std::ostream& os) {
00034 shared_ptr<TrimDisplayData> data (new TrimDisplayData());
00035 shared_ptr<const TrimRangeTestResult> result = dynamic_pointer_cast<const TrimRangeTestResult>(serial);
00036
00037 shared_ptr<TCanvas> c = createCanvas((string)result->getHeader().getUniqueID() + "_TrimData", result->getModuleName() + " Trim Range Fits");
00038 data->canvas.push_back(c);
00039 c->Divide(4, 3);
00040 for (unsigned int ichip = 0; ichip < nChipModule; ++ichip) {
00041 c->cd(ichip + 1);
00042 gPad->SetLeftMargin(0.17);
00043 gPad->SetBottomMargin(0.15);
00044 gPad->SetTopMargin(0.03);
00045 gPad->SetRightMargin(0.03);
00046
00047
00048 float histmax=100.;
00049 float histmin=1.0E7;
00050 for (unsigned ichannel=0; ichannel<nChannelChip; ++ichannel){
00051 Stat<TrimRangeTestResult::TrimData> trim = result->chipTrimData[ichip]->channelData.getAt(ichannel);
00052 for (unsigned ipt=0; ipt<trim.value.graph.size(); ++ipt){
00053 if (trim.value.graph[ipt].first > histmax ) {
00054 histmax=trim.value.graph[ipt].first;
00055 }
00056 if (trim.value.graph[ipt].first < histmin ) {
00057 histmin=trim.value.graph[ipt].first;
00058 }
00059 }
00060 }
00061
00062 char name[100]; sprintf(name,"Chip %d",ichip);
00063 TH2D* hist = new TH2D(name,name,10,histmin*0.9,histmax*1.1,10,0,16);
00064 hist->GetYaxis()->SetTitleOffset(1.2);
00065 hist->GetXaxis()->SetLabelSize(0.06);
00066 hist->GetYaxis()->SetLabelSize(0.06);
00067 hist->GetXaxis()->SetTitleSize(0.06);
00068 hist->GetYaxis()->SetTitleSize(0.06);
00069 hist->GetXaxis()->CenterTitle();
00070 hist->GetYaxis()->CenterTitle();
00071 hist->SetXTitle("VT50");
00072 hist->SetYTitle("Trim DAC");
00073 hist->Draw();
00074
00075 int range=result->chipTrim[ichip]->range;
00076 char txt[10];
00077 sprintf(txt,"R%d",range);
00078 TLatex* lab=new TLatex();
00079 lab->SetTextSize(0.1);
00080 lab->DrawLatex(0,0,txt);
00081
00082 for (unsigned ichannel=0; ichannel<nChannelChip; ++ichannel){
00083 if (result->chipTrimData[ichip]!=0){
00084 Stat<TrimRangeTestResult::TrimData> trim = result->chipTrimData[ichip]->channelData.getAt(ichannel);
00085 TGraph* g = new TGraph();
00086 g->SetMarkerColor(ichannel);
00087 g->SetMarkerStyle(20);
00088 g->SetMarkerSize(0.5);
00089 g->Set(trim.value.graph.size());
00090 for (unsigned ipt=0; ipt<trim.value.graph.size(); ++ipt){
00091 g->SetPoint(ipt,trim.value.graph[ipt].first, trim.value.graph[ipt].second);
00092 }
00093 g->SetLineColor(ichannel);
00094 g->SetLineWidth(1);
00095 if (g->GetN()!=0 ){
00096 g->Draw("LP");
00097 TH1* hist=g->GetHistogram();
00098 hist->GetYaxis()->SetTitleOffset(1.2);
00099 hist->GetXaxis()->SetLabelSize(0.06);
00100 hist->GetYaxis()->SetLabelSize(0.06);
00101 hist->GetXaxis()->SetTitleSize(0.06);
00102 hist->GetYaxis()->SetTitleSize(0.06);
00103 hist->GetXaxis()->CenterTitle();
00104 hist->GetYaxis()->CenterTitle();
00105 }
00106 }
00107 }
00108 }
00109
00110 shared_ptr<TCanvas> c2 = createCanvas((string)result->getHeader().getUniqueID() + "_Trims", result->getModuleName() + " Trims");
00111 data->canvas.push_back(c2);
00112 c2->Divide(1, 4);
00113 for (unsigned int ilink = 0; ilink < nLinkModule; ++ilink) {
00114 TGraph* g1 = new TGraph();
00115 TGraph* g2 = new TGraph();
00116 g1->SetMarkerColor(2);
00117 g1->SetMarkerStyle(20);
00118 g1->SetMarkerSize(0.7);
00119 g2->SetMarkerColor(4);
00120 g2->SetMarkerStyle(20);
00121 g2->SetMarkerSize(0.7);
00122
00123 float maxvt=0;
00124 float minvt=1.0E10;
00125
00126
00127 int npoints=0;
00128 for (unsigned ichip=ilink*nChipLink; ichip<(ilink+1)*nChipLink; ++ichip){
00129 if (result->chipTrim[ichip]==0){
00130 cerr << " no trim at chip "<< ichip << endl; continue;
00131 }
00132 npoints += result->chipTrim[ichip]->channelTrim.n();
00133 }
00134
00135 g1->Set(npoints);
00136 g2->Set(npoints);
00137
00138 int ipoint=0;
00139 for (unsigned ichannel=ilink*nChannelLink; ichannel<(ilink+1)*nChannelLink; ++ichannel){
00140
00141 if (result->chipTrim[ichannel/128]==0){
00142 continue;
00143 }
00144
00145 Stat<TrimRangeTestResult::Trim> trim = result->chipTrim[ichannel/128]
00146 ->channelTrim.getAt(ichannel%128);
00147
00148 if (trim.valid){
00149 g1->SetPoint(ipoint,ichannel%nChannelLink,trim.value.trim);
00150 g2->SetPoint(ipoint,ichannel%nChannelLink,trim.value.vthr);
00151 ++ipoint;
00152 if (trim.value.vthr > maxvt){
00153 maxvt=trim.value.vthr;
00154 }
00155 if (trim.value.vthr < minvt){
00156 minvt=trim.value.vthr;
00157 }
00158 }
00159 }
00160
00161 char name[100]; sprintf(name,"Link %d TrimDAC",ilink);
00162 TH2D* hist1 = new TH2D(name,name,768,-0.5,767.5,16,-0.5,15.5);
00163 sprintf(name,"Link %d VT50",ilink);
00164 TH2D* hist2 = new TH2D(name,name,768,-0.5,767.5,3,minvt*0.9,maxvt*1.1);
00165 c2->cd(ilink*2 + 1);
00166 configureTrimHist(*hist1);
00167 hist1->SetYTitle("Trim DAC");
00168 hist1->Draw();
00169 g1->Draw("P");
00170 for (unsigned ichip=ilink*nChipLink; ichip<(ilink+1)*nChipLink; ++ichip){
00171 TAxis* ax=hist1->GetYaxis();
00172 if (ichip%nChipLink!=0){
00173 TLine* l = new TLine();
00174 l->SetLineStyle(2);
00175 l->SetLineWidth(1);
00176 float xline=(ichip%nChipLink)*nChannelChip;
00177 std::cout << ichip << " xline=" << xline << std::endl;
00178 l->DrawLine(xline,ax->GetXmin(),xline,ax->GetXmax());
00179 }
00180 }
00181
00182 c2->cd(ilink*2 + 2);
00183 configureTrimHist(*hist2);
00184 hist2->SetYTitle("VT50 after trim");
00185 hist2->Draw("");
00186 g2->Draw("P");
00187
00188
00189 for (unsigned ichip=ilink*nChipLink; ichip<(ilink+1)*nChipLink; ++ichip){
00190 int range=result->chipTrim[ichip]->range;
00191 char txt[10];
00192 sprintf(txt,"Range %d",range);
00193 TLatex* lab=new TLatex();
00194 lab->SetTextSize(0.08);
00195 TAxis* ax=hist2->GetYaxis();
00196 float y=ax->GetXmin() + (ax->GetXmax() - ax->GetXmin())*0.02;
00197 lab->DrawLatex(nChannelChip*(ichip%nChipLink)+nChannelChip/2,y,txt);
00198 if (ichip%nChipLink!=0){
00199 TLine* l = new TLine();
00200 l->SetLineStyle(2);
00201 l->SetLineWidth(1);
00202 float xline=(ichip%nChipLink)*nChannelChip;
00203 l->DrawLine(xline,ax->GetXmin(),xline,ax->GetXmax());
00204 }
00205 }
00206
00207 }
00208
00209
00210 os << endl << "Defects: " << endl;
00211 printDefectList(result->getDefects(), os);
00212
00213 return data;
00214 }
00215
00216 void TrimRangeDisplayer::configureTrimHist(TH1& h){
00217 gPad->SetLeftMargin(0.05);
00218 gPad->SetBottomMargin(0.15);
00219 gPad->SetTopMargin(0.03);
00220 gPad->SetRightMargin(0.03);
00221 h.GetXaxis()->CenterTitle();
00222 h.GetYaxis()->CenterTitle();
00223 h.GetYaxis()->SetTitleOffset(0.3);
00224 h.GetXaxis()->SetLabelSize(0.08);
00225 h.GetYaxis()->SetLabelSize(0.08);
00226 h.GetXaxis()->SetTitleSize(0.08);
00227 h.GetYaxis()->SetTitleSize(0.08);
00228 h.SetXTitle("Channel");
00229 }
00230
00231 }