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