00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00020
00026
00031
00037
00038
00039 #include <stdio.h>
00040 #include <stdlib.h>
00041 #include <string>
00042 #include <map>
00043 #include <utility>
00044 #include <sstream>
00045 #include <cmath>
00046
00047
00048 #include "midas.h"
00049
00050
00051 #include <TH1.h>
00052 #include <TH2.h>
00053 #include <TDirectory.h>
00054
00055
00056 #include "TGlobalData.h"
00057 #include "TSetupData.h"
00058 #include "TPulseIsland.h"
00059
00060 using std::string;
00061 using std::map;
00062 using std::vector;
00063 using std::pair;
00064
00065
00066 INT MDQ_DigitizerOverflow_init(void);
00067 INT MDQ_DigitizerOverflow(EVENT_HEADER*, void*);
00068 INT MDQ_DigitizerOverflow_eor(INT);
00069
00070 extern HNDLE hDB;
00071 extern TGlobalData* gData;
00072 extern TSetupData* gSetup;
00073
00074 static TH2* hDQ_DigitizerOverflow_FractionByEvent;
00075 static TH2* hDQ_DigitizerOverflow_TotalByEvent;
00076 static TH1* hDQ_DigitizerOverflow_Fraction;
00077 static TH1* hDQ_DigitizerOverflow_Total;
00078
00079 ANA_MODULE MDQ_DigitizerOverflow_module =
00080 {
00081 "MDQ_DigitizerOverflow",
00082 "Joe Grange",
00083 MDQ_DigitizerOverflow,
00084 NULL,
00085 MDQ_DigitizerOverflow_eor,
00086 MDQ_DigitizerOverflow_init,
00087 NULL,
00088 NULL,
00089 0,
00090 NULL,
00091 };
00092
00095 INT MDQ_DigitizerOverflow_init()
00096 {
00097
00098 if (!gDirectory->Cd("DataQuality_LowLevel")) {
00099
00100 std::string dir_name("DataQuality_LowLevel/");
00101 gDirectory->mkdir(dir_name.c_str());
00102 gDirectory->Cd(dir_name.c_str());
00103 }
00104
00105
00106 char key_name[80];
00107 int size,run_number;
00108 sprintf(key_name, "Runinfo/Run number");
00109 size=sizeof(int);
00110 db_get_value(hDB,0,key_name, &run_number, &size, TID_INT,1);
00111
00112
00113 hDQ_DigitizerOverflow_Fraction = new TH1D("hDQ_DigitizerOverflow_Fraction",Form("Fraction of TPIs with at least one overflow sample value, run %d",run_number),1,0,1);
00114 hDQ_DigitizerOverflow_Fraction->SetBit(TH1::kCanRebin);
00115 hDQ_DigitizerOverflow_Fraction->GetXaxis()->SetTitle("Bank (Detector)");
00116 hDQ_DigitizerOverflow_Fraction->GetYaxis()->SetTitle("Fraction of TPIs with overflow samples");
00117
00118 hDQ_DigitizerOverflow_Total = new TH1D("hDQ_DigitizerOverflow_Total", "Total number of TPIs (for normalization)",1,0,1);
00119 hDQ_DigitizerOverflow_Total->SetBit(TH1::kCanRebin);
00120 hDQ_DigitizerOverflow_Total->GetXaxis()->SetTitle("Bank (Detector)");
00121 hDQ_DigitizerOverflow_Total->GetYaxis()->SetTitle("Number of TPIs with overflow samples");
00122
00123 hDQ_DigitizerOverflow_FractionByEvent = new TH2D("hDQ_DigitizerOverflow_FractionByEvent", Form("Fraction of TPIs with at least one sample overflow value, run %d",run_number),1,0,1, 5000,0,5000);
00124 hDQ_DigitizerOverflow_FractionByEvent->SetBit(TH1::kCanRebin);
00125 hDQ_DigitizerOverflow_FractionByEvent->GetXaxis()->SetTitle("Bank (Detector)");
00126 hDQ_DigitizerOverflow_FractionByEvent->GetYaxis()->SetTitle("MIDAS event number");
00127
00128 hDQ_DigitizerOverflow_TotalByEvent = new TH2I("hDQ_DigitizerOverflow_TotalByEvent", "Total number of TPIs (for normalization)",1,0,1, 5000,0,5000);
00129 hDQ_DigitizerOverflow_TotalByEvent->SetBit(TH1::kCanRebin);
00130 hDQ_DigitizerOverflow_TotalByEvent->GetXaxis()->SetTitle("Bank (Detector)");
00131 hDQ_DigitizerOverflow_TotalByEvent->GetYaxis()->SetTitle("MIDAS event number");
00132
00133
00134
00135 std::map<std::string, std::string> bank_to_detector_map = gSetup->fBankToDetectorMap;
00136 for(std::map<std::string, std::string>::iterator mapIter = bank_to_detector_map.begin();
00137 mapIter != bank_to_detector_map.end(); mapIter++) {
00138
00139 std::string bankname = mapIter->first;
00140 std::string detname = gSetup->GetDetectorName(bankname);
00141 std::string binname = bankname + "(" + detname + ")";
00142
00143 hDQ_DigitizerOverflow_Fraction->Fill(binname.c_str(), 0);
00144 hDQ_DigitizerOverflow_Total->Fill(binname.c_str(), 0);
00145 hDQ_DigitizerOverflow_FractionByEvent->Fill(binname.c_str(), 0.0, 0.0);
00146 hDQ_DigitizerOverflow_TotalByEvent->Fill(binname.c_str(), 0.0, 0.0);
00147 }
00148
00149 gDirectory->Cd("/MidasHists/");
00150 return SUCCESS;
00151 }
00152
00155 INT MDQ_DigitizerOverflow(EVENT_HEADER *pheader, void *pevent)
00156 {
00157
00158 int midas_event_number = pheader->serial_number;
00159
00160 bool pulse_overflow = 0;
00161 int overflow_value = 0;
00162
00163
00164 typedef map<string, vector<TPulseIsland*> > TStringPulseIslandMap;
00165 typedef pair<string, vector<TPulseIsland*> > TStringPulseIslandPair;
00166 typedef map<string, vector<TPulseIsland*> >::iterator map_iterator;
00167
00168
00169
00170 TStringPulseIslandMap& pulse_islands_map =
00171 gData->fPulseIslandToChannelMap;
00172
00173
00174 for (map_iterator mapIter = pulse_islands_map.begin(); mapIter != pulse_islands_map.end(); ++mapIter)
00175 {
00176 std::string bankname = mapIter->first;
00177 std::string detname = gSetup->GetDetectorName(bankname);
00178 std::vector<TPulseIsland*> thePulses = mapIter->second;
00179
00180 int n_bits = gSetup->GetNBits(bankname);
00181 overflow_value = std::pow(2, n_bits) - 1;
00182
00183
00184 for (std::vector<TPulseIsland*>::iterator pulseIter = thePulses.begin(); pulseIter != thePulses.end(); ++pulseIter) {
00185
00186 pulse_overflow = 0;
00187
00188
00189 const std::vector<int>& theSamples = (*pulseIter)->GetSamples();
00190 for (std::vector<int>::const_iterator sampleIter = theSamples.begin(); sampleIter != theSamples.end(); ++sampleIter){
00191 int sample_number = sampleIter - theSamples.begin();
00192 int sample_value = *sampleIter;
00193
00194 if (sample_value >= overflow_value){
00195
00196 pulse_overflow = 1;
00197
00198 }
00199
00200
00201 std::string binname = bankname + "(" + detname + ")";
00202 hDQ_DigitizerOverflow_Total->Fill(binname.c_str(),1);
00203 hDQ_DigitizerOverflow_TotalByEvent->Fill(binname.c_str(),midas_event_number,1);
00204 if ((pulse_overflow)){
00205 hDQ_DigitizerOverflow_Fraction->Fill(binname.c_str(),1);
00206 hDQ_DigitizerOverflow_FractionByEvent->Fill(binname.c_str(),midas_event_number,1);
00207
00208 }
00209
00210 }
00211 }
00212 }
00213
00214 return SUCCESS;
00215 }
00216
00219 INT MDQ_DigitizerOverflow_eor(INT run_number) {
00220
00221
00222 int nBanksTotal = hDQ_DigitizerOverflow_Total->GetNbinsX();
00223 int nBanksOverflow = hDQ_DigitizerOverflow_Fraction->GetNbinsX();
00224 int nMidasEvents = hDQ_DigitizerOverflow_FractionByEvent->GetNbinsY();
00225 int nOverflow = 0;
00226 int nTotal = 0;
00227
00228
00229 for (int i=1; i<=nBanksTotal; i++){
00230
00231 for (int j=1; j<=nBanksOverflow; j++){
00232
00233 if (strcmp(hDQ_DigitizerOverflow_Total->GetXaxis()->GetBinLabel(i),hDQ_DigitizerOverflow_Fraction->GetXaxis()->GetBinLabel(j))==0){
00234 nOverflow = 0;
00235 nOverflow = hDQ_DigitizerOverflow_Fraction->GetBinContent(j);
00236 nTotal = 0;
00237 nTotal = hDQ_DigitizerOverflow_Total->GetBinContent(i);
00238
00239
00240 if (nTotal>0) hDQ_DigitizerOverflow_Fraction->SetBinContent(j,(double)nOverflow/nTotal);
00241
00242 for (int k=1; k<nMidasEvents; k++){
00243 nOverflow = 0;
00244 nOverflow = hDQ_DigitizerOverflow_FractionByEvent->GetBinContent(j,k);
00245 nTotal = 0;
00246 nTotal = hDQ_DigitizerOverflow_TotalByEvent->GetBinContent(i,k);
00247 if (nTotal>0 && nOverflow>0){
00248 hDQ_DigitizerOverflow_FractionByEvent->SetBinContent(j,k,(double)nOverflow/nTotal);
00249
00250 }
00251 }
00252 }
00253 }
00254 }
00255
00256 return SUCCESS;
00257
00258 }
00259