diff --git a/gen_seq_stats.m b/gen_seq_stats.m
new file mode 100644
index 0000000000000000000000000000000000000000..7589dd3e011b13d13b724cd713a4e7a76c63daea
--- /dev/null
+++ b/gen_seq_stats.m
@@ -0,0 +1,223 @@
+clear all;
+
+%seq_stats_s017_t010.txt
+%seq_stats_s030_t011.txt
+%seq_stats_s098_t011.txt
+%seq_stats_s110_t011.txt
+
+
+history_size = 1000;
+
+max_num_sensors = 120
+max_num_targets = 20
+
+for num_sensors=1:max_num_sensors
+
+
+for num_targets=1:max_num_targets
+  
+    
+    
+clear header;
+clear block;
+clear footer;
+
+seq_name = sprintf('seq_stats_s%03d_t%03d.txt',num_sensors,num_targets);
+
+header{1} = '#';
+header{2} = '# Description: $description';
+header{3} = '# Author: Giulio Gaio';
+header{4} = '# Date: 2020/04/06';
+header{5} = '#';
+header{6} = sprintf('# This sequence perform statistics on %d sensors and %d targets',num_sensors,num_targets);
+header{7} = '#';
+
+cnt = 0;
+
+cnt = cnt + 1;
+blk{cnt}=sprintf('step%d;(write(this/AbortFlag) = 0) && (write(this/PauseFlag) = 0) && goto(%d);Init variables;Error init variables;-1',cnt,cnt+1);
+cnt = cnt + 1;
+blk{cnt}=sprintf('step%d;exec($pycalcstat $selfseq $propertyseq) == 0 ? goto(%d) : goto(-1);Running $pycalcstat;Error running $pycalcstat;-1',cnt,cnt+1);
+
+
+% dynamic attributes
+cnt = 0; 
+
+cnt = cnt + 1;
+footer{cnt} = 'attr;BufferLength;long;0'; % number of samples
+cnt = cnt + 1;
+footer{cnt} = 'attr;AcquisitionLength;long;0'; % number of samples
+cnt = cnt + 1;
+footer{cnt} = 'attr;AcquisitionPeriod;double;0'; % seconds
+cnt = cnt + 1;
+footer{cnt} = 'attr;ValidSamplesPerc;double;0'; % from 0 to 1 
+cnt = cnt + 1;
+footer{cnt} = 'attr;AbortFlag;bool;0';
+cnt = cnt + 1;
+footer{cnt} = 'attr;PauseFlag;bool;0';
+cnt = cnt + 1;
+footer{cnt} = 'attr;InitAtStartupFlag;bool;1';
+cnt = cnt + 1;
+footer{cnt} = 'attr;ProcessingTime;double;0'; % seconds
+cnt = cnt + 1;
+footer{cnt} = 'attr;IdleTime;double;0'; % seconds
+cnt = cnt + 1;
+footer{cnt} = 'attr;AcquisitionTime;double;0'; % seconds
+cnt = cnt + 1;
+footer{cnt} = 'attr;LPFilter;double;1'; % seconds
+cnt = cnt + 1;
+footer{cnt} = 'attr;EnablePolling;bool;0'; % seconds
+cnt = cnt + 1;
+footer{cnt} = 'attr;DisablePolling;bool;0'; % seconds
+cnt = cnt + 1;
+footer{cnt} = sprintf('attr;NumSensors;long;%d',num_sensors); % read olny
+cnt = cnt + 1;
+footer{cnt} = sprintf('attr;NumTargets;long;%d',num_targets); % read olny
+
+for i=1:num_sensors
+	% Read / Write attributes
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_SensorName;string;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_SensorDesc;string;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Enable;bool;1',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_EnableStates;long;65535',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_EnableTargets;long;%d',i,2^num_targets-1);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_MinThresVal;double;-1000',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_MaxThresVal;double;1000',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_LowThresPerc;double;0',i);  % from 0 to 1
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_HighThresPerc;double;1',i); % from 0 to 1
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_CoeffVarMeanExp;double;1',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_CoeffVarStdExp;double;1',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_SampleShift;double;0',i);
+	% Read only attributes 
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_AcqState;long;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_BunchNumberStart;long;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_BunchNumberEnd;long;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Mean;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_MinMax;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Min;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Max;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Median;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Std;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Skew;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Kurt;double;1',i);
+    
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_ValidSamples;long;0',i);
+    % History
+  	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Mean_History;double[%d];nomemo',i,history_size);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Median_History;double[%d];nomemo',i,history_size);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Std_History;double[%d];nomemo',i,history_size);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Skew_History;double[%d];nomemo',i,history_size);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Kurt_History;double[%d];nomemo',i,history_size);  
+    cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Min_History;double[%d];nomemo',i,history_size); 
+    cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_Max_History;double[%d];nomemo',i,history_size);         
+     cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_MinMax_History;double[%d];nomemo',i,history_size);  
+     
+	% Correlation attributes
+	for j=1:num_targets
+		cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_Corr_MinThresVal;double;-1',i,j);
+		cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_Corr_MaxThresVal;double;1',i,j);
+		cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_CorrFiltAbs_MinThresVal;double;0',i,j);
+		cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_CorrFiltAbs_MaxThresVal;double;0',i,j);
+   		cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_Corr;double;0',i,j);     
+    	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_CorrFiltAbs;double;0',i,j);    
+		cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_CorrLow;double;0',i,j);
+		cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_CorrHigh;double;0',i,j);
+		cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_Direction;double;0',i,j);
+        % History
+      	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_Corr_History;double[%d];nomemo',i,j,history_size);     
+    	cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_CorrFiltAbs_History;double[%d];nomemo',i,j,history_size);    
+		cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_CorrLow_History;double[%d];nomemo',i,j,history_size);
+		cnt = cnt + 1;footer{cnt} = sprintf('attr;s%03d_t%03d_CorrHigh_History;double[%d];nomemo',i,j,history_size);     
+	end
+end
+
+
+for i=1:num_targets
+	% Read / Write attributes
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_TargetName;string;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_TargetDesc;string;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Enable;bool;1',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_EnableStates;long;65535',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_EnableTargets;long;%d',i,2^num_targets-1);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_MinThresVal;double;-1000',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_MaxThresVal;double;1000',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_LowThresPerc;double;0',i);  % from 0 to 1
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_HighThresPerc;double;1',i); % from 0 to 1
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_CoeffVarMeanExp;double;1',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_CoeffVarStdExp;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_SampleShift;double;0',i);
+	% Read only attributes 
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_AcqState;long;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_BunchNumberStart;long;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_BunchNumberEnd;long;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Mean;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_MinMax;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Min;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Max;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Median;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Std;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Skew;double;0',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Kurt;double;1',i);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_ValidSamples;long;0',i);
+    
+    % History
+  	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Mean_History;double[%d];nomemo',i,history_size);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Median_History;double[%d];nomemo',i,history_size);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Std_History;double[%d];nomemo',i,history_size);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Skew_History;double[%d];nomemo',i,history_size);
+	cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Kurt_History;double[%d];nomemo',i,history_size);  
+    cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Min_History;double[%d];nomemo',i,history_size); 
+    cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_Max_History;double[%d];nomemo',i,history_size);         
+    cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_MinMax_History;double[%d];nomemo',i,history_size);     
+    
+	% Correlation attributes
+	for j=i+1:num_targets
+			cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_Corr;double;0',i,j);
+			cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_Corr_MinThresVal;double;-1',i,j);
+			cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_Corr_MaxThresVal;double;1',i,j);
+			cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_CorrFiltAbs;double;0',i,j);
+			cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_CorrFiltAbs_MinThresVal;double;0',i,j);
+			cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_CorrFiltAbs_MaxThresVal;double;0',i,j);
+			cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_CorrLow;double;0',i,j);
+			cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_CorrHigh;double;0',i,j);
+			cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_Direction;double;0',i,j);
+            % History
+            cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_Corr_History;double[%d];nomemo',i,j,history_size);     
+            cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_CorrFiltAbs_History;double[%d];nomemo',i,j,history_size);    
+            cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_CorrLow_History;double[%d];nomemo',i,j,history_size);
+            cnt = cnt + 1;footer{cnt} = sprintf('attr;t%03d_t%03d_CorrHigh_History;double[%d];nomemo',i,j,history_size);     
+	end          
+end
+
+
+fileID = fopen(seq_name,'w');
+for i=1:size(header,2)
+    fprintf(fileID,'%s\n',header{i});
+end
+for i=1:size(blk,2)
+    fprintf(fileID,'%s\n',blk{i});
+end
+for i=1:size(footer,2)
+    fprintf(fileID,'%s\n',footer{i});
+end
+
+fclose(fileID);
+
+end % for target
+
+end % for sensor
+
+
+
+% Wildcards
+% $description=
+% $devmon_attr=seq/monitor/dcct_sr/ErrorCount
+% $devtime_attr=sequencer/test/seq_util.01/Date[0]
+% $sleep_thread=1
+% $sleep_monitor=3
+% $sleep_write=1
+% $devattr1$=
+% $devattr2$=
+% $devattr3$=
+% .........
+