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
00019 #include <iostream>
00020 #include <vector>
00021 #include <boost/lexical_cast.hpp>
00022
00023 using namespace Sct;
00024 using namespace SctData;
00025 using namespace boost;
00026
00027 namespace SctDataDisplay {
00028
00029
00030 class RawDisplayData : public DisplayData {
00031 public:
00032 vector<shared_ptr<TCanvas> > canvas;
00033 shared_ptr<const RawScanResult> scan;
00034 vector<shared_ptr<TH1> > histos;
00035 vector<shared_ptr<TH2> > event_occ;
00036 };
00037
00038 bool RawDisplayer::inMap = DisplayManager::addToMap("SctData::RawScanResult", shared_ptr<Displayer>(new RawDisplayer()));
00039
00040 shared_ptr<DisplayData> RawDisplayer::display(shared_ptr<const Sct::Serializable> serial, const DisplayInfo& info, std::ostream& os) {
00041
00042 shared_ptr<RawDisplayData> data (new RawDisplayData());
00043 data->scan = dynamic_pointer_cast<const RawScanResult>(serial);
00044
00045 const ConfigurationVariable& var = data->scan->getHeader().getVariable();
00046
00047 string name = var.getVariableName() + data->scan->getUniqueID();
00048 shared_ptr<TCanvas> c = createCanvas(name, name);
00049 data->canvas.push_back(c);
00050 c->Divide(1,2);
00051 for (int ilink=0; ilink<2; ++ilink){
00052 c->cd(ilink+1);
00053 data->scan->getScanData(ilink).SetMinimum(0.);
00054 string x_title;
00055 switch(data->scan->getDataType()) {
00056 case SR_DT_RAWHIST: { x_title="Raw Data"; break;}
00057 case SR_DT_SLICE: case SR_DT_SLICE_COMPRESSED: { x_title="Channel"; break;}
00058 }
00059 data->scan->getScanData(ilink).SetXTitle(x_title.c_str());
00060 data->scan->getScanData(ilink).SetYTitle(var.getVariableName().c_str());
00061 data->scan->getScanData(ilink).SetStats(false);
00062 data->scan->getScanData(ilink).Draw("colz");
00063 }
00064
00065 if (data->scan->getDataType() != SR_DT_RAWHIST &&
00066 var != *DefaultVariable::instance(ST_NMASK) &&
00067 var != *DefaultVariable::instance(ST_TOKEN) &&
00068 info.displayChannels.size() + info.displayChips.size() != 0) {
00069 displayProjs(info, *data);
00070 }
00071
00072 if (info.occupancyHistograms && data->scan->nOccupancyPerEvent()!=0){
00073 displayOccupancyPerEvent(info, *data);
00074 }else if(info.occupancyHistograms){
00075 std::cout << "No OPE data available" << std::endl;
00076 }else{
00077 std::cout << "No OPE data requested" << std::endl;
00078 }
00079
00080 return data;
00081 }
00082
00083 void RawDisplayer::displayOccupancyPerEvent(const DisplayInfo& info, RawDisplayData& data){
00084 ostringstream oss;
00085 oss << data.scan->getHeader().getModuleName() << " Occupancy per event";
00086 const char*const name = oss.str().c_str();
00087 shared_ptr<TCanvas> canvas_occ = createCanvas(name, name);
00088 data.canvas.push_back(canvas_occ);
00089 const unsigned n=data.scan->nOccupancyPerEvent();
00090 divideCanvas(n, *canvas_occ);
00091 for (unsigned i=0; i<n; ++i){
00092 canvas_occ->cd(i+1);
00093 gPad->SetLogz();
00094 TH2D& hist = const_cast<TH2D&> ( data.scan->getOccupancyPerEvent(i) );
00095 hist.Draw("colz");
00096 }
00097 }
00098
00099 void RawDisplayer::displayProjs(const DisplayInfo& info, RawDisplayData& data) {
00100 unsigned int nMax = min((unsigned int)25, info.displayChannels.size() + info.displayChips.size());
00101 unsigned int j=0;
00102 shared_ptr<TCanvas> c;
00103
00104
00105 OccupancyProjector occ(*data.scan);
00106
00107 for (unsigned int i=0; i<info.displayChips.size(); ++i, ++j) {
00108 if (j%nMax == 0) {
00109 c = createCanvas("Projections", "Projections for module " + data.scan->getHeader().getModuleName());
00110 data.canvas.push_back(c);
00111 divideCanvas(nMax, *c);
00112 j=0;
00113 }
00114 c->cd(j+1);
00115
00116 string name = "chip" + lexical_cast<string>(info.displayChips[i]) + data.scan->getUniqueID();
00117 auto_ptr<TH1> chip = occ.getOccupancy(name.c_str(), ModuleElement::Chip(info.displayChips[i]));
00118 chip->Draw();
00119 data.histos.push_back(shared_ptr<TH1>(chip));
00120 }
00121
00122
00123 for (unsigned int i=0; i<info.displayChannels.size(); ++i, ++j) {
00124 if (j%nMax == 0) {
00125 c = createCanvas("Projections", "Projections for module " + data.scan->getHeader().getModuleName());
00126 data.canvas.push_back(c);
00127 divideCanvas(nMax, *c);
00128 j=0;
00129 }
00130 c->cd(j+1);
00131
00132 string name = "channel" + lexical_cast<string>(info.displayChannels[i]) + data.scan->getUniqueID();
00133 auto_ptr<TH1> channel = occ.getOccupancy(name.c_str(), ModuleElement::Channel(info.displayChannels[i]));
00134 channel->Draw();
00135 data.histos.push_back(shared_ptr<TH1>(channel));
00136 }
00137 }
00138 }