00001
00002
00003
00004 #include "CalibDataHistogram.h"
00005 #include "Event/CalibReadoutHeader.h"
00006 #include "Event/CalibReadoutPmtCrate.h"
00007
00008 #include "GaudiKernel/MsgStream.h"
00009 #include "GaudiKernel/IHistogramSvc.h"
00010 #include "GaudiKernel/SmartDataPtr.h"
00011 #include "GaudiKernel/DataObject.h"
00012 #include "GaudiKernel/ITHistSvc.h"
00013
00014 #include "StatisticsSvc/IStatisticsSvc.h"
00015
00016 #include "TH1F.h"
00017 #include "TH2F.h"
00018 #include "TStyle.h"
00019 using namespace std;
00020 using namespace DayaBay;
00021 CalibDataHistogram::CalibDataHistogram(const string& name, ISvcLocator* svcloc)
00022 : GaudiAlgorithm(name, svcloc),m_statsSvc(0)
00023 {
00024 declareProperty("PrintFreq", m_printFreq=0);
00025 declareProperty("MaxTotalCharge", m_maxTotalCharge=10000.);
00026 declareProperty("MinChannelCharge", m_minCharge=0.);
00027 declareProperty("MaxChannelCharge", m_maxCharge=3000.);
00028 declareProperty("MinChannelTime", m_minTime=-2000.);
00029 declareProperty("MaxChannelTime", m_maxTime=-500.);
00030
00031
00032 for(int i=0;i!=DETNUMPLUS;i++)
00033 for(int j=0;j!=RINGPLUS;j++)
00034 for(int k=0;k!=COLUMNPLUS;k++)
00035 {
00036
00037 h_charge[i][j][k] = NULL;
00038 h_time[i][j][k] = NULL;
00039 }
00040
00041 for(int i=0;i!=DETNUMPLUS;i++)
00042 {
00043
00044 h_sum_FEEQSUM[i] = NULL;
00045 h_sum_Charge_PMT[i] = NULL;
00046 h_sum_Mean_Charge_PMT[i] = NULL;
00047 h_sum_RMS_Charge_PMT[i] = NULL;
00048 h_sum_Time_PMT[i] = NULL;
00049 h_sum_Mean_Time_PMT[i] = NULL;
00050 h_sum_RMS_Time_PMT[i] = NULL;
00051 h_sum_Charge_Ratio[i] = NULL;
00052 h_sum_Charge_Patton[i] = NULL;
00053 }
00054
00055 }
00056
00057 CalibDataHistogram::~CalibDataHistogram()
00058 {
00059 }
00060
00061 StatusCode CalibDataHistogram::initialize()
00062 {
00063 debug() << "initialize()" << endreq;
00064
00065
00066 StatusCode status;
00067
00068 status = service("StatisticsSvc", m_statsSvc, true);
00069
00070 if(status.isFailure() )
00071 {
00072 info() << "Unable to retrieve pointer to THistSvc" << endreq;
00073 return status;
00074 }
00075
00076 return StatusCode::SUCCESS;
00077 }
00078
00079 StatusCode CalibDataHistogram::finalize()
00080 {
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 debug() << MSG::DEBUG << "finalize()" << endreq;
00091
00092
00093
00094
00095
00096 return StatusCode::SUCCESS;
00097 }
00098
00099 StatusCode CalibDataHistogram::execute()
00100 {
00101 debug() << "execute() ______________________________ begin" << endreq;
00102
00103
00104 CalibReadoutHeader* croh = get<CalibReadoutHeader>("/Event/CalibReadout/CalibReadoutHeader");
00105 if (croh == 0)
00106 {
00107 error() << " =======> Requested Object can not be accessable." << endreq;
00108 return StatusCode::FAILURE;
00109 }
00110
00111 CalibReadout* calibReadout = const_cast<CalibReadout*>(croh->calibReadout());
00112 CalibReadoutPmtCrate* calibCrate = dynamic_cast<CalibReadoutPmtCrate*>(calibReadout);
00113 CalibReadoutPmtCrate::PmtChannelReadouts calibChannels = calibCrate->channelReadout();
00114
00115
00116 const DayaBay::Detector detector = calibReadout->detector();
00117
00118
00119
00120 double qsum = 0;
00121 double qmax = 0;
00122
00123 int ring = 0;
00124 int column = 0;
00125
00126 double pmtid = 0;
00127
00128 double sumCharge = 0;
00129 double earliestTime = 0;
00130
00131 CalibReadoutPmtCrate::PmtChannelReadouts::iterator it;
00132
00133 unsigned int DetId = detector.detectorId();
00134
00135 for (it=calibChannels.begin(); it != calibChannels.end(); it++)
00136 {
00137 AdPmtSensor sensorId(it->pmtSensorId().fullPackedData());
00138 ring = sensorId.ring();
00139 column = sensorId.column();
00140
00142 stringstream path;
00143 path<<"/file1/";
00144
00145 ostringstream ossSiteDetId;
00146 ossSiteDetId<<Site::AsString(detector.site())<<"/"<<DetectorId::AsString(detector.detectorId())<<"/";
00147
00148 ostringstream ossPmtRing,ossPmtColumn;
00149 ossPmtRing<<setw(2)<<setfill('0')<<ring;
00150 ossPmtColumn<<setw(2)<<setfill('0')<<column;
00151
00152 string pathDir = path.str()+ossSiteDetId.str();
00153
00154 string pathPmtRingColumn = "Ring"+ossPmtRing.str()+"_"+"Column"+ossPmtColumn.str()+"/";
00155
00156 string pathALL = pathDir+pathPmtRingColumn;
00157 string pathSumDir = pathDir+"Calib/";
00158
00159 if(h_charge[DetId][ring][column]==NULL)
00160 {
00161 h_charge[DetId][ring][column] = new TH1F("Charge","Charge",1000, 0, m_maxCharge);
00162 m_statsSvc->put((pathALL+"Charge").c_str(), h_charge[DetId][ring][column]);
00163
00164 h_time[DetId][ring][column] = new TH1F("Time","Time",1000, m_minTime, m_maxTime);
00165 m_statsSvc->put((pathALL+"Time").c_str(), h_time[DetId][ring][column]);
00166
00167
00168 }
00169
00170 if(h_sum_FEEQSUM[DetId]==NULL)
00171 {
00172 h_sum_FEEQSUM[DetId] = new TH1F("h_sum_FEEQSUM", "h_FEEQSUM", 5000 , 0, m_maxTotalCharge);
00173 m_statsSvc->put((pathSumDir+"h_sum_FEEQSUM").c_str(), h_sum_FEEQSUM[DetId]);
00174
00175
00176 h_sum_Charge_PMT[DetId] = new TH2F("h_sum_ChargePMT", "h_sum_ChargePMT",
00177 MAXRING*MAXCOLUMN, 0.5, MAXRING*MAXCOLUMN+0.5, 3000, 0, m_maxCharge);
00178 m_statsSvc->put((pathSumDir+"h_sum_ChargePMT").c_str(), h_sum_Charge_PMT[DetId]);
00179
00180
00181 h_sum_Mean_Charge_PMT[DetId] = new TH1F("h_sum_MeanChargePMT", "h_sum_MeanChargePMT",
00182 MAXRING*MAXCOLUMN, 0.5, MAXRING*MAXCOLUMN+0.5);
00183 m_statsSvc->put((pathSumDir+"h_sum_MeanChargePMT").c_str(), h_sum_Mean_Charge_PMT[DetId]);
00184
00185
00186 h_sum_RMS_Charge_PMT[DetId] = new TH1F("h_sum_RMSChargePMT", "h_sum_RMSChargePMT",
00187 MAXRING*MAXCOLUMN, 0.5, MAXRING*MAXCOLUMN+0.5);
00188 m_statsSvc->put((pathSumDir+"h_sum_RMSChargePMT").c_str(), h_sum_RMS_Charge_PMT[DetId]);
00189
00190
00191 h_sum_Time_PMT[DetId] = new TH2F("h_sum_TimePMT", "h_sum_TimePMT",
00192 MAXRING*MAXCOLUMN, 0.5, MAXRING*MAXCOLUMN+0.5, 1000, m_minTime, m_maxTime);
00193 m_statsSvc->put((pathSumDir+"h_sum_TimePMT").c_str(), h_sum_Time_PMT[DetId]);
00194
00195
00196 h_sum_Mean_Time_PMT[DetId] =new TH1F("h_sum_MeanTimePMT", "h_sum_MeanTimePMT",
00197 MAXRING*MAXCOLUMN, 0.5, MAXRING*MAXCOLUMN+0.5) ;
00198 m_statsSvc->put((pathSumDir+"h_sum_MeanTimePMT").c_str(), h_sum_Mean_Time_PMT[DetId]);
00199
00200
00201 h_sum_RMS_Time_PMT[DetId] = new TH1F("h_sum_RMSTimePMT", "h_sum_RMSTimePMT",
00202 MAXRING*MAXCOLUMN, 0.5, MAXRING*MAXCOLUMN+0.5);
00203 m_statsSvc->put((pathSumDir+"h_sum_RMSTimePMT").c_str(), h_sum_RMS_Time_PMT[DetId]);
00204
00205
00206 h_sum_Charge_Ratio[DetId] = new TH2F("h_sum_ChargeRatio", "h_sum_ChargeRatio",
00207 5000 , 0, m_maxTotalCharge, 1000, 0, 1);
00208 m_statsSvc->put((pathSumDir+"h_sum_ChargeRatio").c_str(), h_sum_Charge_Ratio[DetId]);
00209
00210
00211 h_sum_Charge_Patton[DetId] = new TH2F("h_sum_ChargePatton","h_sum_ChargePatton",49,0.25,24.75,19,-0.75,8.75);
00212 m_statsSvc->put((pathSumDir+"h_sum_ChargePatton").c_str(), h_sum_Charge_Patton[DetId]);
00213
00214
00215
00216 }
00217
00219
00220 if(ring==0)
00221 {
00222 pmtid = 192+column-1;
00223 }
00224 else
00225 {
00226 pmtid = (ring-1)*24+column-1;
00227 }
00228
00229 sumCharge = it->sumCharge();
00230 earliestTime = it->earliestTime();
00231
00232 if(sumCharge > qmax) qmax = sumCharge;
00233 qsum += sumCharge;
00234
00235 for(unsigned int i=0; i<it->size(); i++)
00236 {
00237
00238 h_charge[DetId][ring][column]->Fill(it->charge(i));
00239 h_time[DetId][ring][column]->Fill(it->time(i));
00240
00241 h_sum_Charge_PMT[DetId]->Fill(pmtid,it->charge(i));
00242 h_sum_Time_PMT[DetId]->Fill(pmtid,it->time(i));
00243
00244
00245
00246
00247
00248
00249 }
00250 }
00251
00252
00253 h_sum_FEEQSUM[DetId]->Fill(qsum);
00254 if(qsum>0) h_sum_Charge_Ratio[DetId]->Fill(qsum,qmax/qsum);
00255
00256 debug() << "execute() ______________________________ end" << endreq;
00257 return StatusCode::SUCCESS;
00258 }
00259