00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00016
00021
00028
00029
00030 #include <stdio.h>
00031 #include <stdlib.h>
00032 #include <string>
00033 #include <map>
00034 #include <utility>
00035 #include <sstream>
00036 #include <cmath>
00037
00038
00039 #include "midas.h"
00040
00041
00042 #include <TH1.h>
00043 #include <TH2.h>
00044 #include <TDirectory.h>
00045
00046
00047 #include "TGlobalData.h"
00048 #include "TSetupData.h"
00049 #include "TPulseIsland.h"
00050
00051 using std::string;
00052 using std::map;
00053 using std::vector;
00054 using std::pair;
00055
00056
00057 INT MDQ_Amplitude_init(void);
00058 INT MDQ_Amplitude(EVENT_HEADER*, void*);
00059 INT MDQ_Amplitude_eor(INT);
00060
00061 extern HNDLE hDB;
00062 extern TGlobalData* gData;
00063 extern TSetupData* gSetup;
00064
00065
00066 #include "TDirectory.h"
00067 #include "TFile.h"
00068 #include "TApplication.h"
00069 #include "TROOT.h"
00070 extern TDirectory * gManaHistsDir;
00071 extern TFile * gManaOutputFile;
00072 extern TApplication * manaApp;
00073 extern TROOT * gROOT;
00074
00075 map <std::string, TH1F*> DQ_Amplitude_histograms_map;
00076 map <std::string, TH1F*> DQ_Amplitude_histograms_normalised_map;
00077 map <std::string, TH1F*> DQ_Amplitude_histograms_ped_sub_map;
00078
00079 extern TH1F* hDQ_TDCCheck_muSc;
00080
00081 ANA_MODULE MDQ_Amplitude_module =
00082 {
00083 "MDQ_Amplitude",
00084 "Nam Tran",
00085 MDQ_Amplitude,
00086 NULL,
00087 MDQ_Amplitude_eor,
00088 MDQ_Amplitude_init,
00089 NULL,
00090 NULL,
00091 0,
00092 NULL,
00093 };
00094
00097 INT MDQ_Amplitude_init()
00098 {
00099
00100 if (!gDirectory->Cd("DataQuality_LowLevel")) {
00101
00102 std::string dir_name("DataQuality_LowLevel/");
00103 gDirectory->mkdir(dir_name.c_str());
00104 gDirectory->Cd(dir_name.c_str());
00105 }
00106
00107
00108 std::map<std::string, std::string> Bank2DetMap = gSetup->fBankToDetectorMap;
00109
00110 typedef std::map<std::string, std::string>::iterator String2StringMapIter;
00111
00112 for(String2StringMapIter mapIter = Bank2DetMap.begin();
00113 mapIter != Bank2DetMap.end(); mapIter++) {
00114
00115 std::string bankname = mapIter->first;
00116 std::string detname = gSetup->GetDetectorName(bankname);
00117 int n_bits = gSetup->GetNBits(bankname);
00118 int max_adc_value = std::pow(2, n_bits);
00119
00120
00121 std::string histname = "hDQ_Amplitude_" + detname + "_" + bankname;
00122 std::string histtitle = "Amplitude of Pulses in " + detname;
00123 TH1F* hDQ_Histogram = new TH1F(histname.c_str(), histtitle.c_str(),
00124 max_adc_value, 0, max_adc_value);
00125 hDQ_Histogram->GetXaxis()->SetTitle("Amplitude [adc]");
00126 hDQ_Histogram->GetYaxis()->SetTitle("Counts");
00127 DQ_Amplitude_histograms_map[bankname] = hDQ_Histogram;
00128
00129
00130 std::string normhistname = histname + "_normalised";
00131 std::string normhisttitle = histtitle + " (normalised)";
00132 TH1F* hDQ_Histogram_Normalised = new TH1F(normhistname.c_str(), normhisttitle.c_str(), max_adc_value,0,max_adc_value);
00133 hDQ_Histogram_Normalised->GetXaxis()->SetTitle("Amplitude [adc]");
00134 std::string yaxislabel = hDQ_Histogram->GetYaxis()->GetTitle();
00135 yaxislabel += " per TDC muSc Hit";
00136 hDQ_Histogram_Normalised->GetYaxis()->SetTitle(yaxislabel.c_str());
00137 DQ_Amplitude_histograms_normalised_map[bankname] = hDQ_Histogram_Normalised;
00138
00139
00140 std::string pedsubhistname = histname + "_ped_sub";
00141 std::string pedsubhisttitle = histtitle + " (pedestal subtracted)";
00142 TH1F* hDQ_Histogram_PedSub = new TH1F(pedsubhistname.c_str(), pedsubhisttitle.c_str(), 2*max_adc_value,-max_adc_value,max_adc_value);
00143 hDQ_Histogram_PedSub->GetXaxis()->SetTitle("Amplitude [adc]");
00144 hDQ_Histogram_PedSub->GetYaxis()->SetTitle("Counts");
00145 DQ_Amplitude_histograms_ped_sub_map[bankname] = hDQ_Histogram_PedSub;
00146 }
00147
00148 gDirectory->Cd("/MidasHists/");
00149 return SUCCESS;
00150 }
00151
00154 INT MDQ_Amplitude_eor(INT run_number) {
00155
00156
00157 typedef map<string, vector<TPulseIsland*> > TStringPulseIslandMap;
00158 typedef pair<string, vector<TPulseIsland*> > TStringPulseIslandPair;
00159 typedef map<string, vector<TPulseIsland*> >::iterator map_iterator;
00160
00161
00162
00163 TStringPulseIslandMap& pulse_islands_map =
00164 gData->fPulseIslandToChannelMap;
00165
00166
00167 for (map_iterator mapIter = pulse_islands_map.begin(); mapIter != pulse_islands_map.end(); ++mapIter) {
00168
00169 std::string bankname = mapIter->first;
00170 std::string detname = gSetup->GetDetectorName(bankname);
00171
00172
00173 if (DQ_Amplitude_histograms_normalised_map.find(bankname) != DQ_Amplitude_histograms_normalised_map.end()) {
00174 DQ_Amplitude_histograms_normalised_map[bankname]->Scale(1./hDQ_TDCCheck_muSc->GetEntries());
00175 }
00176 }
00177
00178 return SUCCESS;
00179 }
00180
00183 INT MDQ_Amplitude(EVENT_HEADER *pheader, void *pevent)
00184 {
00185
00186 typedef map<string, vector<TPulseIsland*> > TStringPulseIslandMap;
00187 typedef pair<string, vector<TPulseIsland*> > TStringPulseIslandPair;
00188 typedef map<string, vector<TPulseIsland*> >::iterator map_iterator;
00189
00190
00191
00192 TStringPulseIslandMap& pulse_islands_map = gData->fPulseIslandToChannelMap;
00193
00194
00195 for (map_iterator mapIter = pulse_islands_map.begin();
00196 mapIter != pulse_islands_map.end(); ++mapIter)
00197 {
00198 std::string bankname = mapIter->first;
00199 std::string detname = gSetup->GetDetectorName(bankname);
00200 std::vector<TPulseIsland*> thePulses = mapIter->second;
00201
00202
00203 TH1F* hDQ_Amplitude = DQ_Amplitude_histograms_map[bankname];
00204 TH1F* hDQ_Amplitude_Norm = DQ_Amplitude_histograms_normalised_map[bankname];
00205 TH1F* hDQ_Amplitude_PedSub = DQ_Amplitude_histograms_ped_sub_map[bankname];
00206
00207 for (std::vector<TPulseIsland*>::iterator pulseIter = thePulses.begin();
00208 pulseIter != thePulses.end(); ++pulseIter) {
00209
00210 if (DQ_Amplitude_histograms_map.find(bankname) !=
00211 DQ_Amplitude_histograms_map.end())
00212 {
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 const std::vector<int>& theSamples = (*pulseIter)->GetSamples();
00228 int peak_sample = (*pulseIter)->GetPeakSample();
00229 hDQ_Amplitude->Fill(theSamples.at(peak_sample));
00230 hDQ_Amplitude_Norm->Fill(theSamples.at(peak_sample));
00231
00232 int amplitude = (*pulseIter)->GetPulseHeight();
00233 hDQ_Amplitude_PedSub->Fill(amplitude);
00234
00235 }
00236 }
00237 }
00238 return SUCCESS;
00239 }
00240