11 #include <JANA/JFactory.h>
129 #include <JANA/JApplication.h>
168 printf(
"JEventProcessor_DAQTree::init()\n");
171 f125WRDtree_exists = 0;
172 f125PRDtree_exists = 0;
173 f125PItree_exists = 0;
174 f125PTtree_exists = 0;
175 f125PPtree_exists = 0;
176 f125TTtree_exists = 0;
177 F1TDCHtree_exists = 0;
178 F1TDCTTtree_exists = 0;
179 f250WRDtree_exists = 0;
180 f250PRDtree_exists = 0;
181 f250PItree_exists = 0;
182 f250PTtree_exists = 0;
183 f250PPtree_exists = 0;
184 f250TTtree_exists = 0;
211 vector<const Df125WindowRawData*> f125WindowRawData_vec;
212 loop->Get(f125WindowRawData_vec);
215 vector<const Df125PulseRawData*> f125PulseRawData_vec;
216 loop->Get(f125PulseRawData_vec);
219 vector<const Df125PulseIntegral*> f125PulseIntegral_vec;
220 loop->Get(f125PulseIntegral_vec);
223 vector<const Df125PulseTime*> f125PulseTime_vec;
224 loop->Get(f125PulseTime_vec);
227 vector<const Df125PulsePedestal*> f125PulsePedestal_vec;
228 loop->Get(f125PulsePedestal_vec);
231 vector<const Df125TriggerTime*> f125TriggerTime_vec;
232 loop->Get(f125TriggerTime_vec);
235 vector<const DF1TDCHit*> F1TDCHit_vec;
236 loop->Get(F1TDCHit_vec);
237 sort(F1TDCHit_vec.begin(), F1TDCHit_vec.end(),
DF1TDCHit_cmp);
239 vector<const DF1TDCTriggerTime*> F1TDCTriggerTime_vec;
240 loop->Get(F1TDCTriggerTime_vec);
243 vector<const Df250WindowRawData*> f250WindowRawData_vec;
244 loop->Get(f250WindowRawData_vec);
247 vector<const Df250PulseRawData*> f250PulseRawData_vec;
248 loop->Get(f250PulseRawData_vec);
251 vector<const Df250PulseIntegral*> f250PulseIntegral_vec;
252 loop->Get(f250PulseIntegral_vec);
255 vector<const Df250PulseTime*> f250PulseTime_vec;
256 loop->Get(f250PulseTime_vec);
259 vector<const Df250PulsePedestal*> f250PulsePedestal_vec;
260 loop->Get(f250PulsePedestal_vec);
263 vector<const Df250TriggerTime*> f250TriggerTime_vec;
264 loop->Get(f250TriggerTime_vec);
269 japp->RootWriteLock();
272 const uint32_t numDf125WRDpedsamps = 10;
273 const Int_t Df125WRDminpeakheight = 100;
275 unsigned int num_f125WRD = f125WindowRawData_vec.size();
277 if (!f125WRDtree_exists && num_f125WRD>0) {
278 printf(
"DAQTree >>eventnum %llu, found %4i Df125WindowRawData objects\n",(
long long unsigned int)eventnumber,num_f125WRD);
279 printf(
"DAQTree >>Creating tree Df125WindowRawData_tree\n");
280 Df125WindowRawData_tree =
new TTree(
"Df125WindowRawData",
281 "tree of flash 125 raw window data (waveform samples) for each channel and event");
282 Df125WindowRawData_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
283 Df125WindowRawData_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
284 Df125WindowRawData_tree->Branch(
"rocid",&rocid,
"rocid/i");
285 Df125WindowRawData_tree->Branch(
"slot",&slot,
"slot/i");
286 Df125WindowRawData_tree->Branch(
"channel",&channel,
"channel/i");
287 Df125WindowRawData_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
288 Df125WindowRawData_tree->Branch(
"waveform",&waveform);
289 Df125WindowRawData_tree->Branch(
"nsamples",&nsamples,
"nsamples/i");
290 Df125WindowRawData_tree->Branch(
"w_integral",&w_integral,
"w_integral/i");
291 Df125WindowRawData_tree->Branch(
"w_min",&w_min,
"w_min/i");
292 Df125WindowRawData_tree->Branch(
"w_max",&w_max,
"w_max/i");
293 Df125WindowRawData_tree->Branch(
"w_samp1",&w_samp1,
"w_samp1/i");
294 Df125WindowRawData_tree->Branch(
"w_ped",&w_ped,
"w_ped/i");
295 Df125WindowRawData_tree->Branch(
"w_time",&w_time,
"w_time/f");
296 Df125WindowRawData_tree->Branch(
"invalid_samples",&invalid_samples,
"invalid_samples/b");
297 Df125WindowRawData_tree->Branch(
"overflow",&overflow,
"overflow/b");
298 f125WRDtree_exists = 1;
300 eventnum = eventnumber;
302 for(
unsigned int c_chan=0; c_chan<num_f125WRD; c_chan++){
306 rocid = f125WindowRawData->
rocid;
307 slot = f125WindowRawData->
slot;
308 channel = f125WindowRawData->
channel;
309 itrigger = f125WindowRawData->
itrigger;
311 overflow = f125WindowRawData->
overflow;
314 const vector<uint16_t> &samplesvector = f125WindowRawData->
samples;
315 nsamples=samplesvector.size();
317 for (uint16_t c_samp=0; c_samp<nsamples; c_samp++) {
318 if (samplesvector[c_samp]<4096) {
319 waveform.push_back(samplesvector[c_samp]);
321 waveform.push_back(4096);
324 w_integral = samplesvector[0];
325 w_min = samplesvector[0];
326 w_max = samplesvector[0];
327 w_samp1 = samplesvector[0];
328 w_ped = samplesvector[0];
330 if (c_samp<numDf125WRDpedsamps) {
331 w_ped += samplesvector[c_samp];
333 w_integral += samplesvector[c_samp];
334 if (w_min > samplesvector[c_samp]) w_min = samplesvector[c_samp];
335 if (w_max < samplesvector[c_samp]) w_max = samplesvector[c_samp];
339 Int_t lastbelowsamp=0, peakheight = w_max-w_min;
340 Float_t threshold = w_min + peakheight/2.0;
341 Float_t firstaboveheight=0, lastbelowheight=0;
343 if (peakheight > Df125WRDminpeakheight) {
344 for (uint16_t c_samp=0; c_samp<nsamples; c_samp++) {
345 if (samplesvector[c_samp]>threshold) {
346 firstaboveheight = samplesvector[c_samp];
347 lastbelowsamp = c_samp-1;
348 lastbelowheight = samplesvector[c_samp-1];
352 w_time = lastbelowsamp + (threshold-lastbelowheight)/(firstaboveheight-lastbelowheight);
354 Df125WindowRawData_tree->Fill();
359 const uint32_t numDf125PRDpedsamps= 4;
360 const Int_t Df125PRDminpeakheight = 11;
362 unsigned int num_f125PRD = f125PulseRawData_vec.size();
364 if (!f125PRDtree_exists && num_f125PRD>0) {
365 printf(
"DAQTree >>eventnum %llu, found %4i Df125PulseRawData objects\n",(
long long unsigned int)eventnumber,num_f125PRD);
366 printf(
"DAQTree >>Creating tree Df125PulseRawData_tree\n");
367 Df125PulseRawData_tree =
new TTree(
"Df125PulseRawData",
368 "tree of flash 125 pulse raw data for each channel and event");
369 Df125PulseRawData_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
370 Df125PulseRawData_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
371 Df125PulseRawData_tree->Branch(
"rocid",&rocid,
"rocid/i");
372 Df125PulseRawData_tree->Branch(
"slot",&slot,
"slot/i");
373 Df125PulseRawData_tree->Branch(
"channel",&channel,
"channel/i");
374 Df125PulseRawData_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
375 Df125PulseRawData_tree->Branch(
"pulse_number",&pulse_number,
"pulse_number/i");
376 Df125PulseRawData_tree->Branch(
"first_sample_number",&first_sample_number,
"first_sample_number/i");
377 Df125PulseRawData_tree->Branch(
"waveform",&waveform);
378 Df125PulseRawData_tree->Branch(
"nsamples",&nsamples,
"nsamples/i");
379 Df125PulseRawData_tree->Branch(
"w_integral",&w_integral,
"w_integral/i");
380 Df125PulseRawData_tree->Branch(
"w_min",&w_min,
"w_min/i");
381 Df125PulseRawData_tree->Branch(
"w_max",&w_max,
"w_max/i");
382 Df125PulseRawData_tree->Branch(
"w_samp1",&w_samp1,
"w_samp1/i");
383 Df125PulseRawData_tree->Branch(
"w_ped",&w_ped,
"w_ped/i");
384 Df125PulseRawData_tree->Branch(
"w_time",&w_time,
"w_time/f");
385 Df125PulseRawData_tree->Branch(
"invalid_samples",&invalid_samples,
"invalid_samples/b");
386 Df125PulseRawData_tree->Branch(
"overflow",&overflow,
"overflow/b");
387 f125PRDtree_exists = 1;
389 eventnum = eventnumber;
391 for(
unsigned int c_chan=0; c_chan<num_f125PRD; c_chan++){
395 rocid = f125PulseRawData->
rocid;
396 slot = f125PulseRawData->
slot;
397 channel = f125PulseRawData->
channel;
398 itrigger = f125PulseRawData->
itrigger;
402 overflow = f125PulseRawData->
overflow;
404 const vector<uint16_t> &samplesvector = f125PulseRawData->
samples;
405 nsamples=samplesvector.size();
407 for (uint16_t c_samp=0; c_samp<nsamples; c_samp++) {
409 if (samplesvector[c_samp]<4096) {
410 waveform.push_back(samplesvector[c_samp]);
412 waveform.push_back(4096);
415 w_integral = samplesvector[0];
416 w_min = samplesvector[0];
417 w_max = samplesvector[0];
418 w_samp1 = samplesvector[0];
419 w_ped = samplesvector[0];
421 if (c_samp<numDf125PRDpedsamps) {
422 w_ped += samplesvector[c_samp];
424 w_integral += samplesvector[c_samp];
425 if (w_min > samplesvector[c_samp]) w_min = samplesvector[c_samp];
426 if (w_max < samplesvector[c_samp]) w_max = samplesvector[c_samp];
430 Int_t lastbelowsamp=0, peakheight = w_max-w_min;
431 Float_t threshold = w_min + peakheight/2.0;
432 Float_t firstaboveheight=0, lastbelowheight=0;
434 if (peakheight > Df125PRDminpeakheight) {
435 for (uint16_t c_samp=0; c_samp<nsamples; c_samp++) {
436 if (samplesvector[c_samp]>threshold) {
437 firstaboveheight = samplesvector[c_samp];
438 lastbelowsamp = c_samp-1;
439 lastbelowheight = samplesvector[c_samp-1];
443 w_time = lastbelowsamp + (threshold-lastbelowheight)/(firstaboveheight-lastbelowheight);
445 Df125PulseRawData_tree->Fill();
450 unsigned int num_f125PI = f125PulseIntegral_vec.size();
452 if (!f125PItree_exists && num_f125PI>0) {
453 printf(
"DAQTree >>eventnum %llu, found %4i Df125PulseIntegral objects\n",(
long long unsigned int)eventnumber,num_f125PI);
454 printf(
"DAQTree >>Creating tree Df125PulseIntegral_tree\n");
455 Df125PulseIntegral_tree =
new TTree(
"Df125PulseIntegral",
456 "tree of flash 125 pulse integral for each channel and event");
457 Df125PulseIntegral_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
458 Df125PulseIntegral_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
459 Df125PulseIntegral_tree->Branch(
"rocid",&rocid,
"rocid/i");
460 Df125PulseIntegral_tree->Branch(
"slot",&slot,
"slot/i");
461 Df125PulseIntegral_tree->Branch(
"channel",&channel,
"channel/i");
462 Df125PulseIntegral_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
463 Df125PulseIntegral_tree->Branch(
"pulse_number",&pulse_number,
"pulse_number/i");
464 Df125PulseIntegral_tree->Branch(
"quality_factor",&quality_factor,
"quality_factor/i");
465 Df125PulseIntegral_tree->Branch(
"integral",&integral,
"integral/i");
466 Df125PulseIntegral_tree->Branch(
"pedestal",&
pedestal,
"pedestal/i");
467 f125PItree_exists = 1;
469 eventnum = eventnumber;
471 for(
unsigned int c_chan=0; c_chan<num_f125PI; c_chan++){
474 rocid = f125PulseIntegral->
rocid;
475 slot = f125PulseIntegral->
slot;
476 channel = f125PulseIntegral->
channel;
477 itrigger = f125PulseIntegral->
itrigger;
480 integral = f125PulseIntegral->
integral;
482 Df125PulseIntegral_tree->Fill();
488 unsigned int num_f125PT = f125PulseTime_vec.size();
490 if (!f125PTtree_exists && num_f125PT>0) {
491 printf(
"DAQTree >>eventnum %llu, found %4i Df125PulseTime objects\n",(
long long unsigned int)eventnumber,num_f125PT);
492 printf(
"DAQTree >>Creating tree f125PulseTime_tree\n");
493 Df125PulseTime_tree =
new TTree(
"Df125PulseTime",
494 "tree of flash 125 pulse times for each channel and event");
495 Df125PulseTime_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
496 Df125PulseTime_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
497 Df125PulseTime_tree->Branch(
"rocid",&rocid,
"rocid/i");
498 Df125PulseTime_tree->Branch(
"slot",&slot,
"slot/i");
499 Df125PulseTime_tree->Branch(
"channel",&channel,
"channel/i");
500 Df125PulseTime_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
501 Df125PulseTime_tree->Branch(
"pulse_number",&pulse_number,
"pulse_number/i");
502 Df125PulseTime_tree->Branch(
"quality_factor",&quality_factor,
"quality_factor/i");
503 Df125PulseTime_tree->Branch(
"time",&time,
"time/i");
504 f125PTtree_exists = 1;
506 eventnum = eventnumber;
508 for(
unsigned int c_chan=0; c_chan<num_f125PT; c_chan++){
511 rocid = f125PulseTime->
rocid;
512 slot = f125PulseTime->
slot;
513 channel = f125PulseTime->
channel;
517 time = f125PulseTime->
time;
518 Df125PulseTime_tree->Fill();
523 unsigned int num_f125PP = f125PulsePedestal_vec.size();
525 if (!f125PPtree_exists && num_f125PP>0) {
526 printf(
"DAQTree >>eventnum %llu, found %4i Df125PulsePedestal objects\n",(
long long unsigned int)eventnumber,num_f125PP);
527 printf(
"DAQTree >>Creating tree f125PulsePedestal_tree\n");
528 Df125PulsePedestal_tree =
new TTree(
"Df125PulsePedestal",
529 "tree of flash 125 pulse times for each channel and event");
530 Df125PulsePedestal_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
531 Df125PulsePedestal_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
532 Df125PulsePedestal_tree->Branch(
"rocid",&rocid,
"rocid/i");
533 Df125PulsePedestal_tree->Branch(
"slot",&slot,
"slot/i");
534 Df125PulsePedestal_tree->Branch(
"channel",&channel,
"channel/i");
535 Df125PulsePedestal_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
536 Df125PulsePedestal_tree->Branch(
"pulse_number",&pulse_number,
"pulse_number/i");
537 Df125PulsePedestal_tree->Branch(
"pedestal",&
pedestal,
"pedestal/i");
538 Df125PulsePedestal_tree->Branch(
"pulse_peak",&pulse_peak,
"pulse_peak/i");
539 f125PPtree_exists = 1;
541 eventnum = eventnumber;
543 for(
unsigned int c_chan=0; c_chan<num_f125PP; c_chan++){
546 rocid = f125PulsePedestal->
rocid;
547 slot = f125PulsePedestal->
slot;
548 channel = f125PulsePedestal->
channel;
549 itrigger = f125PulsePedestal->
itrigger;
553 Df125PulsePedestal_tree->Fill();
559 unsigned int num_f125TT = f125TriggerTime_vec.size();
561 if (!f125TTtree_exists && num_f125TT>0) {
562 printf(
"DAQTree >>eventnum %llu, found %4i Df125TriggerTime objects\n",(
long long unsigned int)eventnumber,num_f125TT);
563 printf(
"DAQTree >>Creating tree Df125TriggerTime_tree\n");
564 Df125TriggerTime_tree =
new TTree(
"Df125TriggerTime",
565 "tree of flash 125 trigger times for each slot and event");
566 Df125TriggerTime_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
567 Df125TriggerTime_tree->Branch(
"rocid",&rocid,
"rocid/i");
568 Df125TriggerTime_tree->Branch(
"slot",&slot,
"slot/i");
569 Df125TriggerTime_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
570 Df125TriggerTime_tree->Branch(
"time",&time,
"time/l");
571 f125TTtree_exists = 1;
573 eventnum = eventnumber;
575 for(
unsigned int c_chan=0; c_chan<num_f125TT; c_chan++){
578 rocid = f125TriggerTime->
rocid;
579 slot = f125TriggerTime->
slot;
580 itrigger = f125TriggerTime->
itrigger;
581 time = f125TriggerTime->
time;
582 Df125TriggerTime_tree->Fill();
588 unsigned int num_F1TDCH = F1TDCHit_vec.size();
590 if (!F1TDCHtree_exists && num_F1TDCH>0) {
591 printf(
"DAQTree >>eventnum %llu, found %4i DF1TDCHit objects\n",(
long long unsigned int)eventnumber,num_F1TDCH);
592 printf(
"DAQTree >>Creating tree F1TDCHit_tree\n");
593 DF1TDCHit_tree =
new TTree(
"DF1TDCHit",
"tree of F1 TDC hit times for each channel and event");
594 DF1TDCHit_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
595 DF1TDCHit_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
596 DF1TDCHit_tree->Branch(
"rocid",&rocid,
"rocid/i");
597 DF1TDCHit_tree->Branch(
"slot",&slot,
"slot/i");
598 DF1TDCHit_tree->Branch(
"channel",&channel,
"channel/i");
599 DF1TDCHit_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
600 DF1TDCHit_tree->Branch(
"trig_time",&trig_time,
"trig_time/i");
601 DF1TDCHit_tree->Branch(
"time",&time,
"time/i");
602 DF1TDCHit_tree->Branch(
"data_word",&data_word,
"data_word/i");
603 F1TDCHtree_exists = 1;
605 eventnum = eventnumber;
607 for(
unsigned int c_chan=0; c_chan<num_F1TDCH; c_chan++){
609 const DF1TDCHit *F1TDCHit = F1TDCHit_vec[c_chan];
610 rocid = F1TDCHit->
rocid;
611 slot = F1TDCHit->
slot;
615 time = F1TDCHit->
time;
617 DF1TDCHit_tree->Fill();
623 unsigned int num_F1TDCTT = F1TDCTriggerTime_vec.size();
625 if (!F1TDCTTtree_exists && num_F1TDCTT>0) {
626 printf(
"DAQTree >>eventnum %llu, found %4i DF1TDCTriggerTime objects\n",(
long long unsigned int)eventnumber,num_F1TDCTT);
627 printf(
"DAQTree >>Creating tree DF1TDCTriggerTime_tree\n");
628 DF1TDCTriggerTime_tree =
new TTree(
"DF1TDCTriggerTime",
"tree of F1 TDC trigger times for each slot and event");
629 DF1TDCTriggerTime_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
630 DF1TDCTriggerTime_tree->Branch(
"rocid",&rocid,
"rocid/i");
631 DF1TDCTriggerTime_tree->Branch(
"slot",&slot,
"slot/i");
632 DF1TDCTriggerTime_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
633 DF1TDCTriggerTime_tree->Branch(
"time",&time,
"time/l");
634 F1TDCTTtree_exists = 1;
636 eventnum = eventnumber;
638 for(
unsigned int c_chan=0; c_chan<num_F1TDCTT; c_chan++){
641 rocid = F1TDCTriggerTime->
rocid;
642 slot = F1TDCTriggerTime->
slot;
643 itrigger = F1TDCTriggerTime->
itrigger;
644 time = F1TDCTriggerTime->
time;
645 DF1TDCTriggerTime_tree->Fill();
649 const uint32_t numDf250WRDpedsamps= 10;
650 const Int_t Df250WRDminpeakheight = 11;
652 unsigned int num_f250WRD = f250WindowRawData_vec.size();
654 if (!f250WRDtree_exists && num_f250WRD>0) {
655 printf(
"DAQTree >>eventnum %llu, found %4i Df250WindowRawData objects\n",(
long long unsigned int)eventnumber,num_f250WRD);
656 printf(
"DAQTree >>Creating tree Df250WindowRawData_tree\n");
657 Df250WindowRawData_tree =
new TTree(
"Df250WindowRawData",
658 "tree of flash 250 raw window data (waveform samples) for each channel and event");
659 Df250WindowRawData_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
660 Df250WindowRawData_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
661 Df250WindowRawData_tree->Branch(
"rocid",&rocid,
"rocid/i");
662 Df250WindowRawData_tree->Branch(
"slot",&slot,
"slot/i");
663 Df250WindowRawData_tree->Branch(
"channel",&channel,
"channel/i");
664 Df250WindowRawData_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
665 Df250WindowRawData_tree->Branch(
"waveform",&waveform);
666 Df250WindowRawData_tree->Branch(
"nsamples",&nsamples,
"nsamples/i");
667 Df250WindowRawData_tree->Branch(
"w_integral",&w_integral,
"w_integral/i");
668 Df250WindowRawData_tree->Branch(
"w_min",&w_min,
"w_min/i");
669 Df250WindowRawData_tree->Branch(
"w_max",&w_max,
"w_max/i");
670 Df250WindowRawData_tree->Branch(
"w_samp1",&w_samp1,
"w_samp1/i");
671 Df250WindowRawData_tree->Branch(
"w_ped",&w_ped,
"w_ped/i");
672 Df250WindowRawData_tree->Branch(
"w_time",&w_time,
"w_time/f");
673 Df250WindowRawData_tree->Branch(
"invalid_samples",&invalid_samples,
"invalid_samples/b");
674 Df250WindowRawData_tree->Branch(
"overflow",&overflow,
"overflow/b");
675 f250WRDtree_exists = 1;
677 eventnum = eventnumber;
679 for(
unsigned int c_chan=0; c_chan<num_f250WRD; c_chan++){
683 rocid = f250WindowRawData->
rocid;
684 slot = f250WindowRawData->
slot;
685 channel = f250WindowRawData->
channel;
686 itrigger = f250WindowRawData->
itrigger;
688 overflow = f250WindowRawData->
overflow;
690 const vector<uint16_t> &samplesvector = f250WindowRawData->
samples;
691 nsamples=samplesvector.size();
693 for (uint16_t c_samp=0; c_samp<nsamples; c_samp++) {
694 if (samplesvector[c_samp]<4096) {
695 waveform.push_back(samplesvector[c_samp]);
697 waveform.push_back(4096);
700 w_integral = samplesvector[0];
701 w_min = samplesvector[0];
702 w_max = samplesvector[0];
703 w_samp1 = samplesvector[0];
704 w_ped = samplesvector[0];
706 if (c_samp<numDf250WRDpedsamps) {
707 w_ped += samplesvector[c_samp];
709 w_integral += samplesvector[c_samp];
710 if (w_min > samplesvector[c_samp]) w_min = samplesvector[c_samp];
711 if (w_max < samplesvector[c_samp]) w_max = samplesvector[c_samp];
715 Int_t lastbelowsamp=0, peakheight = w_max-w_min;
716 Float_t threshold = w_min + peakheight/2.0;
717 Float_t firstaboveheight=0, lastbelowheight=0;
719 if (peakheight > Df250WRDminpeakheight) {
720 for (uint16_t c_samp=0; c_samp<nsamples; c_samp++) {
721 if (samplesvector[c_samp]>threshold) {
722 firstaboveheight = samplesvector[c_samp];
723 lastbelowsamp = c_samp-1;
724 lastbelowheight = samplesvector[c_samp-1];
728 w_time = lastbelowsamp + (threshold-lastbelowheight)/(firstaboveheight-lastbelowheight);
730 Df250WindowRawData_tree->Fill();
735 const uint32_t numDf250PRDpedsamps= 4;
736 const Int_t Df250PRDminpeakheight = 11;
738 unsigned int num_f250PRD = f250PulseRawData_vec.size();
740 if (!f250PRDtree_exists && num_f250PRD>0) {
741 printf(
"DAQTree >>eventnum %llu, found %4i Df250PulseRawData objects\n",(
long long unsigned int)eventnumber,num_f250PRD);
742 printf(
"DAQTree >>Creating tree Df250PulseRawData_tree\n");
743 Df250PulseRawData_tree =
new TTree(
"Df250PulseRawData",
744 "tree of flash 250 pulse raw data for each channel and event");
745 Df250PulseRawData_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
746 Df250PulseRawData_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
747 Df250PulseRawData_tree->Branch(
"rocid",&rocid,
"rocid/i");
748 Df250PulseRawData_tree->Branch(
"slot",&slot,
"slot/i");
749 Df250PulseRawData_tree->Branch(
"channel",&channel,
"channel/i");
750 Df250PulseRawData_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
751 Df250PulseRawData_tree->Branch(
"pulse_number",&pulse_number,
"pulse_number/i");
752 Df250PulseRawData_tree->Branch(
"first_sample_number",&first_sample_number,
"first_sample_number/i");
753 Df250PulseRawData_tree->Branch(
"waveform",&waveform);
754 Df250PulseRawData_tree->Branch(
"nsamples",&nsamples,
"nsamples/i");
755 Df250PulseRawData_tree->Branch(
"w_integral",&w_integral,
"w_integral/i");
756 Df250PulseRawData_tree->Branch(
"w_min",&w_min,
"w_min/i");
757 Df250PulseRawData_tree->Branch(
"w_max",&w_max,
"w_max/i");
758 Df250PulseRawData_tree->Branch(
"w_samp1",&w_samp1,
"w_samp1/i");
759 Df250PulseRawData_tree->Branch(
"w_ped",&w_ped,
"w_ped/i");
760 Df250PulseRawData_tree->Branch(
"w_time",&w_time,
"w_time/f");
761 Df250PulseRawData_tree->Branch(
"invalid_samples",&invalid_samples,
"invalid_samples/b");
762 Df250PulseRawData_tree->Branch(
"overflow",&overflow,
"overflow/b");
763 f250PRDtree_exists = 1;
765 eventnum = eventnumber;
767 for(
unsigned int c_chan=0; c_chan<num_f250PRD; c_chan++){
771 rocid = f250PulseRawData->
rocid;
772 slot = f250PulseRawData->
slot;
773 channel = f250PulseRawData->
channel;
774 itrigger = f250PulseRawData->
itrigger;
778 overflow = f250PulseRawData->
overflow;
780 const vector<uint16_t> &samplesvector = f250PulseRawData->
samples;
781 nsamples=samplesvector.size();
783 for (uint16_t c_samp=0; c_samp<nsamples; c_samp++) {
785 if (samplesvector[c_samp]<4096) {
786 waveform.push_back(samplesvector[c_samp]);
788 waveform.push_back(4096);
791 w_integral = samplesvector[0];
792 w_min = samplesvector[0];
793 w_max = samplesvector[0];
794 w_samp1 = samplesvector[0];
795 w_ped = samplesvector[0];
797 if (c_samp<numDf250PRDpedsamps) {
798 w_ped += samplesvector[c_samp];
800 w_integral += samplesvector[c_samp];
801 if (w_min > samplesvector[c_samp]) w_min = samplesvector[c_samp];
802 if (w_max < samplesvector[c_samp]) w_max = samplesvector[c_samp];
806 Int_t lastbelowsamp=0, peakheight = w_max-w_min;
807 Float_t threshold = w_min + peakheight/2.0;
808 Float_t firstaboveheight=0, lastbelowheight=0;
810 if (peakheight > Df250PRDminpeakheight) {
811 for (uint16_t c_samp=0; c_samp<nsamples; c_samp++) {
812 if (samplesvector[c_samp]>threshold) {
813 firstaboveheight = samplesvector[c_samp];
814 lastbelowsamp = c_samp-1;
815 lastbelowheight = samplesvector[c_samp-1];
819 w_time = lastbelowsamp + (threshold-lastbelowheight)/(firstaboveheight-lastbelowheight);
821 Df250PulseRawData_tree->Fill();
826 unsigned int num_f250PI = f250PulseIntegral_vec.size();
828 if (!f250PItree_exists && num_f250PI>0) {
829 printf(
"DAQTree >>eventnum %llu, found %4i Df250PulseIntegral objects\n",(
long long unsigned int)eventnumber,num_f250PI);
830 printf(
"DAQTree >>Creating tree Df250PulseIntegral_tree\n");
831 Df250PulseIntegral_tree =
new TTree(
"Df250PulseIntegral",
832 "tree of flash 250 pulse integral for each channel and event");
833 Df250PulseIntegral_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
834 Df250PulseIntegral_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
835 Df250PulseIntegral_tree->Branch(
"rocid",&rocid,
"rocid/i");
836 Df250PulseIntegral_tree->Branch(
"slot",&slot,
"slot/i");
837 Df250PulseIntegral_tree->Branch(
"channel",&channel,
"channel/i");
838 Df250PulseIntegral_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
839 Df250PulseIntegral_tree->Branch(
"pulse_number",&pulse_number,
"pulse_number/i");
840 Df250PulseIntegral_tree->Branch(
"quality_factor",&quality_factor,
"quality_factor/i");
841 Df250PulseIntegral_tree->Branch(
"integral",&integral,
"integral/i");
842 Df250PulseIntegral_tree->Branch(
"pedestal",&
pedestal,
"pedestal/i");
843 Df250PulseIntegral_tree->Branch(
"nsamples_integral",&nsamples_integral,
"nsamples_integral/i");
844 Df250PulseIntegral_tree->Branch(
"nsamples_pedestal",&nsamples_pedestal,
"nsamples_pedestal/i");
845 f250PItree_exists = 1;
847 eventnum = eventnumber;
849 for(
unsigned int c_chan=0; c_chan<num_f250PI; c_chan++){
852 rocid = f250PulseIntegral->
rocid;
853 slot = f250PulseIntegral->
slot;
854 channel = f250PulseIntegral->
channel;
855 itrigger = f250PulseIntegral->
itrigger;
858 integral = f250PulseIntegral->
integral;
862 Df250PulseIntegral_tree->Fill();
868 unsigned int num_f250PT = f250PulseTime_vec.size();
870 if (!f250PTtree_exists && num_f250PT>0) {
871 printf(
"DAQTree >>eventnum %llu, found %4i Df250PulseTime objects\n",(
long long unsigned int)eventnumber,num_f250PT);
872 printf(
"DAQTree >>Creating tree f250PulseTime_tree\n");
873 Df250PulseTime_tree =
new TTree(
"Df250PulseTime",
874 "tree of flash 250 pulse times for each channel and event");
875 Df250PulseTime_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
876 Df250PulseTime_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
877 Df250PulseTime_tree->Branch(
"rocid",&rocid,
"rocid/i");
878 Df250PulseTime_tree->Branch(
"slot",&slot,
"slot/i");
879 Df250PulseTime_tree->Branch(
"channel",&channel,
"channel/i");
880 Df250PulseTime_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
881 Df250PulseTime_tree->Branch(
"pulse_number",&pulse_number,
"pulse_number/i");
882 Df250PulseTime_tree->Branch(
"quality_factor",&quality_factor,
"quality_factor/i");
883 Df250PulseTime_tree->Branch(
"time",&time,
"time/i");
884 f250PTtree_exists = 1;
886 eventnum = eventnumber;
888 for(
unsigned int c_chan=0; c_chan<num_f250PT; c_chan++){
891 rocid = f250PulseTime->
rocid;
892 slot = f250PulseTime->
slot;
893 channel = f250PulseTime->
channel;
897 time = f250PulseTime->
time;
898 Df250PulseTime_tree->Fill();
903 unsigned int num_f250PP = f250PulsePedestal_vec.size();
905 if (!f250PPtree_exists && num_f250PP>0) {
906 printf(
"DAQTree >>eventnum %llu, found %4i Df250PulsePedestal objects\n",(
long long unsigned int)eventnumber,num_f250PP);
907 printf(
"DAQTree >>Creating tree f250PulsePedestal_tree\n");
908 Df250PulsePedestal_tree =
new TTree(
"Df250PulsePedestal",
909 "tree of flash 250 pulse times for each channel and event");
910 Df250PulsePedestal_tree->Branch(
"channelnum",&channelnum,
"channelnum/i");
911 Df250PulsePedestal_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
912 Df250PulsePedestal_tree->Branch(
"rocid",&rocid,
"rocid/i");
913 Df250PulsePedestal_tree->Branch(
"slot",&slot,
"slot/i");
914 Df250PulsePedestal_tree->Branch(
"channel",&channel,
"channel/i");
915 Df250PulsePedestal_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
916 Df250PulsePedestal_tree->Branch(
"pulse_number",&pulse_number,
"pulse_number/i");
917 Df250PulsePedestal_tree->Branch(
"pedestal",&
pedestal,
"pedestal/i");
918 Df250PulsePedestal_tree->Branch(
"pulse_peak",&pulse_peak,
"pulse_peak/i");
919 f250PPtree_exists = 1;
921 eventnum = eventnumber;
923 for(
unsigned int c_chan=0; c_chan<num_f250PP; c_chan++){
926 rocid = f250PulsePedestal->
rocid;
927 slot = f250PulsePedestal->
slot;
928 channel = f250PulsePedestal->
channel;
929 itrigger = f250PulsePedestal->
itrigger;
933 Df250PulsePedestal_tree->Fill();
939 unsigned int num_f250TT = f250TriggerTime_vec.size();
941 if (!f250TTtree_exists && num_f250TT>0) {
942 printf(
"DAQTree >>eventnum %llu, found %4i Df250TriggerTime objects\n",(
long long unsigned int)eventnumber,num_f250TT);
943 printf(
"DAQTree >>Creating tree Df250TriggerTime_tree\n");
944 Df250TriggerTime_tree =
new TTree(
"Df250TriggerTime",
945 "tree of flash 250 trigger times for each slot and event");
946 Df250TriggerTime_tree->Branch(
"eventnum",&eventnum,
"eventnum/i");
947 Df250TriggerTime_tree->Branch(
"rocid",&rocid,
"rocid/i");
948 Df250TriggerTime_tree->Branch(
"slot",&slot,
"slot/i");
949 Df250TriggerTime_tree->Branch(
"itrigger",&itrigger,
"itrigger/i");
950 Df250TriggerTime_tree->Branch(
"time",&time,
"time/l");
951 f250TTtree_exists = 1;
953 eventnum = eventnumber;
955 for(
unsigned int c_chan=0; c_chan<num_f250TT; c_chan++){
958 rocid = f250TriggerTime->
rocid;
959 slot = f250TriggerTime->
slot;
960 itrigger = f250TriggerTime->
itrigger;
961 time = f250TriggerTime->
time;
962 Df250TriggerTime_tree->Fill();
bool Df250PulsePedestal_cmp(const Df250PulsePedestal *a, const Df250PulsePedestal *b)
uint32_t pedestal
from Pulse Integral Data word (future)
uint32_t pulse_number
from Pulse Raw Data Data 1st word
uint32_t pulse_number
from Pulse Pedestal Data word
uint32_t quality_factor
from Pulse Integral Data word
uint32_t pulse_peak
from Pulse Pedestal Data word
uint32_t quality_factor
from Pulse Integral Data word
JEventProcessor_DAQTree()
uint32_t pulse_number
from Pulse Time Data word
uint32_t nsamples_integral
number of samples used in integral
bool overflow
true if any sample's "overflow" bit set
bool Df250PulseTime_cmp(const Df250PulseTime *a, const Df250PulseTime *b)
vector< uint16_t > samples
uint32_t pulse_peak
from Pulse Pedestal Data word
jerror_t init(void)
for F1TDCH
uint32_t first_sample_number
from Pulse Raw Data Data 1st word
bool Df250PulseIntegral_cmp(const Df250PulseIntegral *a, const Df250PulseIntegral *b)
bool DF1TDCTriggerTime_cmp(const DF1TDCTriggerTime *a, const DF1TDCTriggerTime *b)
vector< uint16_t > samples
from Pulse Raw Data Data words 2-N (each word contains 2 samples)
uint32_t pulse_number
from Pulse Time Data word
bool overflow
true if any sample's "overflow" bit set
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
bool Df125TriggerTime_cmp(const Df125TriggerTime *a, const Df125TriggerTime *b)
bool Df125PulseIntegral_cmp(const Df125PulseIntegral *a, const Df125PulseIntegral *b)
uint32_t time
from Pulse Time Data word
vector< uint16_t > samples
uint32_t pulse_number
from Pulse Pedestal Data word
uint32_t quality_factor
from Pulse Time Data word
~JEventProcessor_DAQTree()
uint32_t pulse_number
from Pulse Integral Data word
bool Df250PulseRawData_cmp(const Df250PulseRawData *a, const Df250PulseRawData *b)
uint32_t pedestal
from Pulse Pedestal Data word
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
bool Df250WindowRawData_cmp(const Df250WindowRawData *a, const Df250WindowRawData *b)
uint32_t time
from Pulse Time Data word
uint32_t quality_factor
from Pulse Time Data word
jerror_t fini(void)
Called after last event of last event source has been processed.
uint32_t pulse_number
from Pulse Raw Data Data 1st word
uint32_t integral
from Pulse Integral Data word
uint32_t pedestal
from Pulse Integral Data word (future)
bool invalid_samples
true if any sample's "not valid" bit set
bool Df125PulseRawData_cmp(const Df125PulseRawData *a, const Df125PulseRawData *b)
uint32_t integral
from Pulse Integral Data word
bool Df125WindowRawData_cmp(const Df125WindowRawData *a, const Df125WindowRawData *b)
Define a comparison operator for sorting objets of all the DAQ types.
bool invalid_samples
true if any sample's "not valid" bit set
static TH1I * pedestal[nChan]
bool Df250TriggerTime_cmp(const Df250TriggerTime *a, const Df250TriggerTime *b)
uint32_t pulse_number
from Pulse Integral Data word
uint32_t pedestal
from Pulse Pedestal Data word
bool Df125PulseTime_cmp(const Df125PulseTime *a, const Df125PulseTime *b)
uint32_t nsamples_pedestal
number of samples used in pedestal
printf("string=%s", string)
vector< uint16_t > samples
from Pulse Raw Data Data words 2-N (each word contains 2 samples)
bool Df125PulsePedestal_cmp(const Df125PulsePedestal *a, const Df125PulsePedestal *b)
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
bool DF1TDCHit_cmp(const DF1TDCHit *a, const DF1TDCHit *b)
uint32_t first_sample_number
from Pulse Raw Data Data 1st word