Warning, /analysis/TPC/DAQ/macros/TPCRateLayered.m is written in an unsupported language. File is not indexed.
0001 % bottom up calcualtion of TPC rate using MC approach
0002 % Author - Jin Huang <jhuang@bnl.gov>
0003
0004 close all
0005
0006 clear all
0007
0008 myColorMap = colormap;
0009 myColorMap(1,:) = [1 1 1];
0010 colormap(myColorMap);
0011 %% Inputs
0012
0013 % n = 1000;
0014 % full_rate = 100e3;
0015 % trig_rate = 15e3;
0016 % trigger_window = 18e-6;
0017
0018 % n = 10000000;
0019 n = 50000;
0020 % n = 500000;
0021 % full_rate = 250e3;
0022 full_rate = 100e3;
0023 % full_rate = 150e3;
0024 % full_rate = 100e3;
0025 % full_rate = 50e3;
0026 trig_rate = 15e3;
0027 % trigger_window = 4e-6;
0028 trigger_window = 13e-6;
0029 % trigger_window = 17.5e-6;
0030 % trigger_window = 35e-6;
0031
0032 TargetEta = 1.1;
0033 % TargetEta = 3;
0034
0035 nRing = 40;
0036 % nRing = 48;
0037
0038 SaveName = sprintf('TPCRateLayered_%.0fHzCol_%.0fHzTrig_%.0fusDrift_nRing%d',full_rate,trig_rate,trigger_window*1e6, nRing);
0039
0040 %% Generic constants
0041
0042
0043 minR = 30;
0044 maxR = 78;
0045 maxZ = 105;
0046 dNdeta = 2 * 180 * 2; % Pre-CDR table 3.3 with effective factor x2 and two signs x2
0047 bitPerHit =3*5*10 * 1.4; % Pre-CDR table 3.3 with effective factor
0048 DAMCompressionFactor = 1.02 * 0.5 * 0.6; % Repacking, clustering, compression
0049
0050 BCO = 10e6;
0051 DataPlotRangeBCO =10000;
0052
0053 TimeSpan= n/full_rate;
0054 TimeSpanBCO = int64(TimeSpan*BCO);
0055
0056
0057 TriggerBCO = poissrnd(trig_rate/BCO, TimeSpanBCO, 1)';
0058 CollisionBCO =poissrnd((full_rate - trig_rate)/BCO ,TimeSpanBCO, 1)' + TriggerBCO;
0059
0060
0061 %% Per triggger
0062
0063 PerTriggerBCO = int64(trigger_window * BCO);
0064
0065 RRing = repmat(linspace(minR, maxR, nRing )',1,PerTriggerBCO);
0066 zBCO = repmat(linspace(maxZ, 0, PerTriggerBCO),nRing,1);
0067
0068 MinEtaRingBCO = atanh( (zBCO - 10) ./ sqrt((zBCO - 10).^2 + RRing.^2) );
0069 % MinEtaRingBCO = atanh( (zBCO - 0) ./ sqrt((zBCO - 0).^2 + RRing.^2) );
0070 dEtaRingBCO = atanh( (zBCO + maxZ/double(PerTriggerBCO) ) ./ sqrt((zBCO + maxZ/double(PerTriggerBCO) ).^2 + RRing.^2) ) - atanh( zBCO ./ sqrt(zBCO.^2 + RRing.^2) );
0071 dataBitRingBCO = bitPerHit .* dNdeta .* dEtaRingBCO; % Pre-CDR table 3.3 with effective factor
0072
0073 TriggerMask = double(MinEtaRingBCO < TargetEta);
0074 dataBitRingBCOAfterMask = dataBitRingBCO.*TriggerMask;
0075
0076 figure('name','PerEventData','PaperPositionMode','auto', ...
0077 'position',[100,0,2400,800]) ;
0078
0079 subplot(1,2,1)
0080
0081
0082 imagesc(zBCO(1,:), RRing(:,1), dataBitRingBCO);
0083 c = colorbar;
0084
0085 hold on;
0086 plot([10 maxZ+10], [0 tan(acos(tanh(TargetEta))) * maxZ],'k--');
0087
0088 set(gca,'YDir','normal');
0089 set(gca,'YLim',[0,80]);
0090 set(gca,'XLim',[0,110])
0091 box on
0092 grid on
0093 daspect([1 1 1])
0094
0095 xlabel('|z| position (cm)','FontSize',14);
0096 ylabel('R position (cm)','FontSize',14);
0097 c.Label.String = 'FEE data (bit) per MB collision per |z|-R bin (integrated over z-sign and azimuth)';
0098 c.Label.FontSize = 14;
0099
0100 title(sprintf('FEE data (bit) per MB collision per |z|-R bin, total = %.1f Mbit', sum(sum(dataBitRingBCO))/1e6),'FontSize',16);
0101
0102
0103 subplot(1,2,2)
0104
0105
0106 imagesc(zBCO(1,:), RRing(:,1), dataBitRingBCOAfterMask);
0107 c = colorbar;
0108 hold on;
0109 plot([10 maxZ+10], [0 tan(acos(tanh(TargetEta))) * maxZ],'k--');
0110
0111 set(gca,'YDir','normal');
0112 set(gca,'YLim',[0,80]);
0113 set(gca,'XLim',[0,110])
0114 box on
0115 grid on
0116 daspect([1 1 1])
0117
0118 xlabel('|z| position (cm)','FontSize',14);
0119 ylabel('R position','FontSize',14);
0120 c.Label.String = 'FEE data (bit) per MB collision per |z|-R bin (integrated over z-sign and azimuth)';
0121 c.Label.FontSize = 14;
0122
0123 title(sprintf('FEE data (bit) after DAM acceptance filtering, total = %.1f Mbit', sum(sum(dataBitRingBCOAfterMask))/1e6),'FontSize',16);
0124
0125
0126
0127
0128 SaveCavas('TPCRateLayered',gcf);
0129
0130
0131 %% Run the DAQ
0132
0133 DataBCO = conv2(CollisionBCO,dataBitRingBCO);
0134 TriggerAcceptBCO = conv2(TriggerBCO,TriggerMask);
0135 ThrottleAcceptBCO = double(TriggerAcceptBCO>0);
0136
0137 PlotDataBCO = DataBCO(:,1:DataPlotRangeBCO);
0138 PlotThrottleDataBCO = DataBCO(:,1:DataPlotRangeBCO).*ThrottleAcceptBCO(:,1:DataPlotRangeBCO);
0139
0140 TotalDataRate = sum(sum(DataBCO))/TimeSpan;
0141 TriggerDataRate = sum(sum(DataBCO.*TriggerAcceptBCO))/TimeSpan;
0142 ThrottleDataRate = sum(sum(DataBCO.*ThrottleAcceptBCO))/TimeSpan;
0143
0144 %% Event stream display
0145
0146 figure('name','DataStream','PaperPositionMode','auto', ...
0147 'position',[100,0,2400,800]) ;
0148
0149 subplot(2,1,1)
0150
0151 imagesc( DataBCO(:,1:DataPlotRangeBCO) );
0152 c = colorbar;
0153 hold on;
0154 set(gca,'YDir','normal');
0155 set(gca,'YLim',[-4,nRing+1]);
0156
0157 xlabel('BCO bin (100 ns)','FontSize',14);
0158 ylabel('Radial layer number','FontSize',14);
0159 c.Label.String = 'FEE data (bit)';
0160 c.Label.FontSize = 14;
0161 title(sprintf('FEE data input to DAM. Rate = %.0f Gbps @ %.0f kHz Collision, %.0f kHz Trigger %.0f us Drift',...
0162 sum(sum(DataBCO))/TimeSpan/1e9,full_rate/1e3,trig_rate/1e3,trigger_window*1e6),'FontSize',16);
0163
0164 for i = 1:DataPlotRangeBCO
0165
0166 if (TriggerBCO(i) >0)
0167
0168 plot([i i], [-3 nRing],'r--','LineWidth',2);
0169 plot([i,i+PerTriggerBCO], [-3 -3], 'r-', 'LineWidth', 2)
0170 plot([i,i+PerTriggerBCO], [-1 -1], 'k-', 'LineWidth', 2)
0171
0172 elseif (CollisionBCO(i) >0)
0173
0174 plot([i i], [-1 nRing],'k--','LineWidth',2);
0175 plot([i,i+PerTriggerBCO], [-1 -1], 'k-', 'LineWidth', 2)
0176 end
0177
0178
0179 end
0180
0181
0182
0183 subplot(2,1,2)
0184
0185 imagesc( PlotThrottleDataBCO );
0186 c = colorbar;
0187 hold on;
0188 set(gca,'YDir','normal');
0189 set(gca,'YLim',[-4,nRing+1]);
0190
0191 xlabel('BCO bin (100 ns)','FontSize',14);
0192 ylabel('Radial layer number','FontSize',14);
0193 c.Label.String = 'FEE data equavelent (bit)';
0194 c.Label.FontSize = 14;
0195 title(sprintf('DAM data output: Throttled data rate = %.0f Gbps, Triggered data rate = %.0f Gbps ',...
0196 ThrottleDataRate * DAMCompressionFactor/1e9 ,...
0197 TriggerDataRate * DAMCompressionFactor/1e9...
0198 ),'FontSize',16);
0199
0200 for i = 1:DataPlotRangeBCO
0201
0202 if (TriggerBCO(i) >0)
0203
0204 plot([i i], [-3 nRing],'r--','LineWidth',2);
0205 plot([i,i+PerTriggerBCO], [-3 -3], 'r-', 'LineWidth', 2)
0206 plot([i,i+PerTriggerBCO], [-1 -1], 'k-', 'LineWidth', 2)
0207
0208 elseif (CollisionBCO(i) >0)
0209
0210 plot([i i], [-1 nRing],'k--','LineWidth',2);
0211 plot([i,i+PerTriggerBCO], [-1 -1], 'k-', 'LineWidth', 2)
0212 end
0213
0214
0215 end
0216
0217 SaveCavas(SaveName,gcf);
0218
0219
0220 %% Event stream display - 1D
0221
0222 figure('name','DataStream1D','PaperPositionMode','auto', ...
0223 'position',[100,0,2400,800]) ;
0224
0225 subplot(2,1,1)
0226
0227 bar( PlotDataBCO(nRing,:) ,1);
0228 % c = colorbar;
0229 hold on;
0230 set(gca,'YDir','normal');
0231 set(gca, 'XLim',[0 DataPlotRangeBCO]);
0232 ylim = get(gca,'YLim');
0233 y_max = ylim(2);
0234
0235 xlabel('BCO bin (100 ns)','FontSize',14);
0236 ylabel('Data in last TPC layer (bit/BCO)','FontSize',14);
0237 % c.Label.String = 'FEE data (bit)';
0238 % c.Label.FontSize = 14;
0239 title(sprintf('FEE data input to DAM. Rate = %.0f Gbps @ %.0f kHz Collision, %.0f kHz Trigger %.0f us Drift',...
0240 sum(sum(DataBCO))/TimeSpan/1e9,full_rate/1e3,trig_rate/1e3,trigger_window*1e6),'FontSize',16);
0241
0242 for i = 1:DataPlotRangeBCO
0243
0244 if (TriggerBCO(i) >0)
0245
0246 plot([i i], [-.15 1].*y_max,'r--','LineWidth',1);
0247 plot([i,i+PerTriggerBCO], [-.15 -.15].*y_max, 'r-', 'LineWidth', 1)
0248 plot([i,i+PerTriggerBCO], [-.1 -.1].*y_max, 'k-', 'LineWidth', 1)
0249
0250 elseif (CollisionBCO(i) >0)
0251
0252 plot([i i], [-.1 1].*y_max,'k--','LineWidth',1);
0253 plot([i,i+PerTriggerBCO], [-.1 -.1].*y_max, 'k-', 'LineWidth', 1)
0254 end
0255
0256
0257 end
0258
0259
0260
0261 subplot(2,1,2)
0262
0263 bar( PlotThrottleDataBCO(nRing,:), 1 );
0264 % c = colorbar;
0265 hold on;
0266 set(gca,'YDir','normal');
0267 set(gca, 'XLim',[0 DataPlotRangeBCO]);
0268 % set(gca,'YLim',[-4,nRing+1]);
0269
0270 xlabel('BCO bin (100 ns)','FontSize',14);
0271 ylabel('Data in last TPC layer (bit/BCO)','FontSize',14);
0272 % c.Label.String = 'FEE data equavelent (bit)';
0273 % c.Label.FontSize = 14;
0274 title(sprintf('DAM data output: Throttled data rate = %.0f Gbps, Triggered data rate = %.0f Gbps ',...
0275 ThrottleDataRate * DAMCompressionFactor/1e9 ,...
0276 TriggerDataRate * DAMCompressionFactor/1e9...
0277 ),'FontSize',16);
0278
0279 for i = 1:DataPlotRangeBCO
0280
0281 if (TriggerBCO(i) >0)
0282
0283 plot([i i], [-.15 1].*y_max,'r--','LineWidth',1);
0284 plot([i,i+PerTriggerBCO], [-.15 -.15].*y_max, 'r-', 'LineWidth', 1)
0285 plot([i,i+PerTriggerBCO], [-.1 -.1].*y_max, 'k-', 'LineWidth', 1)
0286
0287 elseif (CollisionBCO(i) >0)
0288
0289 plot([i i], [-.1 1].*y_max,'k--','LineWidth',1);
0290 plot([i,i+PerTriggerBCO], [-.1 -.1].*y_max, 'k-', 'LineWidth', 1)
0291 end
0292
0293
0294 end
0295
0296
0297 SaveCavas(SaveName,gcf);
0298
0299 %% FEE Data Rate
0300
0301 DataRadialLayerRate = sum(DataBCO, 2) / TimeSpan;
0302
0303 if nRing == 40
0304
0305 FEEDataRate = [sum( DataRadialLayerRate(1:8))/5;
0306 sum( DataRadialLayerRate((8+1):(8+16)))/8;
0307 sum( DataRadialLayerRate((8+1+16):(8+16+16)))/12]...
0308 /12/2;%12 sectors and two sides
0309 elseif nRing == 48
0310
0311 FEEDataRate = [sum( DataRadialLayerRate(1:16))/6;
0312 sum( DataRadialLayerRate((16+1):(16+16)))/8;
0313 sum( DataRadialLayerRate((16+1+16):(16+16+16)))/12]...
0314 /12/2;%12 sectors and two sides
0315
0316 else
0317 assert(0);
0318 end
0319
0320
0321 %% FEE Data Rate Plot
0322
0323 figure('name','FEEDataRate','PaperPositionMode','auto', ...
0324 'position',[100,0,800,400]) ;
0325
0326
0327 bar( FEEDataRate/1e9 );
0328 % c = colorbar;
0329 hold on;
0330 set(gca,'YDir','normal');
0331 % set(gca, 'XLim',[0 DataPlotRangeBCO]);
0332 ylim = get(gca,'YLim');
0333 y_max = ylim(2);
0334
0335 xlabel('Module Number','FontSize',16);
0336 ylabel('Average data rate per FEE (Gbps)','FontSize',16);
0337 % c.Label.String = 'FEE data (bit)';
0338 % c.Label.FontSize = 14;
0339 title(sprintf('FEE data input to DAM. Total = %.0f Gbps @ %.0f kHz Collision, %.0f kHz Trigger %.0f us Drift',...
0340 sum(sum(DataBCO))/TimeSpan/1e9,full_rate/1e3,trig_rate/1e3,trigger_window*1e6),'FontSize',12);
0341
0342 SaveCavas(SaveName,gcf);
0343
0344 %% Collision pile up histogram
0345
0346 nPileUpTrig = zeros( sum(TriggerBCO(PerTriggerBCO+1:(TimeSpanBCO-PerTriggerBCO))) ,1) ;
0347 nPileUpRnd = zeros( TimeSpanBCO - 2*PerTriggerBCO ,1) ;
0348
0349 iTrig = 1;
0350 for i = PerTriggerBCO+1:(TimeSpanBCO-PerTriggerBCO)
0351
0352 if (TriggerBCO(i));
0353
0354 nPileUpTrig(iTrig) = sum( CollisionBCO((i-PerTriggerBCO):(i+PerTriggerBCO)) );
0355
0356 iTrig = iTrig +1;
0357 end
0358
0359 nPileUpRnd(i- PerTriggerBCO + 1) = sum( CollisionBCO((i-PerTriggerBCO):(i+PerTriggerBCO)) );
0360
0361
0362 end
0363 %%
0364
0365 figure('name','nPileUp','PaperPositionMode','auto', ...
0366 'position',[100,0,2000,800]) ;
0367
0368 subplot(1,2,1)
0369
0370 hist(nPileUpTrig,0:20);
0371
0372 set(gca,'XLim',[-1,11]);
0373 xlabel('Number of collisions in TPC drift window','FontSize',14);
0374 ylabel('Count per bin','FontSize',14);
0375 title(sprintf('Collision trigger: <# collision in TPC window> = %.2f @ %.0f kHz Collision, %.0f us Drift',...
0376 mean(nPileUpTrig),...
0377 full_rate/1e3,trigger_window*1e6),'FontSize',16);
0378
0379 subplot(1,2,2)
0380
0381 hist(nPileUpRnd,0:20);
0382
0383 set(gca,'XLim',[-1,11]);
0384 xlabel('Number of collisions in TPC drift window','FontSize',14);
0385 ylabel('Count per bin','FontSize',14);
0386 title(sprintf('Random trigger: <# collision in TPC window> = %.2f @ %.0f kHz Collision, %.0f us Drift',...
0387 mean(nPileUpRnd),...
0388 full_rate/1e3,trigger_window*1e6),'FontSize',16);
0389
0390 SaveCavas(SaveName,gcf);
0391
0392 %%
0393
0394 % fprintf('Throttled event / total = %.3f; Throttled data / total = %.3f; Triggered event / total = %.3f; Triggered data / total = = %.3f\n',...
0395 % n_recorded/n, recorded_data/n, n_triggered./n, triggered_data/n);
0396 fprintf('------------\n');
0397
0398 fprintf('full_rate = %.0f kHz; trig_rate= %.0f kHz; trigger_window= %.1f us; Time span = %.3f s \n',...
0399 full_rate/1e3,trig_rate/1e3, trigger_window*1e6, TimeSpan );
0400
0401 fprintf('per event effective track = %.0f , per event FEE data = %.0f bits, total FEE data rate = %.0f Gbps \n',...
0402 mean(sum(dEtaRingBCO,2)*180*2), sum(sum(dataBitRingBCO)), sum(sum(DataBCO))/TimeSpan/1e9 );
0403
0404 fprintf('Trigger rate*drift window = %.2f;Full rate*drift window= %.2f;Trigger rate/full rate = %.2f (input)/%.2f(MC); \n',...
0405 trig_rate*trigger_window,full_rate*trigger_window,trig_rate/full_rate, sum(TriggerBCO)/sum(CollisionBCO) );
0406
0407 fprintf('throttled data / total = %.3f; Triggered data / total = %.3f; throttled/trigger = %.3f; Triggered data/Per event data = %.3f \n',...
0408 ThrottleDataRate/TotalDataRate,...
0409 TriggerDataRate/TotalDataRate,...
0410 ThrottleDataRate/TriggerDataRate,...
0411 sum(sum(DataBCO.*TriggerAcceptBCO)) ./ (sum(sum(dataBitRingBCOAfterMask)).*sum(TriggerBCO))...
0412 );
0413 % sum(sum(DataBCO.*TriggerAcceptBCO)) ./ (sum(sum(dataBitRingBCOAfterMask)).*sum(CollisionBCO))...
0414
0415 fprintf('throttled data rate = %.0f Gbps; Triggered data rate = %.0f Gbps\n',...
0416 ThrottleDataRate * DAMCompressionFactor/1e9 ,...
0417 TriggerDataRate * DAMCompressionFactor/1e9);
0418 fprintf('------------\n');
0419
0420 % fprintf('throttled event / total = %.3f; Triggered event / total = = %.3f; throttled/trigger = %.3f\n',...
0421 % recorded_data/n, triggered_data/n, recorded_data/triggered_data );
0422