Skip to content

Commit 0ad16c1

Browse files
committed
Add the prelim ALERT timeline scripts
1 parent 291cd19 commit 0ad16c1

3 files changed

Lines changed: 123 additions & 0 deletions

File tree

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package org.jlab.clas.timeline.analysis
2+
import java.util.concurrent.ConcurrentHashMap
3+
import org.jlab.groot.data.TDirectory
4+
import org.jlab.groot.data.GraphErrors
5+
import org.jlab.clas.timeline.fitter.ALERTFitter
6+
7+
class alert_atof_tdc {
8+
9+
def data = new ConcurrentHashMap()
10+
11+
def processRun(dir, run) {
12+
13+
data[run] = [run:run]
14+
def trigger = dir.getObject('/TRIGGER/bits')
15+
def reference_trigger_bit = 0
16+
data[run].put('bits', trigger)
17+
(0..<720).collect{index->
18+
int sector = index / (12 * 4);
19+
int layer = (index % (12 * 4)) / 12;
20+
int component = index % 12;
21+
def file_index = '';
22+
if (component <= 10) file_index = String.format('sector%d_layer%d_component%d_order0', sector, layer, component)
23+
else file_index = String.format('sector%d_layer%d_component%d_order1', sector, layer, component-1)
24+
def h1 = dir.getObject(String.format('/ALERT/TDC_%s', file_index))
25+
data[run].put(String.format('atof_tdc_%s', file_index), h1)
26+
def f1 = ALERTFitter.tdcfitter(h1)
27+
data[run].put(String.format('fit_atof_tdc_%s', file_index), f1)
28+
data[run].put(String.format('peak_location_atof_tdc_%s', file_index), f1.getParameter(1))
29+
data[run].put(String.format('sigma_atof_tdc_%s', file_index), f1.getParameter(2))
30+
data[run].put(String.format('integral_per_trigger_atof_tdc_%s', file_index), Math.sqrt(2*3.141597f) * f1.getParameter(0) * f1.getParameter(2)/trigger.getBinContent(reference_trigger_bit) )
31+
}
32+
}
33+
34+
35+
36+
def write() {
37+
38+
TDirectory out = new TDirectory()
39+
out.mkdir('/timelines')
40+
['peak_location', 'sigma', 'integral_per_trigger'].each{variable->
41+
(0..<15).collect{sector->
42+
(0..<4).collect{layer->
43+
def names = []
44+
(0..<12).collect{component->
45+
def file_index = ''
46+
if (component <= 10) file_index = String.format('sector%d_layer%d_component%d_order0', sector, layer, component)
47+
else file_index = String.format('sector%d_layer%d_component%d_order1', sector, layer, component-1)
48+
names << String.format('atof_tdc_%s', file_index)
49+
}
50+
names.each{ name ->
51+
def gr = new GraphErrors(name)
52+
gr.setTitle("ATOF TDC peak " + variable.replace('_', ' '))
53+
gr.setTitleY("ATOF TDC peak " + variable.replace('_', ' '))
54+
gr.setTitleX("run number")
55+
data.sort{it.key}.each{run,it->
56+
out.mkdir('/'+it.run)
57+
out.cd('/'+it.run)
58+
out.addDataSet(it[name])
59+
out.addDataSet(it['fit_'+name])
60+
gr.addPoint(it.run, it[variable + '_' + name], 0, 0)
61+
}
62+
out.cd('/timelines')
63+
out.addDataSet(gr)
64+
}
65+
out.writeFile(String.format('alert_atof_tdc_%s_sector%d_layer%d.hipo', variable, sector, layer))
66+
}
67+
}
68+
}
69+
}
70+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
*
3+
* Fitter package for CND
4+
*
5+
* Writer: Sangbaek Lee
6+
*
7+
**/
8+
package org.jlab.clas.timeline.fitter
9+
import org.jlab.groot.fitter.DataFitter
10+
import org.jlab.groot.data.H1F
11+
import org.jlab.groot.math.F1D
12+
13+
14+
class ALERTFitter{
15+
16+
static F1D tdcfitter(H1F h1){
17+
def f1 =new F1D("fit:"+h1.getName(),"[amp]*gaus(x,[mean],[sigma])+[cst]", -5.0, 5.0);
18+
f1.setLineColor(33);
19+
f1.setLineWidth(10);
20+
f1.setOptStat("1111");
21+
double maxz = h1.getBinContent(h1.getMaximumBin());
22+
f1.setRange(h1.getMaximumBin() + 350.5 - 50, h1.getMaximumBin() + 350.5 + 50);
23+
f1.setParameter(0,maxz);
24+
f1.setParameter(1, h1.getMaximumBin() + 350.5);
25+
f1.setParameter(2, 20);
26+
f1.setParameter(3, 0.0);
27+
if (maxz>0) f1.setParLimits(0, maxz*0.9,maxz*1.1);
28+
f1.setParLimits(3, 0.0, 0.1*maxz);
29+
30+
double hMean, hRMS
31+
32+
DataFitter.fit(f1, h1, "");
33+
34+
def makefit = {func->
35+
hMean = func.getParameter(1)
36+
hRMS = func.getParameter(2).abs()
37+
func.setRange(Math.max(hMean-2.5*hRMS, 350.0),Math.min(hMean+2.5*hRMS, 550.0))
38+
func.setParLimits(0, func.getParameter(0)*0.9,func.getParameter(0)*1.1);
39+
f1.setParLimits(3, 0.0, 0.1*func.getParameter(0));
40+
DataFitter.fit(func,h1,"Q")
41+
return [func.getChiSquare(), (0..<func.getNPars()).collect{func.getParameter(it)}]
42+
}
43+
44+
def fits1 = (0..20).collect{makefit(f1)}
45+
def bestfit = fits1.sort()[0]
46+
f1.setParameters(*bestfit[1])
47+
//makefit(f1)
48+
49+
return f1
50+
}
51+
}

src/main/java/org/jlab/clas/timeline/run_analysis.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package org.jlab.clas.timeline.analysis
33
import org.jlab.groot.data.TDirectory
44

55
def engines = [
6+
out_ALERT: [new alert_atof_tdc(),
7+
],
68
out_BAND: [new band_adccor(),
79
new band_lasertime(),
810
new band_meantimeadc(),

0 commit comments

Comments
 (0)