00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00016
00022
00023
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 #include <string>
00027 #include <map>
00028 #include <utility>
00029 #include <sstream>
00030 #include <cmath>
00031
00032
00033 #include "midas.h"
00034
00035
00036 #include <TH1.h>
00037 #include <TDirectory.h>
00038
00039
00040 #include "TGlobalData.h"
00041 #include "TSetupData.h"
00042 #include "TPulseIsland.h"
00043
00044 using std::string;
00045 using std::map;
00046 using std::vector;
00047 using std::pair;
00048
00049
00050 INT MDQ_IslandTimestamp_init(void);
00051 INT MDQ_IslandTimestamp(EVENT_HEADER*, void*);
00052 INT MDQ_IslandTimestamp_eor(INT);
00053
00054 extern HNDLE hDB;
00055 extern TGlobalData* gData;
00056 extern TSetupData* gSetup;
00057
00058 map <std::string, TH1F*> DQ_IslandTimestamp_histograms_map;
00059 map <std::string, TH1F*> DQ_IslandTimestamp_histograms_normalised_map;
00060
00061 extern TH1F* hDQ_TDCCheck_muSc;
00062
00063 ANA_MODULE MDQ_IslandTimestamp_module =
00064 {
00065 "MDQ_IslandTimestamp",
00066 "Andrew Edmonds",
00067 MDQ_IslandTimestamp,
00068 NULL,
00069 MDQ_IslandTimestamp_eor,
00070 MDQ_IslandTimestamp_init,
00071 NULL,
00072 NULL,
00073 0,
00074 NULL,
00075 };
00076
00079 INT MDQ_IslandTimestamp_init()
00080 {
00081
00082 if (!gDirectory->Cd("DataQuality_LowLevel")) {
00083
00084 std::string dir_name("DataQuality_LowLevel/");
00085 gDirectory->mkdir(dir_name.c_str());
00086 gDirectory->Cd(dir_name.c_str());
00087 }
00088
00089
00090 std::map<std::string, std::string> bank_to_detector_map = gSetup->fBankToDetectorMap;
00091 for(std::map<std::string, std::string>::iterator mapIter = bank_to_detector_map.begin();
00092 mapIter != bank_to_detector_map.end(); mapIter++) {
00093
00094 std::string bankname = mapIter->first;
00095 std::string detname = gSetup->GetDetectorName(bankname);
00096
00097 double bin_width = gSetup->GetClockTick(bankname) * 1000;
00098 double bin_max = 120e6;
00099 int n_bins = bin_max / bin_width;
00100
00101
00102 std::string histname = "hDQ_IslandTimestamp_" + detname + "_" + bankname;
00103 std::string histtitle = "Distribution of time stamps in " + detname;
00104 TH1F* hDQ_Histogram = new TH1F(histname.c_str(), histtitle.c_str(), n_bins, 0, bin_max);
00105 hDQ_Histogram->GetXaxis()->SetTitle("Time Stamp [ns]");
00106 hDQ_Histogram->GetYaxis()->SetTitle("Number of TPulseIslands");
00107 DQ_IslandTimestamp_histograms_map[bankname] = hDQ_Histogram;
00108
00109
00110 histname += "_normalised";
00111 histtitle += " (normalised)";
00112 TH1F* hDQ_Histogram_Normalised = new TH1F(histname.c_str(), histtitle.c_str(), n_bins,0,bin_max);
00113 hDQ_Histogram_Normalised->GetXaxis()->SetTitle("Time Stamp [ns]");
00114 std::string yaxislabel = hDQ_Histogram->GetYaxis()->GetTitle();
00115 yaxislabel += " per TDC muSc Hit";
00116 hDQ_Histogram_Normalised->GetYaxis()->SetTitle(yaxislabel.c_str());
00117 DQ_IslandTimestamp_histograms_normalised_map[bankname] = hDQ_Histogram_Normalised;
00118 }
00119
00120 gDirectory->Cd("/MidasHists/");
00121 return SUCCESS;
00122 }
00123
00124
00127 INT MDQ_IslandTimestamp_eor(INT run_number) {
00128
00129
00130 typedef map<string, vector<TPulseIsland*> > TStringPulseIslandMap;
00131 typedef pair<string, vector<TPulseIsland*> > TStringPulseIslandPair;
00132 typedef map<string, vector<TPulseIsland*> >::iterator map_iterator;
00133
00134
00135
00136 TStringPulseIslandMap& pulse_islands_map =
00137 gData->fPulseIslandToChannelMap;
00138
00139
00140 for (map_iterator mapIter = pulse_islands_map.begin(); mapIter != pulse_islands_map.end(); ++mapIter) {
00141
00142 std::string bankname = mapIter->first;
00143 std::string detname = gSetup->GetDetectorName(bankname);
00144
00145
00146 if (DQ_IslandTimestamp_histograms_normalised_map.find(bankname) != DQ_IslandTimestamp_histograms_normalised_map.end()) {
00147 DQ_IslandTimestamp_histograms_normalised_map[bankname]->Scale(1./hDQ_TDCCheck_muSc->GetEntries());
00148 }
00149 }
00150
00151 return SUCCESS;
00152 }
00153
00156 INT MDQ_IslandTimestamp(EVENT_HEADER *pheader, void *pevent)
00157 {
00158
00159 int midas_event_number = pheader->serial_number;
00160
00161
00162 typedef map<string, vector<TPulseIsland*> > TStringPulseIslandMap;
00163 typedef pair<string, vector<TPulseIsland*> > TStringPulseIslandPair;
00164 typedef map<string, vector<TPulseIsland*> >::iterator map_iterator;
00165
00166
00167
00168 TStringPulseIslandMap& pulse_islands_map =
00169 gData->fPulseIslandToChannelMap;
00170
00171
00172 for (map_iterator mapIter = pulse_islands_map.begin(); mapIter != pulse_islands_map.end(); ++mapIter)
00173 {
00174 std::string bankname = mapIter->first;
00175 std::string detname = gSetup->GetDetectorName(bankname);
00176 std::vector<TPulseIsland*> thePulses = mapIter->second;
00177
00178
00179 TH1F* hDQ_IslandTimestamp = DQ_IslandTimestamp_histograms_map[bankname];
00180 TH1F* hDQ_IslandTimestamp_Norm = DQ_IslandTimestamp_histograms_normalised_map[bankname];
00181
00182
00183 for (std::vector<TPulseIsland*>::iterator pulseIter = thePulses.begin(); pulseIter != thePulses.end(); ++pulseIter) {
00184
00185
00186 if (DQ_IslandTimestamp_histograms_map.find(bankname) != DQ_IslandTimestamp_histograms_map.end()) {
00187 int time_stamp = (*pulseIter)->GetTimeStamp();
00188 double clock_tick_in_ns = (*pulseIter)->GetClockTickInNs();
00189 double block_time = time_stamp * clock_tick_in_ns;
00190
00191 hDQ_IslandTimestamp->Fill(block_time);
00192 hDQ_IslandTimestamp_Norm->Fill(block_time);
00193 }
00194 }
00195 }
00196 return SUCCESS;
00197 }
00198