CMS 3D CMS Logo

/data/doxygen/doxygen-1.7.3/gen/CMSSW_4_2_8/src/DQM/HcalMonitorClient/src/HcalDetDiagLaserClient.cc

Go to the documentation of this file.
00001 #include "DQM/HcalMonitorClient/interface/HcalDetDiagLaserClient.h"
00002 #include "DQM/HcalMonitorClient/interface/HcalClientUtils.h"
00003 #include "DQM/HcalMonitorClient/interface/HcalHistoUtils.h"
00004 
00005 #include "CondFormats/HcalObjects/interface/HcalChannelStatus.h"
00006 #include "CondFormats/HcalObjects/interface/HcalChannelQuality.h"
00007 #include "CondFormats/HcalObjects/interface/HcalCondObjectContainer.h"
00008 
00009 #include "CalibCalorimetry/HcalAlgos/interface/HcalLogicalMapGenerator.h"
00010 #include "CondFormats/HcalObjects/interface/HcalLogicalMap.h"
00011 
00012 #include <iostream>
00013 
00014 /*
00015  * \file HcalDetDiagLaserClient.cc
00016  * 
00017  * $Date: 2011/04/12 18:25:42 $
00018  * $Revision: 1.6 $
00019  * \author J. Temple
00020  * \brief Hcal DetDiagLaser Client class
00021  */
00022 typedef struct{
00023 int eta;
00024 int phi;
00025 }Raddam_ch;
00026 Raddam_ch RADDAM_CH[56]={{-30,15},{-32,15},{-34,15},{-36,15},{-38,15},{-40,15},{-41,15},
00027                          {-30,35},{-32,35},{-34,35},{-36,35},{-38,35},{-40,35},{-41,35},
00028                          {-30,51},{-32,51},{-34,51},{-36,51},{-38,51},{-40,51},{-41,51},
00029                          {-30,71},{-32,71},{-34,71},{-36,71},{-38,71},{-40,71},{-41,71},
00030                          {30, 01},{32, 01},{34, 01},{36, 01},{38, 01},{40, 71},{41, 71},
00031                          {30, 21},{32, 21},{34, 21},{36, 21},{38, 21},{40, 19},{41, 19},
00032                          {30, 37},{32, 37},{34, 37},{36, 37},{38, 37},{40, 35},{41, 35},
00033                          {30, 57},{32, 57},{34, 57},{36, 57},{38, 57},{40, 55},{41, 55}};
00034 using namespace std;
00035 using namespace edm;
00036 
00037 HcalDetDiagLaserClient::HcalDetDiagLaserClient(std::string myname)
00038 {
00039   name_=myname;   status=0;
00040 }
00041 
00042 HcalDetDiagLaserClient::HcalDetDiagLaserClient(std::string myname, const edm::ParameterSet& ps)
00043 {
00044   name_=myname;
00045   enableCleanup_         = ps.getUntrackedParameter<bool>("enableCleanup",false);
00046   debug_                 = ps.getUntrackedParameter<int>("debug",0);
00047   prefixME_              = ps.getUntrackedParameter<string>("subSystemFolder","Hcal/");
00048   if (prefixME_.substr(prefixME_.size()-1,prefixME_.size())!="/")
00049     prefixME_.append("/");
00050   subdir_                = ps.getUntrackedParameter<string>("DetDiagLaserFolder","DetDiagLaserMonitor_Hcal/"); // DetDiagLaserMonitor_Hcal/
00051   if (subdir_.size()>0 && subdir_.substr(subdir_.size()-1,subdir_.size())!="/")
00052     subdir_.append("/");
00053   subdir_=prefixME_+subdir_;
00054 
00055   validHtmlOutput_       = ps.getUntrackedParameter<bool>("DetDiagLaser_validHtmlOutput",true);
00056   cloneME_ = ps.getUntrackedParameter<bool>("cloneME", true);
00057   badChannelStatusMask_   = ps.getUntrackedParameter<int>("DetDiagLaser_BadChannelStatusMask",
00058                                                           ps.getUntrackedParameter<int>("BadChannelStatusMask",0));
00059   
00060   minerrorrate_ = ps.getUntrackedParameter<double>("DetDiagLaser_minerrorrate",
00061                                                    ps.getUntrackedParameter<double>("minerrorrate",0.05));
00062   minevents_    = ps.getUntrackedParameter<int>("DetDiagLaser_minevents",
00063                                                 ps.getUntrackedParameter<int>("minevents",1));
00064   Online_                = ps.getUntrackedParameter<bool>("online",false);
00065 
00066   ProblemCells=0;
00067   ProblemCellsByDepth=0;
00068 }
00069 
00070 void HcalDetDiagLaserClient::analyze()
00071 {
00072   if (debug_>2) std::cout <<"\tHcalDetDiagLaserClient::analyze()"<<std::endl;
00073   calculateProblems();
00074 }
00075 
00076 void HcalDetDiagLaserClient::calculateProblems()
00077 {
00078  if (debug_>2) std::cout <<"\t\tHcalDetDiagLaserClient::calculateProblems()"<<std::endl;
00079   if(!dqmStore_) return;
00080   double totalevents=0;
00081   int etabins=0, phibins=0, zside=0;
00082   double problemvalue=0;
00083 
00084   // Clear away old problems
00085   if (ProblemCells!=0)
00086     {
00087       ProblemCells->Reset();
00088       (ProblemCells->getTH2F())->SetMaximum(1.05);
00089       (ProblemCells->getTH2F())->SetMinimum(0.);
00090     }
00091   for  (unsigned int d=0;d<ProblemCellsByDepth->depth.size();++d)
00092     {
00093       if (ProblemCellsByDepth->depth[d]!=0) 
00094         {
00095           ProblemCellsByDepth->depth[d]->Reset();
00096           (ProblemCellsByDepth->depth[d]->getTH2F())->SetMaximum(1.05);
00097           (ProblemCellsByDepth->depth[d]->getTH2F())->SetMinimum(0.);
00098         }
00099     }
00100   enoughevents_=true;
00101   // Get histograms that are used in testing
00102   // currently none used,
00103 
00104   std::vector<std::string> name = HcalEtaPhiHistNames();
00105 
00106   // This is a sample of how to get a histogram from the task that can then be used for evaluation purposes
00107   TH2F* BadTiming[4];
00108   TH2F* BadEnergy[4];
00109   MonitorElement* me;
00110   for (int i=0;i<4;++i)
00111     {
00112       BadTiming[i]=0;
00113       BadEnergy[i]=0;
00114       string s=subdir_+name[i]+" Problem Bad Laser Timing";
00115       me=dqmStore_->get(s.c_str());
00116       if (me!=0) BadTiming[i]=HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, BadTiming[i], debug_);
00117       else if (debug_>0) std::cout <<"<HcalDetDiagLaserClient::calculateProblems> could not get histogram '"<<s<<"'"<<std::endl;
00118       s=subdir_+name[i]+" Problem Bad Laser Energy";
00119       me=dqmStore_->get(s.c_str());
00120       if (me!=0) BadEnergy[i]=HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, BadEnergy[i], debug_);
00121       else if (debug_>0) std::cout <<"<HcalDetDiagLaserClient::calculateProblems> could not get histogram '"<<s<<"'"<<std::endl;
00122     }      
00123 
00124   // Because we're clearing and re-forming the problem cell histogram here, we don't need to do any cute
00125   // setting of the underflow bin to 0, and we can plot results as a raw rate between 0-1.
00126   
00127   for (unsigned int d=0;d<ProblemCellsByDepth->depth.size();++d)
00128     {
00129       if (ProblemCellsByDepth->depth[d]==0) continue;
00130     
00131       //totalevents=DigiPresentByDepth[d]->GetBinContent(0);
00132       totalevents=0;
00133       // Check underflow bins for events processed
00134       if (BadTiming[d]!=0) totalevents += BadTiming[d]->GetBinContent(0);
00135       if (BadEnergy[d]!=0) totalevents += BadEnergy[d]->GetBinContent(0);
00136       //if (totalevents==0 || totalevents<minevents_) continue;
00137       
00138       totalevents=1; // temporary value pending removal of histogram normalization from tasks
00139 
00140       etabins=(ProblemCellsByDepth->depth[d]->getTH2F())->GetNbinsX();
00141       phibins=(ProblemCellsByDepth->depth[d]->getTH2F())->GetNbinsY();
00142       for (int eta=0;eta<etabins;++eta)
00143         {
00144           int ieta=CalcIeta(eta,d+1);
00145           if (ieta==-9999) continue;
00146           for (int phi=0;phi<phibins;++phi)
00147             {
00148               problemvalue=0;
00149               if (BadTiming[d]!=0) problemvalue += BadTiming[d]->GetBinContent(eta+1,phi+1)*1./totalevents;
00150               if (BadEnergy[d]!=0) problemvalue += BadEnergy[d]->GetBinContent(eta+1,phi+1)*1./totalevents;
00151               if (problemvalue==0) continue;
00152               // problem value is a rate; we can normalize it here
00153               problemvalue = min(1.,problemvalue);
00154               
00155               zside=0;
00156               if (isHF(eta,d+1)) // shift ieta by 1 for HF
00157                 ieta<0 ? zside = -1 : zside = 1;
00158 
00159               // For problem cells that exceed our allowed rate,
00160               // set the values to -1 if the cells are already marked in the status database
00161               if (problemvalue>minerrorrate_)
00162                 {
00163                   HcalSubdetector subdet=HcalEmpty;
00164                   if (isHB(eta,d+1))subdet=HcalBarrel; 
00165                   else if (isHE(eta,d+1)) subdet=HcalEndcap;
00166                   else if (isHF(eta,d+1)) subdet=HcalForward;
00167                   else if (isHO(eta,d+1)) subdet=HcalOuter;
00168                   HcalDetId hcalid(subdet, ieta, phi+1, (int)(d+1));
00169                   if (badstatusmap.find(hcalid)!=badstatusmap.end())
00170                     problemvalue=999;           
00171                 }
00172 
00173               ProblemCellsByDepth->depth[d]->setBinContent(eta+1,phi+1,problemvalue);
00174               if (ProblemCells!=0) ProblemCells->Fill(ieta+zside,phi+1,problemvalue);
00175             } // loop on phi
00176         } // loop on eta
00177     } // loop on depth
00178 
00179   if (ProblemCells==0)
00180     {
00181       if (debug_>0) std::cout <<"<HcalDetDiagLaserClient::calculateProblems> ProblemCells histogram does not exist!"<<endl;
00182       return;
00183     }
00184 
00185   // Normalization of ProblemCell plot, in the case where there are errors in multiple depths
00186   etabins=(ProblemCells->getTH2F())->GetNbinsX();
00187   phibins=(ProblemCells->getTH2F())->GetNbinsY();
00188   for (int eta=0;eta<etabins;++eta)
00189     {
00190       for (int phi=0;phi<phibins;++phi)
00191         {
00192           if (ProblemCells->getBinContent(eta+1,phi+1)>1. && ProblemCells->getBinContent(eta+1,phi+1)<999)
00193             ProblemCells->setBinContent(eta+1,phi+1,1.);
00194         }
00195     }
00196 
00197   FillUnphysicalHEHFBins(*ProblemCellsByDepth);
00198   FillUnphysicalHEHFBins(ProblemCells);
00199   return;
00200 }
00201 
00202 void HcalDetDiagLaserClient::beginJob()
00203 {
00204   dqmStore_ = Service<DQMStore>().operator->();
00205   if (debug_>0) 
00206     {
00207       std::cout <<"<HcalDetDiagLaserClient::beginJob()>  Displaying dqmStore directory structure:"<<std::endl;
00208       dqmStore_->showDirStructure();
00209     }
00210 }
00211 void HcalDetDiagLaserClient::endJob(){}
00212 
00213 void HcalDetDiagLaserClient::beginRun(void)
00214 {
00215   enoughevents_=false;
00216   if (!dqmStore_) 
00217     {
00218       if (debug_>0) std::cout <<"<HcalDetDiagLaserClient::beginRun> dqmStore does not exist!"<<std::endl;
00219       return;
00220     }
00221   dqmStore_->setCurrentFolder(subdir_);
00222   problemnames_.clear();
00223 
00224   // Put the appropriate name of your problem summary here
00225   ProblemCells=dqmStore_->book2D(" ProblemDetDiagLaser",
00226                                  " Problem DetDiagLaser Rate for all HCAL;ieta;iphi",
00227                                  85,-42.5,42.5,
00228                                  72,0.5,72.5);
00229   problemnames_.push_back(ProblemCells->getName());
00230   if (debug_>1)
00231     std::cout << "Tried to create ProblemCells Monitor Element in directory "<<subdir_<<"  \t  Failed?  "<<(ProblemCells==0)<<std::endl;
00232   dqmStore_->setCurrentFolder(subdir_+"problem_DetDiagLaser");
00233   ProblemCellsByDepth = new EtaPhiHists();
00234   ProblemCellsByDepth->setup(dqmStore_," Problem DetDiagLaser Rate");
00235   for (unsigned int i=0; i<ProblemCellsByDepth->depth.size();++i)
00236     problemnames_.push_back(ProblemCellsByDepth->depth[i]->getName());
00237   nevts_=0;
00238 }
00239 
00240 void HcalDetDiagLaserClient::endRun(void){analyze();}
00241 
00242 void HcalDetDiagLaserClient::setup(void){}
00243 void HcalDetDiagLaserClient::cleanup(void){}
00244 
00245 bool HcalDetDiagLaserClient::hasErrors_Temp(void)
00246 {
00247    if(status&2) return true;
00248     return false;
00249 
00250   if (!ProblemCells)
00251     {
00252       if (debug_>1) std::cout <<"<HcalDetDiagLaserClient::hasErrors_Temp>  ProblemCells histogram does not exist!"<<std::endl;
00253       return false;
00254     }
00255   int problemcount=0;
00256   int ieta=-9999;
00257 
00258   for (int depth=0;depth<4; ++depth)
00259     {
00260       int etabins  = (ProblemCells->getTH2F())->GetNbinsX();
00261       int phibins  = (ProblemCells->getTH2F())->GetNbinsY();
00262       for (int hist_eta=0;hist_eta<etabins;++hist_eta)
00263         {
00264           for (int hist_phi=0; hist_phi<phibins;++hist_phi)
00265             {
00266               ieta=CalcIeta(hist_eta,depth+1);
00267               if (ieta==-9999) continue;
00268               if (ProblemCellsByDepth->depth[depth]==0)
00269                   continue;
00270               if (ProblemCellsByDepth->depth[depth]->getBinContent(hist_eta,hist_phi)>minerrorrate_)
00271                 ++problemcount;
00272 
00273             } // for (int hist_phi=1;...)
00274         } // for (int hist_eta=1;...)
00275     } // for (int depth=0;...)
00276 
00277   if (problemcount>0) return true;
00278   return false;
00279 }
00280 
00281 bool HcalDetDiagLaserClient::hasWarnings_Temp(void){
00282     if(status&1) return true;
00283     return false;
00284 }
00285 bool HcalDetDiagLaserClient::hasOther_Temp(void){return false;}
00286 bool HcalDetDiagLaserClient::test_enabled(void){return true;}
00287 
00288 
00289 void HcalDetDiagLaserClient::updateChannelStatus(std::map<HcalDetId, unsigned int>& myqual)
00290 {
00291   // This gets called by HcalMonitorClient
00292   // trigger primitives don't yet contribute to channel status (though they could...)
00293   // see dead or hot cell code for an example
00294 
00295 } //void HcalDetDiagLaserClient::updateChannelStatus
00296 static void printTableHeader(ofstream& file,std::string  header){
00297      file << "</html><html xmlns=\"https://www.w3.org/1999/xhtml\">"<< endl;
00298      file << "<head>"<< endl;
00299      file << "<meta https-equiv=\"Content-Type\" content=\"text/html\"/>"<< endl;
00300      file << "<title>"<< header <<"</title>"<< endl;
00301      file << "<style type=\"text/css\">"<< endl;
00302      file << " body,td{ background-color: #FFFFCC; font-family: arial, arial ce, helvetica; font-size: 12px; }"<< endl;
00303      file << "   td.s0 { font-family: arial, arial ce, helvetica; }"<< endl;
00304      file << "   td.s1 { font-family: arial, arial ce, helvetica; font-weight: bold; background-color: #FFC169; text-align: center;}"<< endl;
00305      file << "   td.s2 { font-family: arial, arial ce, helvetica; background-color: #eeeeee; }"<< endl;
00306      file << "   td.s3 { font-family: arial, arial ce, helvetica; background-color: #d0d0d0; }"<< endl;
00307      file << "   td.s4 { font-family: arial, arial ce, helvetica; background-color: #FFC169; }"<< endl;
00308      file << "</style>"<< endl;
00309      file << "<body>"<< endl;
00310      file << "<table>"<< endl;
00311 }
00312 static void printTableLine(ofstream& file,int ind,HcalDetId& detid,HcalFrontEndId& lmap_entry,HcalElectronicsId &emap_entry,std::string comment=""){
00313    if(ind==0){
00314      file << "<tr>";
00315      file << "<td class=\"s4\" align=\"center\">#</td>"    << endl;
00316      file << "<td class=\"s1\" align=\"center\">ETA</td>"  << endl;
00317      file << "<td class=\"s1\" align=\"center\">PHI</td>"  << endl;
00318      file << "<td class=\"s1\" align=\"center\">DEPTH</td>"<< endl;
00319      file << "<td class=\"s1\" align=\"center\">RBX</td>"  << endl;
00320      file << "<td class=\"s1\" align=\"center\">RM</td>"   << endl;
00321      file << "<td class=\"s1\" align=\"center\">PIXEL</td>"   << endl;
00322      file << "<td class=\"s1\" align=\"center\">RM_FIBER</td>"   << endl;
00323      file << "<td class=\"s1\" align=\"center\">FIBER_CH</td>"   << endl;
00324      file << "<td class=\"s1\" align=\"center\">QIE</td>"   << endl;
00325      file << "<td class=\"s1\" align=\"center\">ADC</td>"   << endl;
00326      file << "<td class=\"s1\" align=\"center\">CRATE</td>"   << endl;
00327      file << "<td class=\"s1\" align=\"center\">DCC</td>"   << endl;
00328      file << "<td class=\"s1\" align=\"center\">SPIGOT</td>"   << endl;
00329      file << "<td class=\"s1\" align=\"center\">HTR_FIBER</td>"   << endl;
00330      file << "<td class=\"s1\" align=\"center\">HTR_SLOT</td>"   << endl;
00331      file << "<td class=\"s1\" align=\"center\">HTR_FPGA</td>"   << endl;
00332      if(comment[0]!=0) file << "<td class=\"s1\" align=\"center\">Comment</td>"   << endl;
00333      file << "</tr>"   << endl;
00334    }
00335    std::string raw_class;
00336    file << "<tr>"<< endl;
00337    if((ind%2)==1){
00338       raw_class="<td class=\"s2\" align=\"center\">";
00339    }else{
00340       raw_class="<td class=\"s3\" align=\"center\">";
00341    }
00342    file << "<td class=\"s4\" align=\"center\">" << ind+1 <<"</td>"<< endl;
00343    file << raw_class<< detid.ieta()<<"</td>"<< endl;
00344    file << raw_class<< detid.iphi()<<"</td>"<< endl;
00345    file << raw_class<< detid.depth() <<"</td>"<< endl;
00346    file << raw_class<< lmap_entry.rbx()<<"</td>"<< endl;
00347    file << raw_class<< lmap_entry.rm() <<"</td>"<< endl;
00348    file << raw_class<< lmap_entry.pixel()<<"</td>"<< endl;
00349    file << raw_class<< lmap_entry.rmFiber() <<"</td>"<< endl;
00350    file << raw_class<< lmap_entry.fiberChannel()<<"</td>"<< endl;
00351    file << raw_class<< lmap_entry.qieCard() <<"</td>"<< endl;
00352    file << raw_class<< lmap_entry.adc()<<"</td>"<< endl;
00353    file << raw_class<< emap_entry.readoutVMECrateId()<<"</td>"<< endl;
00354    file << raw_class<< emap_entry.dccid()<<"</td>"<< endl;
00355    file << raw_class<< emap_entry.spigot()<<"</td>"<< endl;
00356    file << raw_class<< emap_entry.fiberIndex()<<"</td>"<< endl;
00357    file << raw_class<< emap_entry.htrSlot()<<"</td>"<< endl;
00358    file << raw_class<< emap_entry.htrTopBottom()<<"</td>"<< endl;
00359    if(comment[0]!=0) file << raw_class<< comment<<"</td>"<< endl;
00360 }
00361 static void printTableTail(ofstream& file){
00362      file << "</table>"<< endl;
00363      file << "</body>"<< endl;
00364      file << "</html>"<< endl;
00365 }
00366 
00367 bool HcalDetDiagLaserClient::validHtmlOutput(){
00368   string s=subdir_+"HcalDetDiagLaserMonitor Event Number";
00369   MonitorElement *me = dqmStore_->get(s.c_str());
00370   int n=0;
00371   if ( me ) {
00372     s = me->valueString();
00373     sscanf((s.substr(2,s.length()-2)).c_str(), "%d", &n);
00374   }
00375   if(n<100) return false;
00376   return true;
00377 }
00378 void HcalDetDiagLaserClient::htmlOutput(string htmlDir){
00379   if(dqmStore_==0){
00380       if (debug_>0) std::cout <<"<HcalDetDiagLaserClient::htmlOutput> dqmStore object does not exist!"<<std::endl;
00381       return;
00382   }
00383   if(debug_>2) std::cout <<"\t<HcalDetDiagLaserClient::htmlOutput>  Preparing html for task: "<<name_<<std::endl;
00385 
00386   HcalLogicalMapGenerator gen;
00387   HcalLogicalMap lmap(gen.createMap());
00388   HcalElectronicsMap emap=lmap.generateHcalElectronicsMap();
00389 
00391   string ref_run,s;
00392   MonitorElement* me;
00393   TH1F *hbheEnergy=0;
00394   TH1F *hbheTiming=0;
00395   TH1F *hbheEnergyRMS=0;
00396   TH1F *hbheTimingRMS=0;
00397   TH1F *hoEnergy=0;
00398   TH1F *hoTiming=0;
00399   TH1F *hoEnergyRMS=0;
00400   TH1F *hoTimingRMS=0;
00401   TH1F *hfEnergy=0;
00402   TH1F *hfTiming=0;
00403   TH1F *hfEnergyRMS=0;
00404   TH1F *hfTimingRMS=0;
00405   TH1F *hb=0;
00406   TH1F *he=0;
00407   TH1F *ho=0;
00408   TH1F *hf=0; 
00409   TH2F *Time2Dhbhehf=0;
00410   TH2F *Time2Dho=0;
00411   TH2F *Energy2Dhbhehf=0;
00412   TH2F *Energy2Dho=0;
00413   TH2F *refTime2Dhbhehf=0;
00414   TH2F *refTime2Dho=0;
00415   TH2F *refEnergy2Dhbhehf=0;
00416   TH2F *refEnergy2Dho=0;
00417   int HBpresent_=0,HEpresent_=0,HOpresent_=0,HFpresent_=0;
00418 
00419  
00420   me=dqmStore_->get(prefixME_+"HcalInfo/HBpresent");
00421   if(me!=0) HBpresent_=me->getIntValue();
00422   me=dqmStore_->get(prefixME_+"HcalInfo/HEpresent");
00423   if(me!=0) HEpresent_=me->getIntValue();
00424   me=dqmStore_->get(prefixME_+"HcalInfo/HOpresent");
00425   if(me!=0) HOpresent_=me->getIntValue();
00426   me=dqmStore_->get(prefixME_+"HcalInfo/HFpresent");
00427   if(me!=0) HFpresent_=me->getIntValue();
00428 
00429   s=subdir_+"Summary Plots/HBHE Laser Energy Distribution"; me=dqmStore_->get(s.c_str()); 
00430   if(me!=0) hbheEnergy=HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hbheEnergy, debug_);  else return;
00431   s=subdir_+"Summary Plots/HBHE Laser Timing Distribution"; me=dqmStore_->get(s.c_str());
00432   if(me!=0) hbheTiming=HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hbheTiming, debug_); else return;
00433   s=subdir_+"Summary Plots/HBHE Laser Energy RMS_div_Energy Distribution"; me=dqmStore_->get(s.c_str());
00434   if(me!=0) hbheEnergyRMS= HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hbheEnergyRMS, debug_); else return;
00435   s=subdir_+"Summary Plots/HBHE Laser Timing RMS Distribution"; me=dqmStore_->get(s.c_str());
00436   if(me!=0) hbheTimingRMS= HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hbheTimingRMS, debug_); else return;
00437   s=subdir_+"Summary Plots/HO Laser Energy Distribution"; me=dqmStore_->get(s.c_str());
00438   if(me!=0) hoEnergy = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hoEnergy, debug_); else return;
00439   s=subdir_+"Summary Plots/HO Laser Timing Distribution"; me=dqmStore_->get(s.c_str());
00440   if(me!=0) hoTiming = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hoTiming, debug_); else return;
00441   s=subdir_+"Summary Plots/HO Laser Energy RMS_div_Energy Distribution"; me=dqmStore_->get(s.c_str());
00442   if(me!=0) hoEnergyRMS = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hoEnergyRMS, debug_); else return;
00443   s=subdir_+"Summary Plots/HO Laser Timing RMS Distribution"; me=dqmStore_->get(s.c_str());
00444   if(me!=0) hoTimingRMS  = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hoTimingRMS, debug_); else return;
00445   s=subdir_+"Summary Plots/HF Laser Energy Distribution"; me=dqmStore_->get(s.c_str());
00446   if(me!=0) hfEnergy  = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hfEnergy, debug_); else return;
00447   s=subdir_+"Summary Plots/HF Laser Timing Distribution"; me=dqmStore_->get(s.c_str());
00448   if(me!=0) hfTiming  = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hfTiming, debug_); else return;
00449   s=subdir_+"Summary Plots/HF Laser Energy RMS_div_Energy Distribution"; me=dqmStore_->get(s.c_str());
00450   if(me!=0) hfEnergyRMS = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hfEnergyRMS, debug_); else return;
00451   s=subdir_+"Summary Plots/HF Laser Timing RMS Distribution"; me=dqmStore_->get(s.c_str());
00452   if(me!=0) hfTimingRMS = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hfTimingRMS, debug_); else return;
00453 
00454   s=subdir_+"Summary Plots/HB RBX average Time-Ref"; me=dqmStore_->get(s.c_str());
00455   if(me!=0) hb     = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hb, debug_); else return;
00456   s=subdir_+"Summary Plots/HE RBX average Time-Ref"; me=dqmStore_->get(s.c_str());
00457   if(me!=0) he     = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, he, debug_); else return;
00458   s=subdir_+"Summary Plots/HO RBX average Time-Ref"; me=dqmStore_->get(s.c_str());
00459   if(me!=0) ho     = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, ho, debug_); else return;
00460   s=subdir_+"Summary Plots/HF RoBox average Time-Ref"; me=dqmStore_->get(s.c_str());
00461   if(me!=0) hf     = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, hf, debug_); else return;
00462 
00463   s=subdir_+"Summary Plots/Laser Timing HBHEHF"; me=dqmStore_->get(s.c_str());
00464   if(me!=0) Time2Dhbhehf  = HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, Time2Dhbhehf, debug_); else return;
00465   s=subdir_+"Summary Plots/Laser Timing HO"; me=dqmStore_->get(s.c_str());
00466   if(me!=0) Time2Dho      = HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, Time2Dho, debug_); else return;
00467   s=subdir_+"Summary Plots/Laser Energy HBHEHF"; me=dqmStore_->get(s.c_str());
00468   if(me!=0) Energy2Dhbhehf= HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, Energy2Dhbhehf, debug_); else return;
00469   s=subdir_+"Summary Plots/Laser Energy HO"; me=dqmStore_->get(s.c_str());
00470   if(me!=0) Energy2Dho    = HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, Energy2Dho, debug_); else return;
00471   s=subdir_+"Summary Plots/HBHEHF Laser (Timing-Ref)+1"; me=dqmStore_->get(s.c_str());
00472   if(me!=0) refTime2Dhbhehf  = HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, refTime2Dhbhehf, debug_); else return;
00473   s=subdir_+"Summary Plots/HO Laser (Timing-Ref)+1"; me=dqmStore_->get(s.c_str());
00474   if(me!=0) refTime2Dho      = HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, refTime2Dho, debug_); else return;
00475   s=subdir_+"Summary Plots/HBHEHF Laser Energy_div_Ref"; me=dqmStore_->get(s.c_str());
00476   if(me!=0) refEnergy2Dhbhehf= HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, refEnergy2Dhbhehf, debug_); else return;
00477   s=subdir_+"Summary Plots/HO Laser Energy_div_Ref"; me=dqmStore_->get(s.c_str());
00478   if(me!=0) refEnergy2Dho    = HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, refEnergy2Dho, debug_); else return;
00479 
00480   TH1F *Raddam[56];
00481   char str[100];
00482   for(int i=0;i<56;i++){  
00483        sprintf(str,"RADDAM (%i %i)",RADDAM_CH[i].eta,RADDAM_CH[i].phi);
00484        s=subdir_+"Raddam Plots/"+str; me=dqmStore_->get(s.c_str());
00485        if(me!=0) Raddam[i] = HcalUtilsClient::getHisto<TH1F*>(me, cloneME_, Raddam[i], debug_);
00486        Raddam[i]->SetXTitle("TS");
00487        Raddam[i]->SetTitle(str);
00488   }
00489   
00490   int ievt_ = -1,runNo=-1;
00491   s=subdir_+"HcalDetDiagLaserMonitor Event Number";
00492   me = dqmStore_->get(s.c_str());
00493   if ( me ) {
00494     s = me->valueString();
00495     sscanf((s.substr(2,s.length()-2)).c_str(), "%d", &ievt_);
00496   }
00497   s=subdir_+"HcalDetDiagLaserMonitor Run Number";
00498   me = dqmStore_->get(s.c_str());
00499   if ( me ) {
00500     s = me->valueString();
00501     sscanf((s.substr(2,s.length()-2)).c_str(), "%d", &runNo);
00502   }
00503   s=subdir_+"HcalDetDiagLaserMonitor Reference Run";
00504   me = dqmStore_->get(s.c_str());
00505   if(me) {
00506     string s=me->valueString();
00507     char str[200]; 
00508     sscanf((s.substr(2,s.length()-2)).c_str(), "%s", str);
00509     ref_run=str;
00510   }
00511 
00512   int  badT=0;
00513   int  badE=0;
00514   int  HBP[2]={0,0};
00515   int  HBM[2]={0,0};
00516   int  HEP[2]={0,0};
00517   int  HEM[2]={0,0};
00518   int  HFP[2]={0,0};
00519   int  HFM[2]={0,0};
00520   int  HO[2] ={0,0};
00521   int  newHBP[2]={0,0};
00522   int  newHBM[2]={0,0};
00523   int  newHEP[2]={0,0};
00524   int  newHEM[2]={0,0};
00525   int  newHFP[2]={0,0};
00526   int  newHFM[2]={0,0};
00527   int  newHO[2] ={0,0};
00528 
00529   TH2F* BadTiming_val[4];
00530   TH2F* BadEnergy_val[4];
00531   std::vector<std::string> name = HcalEtaPhiHistNames();
00532   for(int i=0;i<4;++i){
00533       BadTiming_val[i]=0;
00534       BadEnergy_val[i]=0;
00535       string s=subdir_+"Plots for client/"+name[i]+" Laser Timing difference";
00536       me=dqmStore_->get(s.c_str());
00537       if (me!=0) BadTiming_val[i]=HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, BadTiming_val[i], debug_); else return;
00538       s=subdir_+"Plots for client/"+name[i]+" Laser Energy difference";
00539       me=dqmStore_->get(s.c_str());
00540       if (me!=0) BadEnergy_val[i]=HcalUtilsClient::getHisto<TH2F*>(me, cloneME_, BadEnergy_val[i], debug_); else return;
00541   }
00542 
00544   ofstream badTiming; 
00545   badTiming.open((htmlDir+"bad_timing_table.html").c_str());
00546   printTableHeader(badTiming,"Bad Timing Channels list");
00547   ofstream badEnergy; 
00548   badEnergy.open((htmlDir+"bad_energy_table.html").c_str());
00549   printTableHeader(badEnergy,"Bad Energy Channels list");
00550 
00551  for(int d=0;d<4;++d){
00552       int etabins=BadTiming_val[d]->GetNbinsX();
00553       int phibins=BadTiming_val[d]->GetNbinsY();
00554       for(int phi=0;phi<phibins;++phi)for(int eta=0;eta<etabins;++eta){
00555           int ieta=CalcIeta(eta,d+1);
00556           if(ieta==-9999) continue;
00557           HcalSubdetector subdet=HcalEmpty;
00558           if(isHB(eta,d+1))subdet=HcalBarrel;
00559              else if (isHE(eta,d+1)) subdet=HcalEndcap;
00560              else if (isHF(eta,d+1)) subdet=HcalForward;
00561              else if (isHO(eta,d+1)) subdet=HcalOuter;
00562           HcalDetId hcalid(subdet, ieta, phi+1, (int)(d+1));
00563           float val=BadTiming_val[d]->GetBinContent(eta+1,phi+1);
00564           if(val!=0){
00565             if(subdet==HcalBarrel){
00566                if(ieta>0){ HBP[0]++;}else{ HBM[0]++;} badT++;
00567                if(badstatusmap.find(hcalid)==badstatusmap.end()){if(ieta>0){ newHBP[0]++;}else{ newHBM[0]++;}}
00568             }   
00569             if(subdet==HcalEndcap){
00570                if(ieta>0){ HEP[0]++;}else{ HEM[0]++;} badT++;
00571                if(badstatusmap.find(hcalid)==badstatusmap.end()){if(ieta>0){ newHEP[0]++;}else{ newHEM[0]++;}}
00572             }   
00573             if(subdet==HcalForward){
00574                if(ieta>0){ HFP[0]++;}else{ HFM[0]++;} badT++;
00575                if(badstatusmap.find(hcalid)==badstatusmap.end()){if(ieta>0){ newHFP[0]++;}else{ newHFM[0]++;}}
00576             }   
00577             if(subdet==HcalOuter){
00578                HO[0]++;badT++;
00579                if(badstatusmap.find(hcalid)==badstatusmap.end()){newHO[0]++;}
00580             }   
00581          }
00582          val=BadEnergy_val[d]->GetBinContent(eta+1,phi+1);
00583          if(val!=0){
00584             if(subdet==HcalBarrel){
00585                if(ieta>0){ HBP[1]++;}else{ HBM[1]++;} badE++;
00586                if(badstatusmap.find(hcalid)==badstatusmap.end()){if(ieta>0){ newHBP[1]++;}else{ newHBM[1]++;}}
00587             }   
00588             if(subdet==HcalEndcap){
00589                if(ieta>0){ HEP[1]++;}else{ HEM[1]++;} badE++;
00590                if(badstatusmap.find(hcalid)==badstatusmap.end()){if(ieta>0){ newHEP[1]++;}else{ newHEM[1]++;}}
00591             }   
00592             if(subdet==HcalForward){
00593                if(ieta>0){ HFP[1]++;}else{ HFM[1]++;} badE++;
00594                if(badstatusmap.find(hcalid)==badstatusmap.end()){if(ieta>0){ newHFP[1]++;}else{ newHFM[1]++;}}
00595             }   
00596             if(subdet==HcalOuter){
00597                HO[1]++;badT++;
00598                if(badstatusmap.find(hcalid)==badstatusmap.end()){newHO[1]++;}
00599             }   
00600         }
00601      }
00602   }
00603 
00604 
00605   int cnt=0;
00606   if((HBP[0]+HBM[0])>0){
00607     badTiming << "<tr><td align=\"center\"><h3>"<< "HB" <<"</h3></td></tr>" << endl;
00608     for(int d=0;d<4;++d){
00609       int etabins=BadTiming_val[d]->GetNbinsX();
00610       int phibins=BadTiming_val[d]->GetNbinsY();
00611       for(int phi=0;phi<phibins;++phi)for(int eta=0;eta<etabins;++eta){
00612           int ieta=CalcIeta(eta,d+1);
00613           if(ieta==-9999) continue;
00614           if(!isHB(eta,d+1)) continue;
00615           float val=BadTiming_val[d]->GetBinContent(eta+1,phi+1);
00616           if(val==0) continue;
00617           HcalDetId hcalid(HcalBarrel,ieta,phi+1,d+1);
00618           HcalFrontEndId    lmap_entry=lmap.getHcalFrontEndId(hcalid);
00619           HcalElectronicsId emap_entry=emap.lookup(hcalid);
00620           sprintf(str,"Time-Ref=%.2f",val);
00621           printTableLine(badTiming,cnt++,hcalid,lmap_entry,emap_entry,str);
00622       } 
00623     }
00624   } 
00625   cnt=0;
00626   if((HEP[0]+HEM[0])>0){
00627     badTiming << "<tr><td align=\"center\"><h3>"<< "HE" <<"</h3></td></tr>" << endl;
00628     for(int d=0;d<4;++d){
00629       int etabins=BadTiming_val[d]->GetNbinsX();
00630       int phibins=BadTiming_val[d]->GetNbinsY();
00631       for(int phi=0;phi<phibins;++phi)for(int eta=0;eta<etabins;++eta){
00632           int ieta=CalcIeta(eta,d+1);
00633           if(ieta==-9999) continue;
00634           if(!isHE(eta,d+1)) continue;
00635           float val=BadTiming_val[d]->GetBinContent(eta+1,phi+1);
00636           if(val==0) continue;
00637           HcalDetId hcalid(HcalEndcap,ieta,phi+1,d+1);
00638           HcalFrontEndId    lmap_entry=lmap.getHcalFrontEndId(hcalid);
00639           HcalElectronicsId emap_entry=emap.lookup(hcalid);
00640           sprintf(str,"Time-Ref=%.2f",val);
00641           printTableLine(badTiming,cnt++,hcalid,lmap_entry,emap_entry,str);
00642       } 
00643     } 
00644   }
00645   cnt=0;
00646   if(HO[0]>0){
00647     badTiming << "<tr><td align=\"center\"><h3>"<< "HO" <<"</h3></td></tr>" << endl;
00648     for(int d=0;d<4;++d){
00649       int etabins=BadTiming_val[d]->GetNbinsX();
00650       int phibins=BadTiming_val[d]->GetNbinsY();
00651       for(int phi=0;phi<phibins;++phi)for(int eta=0;eta<etabins;++eta){
00652           int ieta=CalcIeta(eta,d+1);
00653           if(ieta==-9999) continue;
00654           if(!isHO(eta,d+1)) continue;
00655           float val=BadTiming_val[d]->GetBinContent(eta+1,phi+1);
00656           if(val==0) continue;
00657           HcalDetId hcalid(HcalOuter,ieta,phi+1,d+1);
00658           HcalFrontEndId    lmap_entry=lmap.getHcalFrontEndId(hcalid);
00659           HcalElectronicsId emap_entry=emap.lookup(hcalid);
00660           sprintf(str,"Time-Ref=%.2f",val);
00661           printTableLine(badTiming,cnt++,hcalid,lmap_entry,emap_entry,str);
00662       } 
00663     } 
00664   }
00665   cnt=0;
00666   if((HFP[0]+HFM[0])>0){
00667     badTiming << "<tr><td align=\"center\"><h3>"<< "HF" <<"</h3></td></tr>" << endl;
00668     for(int d=0;d<4;++d){
00669       int etabins=BadTiming_val[d]->GetNbinsX();
00670       int phibins=BadTiming_val[d]->GetNbinsY();
00671       for(int phi=0;phi<phibins;++phi)for(int eta=0;eta<etabins;++eta){
00672           int ieta=CalcIeta(eta,d+1);
00673           if(ieta==-9999) continue;
00674           if(!isHF(eta,d+1)) continue;
00675           float val=BadTiming_val[d]->GetBinContent(eta+1,phi+1);
00676           if(val==0) continue;
00677           HcalDetId hcalid(HcalForward,ieta,phi+1,d+1);
00678           HcalFrontEndId    lmap_entry=lmap.getHcalFrontEndId(hcalid);
00679           HcalElectronicsId emap_entry=emap.lookup(hcalid);
00680           sprintf(str,"Time-Ref=%.2f",val);
00681           printTableLine(badTiming,cnt++,hcalid,lmap_entry,emap_entry,str);
00682       } 
00683     } 
00684   }
00686   cnt=0;
00687   if((HBP[1]+HBM[1])>0){
00688     badEnergy << "<tr><td align=\"center\"><h3>"<< "HB" <<"</h3></td></tr>" << endl;
00689     for(int d=0;d<4;++d){
00690       int etabins=BadEnergy_val[d]->GetNbinsX();
00691       int phibins=BadEnergy_val[d]->GetNbinsY();
00692       for(int phi=0;phi<phibins;++phi)for(int eta=0;eta<etabins;++eta){
00693           int ieta=CalcIeta(eta,d+1);
00694           if(ieta==-9999) continue;
00695           if(!isHB(eta,d+1)) continue;
00696           float val=BadEnergy_val[d]->GetBinContent(eta+1,phi+1);
00697           if(val==0) continue;
00698           HcalDetId hcalid(HcalBarrel,ieta,phi+1,d+1);
00699           HcalFrontEndId    lmap_entry=lmap.getHcalFrontEndId(hcalid);
00700           HcalElectronicsId emap_entry=emap.lookup(hcalid);
00701           sprintf(str,"Energy/Ref=%.2f",val);
00702           printTableLine(badEnergy,cnt++,hcalid,lmap_entry,emap_entry,str);
00703       } 
00704     }
00705   } 
00706   cnt=0;
00707   if((HEP[1]+HEM[1])>0){
00708     badEnergy << "<tr><td align=\"center\"><h3>"<< "HE" <<"</h3></td></tr>" << endl;
00709     for(int d=0;d<4;++d){
00710       int etabins=BadEnergy_val[d]->GetNbinsX();
00711       int phibins=BadEnergy_val[d]->GetNbinsY();
00712       for(int phi=0;phi<phibins;++phi)for(int eta=0;eta<etabins;++eta){
00713           int ieta=CalcIeta(eta,d+1);
00714           if(ieta==-9999) continue;
00715           if(!isHE(eta,d+1)) continue;
00716           float val=BadEnergy_val[d]->GetBinContent(eta+1,phi+1);
00717           if(val==0) continue;
00718           HcalDetId hcalid(HcalEndcap,ieta,phi+1,d+1);
00719           HcalFrontEndId    lmap_entry=lmap.getHcalFrontEndId(hcalid);
00720           HcalElectronicsId emap_entry=emap.lookup(hcalid);
00721           sprintf(str,"Energy/Ref=%.2f",val);
00722           printTableLine(badEnergy,cnt++,hcalid,lmap_entry,emap_entry,str);
00723       } 
00724     } 
00725   }
00726   cnt=0;
00727   if(HO[1]>0){
00728     badEnergy << "<tr><td align=\"center\"><h3>"<< "HO" <<"</h3></td></tr>" << endl;
00729     for(int d=0;d<4;++d){
00730       int etabins=BadEnergy_val[d]->GetNbinsX();
00731       int phibins=BadEnergy_val[d]->GetNbinsY();
00732       for(int phi=0;phi<phibins;++phi)for(int eta=0;eta<etabins;++eta){
00733           int ieta=CalcIeta(eta,d+1);
00734           if(ieta==-9999) continue;
00735           if(!isHO(eta,d+1)) continue;
00736           float val=BadEnergy_val[d]->GetBinContent(eta+1,phi+1);
00737           if(val==0) continue;
00738           HcalDetId hcalid(HcalOuter,ieta,phi+1,d+1);
00739           HcalFrontEndId    lmap_entry=lmap.getHcalFrontEndId(hcalid);
00740           HcalElectronicsId emap_entry=emap.lookup(hcalid);
00741           sprintf(str,"Energy/Ref=%.2f",val);
00742           printTableLine(badEnergy,cnt++,hcalid,lmap_entry,emap_entry,str);
00743       } 
00744     } 
00745   }
00746   cnt=0;
00747   if((HFP[1]+HFM[1])>0){
00748     badEnergy << "<tr><td align=\"center\"><h3>"<< "HF" <<"</h3></td></tr>" << endl;
00749     for(int d=0;d<4;++d){
00750       int etabins=BadEnergy_val[d]->GetNbinsX();
00751       int phibins=BadEnergy_val[d]->GetNbinsY();
00752       for(int phi=0;phi<phibins;++phi)for(int eta=0;eta<etabins;++eta){
00753           int ieta=CalcIeta(eta,d+1);
00754           if(ieta==-9999) continue;
00755           if(!isHF(eta,d+1)) continue;
00756           float val=BadEnergy_val[d]->GetBinContent(eta+1,phi+1);
00757           if(val==0) continue;
00758           HcalDetId hcalid(HcalForward,ieta,phi+1,d+1);
00759           HcalFrontEndId    lmap_entry=lmap.getHcalFrontEndId(hcalid);
00760           HcalElectronicsId emap_entry=emap.lookup(hcalid);
00761           sprintf(str,"Energy/Ref=%.2f",val);
00762           printTableLine(badEnergy,cnt++,hcalid,lmap_entry,emap_entry,str);
00763       } 
00764     } 
00765   }
00766 
00767   printTableTail(badTiming);
00768   badTiming.close();
00769   printTableTail(badEnergy);
00770   badEnergy.close();
00771 
00773   ofstream htmlFile;
00774   string outfile=htmlDir+name_+".html";
00775   htmlFile.open(outfile.c_str());
00777   gROOT->SetBatch(true);
00778   gStyle->SetCanvasColor(0);
00779   gStyle->SetPadColor(0);
00780   gStyle->SetOptStat(111110);
00781   gStyle->SetPalette(1);
00782   TCanvas *can=new TCanvas("HcalDetDiagLaserClient","HcalDetDiagLaserClient",0,0,500,350);
00783   can->cd();
00784   
00785   if(Raddam[0]->GetEntries()>0){
00786      ofstream RADDAM;
00787      RADDAM.open((htmlDir + "RADDAM_"+name_).c_str());
00788      RADDAM << "</html><html xmlns=\"https://www.w3.org/1999/xhtml\">"<< endl;
00789      RADDAM << "<head>"<< endl;
00790      RADDAM << "<meta https-equiv=\"Content-Type\" content=\"text/html\"/>"<< endl;
00791      RADDAM << "<title>"<< "RADDAM channels" <<"</title>"<< endl;
00792      RADDAM << "<style type=\"text/css\">"<< endl;
00793      RADDAM << " body,td{ background-color: #FFFFCC; font-family: arial, arial ce, helvetica; font-size: 12px; }"<< endl;
00794      RADDAM << "   td.s0 { font-family: arial, arial ce, helvetica; }"<< endl;
00795      RADDAM << "   td.s1 { font-family: arial, arial ce, helvetica; font-weight: bold; background-color: #FFC169; text-align: center;}"<< endl;
00796      RADDAM << "   td.s2 { font-family: arial, arial ce, helvetica; background-color: #eeeeee; }"<< endl;
00797      RADDAM << "   td.s3 { font-family: arial, arial ce, helvetica; background-color: #d0d0d0; }"<< endl;
00798      RADDAM << "   td.s4 { font-family: arial, arial ce, helvetica; background-color: #FFC169; }"<< endl;
00799      RADDAM << "</style>"<< endl;
00800      RADDAM << "<body>"<< endl;
00801      RADDAM << "<h2>Run "<< runNo<<": RADDAM channels event shape </h2>" << endl;
00802      RADDAM << "<table>"<< endl;
00803 
00804      char str[100];
00805      for(int i=0;i<28;i++){
00806          RADDAM << "<tr align=\"left\">" << endl;
00807          //Raddam[2*i]->SetStats(0);
00808          //Raddam[2*i+1]->SetStats(0);
00809          Raddam[2*i]->Draw();    sprintf(str,"%02d",2*i);    can->SaveAs((htmlDir + "raddam_ch"+str+".gif").c_str());
00810          Raddam[2*i+1]->Draw();  sprintf(str,"%02d",2*i+1);  can->SaveAs((htmlDir + "raddam_ch"+str+".gif").c_str());
00811          sprintf(str,"raddam_ch%02d.gif",2*i);
00812          RADDAM << "<td align=\"center\"><img src=\""<<str<<"\" alt=\"raddam channel\">   </td>" << endl;
00813          sprintf(str,"raddam_ch%02d.gif",2*i+1);
00814          RADDAM << "<td align=\"center\"><img src=\""<<str<<"\" alt=\"raddam channel\">   </td>" << endl;
00815          RADDAM << "</tr>" << endl;
00816      }
00817 
00818      RADDAM << "</table>"<< endl;
00819      RADDAM << "</body>"<< endl;
00820      RADDAM << "</html>"<< endl;
00821      RADDAM.close();
00822   }
00823 
00824   Time2Dhbhehf->SetXTitle("i#eta");
00825   Time2Dhbhehf->SetYTitle("i#phi");
00826   Time2Dho->SetXTitle("i#eta");
00827   Time2Dho->SetYTitle("i#phi");
00828   Energy2Dhbhehf->SetXTitle("i#eta");
00829   Energy2Dhbhehf->SetYTitle("i#phi");
00830   Energy2Dho->SetXTitle("i#eta");
00831   Energy2Dho->SetYTitle("i#phi");
00832   refTime2Dhbhehf->SetXTitle("i#eta");
00833   refTime2Dhbhehf->SetYTitle("i#phi");
00834   refTime2Dho->SetXTitle("i#eta");
00835   refTime2Dho->SetYTitle("i#phi");
00836   refEnergy2Dhbhehf->SetXTitle("i#eta");
00837   refEnergy2Dhbhehf->SetYTitle("i#phi");
00838   refEnergy2Dho->SetXTitle("i#eta");
00839   refEnergy2Dho->SetYTitle("i#phi");
00840   refTime2Dhbhehf->SetMinimum(0);
00841   refTime2Dhbhehf->SetMaximum(2);
00842   refTime2Dho->SetMinimum(0);
00843   refTime2Dho->SetMaximum(2);
00844   refEnergy2Dhbhehf->SetMinimum(0.5);
00845   refEnergy2Dhbhehf->SetMaximum(1.5);
00846   refEnergy2Dho->SetMinimum(0.5);
00847   refEnergy2Dho->SetMaximum(1.5);
00848   
00849   Time2Dhbhehf->SetNdivisions(36,"Y");
00850   Time2Dho->SetNdivisions(36,"Y");
00851   Energy2Dhbhehf->SetNdivisions(36,"Y");
00852   Energy2Dho->SetNdivisions(36,"Y");
00853   refTime2Dhbhehf->SetNdivisions(36,"Y");
00854   refTime2Dho->SetNdivisions(36,"Y");
00855   refEnergy2Dhbhehf->SetNdivisions(36,"Y");
00856   refEnergy2Dho->SetNdivisions(36,"Y");
00857 
00858   // html page header
00859   htmlFile << "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">  " << endl;
00860   htmlFile << "<html>  " << endl;
00861   htmlFile << "<head>  " << endl;
00862   htmlFile << "  <meta content=\"text/html; charset=ISO-8859-1\"  " << endl;
00863   htmlFile << " https-equiv=\"content-type\">  " << endl;
00864   htmlFile << "  <title>Detector Diagnostics Laser Monitor</title> " << endl;
00865   htmlFile << "</head>  " << endl;
00866   htmlFile << "<style type=\"text/css\"> td { font-weight: bold } </style>" << endl;
00867  
00868   htmlFile << "<style type=\"text/css\">"<< endl;
00869   htmlFile << "   td.s0 { font-family: arial, arial ce, helvetica; font-weight: bold; background-color: #FF7700; text-align: center;}"<< endl;
00870   htmlFile << "   td.s1 { font-family: arial, arial ce, helvetica; font-weight: bold; background-color: #FFC169; text-align: center;}"<< endl;
00871   htmlFile << "   td.s2 { font-family: arial, arial ce, helvetica; background-color: red; }"<< endl;
00872   htmlFile << "   td.s3 { font-family: arial, arial ce, helvetica; background-color: yellow; }"<< endl;
00873   htmlFile << "   td.s4 { font-family: arial, arial ce, helvetica; background-color: green; }"<< endl;
00874   htmlFile << "   td.s5 { font-family: arial, arial ce, helvetica; background-color: silver; }"<< endl;
00875   std::string state[4]={"<td class=\"s2\" align=\"center\">",
00876                         "<td class=\"s3\" align=\"center\">",
00877                         "<td class=\"s4\" align=\"center\">",
00878                         "<td class=\"s5\" align=\"center\">"};
00879   htmlFile << "</style>"<< endl;
00880  
00881   htmlFile << "<body>  " << endl;
00882   htmlFile << "<br>  " << endl;
00883   htmlFile << "<h2>Run:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" << endl;
00884   htmlFile << "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span " << endl;
00885   htmlFile << " style=\"color: rgb(0, 0, 153);\">" << runNo << "</span></h2>" << endl;
00886   htmlFile << "<h2>Monitoring task:&nbsp;&nbsp;&nbsp;&nbsp; <span " << endl;
00887   htmlFile << " style=\"color: rgb(0, 0, 153);\">Detector Diagnostics Laser Monitor</span></h2> " << endl;
00888   htmlFile << "<h2>Events processed:&nbsp;&nbsp;&nbsp;&nbsp;<span " << endl;
00889   htmlFile << " style=\"color: rgb(0, 0, 153);\">" << ievt_ << "</span></h2>" << endl;
00890   htmlFile << "<hr>" << endl;
00891  
00892   htmlFile << "<table width=100% border=1>" << endl;
00893   htmlFile << "<tr>" << endl;
00894   htmlFile << "<td class=\"s0\" width=20% align=\"center\">SebDet</td>" << endl;
00895   htmlFile << "<td class=\"s0\" width=20% align=\"center\">Bad Timing</td>" << endl;
00896   htmlFile << "<td class=\"s0\" width=20% align=\"center\">Bad Energy</td>" << endl;
00897   htmlFile << "</tr><tr>" << endl;
00898   int ind1=0,ind2=0;
00899   htmlFile << "<td class=\"s1\" align=\"center\">HB+</td>" << endl;
00900   if(HBP[0]==0) ind1=2; if(HBP[0]>0 && HBP[0]<=12) ind1=1; if(HBP[0]>12) ind1=0; 
00901   if(HBP[1]==0) ind2=2; if(HBP[1]>0 && HBP[1]<=12) ind2=1; if(HBP[1]>12) ind2=0; 
00902   if(!HBpresent_) ind1=ind2=3;  
00903   htmlFile << state[ind1] << HBP[0] <<"</td>" << endl;
00904   htmlFile << state[ind2] << HBP[1] <<"</td>" << endl;
00905   htmlFile << "</tr><tr>" << endl;
00906   htmlFile << "<td class=\"s1\" align=\"center\">HB-</td>" << endl;
00907   if(HBM[0]==0) ind1=2; if(HBM[0]>0 && HBP[0]<=12) ind1=1; if(HBM[0]>12) ind1=0; 
00908   if(HBM[1]==0) ind2=2; if(HBM[1]>0 && HBP[1]<=12) ind2=1; if(HBM[1]>12) ind2=0; 
00909   if(!HBpresent_) ind1=ind2=3;  
00910   htmlFile << state[ind1] << HBM[0] <<"</td>" << endl;
00911   htmlFile << state[ind2] << HBM[1] <<"</td>" << endl;
00912   htmlFile << "</tr><tr>" << endl;
00913   htmlFile << "<td class=\"s1\" align=\"center\">HE+</td>" << endl;
00914   if(HEP[0]==0) ind1=2; if(HEP[0]>0 && HEP[0]<=12) ind1=1; if(HEP[0]>12) ind1=0; 
00915   if(HEP[1]==0) ind2=2; if(HEP[1]>0 && HEP[1]<=12) ind2=1; if(HEP[1]>12) ind2=0;
00916   if(!HEpresent_) ind1=ind2=3;  
00917   if(ind1==0 || ind2==0) status|=2; else if(ind1==1 || ind2==1) status|=1;
00918   htmlFile << state[ind1] << HEP[0] <<"</td>" << endl;
00919   htmlFile << state[ind2] << HEP[1] <<"</td>" << endl;
00920   htmlFile << "</tr><tr>" << endl;
00921   htmlFile << "<td class=\"s1\" align=\"center\">HE-</td>" << endl;
00922   if(HEM[0]==0) ind1=2; if(HEM[0]>0 && HEM[0]<=12) ind1=1; if(HEM[0]>12) ind1=0; 
00923   if(HEM[1]==0) ind2=2; if(HEM[1]>0 && HEM[1]<=12) ind2=1; if(HEM[1]>12) ind2=0; 
00924   if(!HEpresent_) ind1=ind2=3;  
00925   if(ind1==0 || ind2==0) status|=2; else if(ind1==1 || ind2==1) status|=1;
00926   htmlFile << state[ind1] << HEM[0] <<"</td>" << endl;
00927   htmlFile << state[ind2] << HEM[1] <<"</td>" << endl;
00928   htmlFile << "</tr><tr>" << endl;
00929   htmlFile << "<td class=\"s1\" align=\"center\">HF+</td>" << endl;
00930   if(HFP[0]==0) ind1=2; if(HFP[0]>0 && HFP[0]<=12) ind1=1; if(HFP[0]>12) ind1=0; 
00931   if(HFP[1]==0) ind2=2; if(HFP[1]>0 && HFP[1]<=12) ind2=1; if(HFP[1]>12) ind2=0; 
00932   if(!HOpresent_) ind1=ind2=3;  
00933   if(ind1==0 || ind2==0) status|=2; else if(ind1==1 || ind2==1) status|=1;
00934   htmlFile << state[ind1] << HFP[0] <<"</td>" << endl;
00935   htmlFile << state[ind2] << HFP[1] <<"</td>" << endl;
00936   htmlFile << "</tr><tr>" << endl;
00937   htmlFile << "<td class=\"s1\" align=\"center\">HF-</td>" << endl;
00938   if(HFM[0]==0) ind1=2; if(HFM[0]>0 && HFM[0]<=12) ind1=1; if(HFM[0]>12) ind1=0; 
00939   if(HFM[1]==0) ind2=2; if(HFM[1]>0 && HFM[1]<=12) ind2=1; if(HFM[1]>12) ind2=0; 
00940   if(!HFpresent_) ind1=ind2=3;  
00941   if(ind1==0 || ind2==0) status|=2; else if(ind1==1 || ind2==1) status|=1;
00942   htmlFile << state[ind1] << HFM[0] <<"</td>" << endl;
00943   htmlFile << state[ind2] << HFM[1] <<"</td>" << endl;
00944   htmlFile << "</tr><tr>" << endl;
00945   htmlFile << "<td class=\"s1\" align=\"center\">HO</td>" << endl;
00946   if(HO[0]==0) ind1=2; if(HO[0]>0 && HO[0]<=12) ind1=1; if(HO[0]>12) ind1=0; 
00947   if(HO[1]==0) ind2=2; if(HO[1]>0 && HO[1]<=12) ind2=1; if(HO[1]>12) ind2=0; 
00948   if(!HFpresent_) ind1=ind2=3;  
00949   if(ind1==0 || ind2==0) status|=2; else if(ind1==1 || ind2==1) status|=1;
00950   htmlFile << state[ind1] << HO[0] <<"</td>" << endl;
00951   htmlFile << state[ind2] << HO[1] <<"</td>" << endl;
00952 
00953   htmlFile << "</tr></table>" << endl;
00954   htmlFile << "<hr>" << endl;
00955 
00956   if((badT+badE)>0){
00957       htmlFile << "<table width=100% border=1><tr>" << endl;
00958       if(badT>0)  htmlFile << "<td><a href=\"" << "bad_timing_table.html" <<"\">list of bad timing channels</a></td>";
00959       if(badE>0) htmlFile << "<td><a href=\"" << "bad_energy_table.html" <<"\">list of bad energy channels</a></td>";
00960       htmlFile << "</tr></table>" << endl;
00961   }
00962 
00964  
00965   if(Raddam[0]->GetEntries()>0){
00966     htmlFile << "<h2 align=\"center\"><a href=\"" << ("RADDAM_"+name_).c_str() <<"\">RADDAM channels</a><h2>";
00967     htmlFile << "<hr>" << endl;
00968   }
00969   
00970   htmlFile << "<h2 align=\"center\">Stability Laser plots (Reference run "<<ref_run<<")</h2>" << endl;
00971   htmlFile << "<table width=100% border=0><tr>" << endl;
00972   
00973   can->SetGridy();
00974   can->SetGridx();
00975   
00976   htmlFile << "<tr align=\"left\">" << endl;
00977   refTime2Dhbhehf->SetStats(0);
00978   refTime2Dho->SetStats(0);
00979   refTime2Dhbhehf->Draw("COLZ");    can->SaveAs((htmlDir + "ref_laser_timing_hbhehf.gif").c_str());
00980   refTime2Dho->Draw("COLZ");        can->SaveAs((htmlDir + "ref_laser_timing_ho.gif").c_str());
00981   htmlFile << "<td align=\"center\"><img src=\"ref_laser_timing_hbhehf.gif\" alt=\"ref laser timing distribution\">   </td>" << endl;
00982   htmlFile << "<td align=\"center\"><img src=\"ref_laser_timing_ho.gif\" alt=\"ref laser timing distribution\">   </td>" << endl;
00983   htmlFile << "</tr>" << endl;
00984   
00985   
00986   if(hb!=0 && he!=0 && ho!=0 && hf!=0){
00987   hb->SetMarkerStyle(22);
00988   hb->SetMarkerColor(kRed);
00989   hb->GetYaxis()->SetRangeUser(hb->GetMinimum()-1,hb->GetMaximum()+1);
00990   hb->GetXaxis()->SetNdivisions(520);
00991   
00992   he->SetMarkerStyle(22);
00993   he->SetMarkerColor(kRed);
00994   he->GetYaxis()->SetRangeUser(he->GetMinimum()-1,he->GetMaximum()+1);
00995   he->GetXaxis()->SetNdivisions(520);
00996   
00997   ho->SetMarkerStyle(22);
00998   ho->SetMarkerColor(kRed);
00999   ho->GetYaxis()->SetRangeUser(ho->GetMinimum()-1,ho->GetMaximum()+1);
01000   ho->GetXaxis()->SetNdivisions(520);
01001   
01002   hf->SetMarkerStyle(22);
01003   hf->SetMarkerColor(kRed);
01004   hf->GetYaxis()->SetRangeUser(hf->GetMinimum()-1,hf->GetMaximum()+1);
01005   hf->GetXaxis()->SetNdivisions(520);  
01006   hb->SetStats(0);
01007   he->SetStats(0);
01008   ho->SetStats(0);
01009   hf->SetStats(0);
01010  
01011   
01012   hb->GetXaxis()->SetBit(TAxis::kLabelsVert);
01013   he->GetXaxis()->SetBit(TAxis::kLabelsVert);
01014   ho->GetXaxis()->SetBit(TAxis::kLabelsVert);
01015   hf->GetXaxis()->SetBit(TAxis::kLabelsVert);
01016   hb->GetXaxis()->SetLabelSize(0.05);
01017   he->GetXaxis()->SetLabelSize(0.05);
01018   ho->GetXaxis()->SetLabelSize(0.05);
01019   hf->GetXaxis()->SetLabelSize(0.05);
01020  
01021   
01022   htmlFile << "<tr align=\"left\">" << endl;
01023   htmlFile << "<td align=\"center\"><img src=\"hb_rbx_timing1D.gif\" alt=\"rbx timing\">   </td>" << endl;
01024   htmlFile << "<td align=\"center\"><img src=\"he_rbx_timing1D.gif\" alt=\"rbx timing\">   </td>" << endl;
01025   htmlFile << "</tr>" << endl;
01026   htmlFile << "<tr align=\"left\">" << endl;
01027   htmlFile << "<td align=\"center\"><img src=\"ho_rbx_timing1D.gif\" alt=\"rbx timing\">   </td>" << endl;
01028   htmlFile << "<td align=\"center\"><img src=\"hf_rbx_timing1D.gif\" alt=\"rbx timing\">   </td>" << endl;
01029   htmlFile << "</tr>" << endl;
01030   }else printf("Error\n");
01031   
01032   
01033   
01034   htmlFile << "<tr align=\"left\">" << endl;
01035   refEnergy2Dhbhehf->SetStats(0);
01036   refEnergy2Dho->SetStats(0);
01037   refEnergy2Dhbhehf->Draw("COLZ");    can->SaveAs((htmlDir + "ref_laser_energy_hbhehf.gif").c_str());
01038   refEnergy2Dho->Draw("COLZ");        can->SaveAs((htmlDir + "ref_laser_energy_ho.gif").c_str());
01039   htmlFile << "<td align=\"center\"><img src=\"ref_laser_energy_hbhehf.gif\" alt=\"ref laser energy distribution\">   </td>" << endl;
01040   htmlFile << "<td align=\"center\"><img src=\"ref_laser_energy_ho.gif\" alt=\"ref laser energy distribution\">   </td>" << endl;
01041   htmlFile << "</tr>" << endl;
01042   
01043   htmlFile << "</table>" << endl;
01044   
01045   
01046   htmlFile << "<h2 align=\"center\">Summary Laser plots</h2>" << endl;
01047   htmlFile << "<table width=100% border=0><tr>" << endl;
01048   htmlFile << "<tr align=\"left\">" << endl;
01049   Time2Dhbhehf->SetStats(0);
01050   Time2Dho->SetStats(0);
01051   Time2Dhbhehf->Draw("COLZ");    can->SaveAs((htmlDir + "laser_timing_hbhehf.gif").c_str());
01052   Time2Dho->Draw("COLZ");        can->SaveAs((htmlDir + "laser_timing_ho.gif").c_str());
01053   htmlFile << "<td align=\"center\"><img src=\"laser_timing_hbhehf.gif\" alt=\"laser timing distribution\">   </td>" << endl;
01054   htmlFile << "<td align=\"center\"><img src=\"laser_timing_ho.gif\" alt=\"laser timing distribution\">   </td>" << endl;
01055   htmlFile << "</tr>" << endl;
01056   
01057   htmlFile << "<tr align=\"left\">" << endl;
01058   Energy2Dhbhehf->SetStats(0);
01059   Energy2Dho->SetStats(0);
01060   Energy2Dhbhehf->Draw("COLZ");    can->SaveAs((htmlDir + "laser_energy_hbhehf.gif").c_str());
01061   Energy2Dho->Draw("COLZ");        can->SaveAs((htmlDir + "laser_energy_ho.gif").c_str());
01062   htmlFile << "<td align=\"center\"><img src=\"laser_energy_hbhehf.gif\" alt=\"laser energy distribution\">   </td>" << endl;
01063   htmlFile << "<td align=\"center\"><img src=\"laser_energy_ho.gif\" alt=\"laser energy distribution\">   </td>" << endl;
01064   htmlFile << "</tr>" << endl;
01065   
01066   
01067   htmlFile << "<tr align=\"left\">" << endl;  
01068   hbheEnergy->Draw();    can->SaveAs((htmlDir + "hbhe_laser_energy_distribution.gif").c_str());
01069   hbheEnergyRMS->Draw(); can->SaveAs((htmlDir + "hbhe_laser_energy_rms_distribution.gif").c_str());
01070   htmlFile << "<td align=\"center\"><img src=\"hbhe_laser_energy_distribution.gif\" alt=\"hbhe laser energy distribution\">   </td>" << endl;
01071   htmlFile << "<td align=\"center\"><img src=\"hbhe_laser_energy_rms_distribution.gif\" alt=\"hbhelaser energy rms distribution\">   </td>" << endl;
01072   htmlFile << "</tr>" << endl;
01073   htmlFile << "<tr align=\"left\">" << endl;
01074   hbheTiming->Draw();    can->SaveAs((htmlDir + "hbhe_laser_timing_distribution.gif").c_str());
01075   hbheTimingRMS->Draw(); can->SaveAs((htmlDir + "hbhe_laser_timing_rms_distribution.gif").c_str());
01076   htmlFile << "<td align=\"center\"><img src=\"hbhe_laser_timing_distribution.gif\" alt=\"hbhe laser timing distribution\">   </td>" << endl;
01077   htmlFile << "<td align=\"center\"><img src=\"hbhe_laser_timing_rms_distribution.gif\" alt=\"hbhe laser timing rms distribution\">   </td>" << endl;
01078   htmlFile << "</tr>" << endl;
01079 
01080   htmlFile << "<tr align=\"left\">" << endl;  
01081   hoEnergy->Draw();    can->SaveAs((htmlDir + "ho_laser_energy_distribution.gif").c_str());
01082   hoEnergyRMS->Draw(); can->SaveAs((htmlDir + "ho_laser_energy_rms_distribution.gif").c_str());
01083   htmlFile << "<td align=\"center\"><img src=\"ho_laser_energy_distribution.gif\" alt=\"ho laser energy distribution\">   </td>" << endl;
01084   htmlFile << "<td align=\"center\"><img src=\"ho_laser_energy_rms_distribution.gif\" alt=\"ho laser energy rms distribution\">   </td>" << endl;
01085   htmlFile << "</tr>" << endl;
01086   htmlFile << "<tr align=\"left\">" << endl;
01087   hoTiming->Draw();    can->SaveAs((htmlDir + "ho_laser_timing_distribution.gif").c_str());
01088   hoTimingRMS->Draw(); can->SaveAs((htmlDir + "ho_laser_timing_rms_distribution.gif").c_str());
01089   htmlFile << "<td align=\"center\"><img src=\"ho_laser_timing_distribution.gif\" alt=\"ho laser timing distribution\">   </td>" << endl;
01090   htmlFile << "<td align=\"center\"><img src=\"ho_laser_timing_rms_distribution.gif\" alt=\"ho laser timing rms distribution\">   </td>" << endl;
01091   
01092   htmlFile << "</tr>" << endl;
01093   htmlFile << "<tr align=\"left\">" << endl;  
01094   hfEnergy->Draw();    can->SaveAs((htmlDir + "hf_laser_energy_distribution.gif").c_str());
01095   hfEnergyRMS->Draw(); can->SaveAs((htmlDir + "hf_laser_energy_rms_distribution.gif").c_str());
01096   htmlFile << "<td align=\"center\"><img src=\"hf_laser_energy_distribution.gif\" alt=\"hf laser energy distribution\">   </td>" << endl;
01097   htmlFile << "<td align=\"center\"><img src=\"hf_laser_energy_rms_distribution.gif\" alt=\"hf laser energy rms distribution\">   </td>" << endl;
01098   htmlFile << "</tr>" << endl;
01099   htmlFile << "<tr align=\"left\">" << endl;
01100   hfTiming->Draw();    can->SaveAs((htmlDir + "hf_laser_timing_distribution.gif").c_str());
01101   hfTimingRMS->Draw(); can->SaveAs((htmlDir + "hf_laser_timing_rms_distribution.gif").c_str());
01102   htmlFile << "<td align=\"center\"><img src=\"hf_laser_timing_distribution.gif\" alt=\"hf laser timing distribution\">   </td>" << endl;
01103   htmlFile << "<td align=\"center\"><img src=\"hf_laser_timing_rms_distribution.gif\" alt=\"hf laser timing rms distribution\">   </td>" << endl;
01104   htmlFile << "</tr>" << endl;
01105   
01106   can->SetBottomMargin(0.2);  
01107   if(hb->GetEntries()>0)hb->Draw("P");else hb->Draw(); can->SaveAs((htmlDir + "hb_rbx_timing1D.gif").c_str());
01108   if(he->GetEntries()>0)he->Draw("P");else he->Draw(); can->SaveAs((htmlDir + "he_rbx_timing1D.gif").c_str());
01109   if(ho->GetEntries()>0)ho->Draw("P");else ho->Draw(); can->SaveAs((htmlDir + "ho_rbx_timing1D.gif").c_str());
01110   if(hf->GetEntries()>0)hf->Draw("P");else hf->Draw(); can->SaveAs((htmlDir + "hf_rbx_timing1D.gif").c_str());  
01111 
01112   htmlFile << "</table>" << endl;
01113 
01114   htmlFile << "</body> " << endl;
01115   htmlFile << "</html> " << endl;
01116   can->Close();
01118   htmlFile.close();
01119   return;
01120 }
01121