| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

DarkNoiseHistogram.cc

Go to the documentation of this file.
00001 #include "DarkNoiseHistogram.h"
00002 #include "Event/ReadoutHeader.h"
00003 #include "Event/ReadoutPmtCrate.h"
00004 
00005 #include "GaudiKernel/MsgStream.h"
00006 #include "GaudiKernel/IHistogramSvc.h"
00007 #include "GaudiKernel/SmartDataPtr.h"
00008 #include "GaudiKernel/DataObject.h"
00009 #include "GaudiKernel/ITHistSvc.h"
00010 
00011 #include <iomanip>
00012 #include "TLine.h"
00013 #include "TF1.h"
00014 #include "TMath.h"
00015 using namespace std;
00016 using namespace DayaBay;
00017 
00018 DarkNoiseHistogram::DarkNoiseHistogram(const string& name, ISvcLocator* svcloc)
00019   : GaudiAlgorithm(name, svcloc)
00020   , m_log(msgSvc(), name)
00021 {
00022   declareProperty("Strategy", m_Strategy=0);
00023 }
00024 
00025 DarkNoiseHistogram::~DarkNoiseHistogram()
00026 {
00027 }
00028 
00029 StatusCode DarkNoiseHistogram::initialize()
00030 {
00031   m_log << MSG::DEBUG << "initialize()" << endreq;
00032   
00033   StatusCode status;
00034   status = service("THistSvc", m_thistsvc);
00035   if(status.isFailure() ){
00036     m_log << MSG::INFO << "Unable to retrieve pointer to THistSvc" << endreq;
00037     return status;
00038   }
00039 
00040   string path;
00041   ostringstream   oss1[NBOARD][NCHANNEL],oss2[NBOARD][NCHANNEL];
00042   for(int i=0; i<NBOARD; i++){
00043     if(i<5||i>17) continue;
00044     for(int j=0; j<NCHANNEL; j++){
00045       path="/DQMHist/Raw/";
00046       oss1[i][j]<<setw(2)<<setfill('0')<<i;
00047       oss2[i][j]<<setw(2)<<setfill('0')<<j;
00048       string hname = "h_DarkNoise_"+oss1[i][j].str()+"_"+oss2[i][j].str();
00049       h_DarkNoise[i][j] = new TH1F(hname.c_str(),hname.c_str(),250,-50,200);
00050       status = m_thistsvc->regHist((path+hname).c_str(),h_DarkNoise[i][j]);
00051       
00052       m_DarkRate[i][j] = 0;
00053     }
00054   }
00055   m_NTrigger = 0;
00056 
00057   //h_sum_Gain = new TH1F("h_sum_Gain","h_Gain",300,0,300);
00058   h_sum_DarkRate = new TH1F("h_sum_DarkRate","h_DarkRate",300,0,300);
00059   //h_sum_DarkRate = new TProfile("h_sum_DarkRate","h_DarkRate",300,0,300,0,30);
00060   h_sum_DarkNoise = new TProfile("h_sum_DarkNoise","h_sum_DarkNoise",300,0,300,0,300);
00061   //status = m_thistsvc->regHist("/DQMHist/Raw/h_sum_Gain", h_sum_Gain);
00062   status = m_thistsvc->regHist("/DQMHist/Raw/h_sum_DarkRate", h_sum_DarkRate);
00063   status = m_thistsvc->regHist("/DQMHist/Raw/h_sum_DarkNoise", h_sum_DarkNoise);
00064   if(status.isFailure()){
00065     m_log << MSG::INFO << "Unable to regist histograms" << endreq;
00066     return status;
00067   }
00068   return StatusCode::SUCCESS;
00069 }
00070 
00071 StatusCode DarkNoiseHistogram::execute()
00072 {
00073   m_log << MSG::DEBUG << "execute()" << endreq;
00074 
00075   ReadoutHeader* roh = get<ReadoutHeader>("/Event/Readout/ReadoutHeader");
00076   if (roh == 0) {
00077     m_log << MSG::ERROR << "Cannot find readouth header." << endreq;
00078     return StatusCode::FAILURE;
00079   }
00080 
00081   m_log << MSG::DEBUG << "Readout: " << (Readout)(*(roh->readout())) << endreq;
00082 
00083   Readout* readout = const_cast<Readout*>(roh->readout());
00084   ReadoutPmtCrate* crate = dynamic_cast<ReadoutPmtCrate*>(readout);
00085   ReadoutPmtCrate::PmtChannelReadouts channels = crate->channelReadout();
00086   m_log << MSG::DEBUG << "#channels=" << crate->channelReadout().size()  << endreq;
00087   ReadoutPmtCrate::PmtChannelReadouts::iterator it;
00088   for (it=channels.begin(); it != channels.end(); it++) {
00089     m_log << MSG::DEBUG << it->first << " => " << it->second  << endreq;
00090     
00091     int board=it->second.channelId().board();
00092     int channel=it->second.channelId().connector()-1;
00093     //cout << "board:" << board << " channel:" << channel << endl;
00094 
00095     int firsthit[NBOARD][NCHANNEL];
00096     for(int i=0; i<NBOARD; i++){
00097       if(i<5||i>17) continue;
00098       for(int j=0; j<NCHANNEL; j++){
00099         firsthit[i][j] = 1;
00100       }
00101     }
00102 
00103     long fee_charge;
00104     unsigned long fee_time;
00105     for(int i=0;i<it->second.size();i++){
00106       fee_charge=it->second.adc(i);           
00107       fee_time=it->second.tdc(i);
00108 
00109       if(fee_time>1070 && fee_time<1170){//select dark noise before trigger
00110         m_DarkRate[board][channel]++;
00111       }
00112 
00113       if(it->second.peakAdcRange(i)==FeeGain::kLow) {
00114         fee_charge = (it->second.adc(i)-it->second.pedestal(i))*20;
00115       } else {
00116         fee_charge = it->second.adc(i)-it->second.pedestal(i);
00117       }
00118       if(fee_time>1050){//select dark noise before trigger
00119         h_DarkNoise[board][channel]->Fill(fee_charge);          
00120   h_sum_DarkNoise->Fill(board*16+channel,fee_charge);
00121       }
00122       if(m_Strategy==1){//include first hits after trigger
00123         if(firsthit[board][channel]&&fee_time<800){
00124           h_DarkNoise[board][channel]->Fill(fee_charge);
00125         }       
00126       }
00127 
00128       //after first hit
00129       firsthit[board][channel] = 0;
00130     }
00131 
00132   }
00133   m_NTrigger++;
00134 
00135   return StatusCode::SUCCESS;
00136 }
00137 
00138 StatusCode DarkNoiseHistogram::finalize()
00139 {
00140   //each Tdc corresponding 1.5625ns
00141   double timeinterval = m_NTrigger*100*1.5625*1e-9;
00142   cout << "Time interval " << timeinterval << endl;
00143 
00144   m_log << MSG::DEBUG << "finalize()" << endreq;
00145   m_log << MSG::INFO << "# of triggers: " << m_NTrigger << endreq;
00146 
00147   TF1 *f1 = new TF1("f1", "gaus", 0, 200);
00148   for(int i=0; i<NBOARD;i++){       
00149     if(i<5||i>17) continue;
00150     for(int j=0; j<NCHANNEL; j++){       
00151       double darkrate = m_DarkRate[i][j]/timeinterval;
00152       double darkrate_err = TMath::Sqrt(m_DarkRate[i][j])/timeinterval;
00153       int id = i*16+j;
00154       if(darkrate>30000){//set maximum 30000
00155         //h_sum_DarkRate->SetBinContent(id,30000); 
00156         //h_sum_DarkRate->SetBinError(id,1000);
00157   //h_sum_DarkRate->Fill(id,30);
00158         h_sum_DarkRate->SetBinContent(id,30); 
00159         h_sum_DarkRate->SetBinError(id,1);
00160 
00161         m_log << MSG::INFO << "Dark Rate of (board, channel):(" 
00162               << i << "," << j 
00163               << ") is larger than 30K Hz! Set to 30K Hz in histogram." 
00164               << endreq; 
00165       }
00166       else{
00167   //h_sum_DarkRate->Fill(id,darkrate/1000.);
00168         h_sum_DarkRate->SetBinContent(id,darkrate/1000.); 
00169         h_sum_DarkRate->SetBinError(id,darkrate_err/1000.); 
00170   //cout << darkrate << "," << darkrate_err << ","
00171   //  << h_sum_DarkRate->GetBinContent(id) << "," 
00172   //  << h_sum_DarkRate->GetBinError(id) << endl;
00173 
00174         if(darkrate>10000){
00175           m_log << MSG::INFO << "Dark Rate of (board, channel):(" 
00176                 << i << "," << j << ") is " << darkrate << " Hz."
00177                 << endreq; 
00178         }
00179       }
00180       //------fit the gain-----------------
00181 //      double gain = 0;
00182 //      double gain_err = 0;
00183 //      double nentry = h_DarkNoise[i][j]->GetEntries();
00184 //      if(nentry<100){
00185 //      m_log << MSG::INFO << "Only " << nentry 
00186 //            << " entries, skip the gain fit."
00187 //            << endreq;        
00188 //      }
00189 //      else{
00190 //        double maxx = -50+h_DarkNoise[i][j]->GetMaximumBin();
00191 //      //f1->SetRange(maxx-10, maxx+12);
00192 //        f1->SetParameters(20, 7);
00193 //        f1->SetLineColor(2);
00194 //        h_DarkNoise[i][j]->Fit("f1", "R");
00195 //
00196 //      gain = f1->GetParameter(1);
00197 //      gain_err = f1->GetParError(1);
00198 //      }
00199 //      if(gain>50||gain<0){//something wrong
00200 //      h_sum_Gain->SetBinContent(id,0);
00201 //      h_sum_Gain->SetBinError(id,0);
00202 //      }
00203 //      else{
00204 //      h_sum_Gain->SetBinContent(id,gain);
00205 //      h_sum_Gain->SetBinError(id,gain_err);
00206 //      }
00207     }
00208   }
00209 //  h_sum_Gain->SetXTitle("board*16+channel");
00210 //  h_sum_Gain->SetYTitle("Adc/PE");
00211 //  h_sum_Gain->SetMaximum(50);
00212 //  h_sum_Gain->SetMinimum(0);
00213 
00214   h_sum_DarkRate->SetXTitle("board*16+channel");
00215   h_sum_DarkRate->SetYTitle("Dark Rate (kHz)");
00216   h_sum_DarkRate->SetMaximum(31);
00217   h_sum_DarkRate->SetMinimum(0);
00218   h_sum_DarkRate->GetXaxis()->SetRangeUser(80,280);
00219   
00220   h_sum_DarkNoise->SetXTitle("board*16+channel");
00221   h_sum_DarkNoise->SetYTitle("Dark Noise (ADC)");
00222   h_sum_DarkNoise->SetMinimum(0);
00223   h_sum_DarkNoise->GetXaxis()->SetRangeUser(80,280);
00224   
00225   delete f1;
00226   return StatusCode::SUCCESS;
00227 }
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:26:19 2011 for DQMRawData by doxygen 1.4.7