00001 #include "NoiseOccupancyDisplayer.h"
00002 #include "DisplayManager.h"
00003 #include "DisplayInfo.h"
00004 #include "OpeDisplayer.h"
00005 #include "SctData/OpeResult.h"
00006
00007 #include "SctData/NoiseOccupancyTestResult.h"
00008 #include "SctData/DefectList.h"
00009
00010 #include "TF1.h"
00011 #include "TGraph.h"
00012 #include "TCanvas.h"
00013 #include "TLatex.h"
00014
00015 #include <iomanip>
00016 #include <string>
00017 #include <boost/shared_ptr.hpp>
00018
00019 using namespace std;
00020 using namespace SctData;
00021 using namespace Sct;
00022 using namespace boost;
00023
00024 namespace SctDataDisplay {
00025
00026
00027 class NoiseOccupancyDisplayData : public DisplayData {
00028 public:
00029 vector<shared_ptr<TCanvas> > canvas;
00030 shared_ptr<const NoiseOccupancyTestResult> test;
00031 vector<shared_ptr<const DisplayData> > otherData;
00032 };
00033
00034 bool NoiseOccupancyDisplayer::inMap = DisplayManager::addToMap("SctData::NoiseOccupancyTestResult", shared_ptr<Displayer>(new NoiseOccupancyDisplayer()));
00035
00036
00037 shared_ptr<DisplayData> NoiseOccupancyDisplayer::display(shared_ptr<const Sct::Serializable> serial, const DisplayInfo& info, std::ostream& os) {
00038 shared_ptr<NoiseOccupancyDisplayData> data (new NoiseOccupancyDisplayData());
00039 data->test = dynamic_pointer_cast<const NoiseOccupancyTestResult>(serial);
00040
00041
00042
00043
00044
00045
00046 if (info.displayChips.size() > 0) displayChips(*data, info, os);
00047
00048 shared_ptr<const SctData::OpeResult> ope = data->test->getOpeResult();
00049
00050 if (ope.get() && info.occupancyHistograms) {
00051
00052 shared_ptr<DisplayData> dd = DisplayManager::instance().display(ope, info, os);
00053 data->otherData.push_back(dd);
00054 }
00055 return data;
00056 }
00057
00058 void NoiseOccupancyDisplayer::displayChips(NoiseOccupancyDisplayData& data, const DisplayInfo& info, std::ostream& os) {
00059 shared_ptr<TCanvas> c = createCanvas((string)data.test->getUniqueID() + "_chipNO", "Noise Occupancy plots for " + data.test->getModuleName());
00060 data.canvas.push_back(c);
00061 divideCanvas(info.displayChips.size(), *c);
00062
00063 for (unsigned int i=0; i<info.displayChips.size(); ++i) {
00064 const ChipNOResult& r = data.test->getChipResult(info.displayChips[i]);
00065 os << "Chip " << i << " noise: " << r.getNoise() << " Fit params: ";
00066 for (int j=0; j<r.fit->GetNpar(); ++j) os << r.fit->GetParameter(j) << " ";
00067 os << endl;
00068 c->cd(i+1);
00069 gPad->SetLeftMargin(0.15);
00070 gPad->SetBottomMargin(0.15);
00071 gPad->SetTopMargin(0.03);
00072 gPad->SetRightMargin(0.03);
00073
00074 if (r.graph.get()){
00075 if (r.graph->GetN()!=0){
00076 if (DisplayManager::rootMode()){
00077 shared_ptr<TDirectory> file=DisplayManager::getTDirectory();
00078 if (file) {
00079 file->cd();
00080 std::ostringstream obname;
00081 obname << data.test->getUniqueID() << "_chipNO_" << i;
00082 r.graph->Write(obname.str().c_str());
00083 }
00084 }else{
00085 r.graph->Draw("ap");
00086 }
00087 if (r.graph->GetHistogram()){
00088 r.graph->GetHistogram()->SetXTitle("Threshold^2 (fC^2)");
00089 r.graph->GetHistogram()->SetYTitle("Ln Occupancy");
00090 r.graph->GetHistogram()->GetXaxis()->SetLabelSize(0.06);
00091 r.graph->GetHistogram()->GetYaxis()->SetLabelSize(0.06);
00092 r.graph->GetHistogram()->GetXaxis()->SetTitleSize(0.06);
00093 r.graph->GetHistogram()->GetYaxis()->SetTitleSize(0.06);
00094 }
00095 try{
00096 std::ostringstream text;
00097 text << std::scientific << std::setprecision(1) << r.mean;
00098 TLatex* l=new TLatex();
00099 l->SetTextAlign(11);
00100 l->SetTextSize(0.07);
00101 l->DrawLatex(1.1,log(r.mean*1.5),text.str().c_str());
00102 }catch(Sct::Throwable& e){
00103 std::cerr << e.what();
00104 }
00105 }
00106 }
00107 if (r.fit.get()) {
00108 r.fit->SetLineWidth(1);
00109 r.fit->SetLineColor(2);
00110 r.fit->SetFillStyle(0);
00111 r.fit->Draw("lsame");
00112 }
00113 }
00114
00115 }
00116 }