FitDisplayer.cpp

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     //Now print out defects:
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 }

Generated on Mon Feb 6 14:01:20 2006 for SCT DAQ/DCS Software - C++ by  doxygen 1.4.6