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 shared_ptr<TCanvas> c = createCanvas("chipFits", "Chip Fits for module " + fit.getHeader().getModuleName());
00079 data.canvas.push_back(c);
00080 divideCanvas(info.displayChips.size(), *c);
00081
00082 auto_ptr<OccupancyProjector> occ;
00083 if (data.raw) {
00084 occ.reset(new OccupancyProjector(*data.raw));
00085 occ->vetoSeriousDefects(fit.getDefects());
00086 }
00087
00088 for (unsigned int i=0; i<info.displayChips.size(); ++i) {
00089 c->cd(i+1);
00090 ostringstream histName;
00091 histName << "chipHist" << info.displayChips[i];
00092
00093 auto_ptr<TH1> h;
00094 if (data.raw) {
00095 auto_ptr<TH1> htemp = occ->getOccupancy(histName.str().c_str(), ModuleElement::Chip(info.displayChips[i]));
00096 h = htemp;
00097 }
00098 FitObject& fo = fit.getChipFit(info.displayChips[i]);
00099
00100 displayFit(fo, h, data, os);
00101 fo.print();
00102 }
00103
00104 }
00105
00106
00107 void FitDisplayer::displayChannels(const FitScanResult& fit, const DisplayInfo& info, FitDisplayData& data, std::ostream& os) {
00108 shared_ptr<TCanvas> c;
00109 unsigned int nMax = min((unsigned int)25, info.displayChannels.size());
00110
00111 auto_ptr<OccupancyProjector> occ;
00112 if (data.raw)
00113 occ.reset(new OccupancyProjector(*data.raw));
00114
00115 int j=0;
00116
00117 for (unsigned int i=0; i<info.displayChannels.size(); ++i) {
00118 if (j%nMax == 0) {
00119 c = createCanvas("channelFits", "Channel Fits for module " + fit.getHeader().getModuleName());
00120 data.canvas.push_back(c);
00121 divideCanvas(nMax, *c);
00122 j=0;
00123 }
00124 c->cd(j+1);
00125
00126 ostringstream histName;
00127 histName << "channelHist" << info.displayChannels[i];
00128
00129 auto_ptr<TH1> h;
00130 if (data.raw) {
00131 auto_ptr<TH1> htemp = occ->getOccupancy(histName.str().c_str(), ModuleElement::Channel(info.displayChannels[i]));
00132 h = htemp;
00133 }
00134 FitObject& fo = fit.getChannelFit(info.displayChannels[i]);
00135 fo.print();
00136 displayFit(fo, h, data, os);
00137 ++j;
00138 }
00139 }
00140
00141 void FitDisplayer::displayFit(FitObject& fo, auto_ptr<TH1> h, FitDisplayData& data, std::ostream& os) {
00142 if (h.get()) h->Draw();
00143
00144 auto_ptr<TF1> f ( fo.makeRootTF1() );
00145 f->SetLineColor(2);
00146 f->SetLineWidth(1);
00147 f->SetFillStyle(0);
00148 if (h.get()) f->Draw("same");
00149 else f->Draw();
00150
00151 for (unsigned int i=0; i<fo.getNPar(); ++i) {
00152 os << fo.getParameter(i) << " " << f->GetParameter(i) << " ";
00153 }
00154 os << endl;
00155
00156 data.hists.push_back(shared_ptr<TH1>(h));
00157 data.funcs.push_back(shared_ptr<TF1>(f));
00158
00159 }
00160
00161 }