16 #include "Constants.h" 23 #include "ChanTrigger.h" 24 #include "GlobalTrigger.h" 25 #include "icemc_random.h" 30 GlobalTrigger::GlobalTrigger(
Settings *settings1,
Anita *anita1){
33 WHICHLAYERSLCPRCP[0]=0;
34 WHICHLAYERSLCPRCP[1]=1;
35 WHICHLAYERSLCPRCP[2]=0;
42 L3_COINCIDENCE=22.5e-9;
45 L1_COINCIDENCE_ANITA3[0]=16.E-9;
46 L1_COINCIDENCE_ANITA3[1]=12.E-9;
47 L1_COINCIDENCE_ANITA3[2]=4.E-9;
51 LASTTIMETOTESTL1_ANITA3=((double)anita1->NFOUR/2)*anita1->TIMESTEP-Tools::dMax(L1_COINCIDENCE_ANITA3,3);
59 L1_COINCIDENCE_LR_SCA[0]=16.E-9;
60 L1_COINCIDENCE_LR_SCA[1]=16.E-9;
62 LASTTIMETOTESTL1_ANITA4LR_SCA=Tools::dMax(L1_COINCIDENCE_LR_SCA,2);
63 LASTTIMETOTESTL1_ANITA4LR_SCA=((double)anita1->NFOUR/2)*anita1->TIMESTEP-LASTTIMETOTESTL1_ANITA4LR_SCA;
65 L1_COINCIDENCE_MOREGENERAL[0][0]=16.E-9;
66 L1_COINCIDENCE_MOREGENERAL[0][1]=4.E-9;
68 L1_COINCIDENCE_MOREGENERAL[1][0]=16.E-9;
69 L1_COINCIDENCE_MOREGENERAL[1][1]=4.E-9;
71 L1_COINCIDENCE_MOREGENERAL[2][0]=4.E-9;
72 L1_COINCIDENCE_MOREGENERAL[2][1]=4.E-9;
74 LASTTIMETOTESTL1_ANITA4=0.;
75 for (
int i=0;i<3;i++) {
76 for (
int j=0;j<2;j++) {
77 if (L1_COINCIDENCE_MOREGENERAL[i][j]>LASTTIMETOTESTL1_ANITA4)
78 LASTTIMETOTESTL1_ANITA4=L1_COINCIDENCE_MOREGENERAL[i][j];
82 LASTTIMETOTESTL1_ANITA4=((double)anita1->NFOUR/2)*anita1->TIMESTEP-LASTTIMETOTESTL1_ANITA4;
85 nstepback=(int)(2.E-9/TRIGTIMESTEP);
88 L1_COINCIDENCE_ANITA4LR_SCB=4.e-9;
90 L2_COINCIDENCE_ANITA4LR_SCB[0]=12.e-9;
91 L2_COINCIDENCE_ANITA4LR_SCB[1]=4.e-9;
92 L2_COINCIDENCE_ANITA4LR_SCB[2]=8.e-9;
93 LASTTIMETOTESTL1_ANITA4LR_SCB=((double)anita1->NFOUR/2)*anita1->TIMESTEP-L1_COINCIDENCE_ANITA4LR_SCB;
94 LASTTIMETOTESTL2_ANITA4LR_SCB=((double)anita1->NFOUR/2)*anita1->TIMESTEP-Tools::dMax(L2_COINCIDENCE_ANITA4LR_SCB,3);
95 L3_COINCIDENCE_ANITA4LR_SCB=12.e-9;
101 Tools::Zero(triggerbits,Anita::NTRIG);
103 phiTrigMask[0]=anita1->phiTrigMask;
104 phiTrigMask[1]=anita1->phiTrigMaskH;
105 l1TrigMask[0]=anita1->l1TrigMask;
106 l1TrigMask[1]=anita1->l1TrigMaskH;
113 for (
int k=0;k<2;k++) {
114 for (
int p=0;p<anita1->
NBANDS+1;p++) {
115 channels_passing[i][j][k][p]=0;
116 channels_passing_justNoise[i][j][k][p]=0;
118 vchannels_passing[i][j][k].push_back(0);
126 for (
int i=0;i<3;i++) {
127 for (
int j=0;j<16;j++) {
128 for (
int k=0;k<2;k++) {
129 for (
int p=0;p<5;p++) {
130 arrayofhits[i][j][k][p].clear();
131 arrayofhitsnoise[i][j][k][p].clear();
137 for (
int k=0;k<2;k++) {
141 volts_em[k][i][j]=0.;
142 volts_original[k][i][j]=0.;
149 for (
int i=0;i<settings1->NANTENNAS;i++) {
150 nchannels_perrx_triggered[i] = 0;
151 for (
int j=0;j<8;j++) {
152 nchannels_perband_triggered[i][j]=0;
211 void GlobalTrigger::PassesTrigger(
Settings *settings1,
Anita *anita1,
int discones_passing,
int mode,
int *l3trig,
int l2trig[
Anita::NPOL][Anita::NTRIGGERLAYERS_MAX],
int l1trig[
Anita::NPOL][Anita::NTRIGGERLAYERS_MAX],
int antennaclump,
int loctrig[
Anita::NPOL][
Anita::NLAYERS_MAX][
Anita::NPHI_MAX],
int loctrig_nadironly[
Anita::NPOL][
Anita::NPHI_MAX],
int inu,
int *thispasses,
bool noiseOnly) {
213 double this_threshold= anita1->powerthreshold[4];
214 return PassesTrigger(settings1,anita1,discones_passing,mode,l3trig,l2trig,l1trig,antennaclump,loctrig,loctrig_nadironly,inu,this_threshold, thispasses, noiseOnly);
220 void GlobalTrigger::PassesTrigger(
Settings *settings1,
Anita *anita1,
int discones_passing,
int mode,
int *l3trig,
int l2trig[
Anita::NPOL][Anita::NTRIGGERLAYERS_MAX],
int l1trig[
Anita::NPOL][Anita::NTRIGGERLAYERS_MAX],
int antennaclump,
int loctrig[
Anita::NPOL][
Anita::NLAYERS_MAX][
Anita::NPHI_MAX],
int loctrig_nadironly[
Anita::NPOL][
Anita::NPHI_MAX],
int inu,
double this_threshold,
int *thispasses,
bool noiseOnly) {
225 if (settings1->TRIGGERSCHEME < 3) {
229 PassesTriggerBasic(settings1, anita1, discones_passing, mode, l3trig, l2trig, l1trig, antennaclump, loctrig, loctrig_nadironly, thispasses, inu, noiseOnly);
233 else if (settings1->TRIGGERSCHEME == 3) {
235 PassesTriggerCoherentSum(settings1, anita1, inu, thispasses);
238 else if (settings1->TRIGGERSCHEME == 4) {
240 PassesTriggerSummedPower(settings1, anita1);
243 else if (settings1->TRIGGERSCHEME == 5) {
246 PassesTriggerScheme5(anita1, this_threshold, thispasses);
255 void GlobalTrigger::PassesTriggerBasic(
Settings *settings1,
Anita *anita1,
int discones_passing,
int mode,
int *l3trig,
int l2trig[
Anita::NPOL][Anita::NTRIGGERLAYERS_MAX],
int l1trig[
Anita::NPOL][Anita::NTRIGGERLAYERS_MAX],
int antennaclump,
int loctrig[
Anita::NPOL][
Anita::NLAYERS_MAX][
Anita::NPHI_MAX],
int loctrig_nadironly[
Anita::NPOL][
Anita::NPHI_MAX],
int *thispasses,
int inu,
bool noiseOnly){
261 int required_bands_failed[2]={0,0};
264 arrayofhits = arrayofhitsnoise;
266 arrayofhits = arrayofhitsall;
278 Tools::Zero(l1trig[k],Anita::NTRIGGERLAYERS_MAX);
279 Tools::Zero(l2trig[k],Anita::NTRIGGERLAYERS_MAX);
287 for (
int ilayer=0;ilayer<settings1->NLAYERS;ilayer++) {
300 int whichphisector=0;
301 for (
int ilayer=0;ilayer<settings1->NLAYERS;ilayer++) {
302 for (
int iphi=0;iphi<anita1->
NRX_PHI[ilayer];iphi++) {
303 for (
int ipolar=0;ipolar<2;ipolar++) {
305 if (anita1->pol_allowed[ipolar]==0)
continue;
309 for (
int iband=0;iband<NBAND;iband++) {
310 if (!anita1->bwslice_allowed[iband])
continue;
321 if (noiseOnly) channels_compacted_passing[whichlayer][whichphisector][ipolar][iband]+=channels_passing_justNoise[ilayer][iphi][ipolar][iband];
322 else channels_compacted_passing[whichlayer][whichphisector][ipolar][iband]+=channels_passing[ilayer][iphi][ipolar][iband];
341 Nreq_l2[i]=anita1->trigRequirements[1];
348 int antpass[2]={0,0};
352 for(
int iloc=0;iloc<anita1->NTRIGGERLAYERS;iloc++) {
355 for(
int iphi=0;iphi<anita1->PHITRIG[iloc];iphi++) {
359 for(
int ipolar=0;ipolar<2;ipolar++) {
363 for(
int iband=0;iband<NBAND;iband++) {
364 if(channels_compacted_passing[iloc][iphitrig][ipolar][iband] == 1
365 && anita1->bwslice_allowed[iband]==1 && anita1->pol_allowed[ipolar]==1) {
367 if (settings1->PHIMASKING && settings1->WHICH==9){
369 if (1<<iphitrig & l1TrigMask[ipolar]) {
373 antsum[ipolar] = antsum[ipolar] +1;
379 for (
int ipolar=0;ipolar<2;ipolar++) {
380 required_bands_failed[ipolar]=0;
381 for (
int iband=0;iband<NBAND;iband++) {
382 if(channels_compacted_passing[iloc][iphitrig][ipolar][iband] == 0
383 && anita1->bwslice_required[iband]==1 ) {
384 required_bands_failed[ipolar] = 1;
393 for (
int ipolar=0;ipolar<2;ipolar++) {
394 ant[ipolar][iloc][iphitrig] = 1;
395 if( (anita1->pol_required[ipolar]==1 &&
396 (antsum[ipolar] < anita1->trigRequirements[0]
397 || required_bands_failed[ipolar]==1 ) )
398 || (anita1->pol_required[ipolar]==0)
400 ant[ipolar][iloc][iphitrig]=0;
410 if (settings1->DISCONES==2) {
417 for(
int iloc=0;iloc<anita1->NTRIGGERLAYERS;iloc++){
418 for (
int iphi=0;iphi<anita1->PHITRIG[iloc];iphi++){
420 for (
int ipolar=0;ipolar<2;ipolar++) {
421 if (ant[ipolar][iloc][iphitrig]==1)
422 l1trig[ipolar][iloc] += (1<<iphitrig);
429 if (antpass[ipolar] >= 2)
430 thispasses[ipolar] = 1;
433 }
else if (mode == 2) {
436 if (settings1->WHICH==9) {
440 std::array<std::array<std::vector<int>,16>,2> vl1trig;
442 L1Anita3_AllPhiSectors(anita1,vl1trig);
445 for (
int ipol=0;ipol<2;ipol++) {
446 for (
int iphi=0;iphi<16;iphi++) {
448 for (
unsigned int ibin=0;ibin<vl1trig[ipol][iphi].size();ibin++) {
449 anita1->l1trig_anita3and4_inanita[ipol][iphi][ibin]=vl1trig[ipol][iphi][ibin];
453 for (
int ibin=vl1trig[ipol][iphi].size();ibin<anita1->HALFNFOUR;ibin++) {
454 anita1->l1trig_anita3and4_inanita[ipol][iphi][ibin]=0;
460 std::array<std::array<std::vector<int>,16>,2> vl2trig;
462 L2Anita3and4(anita1,vl1trig,
465 if (settings1->PHIMASKING){
466 for (
int ipol=0;ipol<2;ipol++) {
467 for (
int iphi=0;iphi<16;iphi++) {
468 if ((1<<iphi & l1TrigMask[ipol])||(1<<iphi & phiTrigMask[ipol])) {
470 std::fill(vl2trig[ipol][iphi].begin(), vl2trig[ipol][iphi].end(), 0);
477 L3Anita3and4(anita1,vl2trig,
480 for (
int ipol=0;ipol<2;ipol++) {
481 for (
int iphi=0;iphi<16;iphi++) {
482 if (vl3trig[ipol][iphi]>0) l3trig[ipol]+=(1<<iphi);
488 else if (settings1->WHICH==10 && !(settings1->LCPRCP)) {
490 std::array<std::array<std::vector<int>,16>,2> vl1trig;
492 L1Anita4_AllPhiSectors(anita1,vl1trig);
495 for (
int ipol=0;ipol<2;ipol++) {
496 for (
int iphi=0;iphi<16;iphi++) {
498 for (
unsigned int ibin=0;ibin<vl1trig[ipol][iphi].size();ibin++) {
499 anita1->l1trig_anita3and4_inanita[ipol][iphi][ibin]=vl1trig[ipol][iphi][ibin];
504 for (
unsigned int ibin=vl1trig[ipol][iphi].size();ibin<anita1->HALFNFOUR;ibin++) {
505 anita1->l1trig_anita3and4_inanita[ipol][iphi][ibin]=0;
511 std::array<std::array<std::vector<int>,16>,2> vl2trig;
513 L2Anita3and4(anita1,vl1trig,
517 L3Anita3and4(anita1,vl2trig,
520 for (
int ipol=0;ipol<2;ipol++) {
521 for (
int iphi=0;iphi<16;iphi++) {
522 if (vl3trig[ipol][iphi]>0) l3trig[ipol]+=(1<<iphi);
527 else if (settings1->WHICH==10 && settings1->LCPRCP) {
558 delay_AllAntennas(anita1);
562 std::array< std::array< vector<int>,16>,3> vl1trig_anita4lr_scb;
566 std::array<std::array<vector<int>,3>,16> vl2_realtime_anita4_scb;
569 std::array<vector<int>,16> vl3trig_type0;
570 std::array<vector<int>,16> vl3trig_type1;
571 int thispasses_l3type0=0;
572 int thispasses_l3type1=0;
575 double time_thisbin=(double)nstepback*TRIGTIMESTEP;
576 int itrigbin=nstepback;
580 while (time_thisbin<LASTTIMETOTESTL1_ANITA4LR_SCB) {
583 L1Anita4LR_ScB_AllAntennas_OneBin(itrigbin,anita1,vl1trig_anita4lr_scb,npassesl1);
589 time_thisbin=(double)itrigbin*TRIGTIMESTEP;
593 time_thisbin=(double)nstepback*TRIGTIMESTEP;
596 while (time_thisbin<LASTTIMETOTESTL1_ANITA4LR_SCB) {
599 int npassesl2_type0=0;
600 L2Anita4LR_ScB_AllPhiSectors_OneBin(itrigbin,anita1,vl1trig_anita4lr_scb,
601 vl2_realtime_anita4_scb,npassesl2,npassesl2_type0);
610 time_thisbin=(double)itrigbin*TRIGTIMESTEP;
614 time_thisbin=(double)nstepback*TRIGTIMESTEP;
618 while (time_thisbin<LASTTIMETOTESTL1_ANITA4LR_SCB) {
621 L3Anita4LR_ScB_OneBin(itrigbin,anita1,vl2_realtime_anita4_scb,
622 vl3trig_type0, vl3trig_type1,
623 thispasses_l3type0,thispasses_l3type1);
627 time_thisbin=(double)itrigbin*TRIGTIMESTEP;
633 if (thispasses_l3type1)
634 thispasses[1]=thispasses[0]=1;
640 for (
int ilayer=0;ilayer<anita1->NTRIGGERLAYERS;ilayer++) {
641 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
642 for (
int ipolar=0;ipolar<anita1->
NPOL;ipolar++) {
643 Tools::reverseTimeOrdering(anita1->HALFNFOUR,anita1->arrayofhits_inanita[ilayer][iphi][ipolar],anita1->arrayofhits_forgaryanderic[ilayer][iphi][ipolar]);
650 for (
int ilayer=0;ilayer<anita1->NTRIGGERLAYERS;ilayer++) {
651 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
652 for (
unsigned int ibin=0;ibin<vl1trig_anita4lr_scb[ilayer][iphi].size();ibin++) {
653 anita1->l1trig_anita4lr_inanita[ilayer][iphi][ibin]=vl1trig_anita4lr_scb[ilayer][iphi][ibin];
655 for (
unsigned int ibin=vl1trig_anita4lr_scb[ilayer][iphi].size();ibin<anita1->HALFNFOUR;ibin++) {
656 anita1->l1trig_anita4lr_inanita[ilayer][iphi][ibin]=0;
659 Tools::reverseTimeOrdering(anita1->HALFNFOUR,anita1->l1trig_anita4lr_inanita[ilayer][iphi],anita1->l1trig_anita4lr_forgaryanderic[ilayer][iphi]);
666 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
667 for (
unsigned int ibin=0;ibin<vl2_realtime_anita4_scb[iphi][1].size();ibin++) {
668 anita1->l2trig_anita4lr_inanita[iphi][1][ibin]=vl2_realtime_anita4_scb[iphi][1][ibin];
671 for (
unsigned int ibin=vl2_realtime_anita4_scb[iphi][1].size();ibin<anita1->HALFNFOUR;ibin++) {
672 anita1->l2trig_anita4lr_inanita[iphi][1][ibin]=0;
676 for (
unsigned int ibin=0;ibin<vl3trig_type0[iphi].size();ibin++) {
677 anita1->l3type0trig_anita4lr_inanita[iphi][ibin]=vl3trig_type0[iphi][ibin];
679 for (
unsigned int ibin=vl3trig_type0[iphi].size();ibin<anita1->HALFNFOUR;ibin++) {
680 anita1->l3type0trig_anita4lr_inanita[iphi][ibin]=0;
682 Tools::reverseTimeOrdering(anita1->HALFNFOUR,anita1->l3type0trig_anita4lr_inanita[iphi],anita1->l3type0trig_anita4lr_forgaryanderic[iphi]);
683 for (
unsigned int ibin=0;ibin<vl3trig_type1[iphi].size();ibin++) {
685 anita1->l3trig_anita4lr_inanita[iphi][ibin]=vl3trig_type1[iphi][ibin];
687 for (
unsigned int ibin=vl3trig_type1[iphi].size();ibin<anita1->HALFNFOUR;ibin++) {
688 anita1->l3trig_anita4lr_inanita[iphi][ibin]=0;
690 Tools::reverseTimeOrdering(anita1->HALFNFOUR,anita1->l3trig_anita4lr_inanita[iphi],anita1->l3type1trig_anita4lr_forgaryanderic[iphi]);
694 for (
int ibin=0;ibin<anita1->HALFNFOUR;ibin++) {
695 anita1->time_trig[ibin]=TRIGTIMESTEP*(double)ibin;
699 for (
int iphi=0;iphi<16;iphi++) {
700 for (
unsigned int ibin=0; ibin<anita1->HALFNFOUR; ibin++){
701 if (anita1->l3trig_anita4lr_inanita[iphi][ibin]>0){
702 l3trig[0]+=(1<<iphi);
703 ibin = anita1->HALFNFOUR;
727 x = (antennaclump-1)/2;
728 y = (antennaclump-1)/2 +1;
730 for (
int iloc=0;iloc<anita1->NTRIGGERLAYERS;iloc++) {
732 for(
int iphi=0;iphi<16;iphi++) {
745 for(
int inbr=iphi-x;inbr<iphi+y;inbr++) {
746 ihit = (inbr + 16) % 16;
749 if (anita1->REQUIRE_CENTRE) {
750 ltsum+=ant[ipolar][iloc][ihittrig]*ant[ipolar][iloc][iphitrig];
755 ltsum+=ant[ipolar][iloc][ihittrig];
757 for (
int ipolar=0;ipolar<2;ipolar++) {
758 for (
int iband=0;iband<4;iband++) {
759 channsum+=channels_compacted_passing[iloc][ihittrig][ipolar][iband];
764 if(ltsum >= Nreq_l2[iloc]){
765 loctrig[ipolar][iloc][iphitrig] = 1;
766 l2trig[ipolar][iloc] += (1<<iphi);
775 if (settings1->DISCONES==2) {
781 if (settings1->PHIMASKING && settings1->WHICH!=9) {
783 for (
int iphi=0;iphi<anita1->NTRIGPHISECTORS;iphi++) {
784 if ((1<<iphi) & phiTrigMask[0]) {
786 for (
int iloc=0;iloc<anita1->NTRIGGERLAYERS;iloc++) {
787 loctrig[ipolar][iloc][iphi] = 0;
788 if(l2trig[ipolar][iloc] & (1<<iphi)) l2trig[ipolar][iloc] -= (1<<iphi);
793 }
else if (settings1->PHIMASKING && settings1->WHICH==9) {
795 for (
int iphi=0;iphi<anita1->NTRIGPHISECTORS;iphi++) {
798 if ( (1<<iphi) & phiTrigMask[ipolar] ) {
799 for (
int iloc=0;iloc<anita1->NTRIGGERLAYERS;iloc++) {
800 loctrig[ipolar][iloc][iphi] = 0;
801 if(l2trig[ipolar][iloc] & (1<<iphi)) l2trig[ipolar][iloc] -= (1<<iphi);
809 if (anita1->trigRequirements[2]==0) {
810 for (
int iloc=0;iloc<anita1->NTRIGGERLAYERS;iloc++) {
812 for (
int iphi=0;iphi<anita1->NTRIGPHISECTORS;iphi++) {
813 if (l2trig[ipolar][iloc] & (1<<iphi)) {
814 thispasses[ipolar]=1;
823 L3Trigger(settings1,anita1,loctrig,loctrig_nadironly,discones_passing,l3trig,
849 void GlobalTrigger::PassesTriggerCoherentSum(
Settings *settings1,
Anita *anita1,
int inu,
int *thispasses) {
851 for (
int center_phi_sector_offset = -1; center_phi_sector_offset <= 1; center_phi_sector_offset++){
852 int center_phi_sector_index = first_phi_sector_hit + center_phi_sector_offset;
853 if (center_phi_sector_index > 15){center_phi_sector_index = 0;}
854 if (center_phi_sector_index < 0){center_phi_sector_index = 15;}
856 bool coherent_trigger_passes =
false;
858 unsigned N_STEP_PHI = 16;
859 unsigned N_STEP_THETA = 81;
860 unsigned N_PHI_SECTORS = 16;
861 unsigned N_LAYERS_TRIGGER = 3;
863 double highest_power = 0;
867 unsigned fill_index = 0;
868 for (
unsigned fill_index_phi_sector = 0; fill_index_phi_sector < 16; ++fill_index_phi_sector) {
869 for (
unsigned fill_index_layer = 0; fill_index_layer < 3; ++fill_index_layer) {
870 anita1->cwst_RXs[fill_index].phi_sector = fill_index_phi_sector;
871 anita1->cwst_RXs[fill_index].layer = fill_index_layer;
873 unsigned physical_layer_index = ((fill_index_phi_sector%2) ? (fill_index_layer + 1) : (0));
874 if (fill_index_phi_sector%2 == 0) {
875 physical_layer_index = (fill_index_layer == 0) ? 0 : (fill_index + 1);
878 unsigned physical_phi_index (fill_index_phi_sector);
879 if (fill_index_layer == 0) {
880 physical_phi_index = unsigned(fill_index_phi_sector / 2.);
882 anita1->cwst_RXs[fill_index].x = anita1->
ANTENNA_POSITION_START[0][physical_layer_index][physical_phi_index][0];
883 anita1->cwst_RXs[fill_index].y = anita1->
ANTENNA_POSITION_START[0][physical_layer_index][physical_phi_index][1];
884 anita1->cwst_RXs[fill_index].z = anita1->
ANTENNA_POSITION_START[0][physical_layer_index][physical_phi_index][2];
886 anita1->cwst_RXs[fill_index].waveform->assign(volts_rx_rfcm_trigger[fill_index_phi_sector][fill_index_layer].begin(),volts_rx_rfcm_trigger[fill_index_phi_sector][fill_index_layer].end());
888 for (
unsigned fill_index_timestep = 0; fill_index_timestep < anita1->HALFNFOUR; ++fill_index_timestep) {
889 anita1->cwst_RXs[fill_index].digitized->at(fill_index_timestep) =
three_bit_round(anita1->cwst_RXs[fill_index].waveform->at(fill_index_timestep)/ anita1->
rms_rfcm_e_single_event, (getRNG(RNG_SUMMED_TRIGGER)->Rndm() >= 0.5),
false);
895 for (
unsigned center_phi_sector_index = 0; center_phi_sector_index < N_PHI_SECTORS; ++center_phi_sector_index) {
897 for (
unsigned index_phi = 0; index_phi < N_STEP_PHI; ++index_phi) {
898 for (
unsigned index_theta = 0; index_theta < N_STEP_THETA; ++index_theta) {
899 unsigned fill_index = 0;
900 vector <double> summed_wfm(anita1->HALFNFOUR, 0.);
902 for (
int fill_index_phi_sector_offset = -1; fill_index_phi_sector_offset <= 1; ++fill_index_phi_sector_offset) {
903 unsigned fill_index_phi_sector = (center_phi_sector_index + fill_index_phi_sector_offset + N_PHI_SECTORS)%N_PHI_SECTORS;
905 for (
unsigned fill_index_layer = 0; fill_index_layer < N_LAYERS_TRIGGER; ++fill_index_layer) {
906 unsigned rx_index = fill_index_phi_sector * 3 + fill_index_layer;
907 anita1->cwst_aligned_wfms[fill_index].phi_sector = fill_index_phi_sector;
908 anita1->cwst_aligned_wfms[fill_index].layer = fill_index_layer;
910 unsigned physical_layer_index = ((fill_index_phi_sector%2) ? (fill_index_layer + 1) : (0));
912 unsigned physical_phi_index (fill_index_phi_sector);
913 if (fill_index_layer == 0) {
914 physical_phi_index = unsigned(fill_index_phi_sector / 2.);
916 anita1->cwst_aligned_wfms[fill_index].x = anita1->
ANTENNA_POSITION_START[0][physical_layer_index][physical_phi_index][0];
917 anita1->cwst_aligned_wfms[fill_index].y = anita1->
ANTENNA_POSITION_START[0][physical_layer_index][physical_phi_index][1];
918 anita1->cwst_aligned_wfms[fill_index].z = anita1->
ANTENNA_POSITION_START[0][physical_layer_index][physical_phi_index][2];
920 unsigned time_offset = anita1->hypothesis_offsets[center_phi_sector_index][index_phi][index_theta][fill_index_phi_sector_offset + 1][fill_index_layer];
922 for (
unsigned fill_index_timestep = 0; fill_index_timestep < anita1->HALFNFOUR - time_offset; ++fill_index_timestep) {
923 anita1->cwst_aligned_wfms[fill_index].digitized->at(fill_index_timestep) = anita1->cwst_RXs[rx_index].digitized->at(fill_index_timestep + time_offset);
924 summed_wfm.at(fill_index_timestep) += anita1->cwst_aligned_wfms[fill_index].digitized->at(fill_index_timestep);
927 for (
unsigned fill_index_timestep = anita1->HALFNFOUR - time_offset; fill_index_timestep < anita1->HALFNFOUR; ++fill_index_timestep) {
930 anita1->cwst_aligned_wfms[fill_index].digitized->at(fill_index_timestep) = 0.;
937 vector <double> power_of_summed_wfm;
940 for (
unsigned window_index = 0; window_index < power_of_summed_wfm.size() - 32; window_index += 16) {
942 if (highest_power < power){
943 highest_power = power;
949 if (power >= settings1->COHERENT_THRESHOLD){
950 coherent_trigger_passes =
true;
954 if (power >= settings1->COHERENT_THRESHOLD){
955 anita1->fill_coherent_waveform_sum_tree(inu, center_phi_sector_index, settings1, anita1->
rms_rfcm_e_single_event, 0., window_index, window_index + 32, index_theta - 45., index_phi, 33., 33.,summed_wfm, power_of_summed_wfm, power);
960 if (inu == 1808 && center_phi_sector_index == 6) {
961 anita1->fill_coherent_waveform_sum_tree(inu, center_phi_sector_index, settings1, anita1->
rms_rfcm_e_single_event, 0., window_index, window_index + 32, index_theta - 45., index_phi, 33., 33.,summed_wfm, power_of_summed_wfm, power);
965 if (coherent_trigger_passes){
982 void GlobalTrigger::PassesTriggerSummedPower(
Settings *settings1,
Anita *anita1){
988 double SummedPowerThreshold = settings1->COHERENT_THRESHOLD;
989 double SummedPowerThetaMin = -45.;
990 double SummedPowerThetaMax = +25.;
991 double SummedPowerThetaStep = 1.;
1003 unsigned fill_index = 0;
1005 for (
unsigned fill_index_phi_sector = 0; fill_index_phi_sector < 16; ++fill_index_phi_sector) {
1006 for (
unsigned fill_index_layer = 0; fill_index_layer < 3; ++fill_index_layer) {
1007 anita1->cwst_RXs[fill_index].phi_sector = fill_index_phi_sector;
1008 anita1->cwst_RXs[fill_index].layer = fill_index_layer;
1011 unsigned physical_phi_index = fill_index_phi_sector;
1012 unsigned physical_layer_index;
1016 if (fill_index_phi_sector%2) {
1017 physical_layer_index = fill_index_layer + 1;
1019 if (fill_index_layer == 0) {
1020 physical_layer_index = 0;
1022 physical_layer_index = fill_index_layer + 1;
1025 if (physical_layer_index == 0) {
1026 physical_phi_index = unsigned(fill_index_phi_sector / 2);
1029 if (physical_layer_index == 1) {
1030 physical_phi_index = unsigned(fill_index_phi_sector / 2);
1034 anita1->cwst_RXs[fill_index].x = anita1->
ANTENNA_POSITION_START[0][physical_layer_index][physical_phi_index][0];
1035 anita1->cwst_RXs[fill_index].y = anita1->
ANTENNA_POSITION_START[0][physical_layer_index][physical_phi_index][1];
1036 anita1->cwst_RXs[fill_index].z = anita1->
ANTENNA_POSITION_START[0][physical_layer_index][physical_phi_index][2];
1039 anita1->cwst_RXs[fill_index].waveform->assign(volts_rx_rfcm_trigger[fill_index_phi_sector][fill_index_layer].begin(),volts_rx_rfcm_trigger[fill_index_phi_sector][fill_index_layer].end());
1041 for (
unsigned fill_index_timestep = 0; fill_index_timestep < anita1->HALFNFOUR; ++fill_index_timestep) {
1042 anita1->cwst_RXs[fill_index].digitized->at(fill_index_timestep) =
three_bit_round(anita1->cwst_RXs[fill_index].waveform->at(fill_index_timestep)/ anita1->
rms_rfcm_e_single_event,
false);
1057 vector <double> theta_hypotheses_deg;
1058 double theta_deg = SummedPowerThetaMin;
1061 theta_hypotheses_deg.push_back (theta_deg);
1062 theta_deg += SummedPowerThetaStep;
1063 }
while (theta_deg <= SummedPowerThetaMax);
1068 for (
unsigned index_window = 0; index_window < 31; ++index_window) {
1069 double max_power_each_sector[16] = {0.};
1070 double summed_power_each_sector[16] = {0.};
1072 for (
unsigned index_phi_sector = 0; index_phi_sector < 16; ++index_phi_sector) {
1073 double max_power = 0.;
1076 TVector3 theta_zero (anita1->cwst_RXs[index_phi_sector * 3 + 1].x - anita1->cwst_RXs[(index_phi_sector + 8)%16 * 3 + 1].x, anita1->cwst_RXs[index_phi_sector * 3 + 1].y - anita1->cwst_RXs[(index_phi_sector + 8)%16 * 3 + 1].y, anita1->cwst_RXs[index_phi_sector * 3 + 1].z - anita1->cwst_RXs[(index_phi_sector + 8)%16 * 3 + 1].z);
1078 theta_zero = theta_zero.Unit();
1081 for (
unsigned index_theta_hypothesis = 0; index_theta_hypothesis < theta_hypotheses_deg.size(); ++index_theta_hypothesis) {
1085 double hypoth_theta_rad = (theta_hypotheses_deg[index_theta_hypothesis] + 45.) * RADDEG;
1086 double hypoth_phi_rad = theta_zero.Phi() * RADDEG;
1087 TVector3 hypoth_vector (sin (hypoth_theta_rad) * cos (hypoth_phi_rad), sin (hypoth_theta_rad) * sin (hypoth_phi_rad), cos (hypoth_theta_rad));
1090 double dist[3] = {0.};
1091 double offset[3] = {0.};
1092 unsigned offset_steps[3] = {0};
1093 TVector3 middle_rx (anita1->cwst_RXs[index_phi_sector * 3 + 1].x, anita1->cwst_RXs[index_phi_sector * 3 + 1].y, anita1->cwst_RXs[index_phi_sector * 3 + 1].z);
1097 dist[0] = hypoth_vector * (TVector3(anita1->cwst_RXs[index_phi_sector * 3].x, anita1->cwst_RXs[index_phi_sector * 3].y, anita1->cwst_RXs[index_phi_sector * 3].z) - middle_rx);
1099 dist[2] = hypoth_vector * (TVector3(anita1->cwst_RXs[index_phi_sector * 3 + 2].x, anita1->cwst_RXs[index_phi_sector * 3 + 2].y, anita1->cwst_RXs[index_phi_sector * 3 + 2].z) - middle_rx);
1103 for (
unsigned index_antenna = 0; index_antenna < 3; ++index_antenna) {
1104 offset[index_antenna] = dist[index_antenna] / CLIGHT;
1108 double minoffset = offset[0];
1109 if (offset[1] <= minoffset) {minoffset = offset[1];}
1110 if (offset[2] <= minoffset) {minoffset = offset[2];}
1114 for (
unsigned index_antenna = 0; index_antenna < 3; ++index_antenna) {
1115 offset[index_antenna] -= minoffset;
1116 offset_steps[index_antenna] = int(Tools::round(offset[index_antenna] / anita1->TIMESTEP));
1120 if (offset_steps[0] + index_window * 16 + 32 > 511) {
continue;}
1121 if (offset_steps[1] + index_window * 16 + 32 > 511) {
continue;}
1122 if (offset_steps[2] + index_window * 16 + 32 > 511) {
continue;}
1125 for (
unsigned time_index = index_window * 16; time_index < index_window * 16 + 32; ++time_index) {
1126 double thispower = (anita1->cwst_RXs[index_phi_sector * 3].digitized->at(time_index + offset_steps[0]) + anita1->cwst_RXs[index_phi_sector * 3 + 1].digitized->at(time_index + offset_steps[1]) + anita1->cwst_RXs[index_phi_sector * 3 + 2].digitized->at(time_index + offset_steps[2]));
1127 thispower *= thispower;
1132 if (power == 0 && index_window < 21) {
1133 std::cout <<
"Trigger error: a trigger window which should not have had zero power had zero power. Window was\t" << index_window <<
"\n";
1137 if (power > max_power) {max_power = power;}
1140 max_power_each_sector[index_phi_sector] = max_power;
1144 summed_power_each_sector[0] = max_power_each_sector[15] + max_power_each_sector[0] + max_power_each_sector[1];
1145 for (
unsigned index_phi_sector = 1; index_phi_sector < 15; ++index_phi_sector) {
1146 summed_power_each_sector[index_phi_sector] = max_power_each_sector[index_phi_sector - 1] + max_power_each_sector[index_phi_sector] + max_power_each_sector[index_phi_sector + 1];
1148 summed_power_each_sector[15] = max_power_each_sector[14] + max_power_each_sector[15] + max_power_each_sector[1];
1151 bool temporary_passing_variable =
false;
1152 for (
unsigned index_phi_sector = 0; index_phi_sector < 16; ++index_phi_sector) {
1154 if (summed_power_each_sector[index_phi_sector] >= SummedPowerThreshold) {
1155 std::cout <<
"Passed with SummedPower =\t" << summed_power_each_sector[index_phi_sector] <<
"\ton sector\t" << index_phi_sector <<
"\n";
1157 temporary_passing_variable =
true;
1160 if (temporary_passing_variable) {index_window=31;}
1165 void GlobalTrigger::PassesTriggerScheme5(
Anita *anita1,
double this_threshold,
int *thispasses) {
1166 double threshold=this_threshold;
1170 int maxsample=TMath::MaxElement(5,anita1->imaxbin);
1171 int minsample=TMath::MinElement(5,anita1->
iminbin);
1173 int nstayhigh=(int)(anita1->l1window/anita1->TIMESTEP);
1177 minsample=(int)(anita1->maxt_diode/anita1->TIMESTEP)+(anita1->NFOUR/4-(int)(anita1->maxt_diode/anita1->TIMESTEP))+(
int)(anita1->arrival_times[0][anita1->rx_minarrivaltime]/anita1->TIMESTEP);
1178 maxsample=anita1->NFOUR/2-(int)(anita1->arrival_times[0][anita1->rx_minarrivaltime]/anita1->TIMESTEP);
1180 for (
int i=0;i<5;i++) {
1182 anita1->imaxbin[i]=maxsample;
1185 for (
unsigned center_phi_sector_index = 0; center_phi_sector_index < 16; ++center_phi_sector_index) {
1189 for (
unsigned int index_hyp=0;index_hyp<anita1->vdifferent_offsets.size();index_hyp++) {
1192 for (
unsigned i_layer = 0; i_layer < anita1->N_SUMMED_LAYERS; ++i_layer) {
1193 for (
unsigned i_sector = 0; i_sector < anita1->N_SUMMED_PHI_SECTORS; ++i_sector) {
1198 double timedomain_output_1_corrected[Anita::NFOUR/2];
1199 double timedomain_output_2_corrected[Anita::NFOUR/2];
1202 for (
int i=0;i<Anita::NFOUR/2;i++) {
1210 Tools::ShiftLeft(timedomain_output_1_corrected,anita1->NFOUR/2,anita1->vdifferent_offsets[index_hyp][anita1->N_SUMMED_PHI_SECTORS*i_layer+i_sector]);
1211 Tools::ShiftLeft(timedomain_output_2_corrected,anita1->NFOUR/2,anita1->vdifferent_offsets[index_hyp][anita1->N_SUMMED_PHI_SECTORS*i_layer+i_sector]);
1218 if (rx==anita1->rx_minarrivaltime) {
1220 for (
int i=0;i<Anita::NFOUR/2;i++) {
1226 flag_e_L1[rx].clear();
1227 flag_h_L1[rx].clear();
1230 for (
int i=minsample;i<maxsample;i++) {
1234 if (timedomain_output_1_corrected[i]<threshold*anita1->bwslice_rmsdiode[0][4]) {
1235 flag_e_L1[rx].push_back(1);
1239 flag_e_L1[rx].push_back(0);
1243 if (timedomain_output_2_corrected[i]<threshold*anita1->bwslice_rmsdiode[1][4])
1244 flag_h_L1[rx].push_back(1);
1246 flag_h_L1[rx].push_back(0);
1250 for (
int i=minsample;i<maxsample;i++) {
1253 if (flag_e_L1[rx][i-minsample]==1)
1254 for(
int k=nstayhigh-1; k>0 && i<maxsample-1; k--) {
1257 flag_e_L1[rx][i-minsample]=1;
1270 for (
int i=minsample;i<maxsample;i++) {
1271 if (flag_h_L1[rx][i-minsample]==1)
1272 for(
int k=nstayhigh-1; k>0 && i<maxsample-1; k--) {
1274 flag_h_L1[rx][i-minsample]=1;
1296 for (
int i=minsample;i<maxsample;i++) {
1298 int nbands_pass[2]={0};
1299 int maxbands[2]={0};
1301 for (
unsigned i_layer = 0; i_layer < anita1->N_SUMMED_LAYERS; ++i_layer) {
1302 for (
unsigned i_sector = 0; i_sector < anita1->N_SUMMED_PHI_SECTORS; ++i_sector) {
1308 if (flag_e_L1[rx][i-minsample]==1)
1310 if (flag_h_L1[rx][i-minsample]==1)
1317 if (nbands_pass[0]>maxbands[0])
1318 maxbands[0]=nbands_pass[0];
1319 if (nbands_pass[1]>maxbands[1])
1320 maxbands[1]=nbands_pass[1];
1322 if (maxbands[0]>=anita1->NCH_PASS)
1325 if ( maxbands[1]>=anita1->NCH_PASS)
1357 for (
int iphi=0;iphi<anita1->
NRX_PHI[2];iphi++) {
1360 if (whichphi & ant) {
1371 for (
int iphi=0;iphi<anita1->NTRIGPHISECTORS;iphi++) {
1402 for (
int i=0;i<anita1->NTRIGPHISECTORS/2;i++) {
1403 ileft=(2*i+anita1->NTRIGPHISECTORS-1)%anita1->NTRIGPHISECTORS;
1404 iright=(2*i+1)%anita1->NTRIGPHISECTORS;
1405 if (ant[ileft] || ant[iright])
1433 if (settings1->DISCONES==2)
1440 cout <<
"Input non-existent layer!\n";
1460 if (settings1->WHICH==6 || settings1->WHICH==2 || settings1->WHICH==8) {
1463 whichphisector=2*j+1;
1475 whichphisector=2*j+1;
1478 else if (settings1->WHICH==9 || settings1->WHICH==10) {
1485 whichphisector=2*j+1;
1545 for (
int i=0;i<Anita::NTRIG;i++)
1550 for (
int i=0;i<anita1->PHITRIG[0];i++) {
1565 for (
int ilayer=0;ilayer<anita1->NTRIGGERLAYERS-1;ilayer++) {
1566 for (
int ipolar=0;ipolar<2;ipolar++) {
1568 if (loctrig[ipolar][ilayer][i]>0 && loctrig[ipolar][ilayer+1][i]>0) {
1571 thispasses[ipolar]=1;
1572 whichphipass[ipolar][i]=1;
1574 if(loctrig[ipolar][0][i]>0 && loctrig[ipolar][1][i]>0) {
1575 if (!(triggerbits[0] & (1<<i)))
1576 triggerbits[0] += (1<<i);
1587 if (settings1->WHICH==2 || settings1->WHICH==6 || settings1->WHICH==8) {
1589 for (
int ipolar=0;ipolar<2;ipolar++) {
1590 if (((settings1->DISCONES==2) && (loctrig[ipolar][1][i]>0 && loctrig[ipolar][2][i]>0)) ||
1591 ((settings1->DISCONES==2) && (loctrig[ipolar][0][i]>0 && loctrig[ipolar][2][i]>0)) ||
1592 ((settings1->DISCONES==2) && loctrig_nadironly[ipolar][i]>0) ||
1593 (settings1->DISCONES==1 && (loctrig[ipolar][1][i]>0 && discones_passing>=settings1->NDISCONES_PASS)) ||
1594 (settings1->DISCONES==1 && (loctrig[ipolar][0][i]>0 && discones_passing>=settings1->NDISCONES_PASS))
1597 thispasses[ipolar]=1;
1598 whichphipass[ipolar][i]=1;
1602 if(loctrig[ipolar][1][i]>0 && loctrig[ipolar][2][i]>0) {
1603 triggerbits[1] += (1<<i);
1606 if(loctrig[ipolar][0][i]>0 && loctrig[ipolar][2][i]>0) {
1607 triggerbits[2]+=(1<<i);
1619 thispasses[ipolar]=1;
1629 for (
int ipolar=0;ipolar<2;ipolar++) {
1630 if (whichphipass[ipolar][i])
1631 l3trig[ipolar]+=(1<<i);
1720 unsigned int shortest_waveform = waveforms[0][0].size();
1721 vector <double> temp_antenna_waveform;
1722 for (
unsigned int phi_sector_index = 0; phi_sector_index < 3; phi_sector_index++){
1723 for (
unsigned int antenna_index = 0; antenna_index < waveforms[phi_sector_index].size(); antenna_index++){
1724 temp_antenna_waveform.clear();
1725 for (
unsigned int sample_index = delays[phi_sector_index][antenna_index]; sample_index < waveforms[phi_sector_index][antenna_index].size(); sample_index++){
1726 temp_antenna_waveform.push_back(waveforms[phi_sector_index][antenna_index][sample_index]);
1728 if (temp_antenna_waveform.size() < shortest_waveform){
1729 shortest_waveform = temp_antenna_waveform.size();
1731 output.push_back(temp_antenna_waveform);
1735 for (
unsigned int antenna_index = 0; antenna_index < output.size(); antenna_index++){
1736 output[antenna_index].resize(shortest_waveform);
1752 unsigned waveform_size = waveforms[0].size();
1753 unsigned waveforms_size = waveforms.size();
1754 for (
unsigned element_index = 0; element_index < waveform_size; ++element_index) {
1755 double element = 0.;
1756 for (
unsigned antenna_index = 0; antenna_index < waveforms_size; ++antenna_index) {
1757 element += waveforms[antenna_index][element_index];
1759 output.push_back(element);
1781 for (
unsigned int element_index = 0; element_index < waveform.size(); element_index++){
1782 output.push_back(waveform[element_index] * waveform[element_index]);
1797 for (
unsigned int index = start_index; index < start_index + length; index++){
1798 result += waveform[index];
1817 }
else if (input > 3.5){
1819 }
else if (floor(input) == input){
1821 if (round_zero_up) {
1822 result = input + 0.5;
1824 result = input + -0.5;
1829 }
else if (floor(input) + 0.5 > input){
1830 result = ceil(input) - 0.5;
1831 }
else if (floor(input) + 0.5 < input){
1832 result = floor(input) + 0.5;
1844 for (
unsigned int index = 0; index < wfm.size(); index++){
1848 int GlobalTrigger::findahit(vector<int> myvector,
int first,
int last) {
1851 if ((
int)myvector.size()<=last)
1854 for (
int i=first;i<=last;i++) {
1855 if (myvector[i]==1) {
1862 int GlobalTrigger::findanl3(
int *l3,
int NPHISECTORS) {
1864 for (
int j=0;j<NPHISECTORS;j++) {
1870 void GlobalTrigger::L2Anita3and4(
Anita *anita1,std::array<std::array<std::vector<int>,16>,2> vl1trig,
1871 std::array<std::array<std::vector<int>,16>,2> &vl2trig) {
1874 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
1875 for (
int ipolar=0;ipolar<2;ipolar++) {
1877 for (
unsigned int ibin=0;ibin<vl1trig[ipolar][iphi].size();ibin++) {
1881 vl2trig[ipolar][iphi].push_back(vl1trig[ipolar][iphi][ibin]);
1890 void GlobalTrigger::L3Anita3and4(
Anita *anita1,std::array<std::array<std::vector<int>,16>,2> vl2trig,
1891 int vl3trig[2][16],
int *thispasses) {
1893 int iphimod16_neighbor;
1895 for (
int ipolar=0;ipolar<2;ipolar++) {
1896 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
1898 for (
int iphi_neighbor=iphi-1;iphi_neighbor<=iphi+1;iphi_neighbor++) {
1899 if (iphi_neighbor!=iphi) {
1900 iphimod16_neighbor=(iphi_neighbor+16)%16;
1902 for (
unsigned int ibin=0;ibin<vl2trig[ipolar][iphi].size();ibin++) {
1903 if (ibin+(
int)(L3_COINCIDENCE/TRIGTIMESTEP)<vl2trig[ipolar][iphimod16_neighbor].size()) {
1904 if (vl2trig[ipolar][iphi][ibin] &&
1905 findahit(vl2trig[ipolar][iphimod16_neighbor],ibin,ibin+(
int)(L3_COINCIDENCE/TRIGTIMESTEP))) {
1908 vl3trig[ipolar][iphi]=1;
1909 thispasses[ipolar]=1;
1910 ibin = vl2trig[ipolar][iphi].size();
1911 iphi_neighbor=iphi+2;
1914 vl3trig[ipolar][iphi]=0;
1918 vl3trig[ipolar][iphi]=0;
1928 void GlobalTrigger::L1Anita4LR_ScB_OneBin(
int IZERO,vector<int> vleft,vector<int> vright,
1929 vector<int> &vl1trig) {
1931 if ((vleft[IZERO] && findahit(vright,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_ANITA4LR_SCB/TRIGTIMESTEP))) ||
1933 (vright[IZERO] && findahit(vleft,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_ANITA4LR_SCB/TRIGTIMESTEP)))) {
1934 vl1trig.push_back(1);
1938 vl1trig.push_back(0);
1943 void GlobalTrigger::L1Anita4LR_ScB_AllAntennas_OneBin(
int IZERO,
Anita *anita1,std::array< std::array< vector<int>,16>,3> &vl1trig_anita4lr_scb,
int &npassesl1) {
1946 for (
int itriglayer=0;itriglayer<anita1->NTRIGGERLAYERS;itriglayer++) {
1947 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
1954 L1Anita4LR_ScB_OneBin(IZERO,arrayofhits[itriglayer][iphi][0][4],arrayofhits[itriglayer][iphi][1][4],
1955 vl1trig_anita4lr_scb[itriglayer][iphi]);
1956 if (vl1trig_anita4lr_scb[itriglayer][iphi][vl1trig_anita4lr_scb[itriglayer][iphi].size()-1])
2042 void GlobalTrigger::L2Anita4LR_ScB_AllPhiSectors_OneBin(
int IZERO,
Anita *anita1,std::array< std::array< vector<int>,16>,3> vl1trig_anita4lr_scb,
2043 std::array<std::array<vector<int>,3>,16> &vl2_realtime_anita4_scb,
int &npassesl2,
int &npassesl2_type0) {
2045 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
2049 L2Anita4LR_ScB_OnePhiSector_OneBin(IZERO,vl1trig_anita4lr_scb[2][iphi],
2050 vl1trig_anita4lr_scb[1][iphi],
2051 vl1trig_anita4lr_scb[0][iphi],
2052 vl2_realtime_anita4_scb[iphi],npassesl2,npassesl2_type0);
2129 void GlobalTrigger::L3Anita4LR_ScA(
Anita *anita1,std::array<std::array<std::vector<int>,16>,2> vl2trig,
2133 for (
int ipolar=0;ipolar<2;ipolar++) {
2134 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
2138 for (
unsigned int ibin=0;ibin<vl2trig[ipolar][iphi].size();ibin++) {
2140 if (vl2trig[ipolar][iphi][ibin]) {
2142 thispasses[ipolar]=1;
2152 void GlobalTrigger::L1Anita3_AllPhiSectors(
Anita *anita1,std::array<std::array<std::vector<int>,16>,2> &vl1trig) {
2153 vector<int> vl1_realtime_vbottom;
2154 vector<int> vl1_realtime_vmiddle;
2155 vector<int> vl1_realtime_vtop;
2156 vector<int> vl1_realtime_hbottom;
2157 vector<int> vl1_realtime_hmiddle;
2158 vector<int> vl1_realtime_htop;
2159 double time_thisbin=(double)nstepback*TRIGTIMESTEP;
2160 int itrigbin=nstepback;
2162 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
2164 time_thisbin=(double)nstepback*TRIGTIMESTEP;
2165 while (time_thisbin<LASTTIMETOTESTL1_ANITA3) {
2167 vl1trig[0][iphi].push_back(L1Anita3_OnePhiSector(itrigbin,arrayofhits[2][iphi][0][4],
2168 arrayofhits[1][iphi][0][4],
2169 arrayofhits[0][iphi][0][4],
2170 vl1_realtime_vbottom, vl1_realtime_vmiddle, vl1_realtime_vtop));
2171 vl1trig[1][iphi].push_back(L1Anita3_OnePhiSector(itrigbin,arrayofhits[2][iphi][1][4],
2172 arrayofhits[1][iphi][1][4],
2173 arrayofhits[0][iphi][1][4],
2174 vl1_realtime_hbottom, vl1_realtime_hmiddle, vl1_realtime_htop));
2180 time_thisbin=(double)itrigbin*TRIGTIMESTEP;
2185 void GlobalTrigger::L1Anita4_AllPhiSectors(
Anita *anita1,std::array<std::array<std::vector<int>,16>,2> &vl1trig) {
2186 vector<int> vl1_realtime_vbottom;
2187 vector<int> vl1_realtime_vmiddle;
2188 vector<int> vl1_realtime_vtop;
2189 vector<int> vl1_realtime_hbottom;
2190 vector<int> vl1_realtime_hmiddle;
2191 vector<int> vl1_realtime_htop;
2192 double time_thisbin=(double)nstepback*TRIGTIMESTEP;
2193 int itrigbin=nstepback;
2195 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
2197 time_thisbin=(double)nstepback*TRIGTIMESTEP;
2198 while (time_thisbin<LASTTIMETOTESTL1_ANITA4) {
2200 vl1trig[0][iphi].push_back(L1Anita4_OnePhiSector(itrigbin,arrayofhits[2][iphi][0][4], arrayofhits[1][iphi][0][4], arrayofhits[0][iphi][0][4],
2201 vl1_realtime_vbottom, vl1_realtime_vmiddle, vl1_realtime_vtop));
2202 vl1trig[1][iphi].push_back(L1Anita4_OnePhiSector(itrigbin,arrayofhits[2][iphi][1][4], arrayofhits[1][iphi][1][4], arrayofhits[0][iphi][1][4],
2203 vl1_realtime_hbottom, vl1_realtime_hmiddle, vl1_realtime_htop));
2229 time_thisbin=(double)itrigbin*TRIGTIMESTEP;
2234 void GlobalTrigger::L1Anita4LR_ScA_AllPhiSectors(
Anita *anita1,std::array<std::array<std::vector<int>,16>,2> &vl1trig) {
2235 vector<int> vl1_realtime_1bottom;
2236 vector<int> vl1_realtime_1middle;
2237 vector<int> vl1_realtime_1top;
2238 vector<int> vl1_realtime_2bottom;
2239 vector<int> vl1_realtime_2middle;
2240 vector<int> vl1_realtime_2top;
2242 double time_thisbin=(double)nstepback*TRIGTIMESTEP;
2243 int itrigbin=nstepback;
2247 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
2249 time_thisbin=(double)nstepback*TRIGTIMESTEP;
2251 int iphi_rightneighbor=(iphi+1+16)%16;
2252 int iphi_leftneighbor=(iphi-1+16)%16;
2253 while (time_thisbin<LASTTIMETOTESTL1_ANITA4LR_SCA) {
2255 for (
int ipolar=0;ipolar<2;ipolar++) {
2257 if (L1Anita4LR_ScA_TwoPhiSectors(itrigbin,ipolar,
2258 arrayofhits[2][iphi][0][4],arrayofhits[2][iphi][1][4],
2259 arrayofhits[2][iphi_rightneighbor][0][4],arrayofhits[2][iphi_rightneighbor][1][4],
2260 arrayofhits[1][iphi][0][4], arrayofhits[1][iphi][1][4],
2261 arrayofhits[1][iphi_rightneighbor][0][4], arrayofhits[1][iphi_rightneighbor][1][4],
2262 arrayofhits[0][iphi][0][4], arrayofhits[0][iphi][1][4],
2263 arrayofhits[0][iphi_rightneighbor][0][4],arrayofhits[0][iphi_rightneighbor][1][4],
2264 vl1_realtime_1bottom, vl1_realtime_1middle, vl1_realtime_1top) ||
2266 L1Anita4LR_ScA_TwoPhiSectors(itrigbin,ipolar,
2267 arrayofhits[2][iphi][0][4],arrayofhits[2][iphi][1][4],
2268 arrayofhits[2][iphi_leftneighbor][0][4],arrayofhits[2][iphi_leftneighbor][1][4],
2269 arrayofhits[1][iphi][0][4], arrayofhits[1][iphi][1][4],
2270 arrayofhits[1][iphi_leftneighbor][0][4], arrayofhits[1][iphi_leftneighbor][1][4],
2271 arrayofhits[0][iphi][0][4], arrayofhits[0][iphi][1][4],
2272 arrayofhits[0][iphi_leftneighbor][0][4],arrayofhits[0][iphi_leftneighbor][1][4],
2273 vl1_realtime_2bottom, vl1_realtime_2middle, vl1_realtime_2top))
2274 vl1trig[ipolar][iphi].push_back(1);
2276 vl1trig[ipolar][iphi].push_back(0);
2305 time_thisbin=(double)itrigbin*TRIGTIMESTEP;
2312 int GlobalTrigger::L1Anita3_OnePhiSector(
int IZERO,vector<int> &vl0_realtime_bottom, vector<int> &vl0_realtime_middle, vector<int> &vl0_realtime_top,
2313 vector<int> &vl1_realtime_bottom, vector<int> &vl1_realtime_middle, vector<int> &vl1_realtime_top) {
2319 if (vl0_realtime_bottom[IZERO]==1) {
2322 if (findahit(vl0_realtime_top,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_ANITA3[0]/TRIGTIMESTEP)) ||
2323 findahit(vl0_realtime_middle,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_ANITA3[0]/TRIGTIMESTEP))) {
2326 vl1_realtime_bottom.push_back(1);
2331 vl1_realtime_bottom.push_back(0);
2335 vl1_realtime_bottom.push_back(0);
2339 if (vl0_realtime_middle[IZERO]==1) {
2340 if (findahit(vl0_realtime_top,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_ANITA3[1]/TRIGTIMESTEP)) ||
2341 findahit(vl0_realtime_bottom,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_ANITA3[1]/TRIGTIMESTEP))) {
2343 vl1_realtime_middle.push_back(1);
2347 vl1_realtime_middle.push_back(0);
2351 vl1_realtime_middle.push_back(0);
2356 if (vl0_realtime_top[IZERO]==1) {
2357 if (findahit(vl0_realtime_middle,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_ANITA3[2]/TRIGTIMESTEP)) ||
2358 findahit(vl0_realtime_bottom,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_ANITA3[2]/TRIGTIMESTEP))) {
2360 vl1_realtime_top.push_back(1);
2364 vl1_realtime_top.push_back(0);
2368 vl1_realtime_top.push_back(0);
2372 if (vl1_realtime_bottom[vl1_realtime_bottom.size()-1]==1 || vl1_realtime_top[vl1_realtime_top.size()-1]==1 || vl1_realtime_middle[vl1_realtime_middle.size()-1]==1) {
2379 int GlobalTrigger::L1Anita4_OnePhiSector(
int IZERO,vector<int> &vl0_realtime_bottom, vector<int> &vl0_realtime_middle, vector<int> &vl0_realtime_top,
2380 vector<int> &vl1_realtime_bottom, vector<int> &vl1_realtime_middle, vector<int> &vl1_realtime_top) {
2386 if (vl0_realtime_bottom[IZERO]==1) {
2388 if (findahit(vl0_realtime_top,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_MOREGENERAL[0][0]/TRIGTIMESTEP)) ||
2389 findahit(vl0_realtime_middle,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_MOREGENERAL[0][1]/TRIGTIMESTEP))) {
2391 vl1_realtime_bottom.push_back(1);
2395 vl1_realtime_bottom.push_back(0);
2399 vl1_realtime_bottom.push_back(0);
2403 if (vl0_realtime_middle[IZERO]==1) {
2404 if (findahit(vl0_realtime_top,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_MOREGENERAL[1][0]/TRIGTIMESTEP)) ||
2405 findahit(vl0_realtime_bottom,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_MOREGENERAL[1][1]/TRIGTIMESTEP))) {
2407 vl1_realtime_middle.push_back(1);
2411 vl1_realtime_middle.push_back(0);
2415 vl1_realtime_middle.push_back(0);
2419 if (vl0_realtime_top[IZERO]==1) {
2420 if (findahit(vl0_realtime_middle,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_MOREGENERAL[2][0]/TRIGTIMESTEP)) ||
2421 findahit(vl0_realtime_bottom,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_MOREGENERAL[2][1]/TRIGTIMESTEP))) {
2423 vl1_realtime_top.push_back(1);
2427 vl1_realtime_top.push_back(0);
2431 vl1_realtime_top.push_back(0);
2435 if (vl1_realtime_bottom[vl1_realtime_bottom.size()-1]==1 || vl1_realtime_top[vl1_realtime_top.size()-1]==1 || vl1_realtime_middle[vl1_realtime_middle.size()-1]==1)
2439 int GlobalTrigger::L1Anita4LR_ScA_TwoPhiSectors(
int IZERO,
int ipolar,
2440 vector<int> &v1l0_realtime_bottomleft, vector<int> &v2l0_realtime_bottomleft,
2441 vector<int> &v1l0_realtime_bottomright, vector<int> &v2l0_realtime_bottomright,
2442 vector<int> &v1l0_realtime_middleleft, vector<int> &v2l0_realtime_middleleft,
2443 vector<int> &v1l0_realtime_middleright, vector<int> &v2l0_realtime_middleright,
2444 vector<int> &v1l0_realtime_topleft, vector<int> &v2l0_realtime_topleft,
2445 vector<int> &v1l0_realtime_topright, vector<int> &v2l0_realtime_topright,
2446 vector<int> &vl1_realtime_bottom,
2447 vector<int> &vl1_realtime_middle,
2448 vector<int> &vl1_realtime_top) {
2457 vleft=v1l0_realtime_bottomleft;
2458 vright=v1l0_realtime_bottomright;
2460 else if (ipolar==1) {
2461 vleft=v2l0_realtime_bottomleft;
2462 vright=v2l0_realtime_bottomright;
2465 if (vleft[IZERO]==1 || vright[IZERO]==1) {
2468 if (PartofL1Anita4LR_ScA_TwoPhiSectors(1,ipolar,IZERO,v1l0_realtime_middleleft, v2l0_realtime_middleleft,
2469 v1l0_realtime_middleright, v2l0_realtime_middleright,
2470 vl1_realtime_middle) &&
2471 PartofL1Anita4LR_ScA_TwoPhiSectors(0,ipolar,IZERO,v1l0_realtime_topleft, v2l0_realtime_topleft,
2472 v1l0_realtime_topright, v2l0_realtime_topright,
2473 vl1_realtime_top)) {
2497 int GlobalTrigger::PartofL1Anita4LR_ScA_TwoPhiSectors(
int ilayerreverse,
int ipolar,
int IZERO,
2498 vector<int> &v1l0_realtime_left, vector<int> &v2l0_realtime_left,
2499 vector<int> &v1l0_realtime_right, vector<int> &v2l0_realtime_right,
2500 vector<int> &vl1_realtime) {
2504 if (WHICHLAYERSLCPRCP[ilayerreverse]==0) {
2510 vleft=v1l0_realtime_left;
2511 vright=v1l0_realtime_right;
2513 else if (ipolar==1) {
2514 vleft=v2l0_realtime_left;
2515 vright=v2l0_realtime_right;
2535 if (findahit(vleft,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_LR_SCA[ilayerreverse]/TRIGTIMESTEP)) ||
2536 findahit(vright,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_LR_SCA[ilayerreverse]/TRIGTIMESTEP))) {
2538 vl1_realtime.push_back(1);
2543 vl1_realtime.push_back(0);
2546 if ( (findahit(v1l0_realtime_left,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_LR_SCA[ilayerreverse]/TRIGTIMESTEP)) &&
2547 findahit(v2l0_realtime_left,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_LR_SCA[ilayerreverse]/TRIGTIMESTEP))) ||
2548 (findahit(v1l0_realtime_right,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_LR_SCA[ilayerreverse]/TRIGTIMESTEP)) &&
2549 findahit(v2l0_realtime_right,IZERO-nstepback,IZERO-nstepback+(
int)(L1_COINCIDENCE_LR_SCA[ilayerreverse]/TRIGTIMESTEP))) ) {
2550 vl1_realtime.push_back(1);
2556 vl1_realtime.push_back(0);
2559 if (vl1_realtime[vl1_realtime.size()-1]) {
2570 void GlobalTrigger::L3Anita4LR_ScB_OneBin(
int IZERO,
Anita *anita1,std::array<std::array<vector<int>,3>,16> vl2_realtime_anita4_scb,
2571 std::array<vector<int>,16> &vl3trig_type0, std::array<vector<int>,16> &vl3trig_type1,
2572 int &thispasses_l3type0,
int &thispasses_l3type1) {
2576 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
2579 int iphi_next=(iphi+1+16)%16;
2580 int iphi_previous=(iphi-1+16)%16;
2584 if (L3or30Anita4LR_ScB_TwoPhiSectors_OneBin(IZERO,
2585 vl2_realtime_anita4_scb[iphi],
2586 vl2_realtime_anita4_scb[iphi_previous],
2589 L3or30Anita4LR_ScB_TwoPhiSectors_OneBin(IZERO,
2590 vl2_realtime_anita4_scb[iphi],
2591 vl2_realtime_anita4_scb[iphi_next],
2597 thispasses_l3type1=1;
2598 vl3trig_type1[iphi].push_back(1);
2602 vl3trig_type1[iphi].push_back(0);
2633 void GlobalTrigger::L2Anita4LR_ScB_OnePhiSector_OneBin(
int IZERO,vector<int> vl1_bottom,
2634 vector<int> vl1_middle,
2635 vector<int> vl1_top,
2636 std::array<vector<int>,3> &vl2_realtime_anita4_scb,
int &npassesl2,
int &npassesl2_type0) {
2645 if (vl1_bottom[IZERO] || vl1_middle[IZERO] || vl1_top[IZERO]) {
2646 vl2_realtime_anita4_scb[0].push_back(1);
2650 vl2_realtime_anita4_scb[0].push_back(0);
2663 if ((vl1_bottom[IZERO] &&
2664 ( findahit(vl1_middle,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[1]/TRIGTIMESTEP)) ||
2665 findahit(vl1_top,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[0]/TRIGTIMESTEP)) )) ||
2667 (vl1_middle[IZERO] &&
2668 ( findahit(vl1_bottom,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[1]/TRIGTIMESTEP)) ||
2669 findahit(vl1_top,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[2]/TRIGTIMESTEP)))) ||
2672 ( findahit(vl1_bottom,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[0]/TRIGTIMESTEP)) ||
2673 findahit(vl1_middle,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[2]/TRIGTIMESTEP))))
2675 vl2_realtime_anita4_scb[1].push_back(1);
2682 vl2_realtime_anita4_scb[1].push_back(0);
2694 if ((vl1_bottom[IZERO] &&
2695 ( findahit(vl1_middle,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[1]/TRIGTIMESTEP)) &&
2696 findahit(vl1_top,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[0]/TRIGTIMESTEP)) )) ||
2698 (vl1_middle[IZERO] &&
2699 ( findahit(vl1_bottom,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[1]/TRIGTIMESTEP)) &&
2700 findahit(vl1_top,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[2]/TRIGTIMESTEP)))) ||
2703 ( findahit(vl1_bottom,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[0]/TRIGTIMESTEP)) &&
2704 findahit(vl1_middle,IZERO-nstepback,IZERO-nstepback+(
int)(L2_COINCIDENCE_ANITA4LR_SCB[2]/TRIGTIMESTEP))))
2706 vl2_realtime_anita4_scb[2].push_back(1);
2710 vl2_realtime_anita4_scb[2].push_back(0);
2716 int GlobalTrigger::L3or30Anita4LR_ScB_TwoPhiSectors_OneBin(
int IZERO,
2717 std::array<vector<int>,3> vl2_realtime_anita4_scb,
2718 std::array<vector<int>,3> vl2_realtime_anita4_scb_other,
2719 int npass1,
int npass2) {
2731 if ((vl2_realtime_anita4_scb[npass1-1][IZERO] &&
2732 findahit(vl2_realtime_anita4_scb_other[npass2-1],IZERO-nstepback,IZERO-nstepback+(
int)(L3_COINCIDENCE_ANITA4LR_SCB/TRIGTIMESTEP))) ||
2733 (vl2_realtime_anita4_scb_other[npass2-1][IZERO] &&
2734 findahit(vl2_realtime_anita4_scb[npass1-1],IZERO-nstepback,IZERO-nstepback+(
int)(L3_COINCIDENCE_ANITA4LR_SCB/TRIGTIMESTEP)))) {
2744 void GlobalTrigger::delayL0(vector<int> &vl0,
double delay) {
2745 int ndelay=(int)(delay/TRIGTIMESTEP);
2746 for (
int i=0;i<ndelay;i++) {
2747 vl0.insert(vl0.begin(),0);
2748 vl0.erase(vl0.end()-1);
2752 void GlobalTrigger::delay_AllAntennas(
Anita *anita1) {
2753 for (
int itriglayer=0;itriglayer<anita1->NTRIGGERLAYERS;itriglayer++) {
2754 for (
int iphi=0;iphi<anita1->PHITRIG[0];iphi++) {
2755 for (
int ipolar=0;ipolar<anita1->
NPOL;ipolar++) {
2758 delayL0(arrayofhits[itriglayer][iphi][ipolar][4],DELAYS[itriglayer]);
void PassesTrigger(Settings *settings1, Anita *anita1, int discones_passing, int mode, int *l3trig, int l2trig[Anita::NPOL][Anita::NTRIGGERLAYERS_MAX], int l1trig[Anita::NPOL][Anita::NTRIGGERLAYERS_MAX], int antennaclump, int loctrig[Anita::NPOL][Anita::NLAYERS_MAX][Anita::NPHI_MAX], int loctrig_nadironly[Anita::NPOL][Anita::NPHI_MAX], int inu, int *thispasses, bool noiseOnly=false)
Evaluate the full trigger simulation for a given payload configuration.
void L3Trigger(Settings *settings1, Anita *anita1, int loctrig[Anita::NPOL][Anita::NLAYERS_MAX][Anita::NPHI_MAX], int loctrig_nadironly[Anita::NPOL][Anita::NPHI_MAX], int discones_passing, int *l3trigy, int *thispasses)
Level 3 Trigger Function.
double timedomain_output_corrected_forplotting[2][6][HALFNFOUR]
this is just for writing out to the following tree
double rms_rfcm_e_single_event
This is in Volts, not mV!
static const int NPOL
number of polarizations
int GetRxTriggerNumbering(int ilayer, int ifold)
get antenna number based on which layer and position it is
void square_waveform_elements(const vector< double > &waveform, vector< double > &output)
Performs an element-wise squaring of the values of the input array.
Reads in and stores input settings for the run.
void GetAnitaLayerPhiSector(Settings *settings1, int i, int j, int &whichlayer, int &whichphisector)
Provides a mapping between the 4 layers and 16 phi sectors physically to the 3 layers and 16 sectors ...
int NBANDS
number of frequency sub-bands (not counting full band)
int iminbin[5]
this is the minimum bin to start
Vector ANTENNA_POSITION_START[2][NLAYERS_MAX][NPHI_MAX]
antenna positions from Kurt's measurements
void sum_aligned_waveforms(const vector< vector< double > > &waveforms, vector< double > &output)
Given a number of waveforms (usually 3) which are delay-aligned, it sums them.
double summed_power_window(const vector< double > &waveform, unsigned int start_index, unsigned int length)
Sum a window from the specified starting index.
void convert_wfm_to_3_bit(const vector< double > &wfm, double rms, vector< double > &output)
Converts a waveform by sampling it into 3 bits, after it is normalized to the RMS.
Contains everything about positions within payload and signals it sees for each event, in both the trigger and signal paths.
static const int NLAYERS_MAX
max number of layers (in smex design, it's 4)
int GetPhiSector(Settings *settings1, int i, int j)
Provides a mapping between the 4 layers and 16 phi sectors physically to the 3 layers and 16 sectors ...
double timedomain_output_allantennas[2][48][HALFNFOUR]
this is across all antennas, just the full band
void FillInNadir(Anita *anita1, int *ant)
Virtual nadir antennas had effective L2 triggers based on neighbor antennas.
void delay_align_antenna_waveforms(const vector< vector< vector< double > > > &waveforms, const vector< vector< unsigned int > > &delays, vector< vector< double > > &output)
Calculate the difference in each arrival time due to propagation delay of the signal.
int l2trig_anita4lr_forgaryanderic[16][HALFNFOUR]
when it passes 2/3
double three_bit_round(double input, bool round_zero_up=true, bool allow_zero=false)
Three bit rounding function.
static const int NPHI_MAX
max number of antennas around in phi (in smex, 16)
int NRX_PHI[NLAYERS_MAX]
number of antennas around in each layer. (radians)