00001 #include "FitDisplayer.h"
00002 #include "DisplayManager.h"
00003 #include "DisplayInfo.h"
00004
00005 #include "SctData/RawScanResult.h"
00006 #include "SctData/FitScanResult.h"
00007 #include "SctData/FitObject.h"
00008 #include "Sct/IS/IOManagerIS.h"
00009 #include "Sct/IS/IONameIS.h"
00010 #include "Sct/Archive/IONameArchiveFile.h"
00011 #include "Sct/Archive/IOManagerArchiveFile.h"
00012 #include "SctData/OccupancyProjector.h"
00013 #include "SctData/ModuleElement.h"
00014
00015 #include <vector>
00016 #include <sstream>
00017 #include <algorithm>
00018 #include <boost/shared_ptr.hpp>
00019
00020 #include <TH1.h>
00021 #include <TF1.h>
00022 #include <TCanvas.h>
00023
00024 using namespace std;
00025 using namespace SctData;
00026 using namespace Sct;
00027 using namespace Sct::IS;
00028 using namespace boost;
00029
00030 namespace SctDataDisplay {
00031
00032 class FitDisplayData : public DisplayData {
00033 public:
00034 shared_ptr<const RawScanResult> raw;
00035 vector<shared_ptr<TCanvas> > canvas;
00036 vector<shared_ptr<TH1> > hists;
00037 vector<shared_ptr<TF1> > funcs;
00038 };
00039
00040 bool FitDisplayer::inMap = DisplayManager::addToMap("SctData::FitScanResult", shared_ptr<Displayer>(new FitDisplayer()));
00041
00042 shared_ptr<DisplayData> FitDisplayer::display(shared_ptr<const Sct::Serializable> serial, const DisplayInfo& info, std::ostream& os) {
00043 shared_ptr<FitDisplayData> data (new FitDisplayData());
00044 const FitScanResult& fit = dynamic_cast<const FitScanResult&>(*serial);
00045 os << fit.getHeader().getScanNumber() << endl;
00046
00047 try {
00048 Sct::IS::IONameIS name_is(fit.getUniqueID(), "SctData::RawScanResult");
00049 shared_ptr<Serializable> ob = IOManagerIS::instance().read(name_is.getIOName());
00050 data->raw = dynamic_pointer_cast<const RawScanResult>(ob);
00051 } catch (Sct::IoException& e) {
00052 e.sendToMrs(MRS_DIAGNOSTIC);
00053 }
00054 if (data->raw==0) try {
00055 Sct::Archive::IONameArchiveFile name(fit.getHeader().getUniqueID(),"SctData::RawScanResult");
00056 shared_ptr<Serializable> ob = Sct::Archive::IOManagerArchiveFile::instance().read(name.getIOName());
00057 data->raw = dynamic_pointer_cast<const RawScanResult>(ob);
00058 } catch (Sct::IoException& e) {
00059 e.sendToMrs(MRS_DIAGNOSTIC);
00060 }
00061
00062 if (data->raw == 0)
00063 cerr << "Couldn't get RawScanResult associated with this FitScanResult" << endl;
00064
00065 if (info.displayChips.size() > 0)
00066 displayChips(fit, info, *data, os);
00067
00068 if (info.displayChannels.size() > 0)
00069 displayChannels(fit, info, *data, os);
00070
00071
00072 os << endl << "Defects: " << endl;
00073 printDefectList(fit.getDefects(), os);
00074
00075 return data;
00076 }
00077
00078 void FitDisplayer::displayChips(const FitScanResult& fit, const DisplayInfo& info, FitDisplayData& data, std::ostream& os) {
00079 std::string canvasname = "Fit."+ (string)fit.getHeader().getUniqueID() + "_chipfits";
00080 shared_ptr<TCanvas> c = createCanvas(canvasname, "Chip Fits for module " + fit.getHeader().getModuleName());
00081 data.canvas.push_back(c);
00082 divideCanvas(info.displayChips.size(), *c);
00083
00084 auto_ptr<OccupancyProjector> occ;
00085 if (data.raw) {
00086 occ.reset(new OccupancyProjector(*data.raw));
00087 occ->vetoSeriousDefects(fit.getDefects());
00088 }
00089
00090 for (unsigned int i=0; i<info.displayChips.size(); ++i) {
00091 c->cd(i+1);
00092 ostringstream histName;
00093 histName << "chip_" << info.displayChips[i];
00094
00095 auto_ptr<TH1> h;
00096 if (data.raw) {
00097 auto_ptr<TH1> htemp = occ->getOccupancy(histName.str().c_str(), ModuleElement::Chip(info.displayChips[i]));
00098 h = htemp;
00099 }
00100 FitObject& fo = fit.getChipFit(info.displayChips[i]);
00101
00102 displayFit(fo, h, data, os, histName.str());
00103 fo.print();
00104 }
00105
00106 }
00107
00108
00109 void FitDisplayer::displayChannels(const FitScanResult& fit, const DisplayInfo& info, FitDisplayData& data, std::ostream& os) {
00110 shared_ptr<TCanvas> c;
00111 unsigned int nMax = min((unsigned int)25, info.displayChannels.size());
00112
00113 auto_ptr<OccupancyProjector> occ;
00114 if (data.raw)
00115 occ.reset(new OccupancyProjector(*data.raw));
00116
00117 int j=0;
00118
00119 for (unsigned int i=0; i<info.displayChannels.size(); ++i) {
00120 if (j%nMax == 0) {
00121 std::string canvasname= "Fit." + (string)fit.getHeader().getUniqueID() + "_channelfits";
00122 c = createCanvas(canvasname,"Channel Fits for module " + fit.getHeader().getModuleName());
00123 data.canvas.push_back(c);
00124 divideCanvas(nMax, *c);
00125 j=0;
00126 }
00127 c->cd(j+1);
00128 ostringstream histName;
00129 histName << "channel_" << info.displayChannels[i];
00130
00131 auto_ptr<TH1> h;
00132 if (data.raw) {
00133 auto_ptr<TH1> htemp = occ->getOccupancy(histName.str().c_str(), ModuleElement::Channel(info.displayChannels[i]));
00134 h = htemp;
00135 }
00136 FitObject& fo = fit.getChannelFit(info.displayChannels[i]);
00137 fo.print();
00138 displayFit(fo, h, data, os, histName.str());
00139 ++j;
00140 }
00141 }
00142
00143 void FitDisplayer::displayFit(FitObject& fo, auto_ptr<TH1> h, FitDisplayData& data, std::ostream& os, const std::string& name) {
00144 gPad->SetLeftMargin(0.17);
00145 gPad->SetBottomMargin(0.15);
00146 gPad->SetTopMargin(0.03);
00147 gPad->SetRightMargin(0.03);
00148
00149 if (h.get()) {
00150 h->GetYaxis()->SetTitleOffset(1.2);
00151 h->GetXaxis()->SetLabelSize(0.05);
00152 h->GetYaxis()->SetLabelSize(0.05);
00153 h->GetXaxis()->SetTitleSize(0.06);
00154 h->GetYaxis()->SetTitleSize(0.06);
00155 h->GetYaxis()->SetNdivisions(505);
00156 h->GetXaxis()->CenterTitle();
00157 h->GetYaxis()->CenterTitle();
00158 h->Draw();
00159 }
00160 auto_ptr<TF1> f ( fo.makeRootTF1() );
00161 f->SetLineColor(2);
00162 f->SetLineWidth(1);
00163 f->SetFillStyle(0);
00164 f->SetName(name.c_str());
00165 f->SetTitle(name.c_str());
00166 if (h.get()) f->Draw("same");
00167 else f->Draw();
00168
00169 if (DisplayManager::rootMode()){
00170 shared_ptr<TDirectory> file=DisplayManager::getTDirectory();
00171 if (file) {
00172 file->cd();
00173 f->Write(name.c_str());
00174 }
00175 }
00176
00177 for (unsigned int i=0; i<fo.getNPar(); ++i) {
00178 os << fo.getParameter(i) << " " << f->GetParameter(i) << " ";
00179 }
00180 os << endl;
00181
00182 data.hists.push_back(shared_ptr<TH1>(h));
00183 data.funcs.push_back(shared_ptr<TF1>(f));
00184
00185 }
00186
00187 }