TrimRangeDisplayer.cpp

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     // Find max for plot:
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     // find number of trimmed channels:
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     // Draw on chip boundries and range labels.
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     //Now print out defects:
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 }

Generated on Mon Feb 6 14:01:36 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6