00001 #include "RawDisplayer.h"
00002 #include "DisplayManager.h"
00003 #include "DisplayInfo.h"
00004
00005 #include "SctData/ModuleConfiguration.h"
00006 #include "SctData/ResultHeader.h"
00007 #include "SctData/ConfigurationVariable.h"
00008 #include "SctData/RawScanResult.h"
00009 #include "SctData/OccupancyProjector.h"
00010 #include "SctData/ModuleElement.h"
00011 #include "SctData/DefaultVariable.h"
00012 #include "ScanResultWriter/dataTypes.h"
00013 #include "Sct/AbcdScans.h"
00014 #include <TH1.h>
00015 #include <TH2.h>
00016 #include <TCanvas.h>
00017 #include <TApplication.h>
00018 #include <TStyle.h>
00019 #include <TPaletteAxis.h>
00020
00021 #include <iostream>
00022 #include <vector>
00023 #include <boost/lexical_cast.hpp>
00024
00025 using namespace std;
00026 using namespace Sct;
00027 using namespace SctData;
00028 using namespace boost;
00029
00030 namespace SctDataDisplay {
00031
00032
00033 class RawDisplayData : public DisplayData {
00034 public:
00035 vector<shared_ptr<TCanvas> > canvas;
00036 shared_ptr<const RawScanResult> scan;
00037 vector<shared_ptr<TH1> > histos;
00038 vector<shared_ptr<TH2> > event_occ;
00039 };
00040
00041 bool RawDisplayer::inMap = DisplayManager::addToMap("SctData::RawScanResult", shared_ptr<Displayer>(new RawDisplayer()));
00042
00043 shared_ptr<DisplayData> RawDisplayer::display(shared_ptr<const Sct::Serializable> serial, const DisplayInfo& info, std::ostream& os) {
00044 shared_ptr<RawDisplayData> data (new RawDisplayData());
00045 data->scan = dynamic_pointer_cast<const RawScanResult>(serial);
00046
00047 const ConfigurationVariable& var = data->scan->getHeader().getVariable();
00048
00049 if (data->scan->getDataType() != SR_DT_RAWHIST &&
00050 var != *DefaultVariable::instance(ST_NMASK) &&
00051 var != *DefaultVariable::instance(ST_TOKEN) &&
00052 info.displayChannels.size() + info.displayChips.size() != 0) {
00053 displayProjs(info, *data);
00054 }
00055
00056 string name = "Raw." + (string)data->scan->getUniqueID();
00057 shared_ptr<TCanvas> c = createCanvas(name, name);
00058 data->canvas.push_back(c);
00059 TPad* p1=new TPad("Data","Data",0.,0.,0.75,1.0);
00060 TPad* p2=new TPad("Data","Data",0.75,0.4,1.0,0.95);
00061 p1->Draw();
00062 p2->Draw();
00063
00064 p2->cd();
00065 p2->SetLeftMargin(0.2);
00066 p2->SetRightMargin(0.3);
00067
00068 const SctData::ScanPoints& pts = data->scan->getPoints();
00069 double* bins = pts.getEdgesAscending();
00070 int npoints= pts.getNPoints();
00071 shared_ptr<TH2> trigs (new TH2F("Triggers","Triggers",2,0,2,npoints,bins));
00072 for (int i=0; i<npoints; ++i){
00073 int ipt=pts.ascending() ? i : npoints-i-1;
00074 trigs->Fill(1.5, pts[ipt],data->scan->getPoints().getNEvents(ipt));
00075 trigs->Fill(0.5, pts[ipt],data->scan->getPoints().getNErrorEvents(ipt));
00076 }
00077 delete[] bins;
00078 trigs->GetYaxis()->SetTitleOffset(1.8);
00079 trigs->GetXaxis()->SetLabelSize(0.08);
00080 trigs->GetYaxis()->SetLabelSize(0.08);
00081 trigs->GetZaxis()->SetLabelSize(0.08);
00082 trigs->GetXaxis()->SetBinLabel(1,"Errors");
00083 trigs->GetXaxis()->SetBinLabel(2,"Events");
00084
00085 gPad->SetLogz();
00086 gPad->SetTheta(10);
00087 data->histos.push_back(trigs);
00088 displayHistogram(trigs,"lego");
00089
00090 const Int_t NRGBs = 5;
00091 Double_t Stops[NRGBs] = { 0.00, 0.10, 0.50, 0.90, 1.00 };
00092 Double_t Red[NRGBs] = { 1.0, 0.0, 0.0, 1.0, 0.0 };
00093 Double_t Green[NRGBs] = { 1.0, 0.0, 1.0, 0.0, 0.0 };
00094 Double_t Blue[NRGBs] = { 1.0, 1.0, 0.0, 0.0, 0.0 };
00095 gStyle->CreateGradientColorTable(NRGBs, Stops, Red, Green, Blue, 100);
00096
00097 p1->cd();
00098 gPad->Divide(1,2,0.01,0.01);
00099 for (int ilink=0; ilink<2; ++ilink){
00100 p1->cd(ilink+1);
00101 data->scan->getScanData(ilink).SetMinimum(0.);
00102 string x_title;
00103 switch(data->scan->getDataType()) {
00104 case SR_DT_RAWHIST: { x_title="Time Bin"; break;}
00105 case SR_DT_SLICE: case SR_DT_SLICE_COMPRESSED: { x_title="Channel"; break;}
00106 }
00107 shared_ptr<TH2> datah(dynamic_cast<TH2*>(data->scan->getScanData(ilink).Clone()));
00108
00109 for (unsigned iy=1; iy<=datah->GetNbinsY(); ++iy){
00110 int ipt=pts.ascending() ? iy-1 : npoints-iy;
00111 for (unsigned ix=1; ix<=datah->GetNbinsX(); ++ix){
00112 double val=datah->GetBinContent(ix,iy);
00113 double triggers = data->scan->getPoints().getNEvents(ipt);
00114 if (triggers!=0.) val/=triggers;
00115 datah->SetBinContent(ix,iy,val);
00116 }
00117 }
00118 datah->SetXTitle(x_title.c_str());
00119 std::string ytitle=var.getVariableName();
00120 if (ytitle=="Default Variable"){
00121 std::ostringstream ytitle_builder;
00122 ytitle_builder << "Variable " << ConfigurationVariableIOHelper::getTypeRep(var);
00123 ytitle=ytitle_builder.str();
00124 }
00125 datah->SetYTitle(ytitle.c_str());
00126 datah->SetStats(false);
00127 datah->GetXaxis()->CenterTitle();
00128 datah->GetYaxis()->CenterTitle();
00129 data->histos.push_back(datah);
00130 displayHistogram(datah,"colz");
00131 }
00132
00133 if (info.occupancyHistograms && data->scan->nOccupancyPerEvent()!=0){
00134 displayOccupancyPerEvent(info, *data);
00135 }else if(info.occupancyHistograms){
00136 std::cerr << "No OPE data available" << std::endl;
00137 }
00138
00139 return data;
00140 }
00141
00142 void RawDisplayer::displayOccupancyPerEvent(const DisplayInfo& info, RawDisplayData& data){
00143 ostringstream oss;
00144 oss << "Raw." << data.scan->getHeader().getUniqueID() << "_OPE";
00145 const char*const name = oss.str().c_str();
00146 shared_ptr<TCanvas> canvas_occ = createCanvas(name, name);
00147 data.canvas.push_back(canvas_occ);
00148 const unsigned n=data.scan->nOccupancyPerEvent();
00149 divideCanvas(n, *canvas_occ);
00150 for (unsigned i=0; i<n; ++i){
00151 canvas_occ->cd(i+1);
00152 gPad->SetLogz();
00153 gPad->SetLeftMargin(0.17);
00154 gPad->SetBottomMargin(0.15);
00155 gPad->SetTopMargin(0.03);
00156 gPad->SetRightMargin(0.03);
00157 TH2D& hist = const_cast<TH2D&> ( data.scan->getOccupancyPerEvent(i) );
00158 ostringstream title;
00159 title << "Chip " << i;
00160 hist.GetYaxis()->SetTitleOffset(1.2);
00161 hist.GetXaxis()->SetLabelSize(0.05);
00162 hist.GetYaxis()->SetLabelSize(0.05);
00163 hist.GetXaxis()->SetTitleSize(0.05);
00164 hist.GetYaxis()->SetTitleSize(0.05);
00165 hist.GetXaxis()->CenterTitle();
00166 hist.GetYaxis()->CenterTitle();
00167 hist.SetTitle(title.str().c_str());
00168 displayHistogram(hist,"colz");
00169 }
00170 }
00171
00172 void RawDisplayer::displayProjs(const DisplayInfo& info, RawDisplayData& data) {
00173 if (!info.projections) return;
00174 unsigned int nMax = min((unsigned int)25, info.displayChannels.size() + info.displayChips.size());
00175 unsigned int j=0;
00176 shared_ptr<TCanvas> c;
00177
00178
00179 OccupancyProjector occ(*data.scan);
00180
00181 for (unsigned int i=0; i<info.displayChips.size(); ++i, ++j) {
00182 if (j%nMax == 0) {
00183 std::string canvasname = "Raw." + (string)data.scan->getHeader().getUniqueID() + "_chipProj";
00184 c = createCanvas(canvasname, canvasname);
00185 data.canvas.push_back(c);
00186 divideCanvas(nMax, *c);
00187 j=0;
00188 }
00189 c->cd(j+1);
00190 string name = "chip" + lexical_cast<string>(info.displayChips[i]) + (string)data.scan->getUniqueID();
00191 shared_ptr<TH1> chip(occ.getOccupancy(name.c_str(), ModuleElement::Chip(info.displayChips[i])).release());
00192 gPad->SetLeftMargin(0.2);
00193 gPad->SetBottomMargin(0.15);
00194 gPad->SetTopMargin(0.07);
00195 gPad->SetRightMargin(0.03);
00196 chip->GetYaxis()->SetTitleOffset(1.35);
00197 chip->GetXaxis()->SetLabelSize(0.05);
00198 chip->GetYaxis()->SetLabelSize(0.05);
00199 chip->GetXaxis()->SetTitleSize(0.05);
00200 chip->GetYaxis()->SetTitleSize(0.05);
00201 chip->GetXaxis()->CenterTitle();
00202 chip->GetYaxis()->CenterTitle();
00203 chip->GetXaxis()->SetNdivisions(506);
00204 data.histos.push_back(chip);
00205 displayHistogram(chip);
00206 }
00207
00208
00209 for (unsigned int i=0; i<info.displayChannels.size(); ++i, ++j) {
00210 if (j%nMax == 0) {
00211 std::string canvasname = "Raw." + (string)data.scan->getHeader().getUniqueID() + "_chanProj";
00212 c = createCanvas(canvasname, canvasname);
00213 data.canvas.push_back(c);
00214 divideCanvas(nMax, *c);
00215 j=0;
00216 }
00217 c->cd(j+1);
00218
00219 string name = "channel" + lexical_cast<string>(info.displayChannels[i]) + (string)data.scan->getUniqueID();
00220 shared_ptr<TH1> channel(occ.getOccupancy(name.c_str(), ModuleElement::Channel(info.displayChannels[i])).release());
00221 data.histos.push_back(channel);
00222 displayHistogram(channel);
00223 }
00224 }
00225 }