15 #include <JANA/JApplication.h>
16 #include <JANA/JFactory.h>
29 #include <TDirectory.h>
96 const Char_t rtunits[6] =
"0.8ns";
98 const Int_t RTMAX = 2048;
99 const Int_t
TMAX = 2000;
102 japp->RootWriteLock();
105 TDirectory *
main = gDirectory;
106 gDirectory->mkdir(
"CDC_drift")->cd();
111 cdc_time =
new TH1F(
"cdc_time",
"CDC time (units of ns); time (ns)",TMAX,-500,TMAX-500);
112 cdc_rawtime =
new TH1I(
"cdc_rawtime",Form(
"CDC raw time (units of %s); raw time (%s)",rtunits,rtunits),RTMAX,0,RTMAX);
117 rtfit =
new TTree(
"rawtimefit",
"raw drift time fit params");
120 rtfit->Branch(
"entries",&tentries,
"entries/L");
123 rtfit->Branch(
"t0",&t0,
"t0/D");
126 rtfit->Branch(
"tmax",&tmax,
"tmax/D");
129 rtfit->Branch(
"tmax_slope",&tmax_slope,
"tmax_slope/D");
132 rtfit->Branch(
"tdiff_ns",&tdiff,
"tdiff/D");
135 tfit =
new TTree(
"timefit",
"drift time fit params");
137 tfit->Branch(
"entries",&tentries,
"entries/L");
139 tfit->Branch(
"t0",&t0,
"t0/D");
141 tfit->Branch(
"tmax",&tmax,
"tmax/D");
143 tfit->Branch(
"tmax_slope",&tmax_slope,
"tmax_slope/D");
145 tfit->Branch(
"tdiff_ns",&tdiff,
"tdiff/D");
180 const uint32_t MIN_EVENTS = 50000;
181 const uint32_t UPDATE_INTERVAL = 25000;
183 const Bool_t RESET = kFALSE;
192 int64_t previous,tprevious;
196 int straw_offset[29] = {0,0,42,84,138,192,258,324,404,484,577,670,776,882,1005,1128,1263,1398,1544,1690,1848,2006,2176,2346,2528,2710,2907,3104,3313};
198 const uint16_t nstraws = 77;
200 const uint16_t strawlist[] = {176, 237, 496, 497, 775, 776, 777, 782, 879, 881, 882, 895, 900, 1021, 1026, 1047, 1052, 1056, 1057, 1130, 1241, 1252, 1266, 1318, 1340, 1376, 1567, 1568, 1679, 1682, 1701, 1849, 1853, 1864, 1918, 1998, 2088, 2242, 2244, 2248, 2255, 2256, 2430, 2445, 2556, 2585, 2748, 2767, 2770, 2772, 2774, 2782, 2788, 2789, 2793, 2796, 2943, 2951, 2952, 2962, 2963, 2965, 2969, 2973, 2985, 3159, 3160, 3176, 3177, 3184, 3214, 3361, 3363, 3365, 3369, 3428, 3429};
207 eventLoop->GetSingle(locTrigger);
216 vector<const DCDCDigiHit*> digihits;
217 eventLoop->Get(digihits);
220 japp->RootWriteLock();
224 previous = (uint32_t)(
cdc_rawtime->GetEntries()/UPDATE_INTERVAL);
227 for (uint32_t i=0; i<digihits.size(); i++) {
232 digihit->GetSingle(cp);
236 ring = digihit->
ring;
237 straw = digihit->
straw;
238 n = straw_offset[ring] + straw;
246 while ((!fillhisto) && (j<nstraws)) {
248 if (n == strawlist[j]) fillhisto = kTRUE;
258 if ((nentries > MIN_EVENTS) && (uint32_t(nentries/UPDATE_INTERVAL) > previous)) fithisto = kTRUE;
270 vector<const DCDCHit*> hits;
271 eventLoop->Get(hits);
275 tprevious = (uint32_t)(
cdc_time->GetEntries()/UPDATE_INTERVAL);
278 for (uint32_t i=0; i<hits.size(); i++) {
284 n = straw_offset[ring] + straw;
290 while ((!fillhisto) && (j<nstraws)) {
292 if (n == strawlist[j]) fillhisto = kTRUE;
302 if ((nentries > MIN_EVENTS) && (uint32_t(nentries/UPDATE_INTERVAL) > tprevious)) fitthisto = kTRUE;
315 if (VERBOSE)
printf(
"\n\nFitting cdc_rawtime\n");
317 const float TUNITS = 0.8;
320 Double_t fitparams[10];
321 Float_t startpar[10];
332 Int_t bgpeakwidth = 10;
338 for (i=0; i<bgpeakwidth; i++) chunk1 +=
cdc_rawtime->GetBinContent(imin+i);
341 for (i=0; i<bgpeakwidth; i++) chunk2 +=
cdc_rawtime->GetBinContent(imin+bgpeakwidth+i);
344 if (chunk1>1.5*chunk2) imin += bgpeakwidth;
345 xmin =
cdc_rawtime->GetXaxis()->GetBinLowEdge(imin);
358 Double_t xpeak =
cdc_rawtime->GetXaxis()->GetBinLowEdge(ipeak);
368 for (i=imin; i<imin+bgrange; i++) bg +=
cdc_rawtime->GetBinContent(i);
369 bg = bg/(Double_t)bgrange;
372 TF1 *
f =
new TF1(
"f",
"[9] + [0] * (1 + [1]*exp(([3]-x)/[2]) + [7]*exp(([3]-x)/[8]) ) / ( (1+exp(([3]-x)/[5])) * (1+exp((x-[4])/[6])) )",xmin,xmax);
382 f->SetParLimits(1,0,startpar[1]*2);
383 f->SetParLimits(7,0,startpar[7]*2);
385 startpar[5] = 5*0.8/TUNITS;
386 startpar[6] = 25*0.8/TUNITS;
388 f->SetParLimits(5,0,startpar[5]*2.5);
389 f->SetParLimits(6,0,startpar[6]*2.5);
391 startpar[2] = 20*0.8/TUNITS;
392 startpar[8] = 200*0.8/TUNITS;
394 f->SetParLimits(2,0,startpar[2]*3);
395 f->SetParLimits(8,startpar[2]*3,startpar[8]*3);
397 for (j=1;j<3;j++) f->SetParameter(j,startpar[j]);
398 for (j=5;j<9;j++) f->SetParameter(j,startpar[j]);
400 previous = (uint32_t)(nentries/UPDATE_INTERVAL);
404 startpar[0] = 0.0005*nentries;
407 f->SetParLimits(0,0,startpar[0]*100);
408 f->SetParameter(0,startpar[0]);
410 f->SetParLimits(9,0,bg*2);
411 f->SetParameter(9,startpar[9]);
416 f->SetParLimits(3,startpar[3]-(50*0.8/TUNITS),startpar[3]);
417 f->SetParLimits(4,startpar[3]+(500*0.8/TUNITS),xmax);
419 f->SetParameter(3,startpar[3]);
420 f->SetParameter(4,startpar[3] + (700*0.8/TUNITS));
422 if (!VERBOSE) fitstatus =
cdc_rawtime->Fit(
"f",
"QRLL");
423 if (VERBOSE) fitstatus =
cdc_rawtime->Fit(
"f",
"RLL");
425 if (fitstatus == 0 || fitstatus == 2) {
427 f->GetParameters(fitparams);
429 tdiff = (fitparams[4] - fitparams[3])*TUNITS;
439 if (VERBOSE)
printf(
"fitstatus:%1i nentries:%5lli [0] %2.0f [1] %2.0f [2] %3.0f [3] %4.0f [4] %4.0f [5] %4.1f [6] %3.0f [7] %3.1f [8] %4.0f [9] %4.0f [tmax] %3.0f\n",fitstatus,nentries,fitparams[0],fitparams[1],fitparams[2],fitparams[3],fitparams[4],fitparams[5],fitparams[6],fitparams[7],fitparams[8],fitparams[9],tdiff);
442 rtfit->SetBranchAddress(
"entries",&nentries);
443 rtfit->SetBranchAddress(
"t0",&fitparams[3]);
444 rtfit->SetBranchAddress(
"tmax",&fitparams[4]);
445 rtfit->SetBranchAddress(
"tmax_slope",&fitparams[6]);
446 rtfit->SetBranchAddress(
"tdiff_ns",&tdiff);
460 if (VERBOSE)
printf(
"\n\nFitting cdc_time\n");
462 const float TUNITS = 1.0;
464 Double_t fitparams[10];
465 Float_t startpar[10];
469 Int_t imin =
cdc_time->FindFirstBinAbove();
476 Int_t bgpeakwidth = 8;
482 for (i=0; i<bgpeakwidth; i++) chunk1 +=
cdc_time->GetBinContent(imin+i);
485 for (i=0; i<bgpeakwidth; i++) chunk2 +=
cdc_time->GetBinContent(imin+bgpeakwidth+i);
486 if (chunk1>1.5*chunk2) imin += bgpeakwidth;
487 xmin =
cdc_time->GetXaxis()->GetBinLowEdge(imin);
493 for (i=imin; i<
cdc_time->GetNbinsX(); i++) {
494 if (
cdc_time->GetBinContent(i) > maxcontent) {
495 maxcontent =
cdc_time->GetBinContent(i);
500 Double_t xpeak =
cdc_time->GetXaxis()->GetBinLowEdge(ipeak);
506 xmax =
cdc_time->GetBinLowEdge(imax);
510 for (i=imin; i<imin+bgrange; i++) bg +=
cdc_time->GetBinContent(i);
511 bg = bg/(Double_t)bgrange;
514 TF1 *
f =
new TF1(
"f",
"[9] + [0] * (1 + [1]*exp(([3]-x)/[2]) + [7]*exp(([3]-x)/[8]) ) / ( (1+exp(([3]-x)/[5])) * (1+exp((x-[4])/[6])) )",xmin,xmax);
524 f->SetParLimits(1,0,startpar[1]*2);
525 f->SetParLimits(7,0,startpar[7]*2);
527 startpar[5] = 5*0.8/TUNITS;
528 startpar[6] = 25*0.8/TUNITS;
530 f->SetParLimits(5,0,startpar[5]*2.5);
531 f->SetParLimits(6,0,startpar[6]*2.5);
533 startpar[2] = 20*0.8/TUNITS;
534 startpar[8] = 200*0.8/TUNITS;
536 f->SetParLimits(2,0,startpar[2]*3);
537 f->SetParLimits(8,startpar[2]*3,startpar[8]*3);
539 for (j=1;j<3;j++) f->SetParameter(j,startpar[j]);
540 for (j=5;j<9;j++) f->SetParameter(j,startpar[j]);
542 previous = (uint32_t)(nentries/UPDATE_INTERVAL);
546 startpar[0] = 0.0005*nentries;
549 f->SetParLimits(0,0,startpar[0]*100);
550 f->SetParameter(0,startpar[0]);
552 f->SetParLimits(9,0,bg*2);
553 f->SetParameter(9,startpar[9]);
558 f->SetParLimits(3,startpar[3]-(50*0.8/TUNITS),startpar[3]);
559 f->SetParLimits(4,startpar[3]+(500*0.8/TUNITS),xmax);
561 f->SetParameter(3,startpar[3]);
562 f->SetParameter(4,startpar[3] + (700*0.8/TUNITS));
564 if (!VERBOSE) fitstatus =
cdc_time->Fit(
"f",
"QRLL");
565 if (VERBOSE) fitstatus =
cdc_time->Fit(
"f",
"RLL");
567 if (fitstatus == 0 || fitstatus == 2) {
569 f->GetParameters(fitparams);
571 tdiff = (fitparams[4] - fitparams[3])*TUNITS;
581 if (VERBOSE)
printf(
"fitstatus:%1i nentries:%5lli [0] %2.0f [1] %2.0f [2] %3.0f [3] %4.0f [4] %4.0f [5] %4.1f [6] %3.0f [7] %3.1f [8] %4.0f [9] %4.0f [tmax] %3.0f\n",fitstatus,nentries,fitparams[0],fitparams[1],fitparams[2],fitparams[3],fitparams[4],fitparams[5],fitparams[6],fitparams[7],fitparams[8],fitparams[9],tdiff);
584 tfit->SetBranchAddress(
"entries",&nentries);
585 tfit->SetBranchAddress(
"t0",&fitparams[3]);
586 tfit->SetBranchAddress(
"tmax",&fitparams[4]);
587 tfit->SetBranchAddress(
"tmax_slope",&fitparams[6]);
588 tfit->SetBranchAddress(
"tdiff_ns",&tdiff);
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
Called every event.
jerror_t fini(void)
Called after last event of last event source has been processed.
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
uint32_t Get_L1FrontPanelTriggerBits(void) const
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
Called everytime a new run number is detected.
uint32_t pulse_time
identified pulse time as returned by FPGA algorithm
bool Get_IsPhysicsEvent(void) const
~JEventProcessor_CDC_drift()
JEventProcessor_CDC_drift()
uint32_t time_quality_bit
from first word
jerror_t init(void)
Called once at program start.
static TH1I * cdc_rawtime
printf("string=%s", string)
int main(int argc, char *argv[])