11 #include <JANA/JApplication.h>
12 #include <JANA/JFactory.h>
67 TDirectory *
main = gDirectory;
68 gDirectory->mkdir(
"st_lowlevel")->cd();
70 st_num_events =
new TH1I(
"st_num_events",
"ST Number of events",1, 0.5, 1.5);
96 h2_st_time_vs_pcpi =
new TH2I(
"h2_st_time_vs_pcpi",
"Ped Corrected Pulse Integral vs #delta (t_{TDC} - t_{ADC});Pulse Integral(cahnnels) ;#delta (t_{TDC} - t_{ADC}) (ns)",
PI_BINS,
PI_MIN,
PI_MAX,32, -4., 4.);
97 h2_st_time_vs_pp =
new TH2I(
"h2_st_time_vs_pp",
"Pulse Peak vs #delta (t_{TDC} - t_{ADC});Pulse Peak (cahnnels);#delta (t_{TDC} - t_{ADC}) (ns)",300,0,3000,32, -4., 4.);
108 h2_dE_sec =
new TH2I(
"h2_dE_sec",
"ST Hit Sector vs dE; Channel Number; dE(GeV)",
NCHANNELS, 0.5,
NCHANNELS + 0.5, 80, 0.0, 0.004);
112 gDirectory->mkdir(
"waveforms")->cd();
116 for(
unsigned int i = 0; i <
NCHANNELS; i++)
118 h_amp_vs_sampl_chan[i] =
new TH1I(Form(
"amp_vs_sampl_chan_%i", i+1), Form(
"Channel %i, #phi #in [%i^{#circ}, %i^{#circ}]; fADC250 Sample Number; fADC250 Pulse Height (au)", i+1, 0+12*i, 12+12*i), 100, 0, 100);
119 h_amp_vs_sampl_chan150[i] =
new TH1I(Form(
"amp_vs_sampl_chan150_%i", i+1), Form(
"Channel %i, #phi #in [%i^{#circ}, %i^{#circ}]; fADC250 Sample Number; fADC250 Pulse Height (au)", i+1, 0+12*i, 12+12*i), 100, 0, 100);
121 h_amp_vs_sampl_chan1000[i] =
new TH1I(Form(
"amp_vs_sampl_chan1000_%i", i+1), Form(
"Channel %i, #phi #in [%i^{#circ}, %i^{#circ}]; fADC250 Sample Number; fADC250 Pulse Height (au)", i+1, 0+12*i, 12+12*i), 100, 0, 100);
123 h_amp_vs_sampl_chan2000[i] =
new TH1I(Form(
"amp_vs_sampl_chan2000_%i", i+1), Form(
"Channel %i, #phi #in [%i^{#circ}, %i^{#circ}]; fADC250 Sample Number; fADC250 Pulse Height (au)", i+1, 0+12*i, 12+12*i), 100, 0, 100);
125 h_amp_vs_sampl_chan3000[i] =
new TH1I(Form(
"amp_vs_sampl_chan3000_%i", i+1), Form(
"Channel %i, #phi #in [%i^{#circ}, %i^{#circ}]; fADC250 Sample Number; fADC250 Pulse Height (au)", i+1, 0+12*i, 12+12*i), 100, 0, 100);
127 h_amp_vs_sampl_chan4000[i] =
new TH1I(Form(
"amp_vs_sampl_chan4000_%i", i+1), Form(
"Channel %i, #phi #in [%i^{#circ}, %i^{#circ}]; fADC250 Sample Number; fADC250 Pulse Height (au)", i+1, 0+12*i, 12+12*i), 100, 0, 100);
149 map<string,double> scale_factors;
150 if (eventLoop->GetCalib(
"/START_COUNTER/digi_scales", scale_factors))
151 jout <<
"Error loading /START_COUNTER/digi_scales !" << endl;
153 if (scale_factors.find(
"SC_ADC_TSCALE") != scale_factors.end())
154 t_scale = scale_factors[
"SC_ADC_TSCALE"];
156 jerr <<
"Unable to get SC_ADC_TSCALE from /START_COUNTER/digi_scales !"
160 map<string,double> base_time_offset;
162 if (eventLoop->GetCalib(
"/START_COUNTER/base_time_offset",base_time_offset))
163 jout <<
"Error loading /START_COUNTER/base_time_offset !" << endl;
164 if (base_time_offset.find(
"SC_BASE_TIME_OFFSET") != base_time_offset.end())
165 t_base = base_time_offset[
"SC_BASE_TIME_OFFSET"];
167 jerr <<
"Unable to get SC_BASE_TIME_OFFSET from /START_COUNTER/base_time_offset !" << endl;
169 if (base_time_offset.find(
"SC_TDC_BASE_TIME_OFFSET") != base_time_offset.end())
170 t_tdc_base = base_time_offset[
"SC_TDC_BASE_TIME_OFFSET"];
172 jerr <<
"Unable to get SC_BASE_TIME_OFFSET from /START_COUNTER/base_time_offset !" << endl;
175 if (eventLoop->GetCalib(
"/START_COUNTER/pedestals",
a_pedestals))
176 jout <<
"Error loading /START_COUNTER/pedestals !" << endl;
178 if (eventLoop->GetCalib(
"/START_COUNTER/adc_timing_offsets",
adc_time_offsets))
179 jout <<
"Error loading /START_COUNTER/adc_timing_offsets !" << endl;
181 if (eventLoop->GetCalib(
"/START_COUNTER/tdc_timing_offsets",
tdc_time_offsets)) jout <<
"Error loading /START_COUNTER/tdc_timing_offsets !" << endl;
192 vector<const DSCDigiHit*> dscdigihits;
193 vector<const DSCTDCDigiHit*> dsctdcdigihits;
194 vector<const DSCHit*> dschits;
198 loop->GetSingle(locTrigger);
202 loop->Get(dscdigihits);
203 loop->Get(dsctdcdigihits);
205 loop->GetSingle(TTabUtilities);
206 uint32_t ADC_hits = dscdigihits.size();
207 uint32_t TDC_hits = dsctdcdigihits.size();
208 uint32_t Hits = dschits.size();
212 japp->RootFillLock(
this);
214 if( (dscdigihits.size()>0) || (dsctdcdigihits.size()>0) || (dschits.size()>0) )
221 for(uint32_t i = 0; i < ADC_hits; i++) {
229 vector<uint16_t> samples;
231 Int_t hit_sector_adc = dscdigihits[i]->sector;
232 Int_t hit_sector_adc_index = hit_sector_adc - 1;
234 dscdigihits[i]->GetSingle(pulseintegral);
235 dscdigihits[i]->GetSingle(windowrawdata);
237 if (pulseintegral !=
nullptr) {
238 pulseintegral->GetSingle(windowrawdata);
241 if (windowrawdata !=
nullptr) {
242 adc_pp = dscdigihits[i]->pulse_peak;
248 for (uint32_t j = 0; j < windowrawdata->
samples.size(); j++) {
249 samples.push_back(windowrawdata->
samples[j]);
256 if (!
bool_sec[hit_sector_adc_index]) {
257 bool_sec[hit_sector_adc_index] =
true;
258 if (
bool_sec[hit_sector_adc_index]) {
259 for (uint32_t j = 0; j < windowrawdata->
samples.size(); j++) {
260 samples.push_back(windowrawdata->
samples[j]);
270 for (uint32_t j = 0; j < windowrawdata->
samples.size(); j++) {
271 samples.push_back(windowrawdata->
samples[j]);
281 for (uint32_t j = 0; j < windowrawdata->
samples.size(); j++) {
282 samples.push_back(windowrawdata->
samples[j]);
292 for (uint32_t j = 0; j < windowrawdata->
samples.size(); j++) {
293 samples.push_back(windowrawdata->
samples[j]);
303 for (uint32_t j = 0; j < windowrawdata->
samples.size(); j++) {
304 samples.push_back(windowrawdata->
samples[j]);
314 int hit_channel = dscdigihits[i]->sector - 1;
315 int adc_sector = dscdigihits[i]->sector ;
316 uint32_t avg_pedestal = (dscdigihits[i]->nsamples_pedestal == 0 ) ? 0.0 : dscdigihits[i]->
pedestal/dscdigihits[i]->nsamples_pedestal;
317 uint32_t pulse_time = dscdigihits[i]->pulse_time*
ADC_PT_RES;
318 uint32_t pulse_integral= dscdigihits[i]->pulse_integral;
332 double single_sample_ped = (double)dscdigihits[i]->pedestal;
333 double nsamples_integral = (double)dscdigihits[i]->nsamples_integral;
334 double nsamples_pedestal = (double)dscdigihits[i]->nsamples_pedestal;
335 pedestal = single_sample_ped * nsamples_integral/nsamples_pedestal;
339 adc_pi = dscdigihits[i]->pulse_integral;
341 adc_pp = dscdigihits[i]->pulse_peak;
351 for(uint32_t i = 0; i < TDC_hits; i++) {
355 int tdc_sector = tdc_dhit->
sector;
356 if (adc_sector == tdc_sector) {
368 for(uint32_t i = 0; i < TDC_hits; i++)
372 int tdc_sec = tdc_dhit->
sector;
382 for(uint32_t i = 0; i < dschits.size(); i++)
384 const DSCHit *hit = dschits[i];
385 int hit_sector = hit->
sector;
388 float t_TDC = hit->
t_TDC;
389 float t_fADC = hit->
t_fADC;
400 japp->RootFillUnLock(
this);
Bool_t bool_sec[NCHANNELS]
double Convert_DigiTimeToNs_F1TDC(const JObject *locTDCDigiHit) const
bool DSCHit_fadc_cmp(const DSCDigiHit *a, const DSCDigiHit *b)
static TH2I * h2_st_adc_hit_multi
TH1I ** h_amp_vs_sampl_chan1000
static TH2I * h2_st_time_vs_pcpi
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
static TH2I * h2_tTDC_sec
const uint32_t ADC_MULTI_MAX
bool DSCHit_thit_cmp(const DSCHit *a, const DSCHit *b)
int sector
sector number 1-24
const uint32_t TDC_DHIT_BINS
JEventProcessor_ST_online_lowlevel()
Bool_t bool_sec150[NCHANNELS]
TH1I ** h_amp_vs_sampl_chan2000
const uint32_t TDC_DHIT_MAX
jerror_t init(void)
Called once at program start.
TH1I ** h_amp_vs_sampl_chan
uint32_t Get_L1FrontPanelTriggerBits(void) const
vector< uint16_t > samples
static TH2I * h2_raw_ped_sector
bool DSCHit_tdc_cmp(const DSCTDCDigiHit *a, const DSCTDCDigiHit *b)
const uint32_t TDC_MULTI_MAX
const uint32_t ADC_MULTI_MIN
static TH2I * h2_st_time_vs_pp
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
TH1I ** h_amp_vs_sampl_chan3000
Bool_t bool_sec1000[NCHANNELS]
static TH2I * h2_raw_tdcTime_sec
static TH2I * h2_adc_ped_sector
static TH2I * h2_tfADC_sec
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
~JEventProcessor_ST_online_lowlevel()
static TH2I * h2_st_adc_tdc_multi
const uint32_t TDC_MULTI_BINS
static TH1I * st_num_events
const uint32_t TDC_MULTI_MIN
uint32_t pulse_time
identified pulse time as returned by FPGA algorithm
const uint32_t ADC_MULTI_BINS
vector< double > a_pedestals
vector< double > tdc_time_offsets
static TH2I * h2_adc_pp_sector
TH1I ** h_amp_vs_sampl_chan150
static TH2I * h2_raw_pt_sector
Bool_t bool_sec2000[NCHANNELS]
static TH2I * h2_raw_pi_sector
static TH2I * h2_adc_pcpi_sector
static TH1I * pedestal[nChan]
TH1I ** h_amp_vs_sampl_chan4000
static TH2I * h2_adc_pt_sector
static TH2I * h2_tdcTime_sec
Bool_t bool_sec4000[NCHANNELS]
vector< double > adc_time_offsets
int main(int argc, char *argv[])
Bool_t bool_sec3000[NCHANNELS]
jerror_t fini(void)
Called after last event of last event source has been processed.
const uint32_t TDC_DHIT_MIN