00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00020
00024
00028
00032
00036
00040
00045
00046
00047 #include <stdio.h>
00048 #include <stdlib.h>
00049 #include <string>
00050 #include <map>
00051 #include <utility>
00052 #include <sstream>
00053 #include <cmath>
00054
00055
00056 #include "midas.h"
00057
00058
00059 #include "../muSC_muPC/common.h"
00060
00061
00062 #include <TH1.h>
00063 #include <TDirectory.h>
00064
00065
00066 #include "TGlobalData.h"
00067 #include "TSetupData.h"
00068 #include "TPulseIsland.h"
00069
00070 using std::string;
00071 using std::map;
00072 using std::vector;
00073 using std::pair;
00074
00075
00076 INT MDQ_TDCCheck_init(void);
00077 INT MDQ_TDCCheck(EVENT_HEADER*, void*);
00078 INT MDQ_TDCCheck_eor(INT);
00079
00080 extern HNDLE hDB;
00081 extern TGlobalData* gData;
00082 extern TSetupData* gSetup;
00083
00084 TH1F* hDQ_TDCCheck_muSc;
00085 TH1F* hDQ_TDCCheck_muScA;
00086 TH1F* hDQ_TDCCheck_muPC;
00087 TH1F* hDQ_TDCCheck_Unknown;
00088
00089 TH1F* hDQ_TDCCheck_muSc_time;
00090 TH1F* hDQ_TDCCheck_muSc_rate;
00091 TH1F* hDQ_TDCCheck_TDiff;
00092
00093
00094 ANA_MODULE MDQ_TDCCheck_module =
00095 {
00096 "MDQ_TDCCheck",
00097 "Andrew Edmonds",
00098 MDQ_TDCCheck,
00099 NULL,
00100 MDQ_TDCCheck_eor,
00101 MDQ_TDCCheck_init,
00102 NULL,
00103 NULL,
00104 0,
00105 NULL,
00106 };
00107
00110 INT MDQ_TDCCheck_init()
00111 {
00112
00113 if (!gDirectory->Cd("DataQuality_LowLevel")) {
00114
00115 std::string dir_name("DataQuality_LowLevel/");
00116 gDirectory->mkdir(dir_name.c_str());
00117 gDirectory->Cd(dir_name.c_str());
00118 }
00119
00120
00121 hDQ_TDCCheck_muSc = new TH1F("hDQ_TDCCheck_muSc", "Number of Hits in TDC (muSc)", 3,0,3);
00122 hDQ_TDCCheck_muSc->GetXaxis()->SetTitle("muSc");
00123 hDQ_TDCCheck_muSc->GetYaxis()->SetTitle("Number of Hits");
00124
00125 hDQ_TDCCheck_muScA = new TH1F("hDQ_TDCCheck_muScA", "Number of Hits in TDC (muScA)", 3,0,3);
00126 hDQ_TDCCheck_muScA->GetXaxis()->SetTitle("muScA");
00127 hDQ_TDCCheck_muScA->GetYaxis()->SetTitle("Number of Hits");
00128
00129 hDQ_TDCCheck_muPC = new TH1F("hDQ_TDCCheck_muPC", "Number of Hits in TDC (muPC)", 3,0,3);
00130 hDQ_TDCCheck_muPC->GetXaxis()->SetTitle("muPC");
00131 hDQ_TDCCheck_muPC->GetYaxis()->SetTitle("Number of Hits");
00132
00133 hDQ_TDCCheck_Unknown = new TH1F("hDQ_TDCCheck_Unknown", "Number of Hits in TDC (Unknown)", 7000,0,7000);
00134 hDQ_TDCCheck_Unknown->GetXaxis()->SetTitle("TDC Parameter");
00135 hDQ_TDCCheck_Unknown->GetYaxis()->SetTitle("Number of Hits");
00136
00137 hDQ_TDCCheck_muSc_time = new TH1F("hDQ_TDCCheck_muSc_time", "Time of TDC Hits in muSc", 1200,0,120e6);
00138 hDQ_TDCCheck_muSc_time->GetXaxis()->SetTitle("Time of muSc Hit [ns]");
00139 hDQ_TDCCheck_muSc_time->GetYaxis()->SetTitle("Number of Hits");
00140
00141 hDQ_TDCCheck_muSc_rate = new TH1F("hDQ_TDCCheck_muSc_rate", "Rate of TDC Hits in muSc", 3,0,3);
00142 hDQ_TDCCheck_muSc_rate->GetXaxis()->SetTitle("muSc");
00143 hDQ_TDCCheck_muSc_rate->GetYaxis()->SetTitle("Rate of muSc Hit [s^-1]");
00144
00145 hDQ_TDCCheck_TDiff = new TH1F("hDQ_TDCCheck_TDiff", "Time difference between muSc hit in TDC and BU", 10000,-5000,5000);
00146 hDQ_TDCCheck_TDiff->GetXaxis()->SetTitle("Time Difference of muSc Hits (BU CAEN - TDC)");
00147 hDQ_TDCCheck_TDiff->GetYaxis()->SetTitle("Number of Hits");
00148
00149 gDirectory->Cd("/MidasHists/");
00150 return SUCCESS;
00151 }
00152
00155 INT MDQ_TDCCheck_eor(INT run_number) {
00156
00157
00158 HNDLE hDB, hKey;
00159 char keyName[200];
00160
00161 if(cm_get_experiment_database(&hDB, NULL) != CM_SUCCESS){
00162 printf("Warning: Could not connect to ODB database!\n");
00163 return false;
00164 }
00165
00166 sprintf(keyName, "/Runinfo/Start time binary");
00167 if(db_find_key(hDB,0,keyName, &hKey) != SUCCESS){
00168 printf("Warning: Could not find key %s\n", keyName);
00169 return false;
00170 }
00171 KEY start_time_key;
00172 if(db_get_key(hDB, hKey, &start_time_key) != DB_SUCCESS){
00173 printf("Warning: Could not find key %s\n", keyName);
00174 return false;
00175 }
00176 DWORD StartTimes[start_time_key.num_values];
00177 int size = sizeof(StartTimes);
00178 if(db_get_value(hDB, 0, keyName, StartTimes, &size, TID_DWORD, 0) != DB_SUCCESS){
00179 printf("Warning: Could not retrieve values for key %s\n", keyName);
00180 return false;
00181 }
00182
00183 sprintf(keyName, "/Runinfo/Stop time binary");
00184 if(db_find_key(hDB,0,keyName, &hKey) != SUCCESS){
00185 printf("Warning: Could not find key %s\n", keyName);
00186 return false;
00187 }
00188 KEY stop_time_key;
00189 if(db_get_key(hDB, hKey, &stop_time_key) != DB_SUCCESS){
00190 printf("Warning: Could not find key %s\n", keyName);
00191 return false;
00192 }
00193 DWORD StopTimes[stop_time_key.num_values];
00194 size = sizeof(StopTimes);
00195 if(db_get_value(hDB, 0, keyName, StopTimes, &size, TID_DWORD, 0) != DB_SUCCESS){
00196 printf("Warning: Could not retrieve values for key %s\n", keyName);
00197 return false;
00198 }
00199
00200 int duration = StopTimes[0] - StartTimes[0];
00201
00202 hDQ_TDCCheck_muSc_rate->Scale(1.0/duration);
00203
00204 return SUCCESS;
00205 }
00206
00209 INT MDQ_TDCCheck(EVENT_HEADER *pheader, void *pevent)
00210 {
00211
00212 int midas_event_number = pheader->serial_number;
00213
00214
00215 typedef map<string, vector<TPulseIsland*> > TStringPulseIslandMap;
00216 typedef pair<string, vector<TPulseIsland*> > TStringPulseIslandPair;
00217 typedef map<string, vector<TPulseIsland*> >::iterator map_iterator;
00218
00219
00220
00221 TStringPulseIslandMap& pulse_islands_map =
00222 gData->fPulseIslandToChannelMap;
00223
00224
00225
00226 channel_hit *hit_bank;
00227 int hit_bank_size = bk_locate(pevent, "HITS", (DWORD *) &hit_bank);
00228 hit_bank_size = hit_bank_size * sizeof(DWORD) / sizeof(channel_hit);
00229
00230
00231
00232 for (int i = 0; i < hit_bank_size; ++i) {
00233 if (hit_bank[i].parameter == 6011) {
00234
00235 hDQ_TDCCheck_muSc->Fill(1);
00236 hDQ_TDCCheck_muSc_time->Fill(hit_bank[i].time);
00237 hDQ_TDCCheck_muSc_rate->Fill(1);
00238
00239
00240 std::string detname = "muSc";
00241 std::string bankname = gSetup->GetBankName(detname);
00242 std::vector<TPulseIsland*> theMuScPulses = pulse_islands_map[bankname];
00243
00244
00245 for (std::vector<TPulseIsland*>::iterator pulseIter = theMuScPulses.begin(); pulseIter != theMuScPulses.end(); ++pulseIter) {
00246
00247
00248 int time_stamp = (*pulseIter)->GetTimeStamp();
00249 double clock_tick_in_ns = (*pulseIter)->GetClockTickInNs();
00250 double block_time = time_stamp * clock_tick_in_ns;
00251
00252 hDQ_TDCCheck_TDiff->Fill(block_time - hit_bank[i].time);
00253 }
00254 }
00255
00256 else if (hit_bank[i].parameter == 6002)
00257
00258 hDQ_TDCCheck_muScA->Fill(1);
00259
00260 else if (hit_bank[i].parameter >= 4001 && hit_bank[i].parameter <= 4074)
00261
00262 hDQ_TDCCheck_muPC->Fill(1);
00263 else
00264
00265 hDQ_TDCCheck_Unknown->Fill(hit_bank[i].parameter);
00266 }
00267
00268 return SUCCESS;
00269 }
00270