00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <stdio.h>
00018 #include <stdlib.h>
00019 #include <string>
00020 #include <map>
00021 #include <utility>
00022 #include <sstream>
00023 #include <algorithm>
00024 #include <iostream>
00025
00026
00027 #include "midas.h"
00028
00029
00030
00031
00032 #include "TGlobalData.h"
00033 #include "TSetupData.h"
00034 #include "TPulseIsland.h"
00035
00036
00037
00038 static INT module_event_sort_and_stitch(EVENT_HEADER *pheader, void *pevent);
00039 static INT module_init_sort_and_stitch();
00040
00041 extern HNDLE hDB;
00042 extern TGlobalData* gData;
00043 extern TSetupData* gSetup;
00044
00048 static unsigned int nUHSamples;
00052 static unsigned int nBUSamples;
00056 static unsigned int nUHPreSamples;
00060 static unsigned int nBUPreSamples;
00061
00062 ANA_MODULE MCAENPulseIslandSortAndStitch_module =
00063 {
00064 "MCAENPulseIslandSortAndStitch",
00065 "Vladimir Tishchenko",
00066 module_event_sort_and_stitch,
00067 NULL,
00068 NULL,
00069 module_init_sort_and_stitch,
00070 NULL,
00071 NULL,
00072 0,
00073 NULL,
00074 };
00075
00076 static bool pulse_islands_t_comp(TPulseIsland *a, TPulseIsland *b);
00077 static void pulse_islands_stitch(std::vector<TPulseIsland*>& v, unsigned int nSamples);
00078
00079
00080 INT module_init_sort_and_stitch() {
00081
00082
00083 char key[80];
00084 int size;
00085 unsigned int post_trigger_percentage;
00086
00087 sprintf(key, "/Equipment/Crate 4/Settings/CAEN0/waveform length");
00088 size = sizeof(nUHSamples);
00089 db_get_value(hDB, 0, key, &nUHSamples, &size, TID_DWORD, 1);
00090 post_trigger_percentage = 80;
00091 nUHPreSamples = (int) (0.01 * ((100 - post_trigger_percentage) * nUHSamples));
00092
00093 return SUCCESS;
00094
00095 sprintf(key, "/Equipment/Crate 5/Settings/CAEN/waveform length");
00096 size = sizeof(nBUSamples);
00097 db_get_value(hDB, 0, key, &nBUSamples, &size, TID_DWORD, 1);
00098 sprintf(key, "/Equipment/Crate 5/Settings/CAEN/post_trigger_size");
00099 size = sizeof(post_trigger_percentage);
00100 db_get_value(hDB, 0, key, &post_trigger_percentage, &size, TID_BYTE, 1);
00101
00102 nBUPreSamples = 20;
00103
00104
00105
00106 return SUCCESS;
00107 }
00108
00111 INT module_event_sort_and_stitch(EVENT_HEADER *pheader, void *pevent)
00112 {
00113
00114 typedef std::map<std::string, std::vector<TPulseIsland*> > TStringPulseIslandMap;
00115
00116
00117
00118 TStringPulseIslandMap& pulse_islands_map = gData->fPulseIslandToChannelMap;
00119
00120 for (std::map<std::string, std::vector<TPulseIsland*> >::iterator it=pulse_islands_map.begin(); it!=pulse_islands_map.end(); ++it)
00121 {
00122 unsigned int nSamples = 0;
00123 if (TSetupData::IsBostonCAEN(it->first))
00124 nSamples = nBUSamples;
00125 else if (TSetupData::IsHoustonCAEN(it->first))
00126 nSamples = nUHSamples;
00127 if (nSamples != 0) {
00128 std::vector<TPulseIsland*> &v = it->second;
00129 std::sort(v.begin(), v.end(), pulse_islands_t_comp);
00130 pulse_islands_stitch(v, nSamples);
00131 }
00132 }
00133
00134 return SUCCESS;
00135 }
00136
00137
00140 bool pulse_islands_t_comp(TPulseIsland *a, TPulseIsland *b)
00141 {
00142 return (a->GetTimeStamp() < b->GetTimeStamp());
00143 }
00144
00162 void pulse_islands_stitch(std::vector<TPulseIsland*>& pulses, unsigned int nSamples) {
00163 unsigned int nPulses = pulses.size();
00164 if (nPulses == 0) return;
00165 std::vector<int> next_samples, current_samples;
00166 TPulseIsland* temp_pulse;
00167 for (unsigned int iPulse = 0; iPulse < nPulses - 1; ++iPulse) {
00168 next_samples = pulses[iPulse + 1]->GetSamples();
00169
00170
00171 while (next_samples.size() < nSamples) {
00172 current_samples = pulses[iPulse]->GetSamples();
00173 for (unsigned int i = 0; i < next_samples.size(); ++i)
00174 current_samples.push_back(next_samples[i]);
00175 temp_pulse = pulses[iPulse];
00176 pulses[iPulse] = new TPulseIsland(temp_pulse->GetTimeStamp(), current_samples, temp_pulse->GetBankName());
00177 delete temp_pulse;
00178 delete pulses[iPulse + 1];
00179 pulses.erase(pulses.begin() + iPulse + 1);
00180 if (!(iPulse < --nPulses - 1)) break;
00181 next_samples = pulses[iPulse + 1]->GetSamples();
00182 }
00183 }
00184 }
00185