diff --git a/lago_data.h b/lago_data.h
index ebf05b1d08ee59ffd979da398fe4d67c53a60dae..8d3e806f38d4026c294ee7c5f545b404929a2703 100644
--- a/lago_data.h
+++ b/lago_data.h
@@ -112,11 +112,15 @@ class LagoEvent {
int GetBase(int channel) {
return GetPulseBase(channel);
}
+
+ int GetValAtPos(int channel, int pos) {
+ return (trace[channel][pos - 1] - BASELINE);
+ }
int GetValAtTrigger(int channel) {
- return (trace[channel][2] - BASELINE); // Pulse triggered at 3rd bin
+ return (GetValAtPos(channel, TRIGGERBIN)); // Pulse triggered at 3rd bin
}
-
+
int GetCharge(int channel, int negativepulse=0, int max=4095) {
int charge=0;
if (negativepulse) {
diff --git a/lago_defs.h b/lago_defs.h
index d3d5044fe17b9d09f5789022cb5cb791fcc2ca78..60d7f42b5139674c948505d8a93f676acfd848a7 100644
--- a/lago_defs.h
+++ b/lago_defs.h
@@ -39,5 +39,8 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
#define TRACELEN 12
#define BASELINE 50
#define BIN 25.
+#define ADCMAX 1024
+#define CHRGMAX 4096
+#define TRIGGERBIN 3
#endif
diff --git a/raw.cc b/raw.cc
index cd2c576bd12d940a2e4d851be37162f69bc3c115..30fdccc1f2eab8931a1547454cb7b2f2e9a740fc 100644
--- a/raw.cc
+++ b/raw.cc
@@ -50,6 +50,7 @@ using namespace std;
// action flags. Should be improved with a class
int ical=0, itim=0, isol=0, iall=0, imon=0, force=0, ivalid=0;
int izip=0, iscl=0, isclg=0, itrg=0, irte=0, iflx=0, ineg[3]= {0,0,0};
+int isat=0, iqtr=0;
// OLD SCALER ANALYSIS
// levels should be given above baseline or threshold (-lt modifier).
@@ -76,6 +77,14 @@ double flx_avg[CHANNELS], flx_dev[CHANNELS];
int trg_level[CHANNELS];
int trg_default = 85;
+// FOURTH BIN TRIGGER
+int qtr_level[CHANNELS];
+int qtr_default = 64;
+
+// SATURATED PEAKS
+int sat_level[CHANNELS];
+int sat_default = ADCMAX - 1;
+
// TIME DIFFERENCE (AND ALSO ALL PULSE DATA) ANALYSIS
int tim_pc = 0, tim_pt = 0, tim_dc = 0, tim_dt = 0;
double tim_ap = 0., tim_map = 0.;
@@ -99,14 +108,14 @@ double mon_dev_bl_tmp;
int mon_bl_counts;
// AUXILIARY ARRAYS
-int Peak[CHANNELS][1024];
-int Base[CHANNELS][1024];
-int Charge[CHANNELS][4096];
-int ECharge[CHANNELS][4096];
+int Peak[CHANNELS][ADCMAX];
+int Base[CHANNELS][ADCMAX];
+int Charge[CHANNELS][CHRGMAX];
+int ECharge[CHANNELS][CHRGMAX];
int Time[CHANNELS][MAXTIMEINVECTOR];
-int Peak_minute[CHANNELS][1024];
-int Charge_minute[CHANNELS][4096];
+int Peak_minute[CHANNELS][ADCMAX];
+int Charge_minute[CHANNELS][CHRGMAX];
void TreatSecond(LagoGeneric *Data, LagoEvent*Pulse, int NbPulses) {
if (((Data->second)%36)==0)
@@ -135,6 +144,18 @@ void TreatSecond(LagoGeneric *Data, LagoEvent*Pulse, int NbPulses) {
// processing pulses
for (int i=0; i<NbPulses; i++) {
+ // discard saturated and it is a saturated pulse?
+ int sat_drop = 0;
+ if (isat) {
+ for (int j=0; j<CHANNELS; j++) {
+ if (Pulse[i].GetPeak(j) >= sat_level[j]) { // pulse is saturated
+ sat_drop++;
+ }
+ }
+ }
+ if (isat && sat_drop)
+ continue;
+
// impossing external trigger
int trg_drop = 0;
if (itrg)
@@ -144,6 +165,17 @@ void TreatSecond(LagoGeneric *Data, LagoEvent*Pulse, int NbPulses) {
trg_drop++;
if (itrg && trg_drop)
continue;
+
+ // impose an additional trigger using values for bin #3
+ int qtr_drop = 0;
+ if (iqtr)
+ for (int j=0; j<CHANNELS; j++)
+ if (Pulse[i].IsTriggered(j))
+ if (Pulse[i].GetValAtPos(j,4) < qtr_level[j])
+ qtr_drop++;
+ if (iqtr && qtr_drop)
+ continue;
+
//we can use this pulse
for (int j=0; j<CHANNELS; j++) {
peaktmp = Pulse[i].GetPeak(j);
@@ -291,7 +323,7 @@ void TreatSecond(LagoGeneric *Data, LagoEvent*Pulse, int NbPulses) {
fprintf(sol, "# q %d %d %.2f %.2f\n", Data->second, Data->clockfrequency, Data->temperature, Data->pressure);
for (int i=0; i<CHANNELS; i++) {
fprintf(sol, "0 %d %d %d %.2f %.2f", i, Data->second, Data->clockfrequency, Data->temperature, Data->pressure);
- for (int j=0; j<4096; j++) {
+ for (int j=0; j<CHRGMAX; j++) {
fprintf(sol, " %d", Charge[i][j]-Charge_minute[i][j]);
Charge_minute[i][j]=Charge[i][j];
}
@@ -300,7 +332,7 @@ void TreatSecond(LagoGeneric *Data, LagoEvent*Pulse, int NbPulses) {
fprintf(sol, "# p %d %d %.2f %.2f\n", Data->second, Data->clockfrequency, Data->temperature, Data->pressure);
for (int i=0; i<CHANNELS; i++) {
fprintf(sol, "1 %d %d %d %.2f %.2f", i, Data->second, Data->clockfrequency, Data->temperature, Data->pressure);
- for (int j=0; j<1024; j++) {
+ for (int j=0; j<ADCMAX; j++) {
fprintf(sol, " %d", Peak[i][j]-Peak_minute[i][j]);
Peak_minute[i][j]=Peak[i][j];
}
@@ -366,7 +398,11 @@ void Usage(char *prog, int verbose=0)
cout << "\t-N <mask>\tindicate what channels have negative undershoots" << endl;
cout << "\t \tUse channel mask 1-7." << endl;
cout << "\t-u <tr i>\tImpose an offline trigger level for each channel" << endl;
- cout << "\t \tDefault value: " << trg_default << " ADC)" << endl;
+ cout << "\t \t(Default value: " << trg_default << " ADC)" << endl;
+ cout << "\t-q <tr i>\tImpose an offline trigger level on 4th bin for each channel" << endl;
+ cout << "\t \t(Default value: " << qtr_default << " ADC)" << endl;
+ cout << "\t-p <tr i>\tRemove saturated pulses (i.e. discard pulses with peak >= <tr i>)" << endl;
+ cout << "\t \t(Default value: " << ADCMAX - 1 << " ADC)" << endl;
cout << "\t-l <ch> <t_i>\tdefines the " << SCL_LEVELS << " thresholds t_i for the old" << endl;
cout << "\t \tlago-like scalers analysis on channel <ch>."<< endl;
cout << "\t \tFor example: -l 1 5 15 30 50, defines subchannels" << endl;
@@ -419,6 +455,10 @@ int main (int argc, char *argv[])
scl_flux[i] = 0;
for (int i = 0; i < CHANNELS; i++)
trg_level[i] = trg_default;
+ for (int i = 0; i < CHANNELS; i++)
+ qtr_level[i] = qtr_default;
+ for (int i = 0; i < CHANNELS; i++)
+ sat_level[i] = sat_default;
LagoGeneric Data;
LagoEvent *Pulse;
@@ -457,6 +497,22 @@ int main (int argc, char *argv[])
case 'a':
iall=1;
break;
+ case 'p':
+ isat=1;
+ if (atoi(argv[i+1])) { // false if not trigger value was given. Use default levels
+ for (int j = 0; j < CHANNELS; j++) {
+ i++;
+ if (atoi(argv[i])) {
+ sat_level[j] = atoi(argv[i]);
+ }
+ else { // user didn't set the four levels (mandatory): try again.
+ cerr << " Error: you must set one value per channel" << endl;
+ Usage(argv[0]);
+ break;
+ }
+ }
+ }
+ break;
case 'u':
itrg=1;
if (atoi(argv[i+1])) { // false if not trigger value was given. Use default levels
@@ -473,6 +529,22 @@ int main (int argc, char *argv[])
}
}
break;
+ case 'q':
+ iqtr=1;
+ if (atoi(argv[i+1])) { // false if not trigger value was given. Use default levels
+ for (int j = 0; j < CHANNELS; j++) {
+ i++;
+ if (atoi(argv[i])) {
+ qtr_level[j] = atoi(argv[i]);
+ }
+ else { // user didn't set the three levels (mandatory): try again.
+ cerr << " Error: you must set one trigger level per channel" << endl;
+ Usage(argv[0]);
+ break;
+ }
+ }
+ }
+ break;
case 'm':
imon=1;
break;
@@ -553,9 +625,12 @@ int main (int argc, char *argv[])
Input.Open(nfi);
- for (int j = 0; j < CHANNELS; j++)
+ for (int j = 0; j < CHANNELS; j++) {
trg_level[j] -= BASELINE;
-
+ qtr_level[j] -= BASELINE;
+ sat_level[j] -= BASELINE;
+ }
+
char *ifile2;
char ifile[256];
ifile2=ifiname;
@@ -575,9 +650,9 @@ int main (int argc, char *argv[])
}
for (int i=0; i<CHANNELS; i++) {
- for (int j=0; j<1024; j++)
+ for (int j=0; j<ADCMAX; j++)
Peak[i][j]=Peak_minute[i][j]=Base[i][j]=0;
- for (int j=0; j<4096; j++)
+ for (int j=0; j<CHRGMAX; j++)
ECharge[i][j]=Charge[i][j]=Charge_minute[i][j]=0;
for (int j=0; j<MAXTIMEINVECTOR; j++)
Time[i][j]=0;
@@ -673,8 +748,12 @@ int main (int argc, char *argv[])
cal << "# # Format is ch1 ch2 ch3 pk1 pk2 pk3" << endl;
if (itrg)
cal << "# # An offline trigger of " << trg_level[0] << " " << trg_level[1] << " " << trg_level[2] << " ADC above baseline has been used for each channel respectively." << endl;
+ if (iqtr)
+ cal << "# # An offline trigger on 4th bin of " << qtr_level[0] << " " << qtr_level[1] << " " << qtr_level[2] << " ADC above baseline has been used for each channel respectively." << endl;
if (icaltrg)
cal << "# # For each channel we only used triggered pulses at this particular channel (-i option)" << endl;
+ if (isat)
+ cal << "# # Pulses with peak >=" << sat_level[0] << " " << sat_level[1] << " " << sat_level[2] << " ADC above baseline were discarded" << endl;
}
if (itim) {
@@ -686,6 +765,10 @@ int main (int argc, char *argv[])
tim << "# # Pulses were discarded if (a/p < " << tim_map << ")"<< endl;
if (itrg)
tim << "# # An offline trigger of " << trg_level[0] << " " << trg_level[1] << " " << trg_level[2] << " ADC above baseline has been used for each channel respectively." << endl;
+ if (iqtr)
+ tim << "# # An offline trigger on 4th bin of " << qtr_level[0] << " " << qtr_level[1] << " " << qtr_level[2] << " ADC above baseline has been used for each channel respectively." << endl;
+ if (isat)
+ tim << "# # Pulses with peak >=" << sat_level[0] << " " << sat_level[1] << " " << sat_level[2] << " ADC above baseline were discarded" << endl;
}
if (iraw) {
@@ -701,10 +784,14 @@ int main (int argc, char *argv[])
fprintf(sol, "# # These are one minute charge and peak histograms, with monitoring information\n");
fprintf(sol, "# # Format is # q/p second frequency temperature pressure\n");
fprintf(sol, "# # (q for charge and p for peak)\n");
- fprintf(sol, "# # followed by 0/1 0/1/2 second frequency temperature pressure and 1024 or 4096 values\n");
+ fprintf(sol, "# # followed by 0/1 0/1/2 second frequency temperature pressure and %d or %d values\n", ADCMAX, CHRGMAX);
fprintf(sol, "# # where 0/1 stands for charge (0) or peak (1) and 0/1/2 is the channel\n");
if (itrg)
fprintf(sol, "# # An offline trigger of %d %d %d ADC above baseline has been used for each channel respectively.\n", trg_level[0], trg_level[1], trg_level[2]);
+ if (iqtr)
+ fprintf(sol, "# # An offline trigger on 4th bin of %d %d %d ADC above baseline has been used for each channel respectively.\n", qtr_level[0], qtr_level[1], qtr_level[2]);
+ if (isat)
+ fprintf(sol, "# # Pulses with peak >= %d %d %d ADC above baseline were discarded.\n", sat_level[0], sat_level[1], sat_level[2]);
}
if (iall) {
@@ -716,6 +803,10 @@ int main (int argc, char *argv[])
fprintf(all, "# # note: time_to_prev_pulse is in clock cycle, and reset to 0 every second\n");
if (itrg)
fprintf(all, "# # An offline trigger of %d %d %d ADC above baseline has been used for each channel respectively.\n", trg_level[0], trg_level[1], trg_level[2]);
+ if (iqtr)
+ fprintf(all, "# # An offline trigger on 4th bin of %d %d %d ADC above baseline has been used for each channel respectively.\n", qtr_level[0], qtr_level[1], qtr_level[2]);
+ if (isat)
+ fprintf(all, "# # Pulses with peak >= %d %d %d ADC above baseline were discarded.\n", sat_level[0], sat_level[1], sat_level[2]);
}
if (imon) {
@@ -746,6 +837,10 @@ int main (int argc, char *argv[])
fprintf(scl, "compared with the baseline level for each channel (%d adc)\n", BASELINE);
if (itrg)
fprintf(scl, "# # An offline trigger of %d %d %d ADC above baseline has been used for each channel respectively.\n", trg_level[0], trg_level[1], trg_level[2]);
+ if (iqtr)
+ fprintf(scl, "# # An offline trigger on 4th bin of %d %d %d ADC above baseline has been used for each channel respectively.\n", qtr_level[0], qtr_level[1], qtr_level[2]);
+ if (isat)
+ fprintf(scl, "# # Pulses with peak >= %d %d %d ADC above baseline were discarded.\n", sat_level[0], sat_level[1], sat_level[2]);
}
if (irte) {
fprintf(rte, "# # # p 1 rte %s %s\n", PROJECT, CODEVERSION);
@@ -753,6 +848,12 @@ int main (int argc, char *argv[])
fprintf(rte, "# # This is the rate (pulse per second) file.\n");
fprintf(rte, "# # Format is:\n");
fprintf(rte, "# # second temperature pressure Total_Rate Rate_per_channel:_(%d)_columns\n",CHANNELS);
+ if (itrg)
+ fprintf(rte, "# # An offline trigger of %d %d %d ADC above baseline has been used for each channel respectively.\n", trg_level[0], trg_level[1], trg_level[2]);
+ if (iqtr)
+ fprintf(rte, "# # An offline trigger on 4th bin of %d %d %d ADC above baseline has been used for each channel respectively.\n", qtr_level[0], qtr_level[1], qtr_level[2]);
+ if (isat)
+ fprintf(rte, "# # Pulses with peak >= %d %d %d ADC above baseline were discarded.\n", sat_level[0], sat_level[1], sat_level[2]);
}
if (iflx) {
fprintf(flx, "# # # p 1 flx %s %s\n", PROJECT, CODEVERSION);
@@ -761,6 +862,12 @@ int main (int argc, char *argv[])
fprintf(flx, "# # Format is:\n");
fprintf(flx, "# # second_at_half_interval avg_temp avg_press avg_rate avg_rate_per_channel sigma_temp sigma_press sigma_rate sigma_rate_per_channel\n");
fprintf(flx, "# # Average interval used: %d seconds\n", flx_default);
+ if (itrg)
+ fprintf(flx, "# # An offline trigger of %d %d %d ADC above baseline has been used for each channel respectively.\n", trg_level[0], trg_level[1], trg_level[2]);
+ if (iqtr)
+ fprintf(flx, "# # An offline trigger on 4th bin of %d %d %d ADC above baseline has been used for each channel respectively.\n", qtr_level[0], qtr_level[1], qtr_level[2]);
+ if (isat)
+ fprintf(flx, "# # Pulses with peak >= %d %d %d ADC above baseline were discarded.\n", sat_level[0], sat_level[1], sat_level[2]);
}
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
@@ -770,16 +877,17 @@ int main (int argc, char *argv[])
cerr << "Reading file" << endl;
while(NbPulses!=-1) {
NbPulses=Input.ReadOneSecond(&Data,Pulse,MAXPULSEPERSEC);
- if (NbPulses>0) TreatSecond(&Data,Pulse,NbPulses);
+ if (NbPulses>0)
+ TreatSecond(&Data,Pulse,NbPulses);
}
// Filling calibration histograms
- for (int j=0; j<4096; j++) {
+ for (int j=0; j<CHRGMAX; j++) {
for (int i=0; i<CHANNELS; i++) {
cal << Charge[i][j] << " ";
}
- if (j<1024) for (int i=0; i<CHANNELS; i++)
+ if (j<ADCMAX) for (int i=0; i<CHANNELS; i++)
cal << Peak[i][j] << " ";
cal << endl;
}
@@ -793,7 +901,7 @@ int main (int argc, char *argv[])
ivalid=ivalid-1; // 0 to 2
// baseline
double b=0,b2=0,n=0;
- for (int j=0; j<1024; j++) {
+ for (int j=0; j<ADCMAX; j++) {
b+=Base[ivalid][j]*1.*j;
b2+=Base[ivalid][j]*1.*j*j;
n+=Base[ivalid][j];
@@ -806,7 +914,7 @@ int main (int argc, char *argv[])
float m=b*1./n;
float v=sqrt(b2*1./n-m*m);
int bb=0;
- for (int j=0; j<1024; j++)
+ for (int j=0; j<ADCMAX; j++)
if (j<m-5*v || j>m+5*v) bb+=Base[ivalid][j];
printf(" Baseline: %lf +- %lf, %lf%% at more than 5 sigmas\n",m,v,bb*100./n);
if (m-v>BASELINE || m+v<BASELINE) printf("@ Problem: Baseline is not within 1 sigma of %d\n",BASELINE);
@@ -816,7 +924,7 @@ int main (int argc, char *argv[])
for (int i=0; i<10; i++)
for (int j=0; j<10; j++) BitHist[i][j]=0;
int tv=0;
- for (int j=BASELINE; j<1024; j++) {
+ for (int j=BASELINE; j<ADCMAX; j++) {
tv+=Peak[ivalid][j-BASELINE];
for (int i=0; i<10; i++)
for (int k=0; k<10; k++)
@@ -827,7 +935,7 @@ int main (int argc, char *argv[])
for (int i=0; i<10; i++)
for (int j=i; j<10; j++)
if (BitHist[i][j]==0) printf("@ Problem: bit combination %d %d never happenning\n",i,j);
- //for (int j=0; j<1024; j++)
+ //for (int j=0; j<ADCMAX; j++)
//printf("%d %d %d\n",j,Peak[ivalid][j],Base[ivalid][j]);
}
}