Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Namespace Members | Data Fields | Related Pages

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 "CommonWithDsp/ABCD/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 Sct;
00026 using namespace SctData;
00027 using namespace boost;
00028 
00029 namespace SctDataDisplay {
00030     
00031 
00032 class RawDisplayData : public DisplayData {
00033 public:
00034     vector<shared_ptr<TCanvas> > canvas;
00035     shared_ptr<const RawScanResult> scan;
00036     vector<shared_ptr<TH1> > histos;
00037     vector<shared_ptr<TH2> > event_occ;
00038 };
00039 
00040 bool RawDisplayer::inMap = DisplayManager::addToMap("SctData::RawScanResult", shared_ptr<Displayer>(new RawDisplayer()));
00041     
00042 shared_ptr<DisplayData> RawDisplayer::display(shared_ptr<const Sct::Serializable> serial, const DisplayInfo& info, std::ostream& os) {
00043     
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." + 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.85,1.0);
00060     TPad* p2=new TPad("Data","Data",0.85,0.4,1.0,0.95);
00061     p1->Draw();
00062     p2->Draw();
00063     p1->cd();
00064     //gStyle->SetPalette(30);
00065     gPad->Divide(1,2,0.01,0.01);
00066     for (int ilink=0; ilink<2; ++ilink){
00067       p1->cd(ilink+1);
00068       data->scan->getScanData(ilink).SetMinimum(0.);
00069       string x_title;
00070       switch(data->scan->getDataType()) {
00071       case SR_DT_RAWHIST: { x_title="Time Bin"; break;}
00072       case SR_DT_SLICE: case SR_DT_SLICE_COMPRESSED: { x_title="Channel"; break;}
00073       }
00074       TH2& datah=data->scan->getScanData(ilink);
00075       datah.SetXTitle(x_title.c_str());
00076       datah.SetYTitle(var.getVariableName().c_str());
00077       datah.SetStats(false);
00078       datah.GetXaxis()->CenterTitle();
00079       datah.GetYaxis()->CenterTitle();
00080       datah.Draw("colz");
00081     }
00082     {
00083       p2->cd();
00084       p2->SetLeftMargin(0.2);
00085       p2->SetRightMargin(0.3);
00086       //p2->SetLogz();
00087       const SctData::ScanPoints& pts = data->scan->getPoints();
00088       double* bins = pts.getEdgesAscending();
00089       int npoints= pts.getNPoints();
00090       TH2F* trigs = new TH2F("Triggers","Triggers",2,0,2,npoints,bins);
00091       for (int i=0; i<npoints; ++i){
00092     int ipt=pts.ascending() ? i : npoints-i-1;
00093     trigs->Fill(0.5, pts[ipt],data->scan->getPoints().getNEvents(ipt));
00094     trigs->Fill(1.5, pts[ipt],data->scan->getPoints().getNErrorEvents(ipt));
00095       }
00096       delete[] bins;
00097       trigs->GetYaxis()->SetTitleOffset(0.8);
00098       trigs->GetXaxis()->SetLabelSize(0.12);
00099       trigs->GetYaxis()->SetLabelSize(0.08);
00100       trigs->GetXaxis()->CenterTitle();
00101       trigs->GetYaxis()->CenterTitle();
00102       trigs->GetXaxis()->SetBinLabel(1,"Events");
00103       trigs->GetXaxis()->SetBinLabel(2,"Errors");
00104       trigs->Draw("col");
00105     }
00106     
00107     if (info.occupancyHistograms && data->scan->nOccupancyPerEvent()!=0){
00108       displayOccupancyPerEvent(info, *data);
00109     }else if(info.occupancyHistograms){
00110       std::cerr << "No OPE data available" << std::endl;
00111     }
00112 
00113     return data;
00114 }
00115 
00116 void RawDisplayer::displayOccupancyPerEvent(const DisplayInfo& info, RawDisplayData& data){
00117   ostringstream oss;
00118   oss << "Raw." << data.scan->getHeader().getUniqueID() << "_OPE";
00119   const char*const name = oss.str().c_str();
00120   shared_ptr<TCanvas> canvas_occ = createCanvas(name, name);
00121   data.canvas.push_back(canvas_occ);
00122   const unsigned n=data.scan->nOccupancyPerEvent();
00123   divideCanvas(n, *canvas_occ);
00124   for (unsigned i=0; i<n; ++i){
00125     canvas_occ->cd(i+1);
00126     gPad->SetLogz();
00127     gPad->SetLeftMargin(0.17);
00128     gPad->SetBottomMargin(0.15);
00129     gPad->SetTopMargin(0.03);
00130     gPad->SetRightMargin(0.03);
00131     TH2D& hist = const_cast<TH2D&> ( data.scan->getOccupancyPerEvent(i) );
00132     ostringstream title;
00133     title << "Chip " << i;
00134     hist.GetYaxis()->SetTitleOffset(1.2);
00135     hist.GetXaxis()->SetLabelSize(0.05);
00136     hist.GetYaxis()->SetLabelSize(0.05);
00137     hist.GetXaxis()->SetTitleSize(0.05);
00138     hist.GetYaxis()->SetTitleSize(0.05);
00139     hist.GetXaxis()->CenterTitle();
00140     hist.GetYaxis()->CenterTitle();
00141     hist.SetTitle(title.str().c_str());
00142     hist.Draw("colz");
00143   }
00144 }
00145     
00146 void RawDisplayer::displayProjs(const DisplayInfo& info, RawDisplayData& data) {
00147   if (!info.projections) return;
00148     unsigned int nMax = min((unsigned int)25, info.displayChannels.size() + info.displayChips.size());
00149     unsigned int j=0;
00150     shared_ptr<TCanvas> c;
00151     
00152     //Now show some projections for channels and chips
00153     OccupancyProjector occ(*data.scan);
00154 
00155     for (unsigned int i=0; i<info.displayChips.size(); ++i, ++j) {
00156     if (j%nMax == 0) {
00157       std::string canvasname = "Raw." + data.scan->getHeader().getUniqueID() + "_chipProj";
00158             c = createCanvas(canvasname, canvasname);
00159         data.canvas.push_back(c);
00160         divideCanvas(nMax, *c);
00161             j=0;
00162         }
00163     c->cd(j+1);
00164     string name = "chip" + lexical_cast<string>(info.displayChips[i]) + data.scan->getUniqueID();
00165     auto_ptr<TH1> chip = occ.getOccupancy(name.c_str(), ModuleElement::Chip(info.displayChips[i]));
00166     gPad->SetLeftMargin(0.2);
00167     gPad->SetBottomMargin(0.15);
00168     gPad->SetTopMargin(0.07);
00169     gPad->SetRightMargin(0.03);
00170     chip->GetYaxis()->SetTitleOffset(1.35);
00171     chip->GetXaxis()->SetLabelSize(0.05);
00172     chip->GetYaxis()->SetLabelSize(0.05);
00173     chip->GetXaxis()->SetTitleSize(0.05);
00174     chip->GetYaxis()->SetTitleSize(0.05);
00175     chip->GetXaxis()->CenterTitle();
00176     chip->GetYaxis()->CenterTitle();
00177     chip->GetXaxis()->SetNdivisions(506);
00178     chip->Draw();
00179     data.histos.push_back(shared_ptr<TH1>(chip));
00180     }
00181     
00182     
00183     for (unsigned int i=0; i<info.displayChannels.size(); ++i, ++j) {
00184     if (j%nMax == 0) {
00185       std::string canvasname = "Raw." + data.scan->getHeader().getUniqueID() + "_chanProj";
00186             c = createCanvas(canvasname, canvasname);
00187         data.canvas.push_back(c);
00188         divideCanvas(nMax, *c);
00189             j=0;
00190         }
00191     c->cd(j+1);
00192     
00193     string name = "channel" + lexical_cast<string>(info.displayChannels[i]) + data.scan->getUniqueID();
00194     auto_ptr<TH1> channel = occ.getOccupancy(name.c_str(), ModuleElement::Channel(info.displayChannels[i]));
00195     channel->Draw();
00196     data.histos.push_back(shared_ptr<TH1>(channel));
00197     }
00198 }   
00199 }

Generated on Fri Jan 14 12:47:05 2005 for SCT DAQ/DCS Software - C++ by doxygen 1.3.5