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
00058 h_sum_DarkRate = new TH1F("h_sum_DarkRate","h_DarkRate",300,0,300);
00059
00060 h_sum_DarkNoise = new TProfile("h_sum_DarkNoise","h_sum_DarkNoise",300,0,300,0,300);
00061
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
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){
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){
00119 h_DarkNoise[board][channel]->Fill(fee_charge);
00120 h_sum_DarkNoise->Fill(board*16+channel,fee_charge);
00121 }
00122 if(m_Strategy==1){
00123 if(firsthit[board][channel]&&fee_time<800){
00124 h_DarkNoise[board][channel]->Fill(fee_charge);
00125 }
00126 }
00127
00128
00129 firsthit[board][channel] = 0;
00130 }
00131
00132 }
00133 m_NTrigger++;
00134
00135 return StatusCode::SUCCESS;
00136 }
00137
00138 StatusCode DarkNoiseHistogram::finalize()
00139 {
00140
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){
00155
00156
00157
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
00168 h_sum_DarkRate->SetBinContent(id,darkrate/1000.);
00169 h_sum_DarkRate->SetBinError(id,darkrate_err/1000.);
00170
00171
00172
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
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207 }
00208 }
00209
00210
00211
00212
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 }