RawDisplayer.cpp

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

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