13 #include <JANA/JApplication.h>
14 #include <JANA/JFactory.h>
52 cout<<
"INITIALIZE VARIABLES "<<flush<<endl;
54 pthread_mutex_init(&mutex, NULL);
57 BINTDC_2_TIME = 0.0234375;
58 BINADC_2_TIME = 0.0625;
79 RunNumber = runnumber;
84 map<string,double> tdcshift;
85 if (!eventLoop->GetCalib(
"/TOF/tdc_shift", tdcshift)){
86 TOF_TDC_SHIFT = tdcshift[
"TOF_TDC_SHIFT"];
117 vector <const DL1Trigger*> trig_words;
118 uint32_t trig_mask, fp_trig_mask;
120 loop->Get(trig_words);
122 if (trig_words.size()) {
123 trig_mask = trig_words[0]->trig_mask;
124 fp_trig_mask = trig_words[0]->fp_trig_mask;
143 vector< const DCAEN1290TDCHit*> CAENHits;
145 if (CAENHits.size()<=0){
148 uint32_t locROCID = CAENHits[0]->rocid;
150 vector <const DCODAROCInfo*> ROCS;
153 for (
unsigned int n=0; n<ROCS.size(); n++) {
154 if (locROCID == ROCS[n]->rocid){
164 uint64_t TriggerTime = ROCS[indx]->timestamp;
165 int TriggerBIT = TriggerTime%6;
166 float TimingShift = TOF_TDC_SHIFT - (float)TriggerBIT;
167 if(TimingShift <= 0) {
173 vector<const DTOFDigiHit*> ADCHits, ADCHitsLeft[2],ADCHitsRight[2];
174 vector<const DTOFTDCDigiHit*> TDCHits, TDCHitsLeft[2], TDCHitsRight[2];
175 vector<int> ADCLeftOverFlow[2],ADCRightOverFlow[2];
185 memset(th,0,2*44*2*4);
186 for (
unsigned int k=0; k<ADCHits.size(); k++){
188 int plane = hit->
plane;
191 float time = (float)hit->
pulse_time * BINADC_2_TIME;
198 float indx = bar-1 + plane *88 + end*44;
202 TOFPedestal->Fill(indx, (
float)hit->
pedestal);
207 if (th[plane][bar-1][end]){
211 th[plane][bar-1][end] = 1;
212 TOFADCtime->Fill(time,indx);
213 if (fabsf(time-ADCTLOC)<ADCTimeCut){
215 vector <const Df250PulseIntegral*> PulseIntegral;
216 hit->Get(PulseIntegral);
232 ADCHitsRight[plane].push_back(hit);
233 ADCRightOverFlow[plane].push_back(overflow);
235 ADCHitsLeft[plane].push_back(hit);
236 ADCLeftOverFlow[plane].push_back(overflow);
241 if (ADCLeftOverFlow[0].
size() != ADCHitsLeft[0].
size()){
242 cout<<
"Error vector size missmatch!"<<endl;
250 for (
unsigned int k=0; k<TDCHits.size(); k++){
252 int plane = hit->
plane;
254 float time = (float)hit->
time * BINTDC_2_TIME;
255 float indx = plane*88 + end*44 + hit->
bar-1;
256 TOFTDCtime->Fill(time, indx);
257 if (fabsf(time-TDCTLOC)<TDCTimeCut){
259 TDCHitsRight[plane].push_back(hit);
261 TDCHitsLeft[plane].push_back(hit);
267 vector <paddle> TOFADCPaddles[2];
268 vector <SingleP> TOFADCSingles[2];
274 for (
int plane=0; plane<2; plane++){
278 for (
unsigned int i = 0; i<ADCHitsRight[plane].size(); i++) {
281 if ((paddle == 22) || (paddle == 23)){
283 newsingle.
paddle = paddle;
291 newsingle.
OverFlow = ADCRightOverFlow[plane][i];
292 TOFADCSingles[plane].push_back(newsingle);
300 for (
unsigned int j = 0; j<ADCHitsLeft[plane].size(); j++) {
303 if ((paddle == 22) || (paddle == 23)){
305 newsingle.
paddle = paddle;
313 newsingle.
OverFlow = ADCLeftOverFlow[plane][j];
314 TOFADCSingles[plane].push_back(newsingle);
318 for (
unsigned int i = 0; i<ADCHitsRight[plane].size(); i++) {
320 if (hitR->
bar == paddle){
321 struct paddle newpaddle;
322 newpaddle.
paddle = paddle;
326 newpaddle.
td = Signum*(newpaddle.
timeL - newpaddle.
timeR)/2.;
336 newpaddle.
OverFlowL = ADCLeftOverFlow[plane][j];
337 newpaddle.
OverFlowR = ADCRightOverFlow[plane][i];
338 if ((paddle != 22) && (paddle !=23)) {
340 TOFADCPaddles[plane].push_back(newpaddle);
348 vector <paddle> TOFTDCPaddles[2];
349 vector <SingleP> TOFTDCSingles[2];
355 for (
int plane=0; plane<2; plane++){
357 for (
unsigned int j = 0; j<TDCHitsRight[plane].size(); j++) {
360 if ((paddle == 22) || (paddle == 23)){
362 newsingle.
paddle = paddle;
364 newsingle.
time = (float)hit->
time*BINTDC_2_TIME ;
365 TOFTDCSingles[plane].push_back(newsingle);
369 for (
unsigned int j = 0; j<TDCHitsLeft[plane].size(); j++) {
372 if ((paddle == 22) || (paddle == 23)){
374 newsingle.
paddle = paddle;
376 newsingle.
time = (float)hit->
time*BINTDC_2_TIME ;
377 TOFTDCSingles[plane].push_back(newsingle);
379 for (
unsigned int i = 0; i<TDCHitsRight[plane].size(); i++) {
381 if (hitR->
bar == paddle){
382 struct paddle newpaddle;
383 newpaddle.
paddle = paddle;
384 newpaddle.
timeL = (float)hit->
time*BINTDC_2_TIME ;
385 newpaddle.
timeR = (
float)hitR->
time*BINTDC_2_TIME ;
387 newpaddle.
td = Signum*(newpaddle.
timeL - newpaddle.
timeR)/2.;
388 if ((paddle != 22) && (paddle !=23)) {
389 TOFTDCPaddles[plane].push_back(newpaddle);
399 japp->RootFillLock(
this);
402 TShift = TimingShift;
403 Nhits = TOFTDCPaddles[0].size() + TOFTDCPaddles[1].size();
405 int AllHits[4]={0,0,0,0};
408 for (
unsigned int k = 0; k<TOFTDCPaddles[0].size() ; k++){
410 Paddle[cnt] = TOFTDCPaddles[0][k].paddle;
411 MeanTime[cnt] = TOFTDCPaddles[0][k].mt;
412 TimeDiff[cnt] = TOFTDCPaddles[0][k].td;
417 for (
unsigned int k = 0; k<TOFTDCPaddles[1].size() ; k++){
419 Paddle[cnt] = TOFTDCPaddles[1][k].paddle;
420 MeanTime[cnt] = TOFTDCPaddles[1][k].mt;
421 TimeDiff[cnt] = TOFTDCPaddles[1][k].td;
430 NhitsA = TOFADCPaddles[0].size() + TOFADCPaddles[1].size();
432 for (
unsigned int k = 0; k<TOFADCPaddles[0].size() ; k++){
434 PaddleA[cnt] = TOFADCPaddles[0][k].paddle;
435 MeanTimeA[cnt] = TOFADCPaddles[0][k].mt;
436 TimeDiffA[cnt] = TOFADCPaddles[0][k].td;
437 ADCL[cnt] = TOFADCPaddles[0][k].adcL;
438 ADCR[cnt] = TOFADCPaddles[0][k].adcR;
439 OFL[cnt] = TOFADCPaddles[0][k].OverFlowL;
440 OFR[cnt] = TOFADCPaddles[0][k].OverFlowR;
441 PEAKL[cnt] = TOFADCPaddles[0][k].PeakL;
442 PEAKR[cnt] = TOFADCPaddles[0][k].PeakR;
448 for (
unsigned int k = 0; k<TOFADCPaddles[1].size() ; k++){
450 PaddleA[cnt] = TOFADCPaddles[1][k].paddle;
451 MeanTimeA[cnt] = TOFADCPaddles[1][k].mt;
452 TimeDiffA[cnt] = TOFADCPaddles[1][k].td;
453 ADCL[cnt] = TOFADCPaddles[1][k].adcL;
454 ADCR[cnt] = TOFADCPaddles[1][k].adcR;
455 OFL[cnt] = TOFADCPaddles[1][k].OverFlowL;
456 OFR[cnt] = TOFADCPaddles[1][k].OverFlowR;
457 PEAKL[cnt] = TOFADCPaddles[1][k].PeakL;
458 PEAKR[cnt] = TOFADCPaddles[1][k].PeakR;
467 NsinglesA = TOFADCSingles[0].size() + TOFADCSingles[1].size();
468 NsinglesT = TOFTDCSingles[0].size() + TOFTDCSingles[1].size();
471 for (
unsigned int k = 0; k<TOFADCSingles[0].size(); k++){
473 PaddleSA[k] = TOFADCSingles[0][k].paddle ;
474 LRA[k] = TOFADCSingles[0][k].LR ;
475 ADCS[k] = TOFADCSingles[0][k].adc;
476 TADCS[k] = TOFADCSingles[0][k].time;
477 OF[k] = TOFADCSingles[0][k].OverFlow;
478 PEAK[k] = TOFADCSingles[0][k].Peak;
482 for (
unsigned int k = 0; k<TOFADCSingles[1].size(); k++){
484 PaddleSA[k+j] = TOFADCSingles[1][k].paddle ;
485 LRA[k+j] = TOFADCSingles[1][k].LR ;
486 ADCS[k+j] = TOFADCSingles[1][k].adc;
487 TADCS[k+j] = TOFADCSingles[1][k].time; ;
488 OF[k+j] = TOFADCSingles[1][k].OverFlow;
489 PEAK[k+j] = TOFADCSingles[1][k].Peak;
492 for (
unsigned int k = 0; k<TOFTDCSingles[0].size(); k++){
494 PaddleST[k] = TOFTDCSingles[0][k].paddle ;
495 LRT[k] = TOFTDCSingles[0][k].LR ;
496 TDCST[k] = TOFTDCSingles[0][k].time;
499 for (
unsigned int k = 0; k<TOFTDCSingles[1].size(); k++){
501 PaddleST[k+j] = TOFTDCSingles[1][k].paddle ;
502 LRT[k+j] = TOFTDCSingles[1][k].LR ;
503 TDCST[k+j] = TOFTDCSingles[1][k].time; ;
506 if (((AllHits[0]>0) && (AllHits[1]>0)) ||
507 ((AllHits[2]>0) && (AllHits[3]>0))){
511 japp->RootFillUnLock(
this);
546 TDirectory *top = gDirectory;
549 ROOTFile->cd(
"TOFcalib");
555 TOFPedestal->Write();
582 TDirectory *top = gDirectory;
585 sprintf(ROOTFileName,
"hd_root_tofcalib.root");
586 ROOTFile =
new TFile(ROOTFileName,
"recreate");
589 ROOTFile->mkdir(
"TOFcalib");
590 ROOTFile->cd(
"TOFcalib");
593 TOFTDCtime =
new TH2F(
"TOFTDCtime",
"TOF CAEN TDC times", 8000, 0., 4000., 176, 0., 176.);
594 TOFADCtime =
new TH2F(
"TOFADCtime",
"TOF ADC times", 800, 0., 400., 176, 0., 176.);
596 TOFEnergy =
new TH2F(
"TOFEnergy",
"TOF Energy Integral (no ped subraction)",
597 176, 0., 176., 100, 0., 20000.);
598 TOFPeak =
new TH2F(
"TOFPeak",
"TOF Peak Amplitude",176, 0., 176., 100, 0., 4100.);
599 TOFPedestal =
new TH2F(
"TOFPedestal",
"TOF Pedestal",176, 0., 176., 300, 0., 600.);
602 t3 =
new TTree(
"t3",
"TOF Hits");
603 t3->Branch(
"Event", &
Event,
"Event/I");
605 t3->Branch(
"Nhits", &Nhits,
"Nhits/I");
606 t3->Branch(
"TShift",&TShift,
"TShift/F");
607 t3->Branch(
"Plane",Plane,
"Plane[Nhits]/I");
608 t3->Branch(
"Paddle",Paddle,
"Paddle[Nhits]/I");
609 t3->Branch(
"MeanTime",MeanTime,
"MeanTime[Nhits]/F");
610 t3->Branch(
"TimeDiff",TimeDiff,
"TimeDiff[Nhits]/F");
612 t3->Branch(
"NhitsA", &NhitsA,
"NhitsA/I");
613 t3->Branch(
"PlaneA",PlaneA,
"PlaneA[NhitsA]/I");
614 t3->Branch(
"PaddleA",PaddleA,
"PaddleA[NhitsA]/I");
615 t3->Branch(
"MeanTimeA",MeanTimeA,
"MeanTimeA[NhitsA]/F");
616 t3->Branch(
"TimeDiffA",TimeDiffA,
"TimeDiffA[NhitsA]/F");
617 t3->Branch(
"ADCL",ADCL,
"ADCL[NhitsA]/F");
618 t3->Branch(
"ADCR",ADCR,
"ADCR[NhitsA]/F");
619 t3->Branch(
"OFL",OFL,
"OFL[NhitsA]/I");
620 t3->Branch(
"OFR",OFR,
"OFR[NhitsA]/I");
621 t3->Branch(
"PEAKL",PEAKL,
"PEAKL[NhitsA]/F");
622 t3->Branch(
"PEAKR",PEAKR,
"PEAKR[NhitsA]/F");
624 t3->Branch(
"NsinglesA", &NsinglesA,
"NsinglesA/I");
625 t3->Branch(
"PlaneSA",PlaneSA,
"PlaneSA[NsinglesA]/I");
626 t3->Branch(
"PaddleSA",PaddleSA,
"PaddleSA[NsinglesA]/I");
627 t3->Branch(
"LRA",LRA,
"LRA[NsinglesA]/I");
628 t3->Branch(
"ADCS",ADCS,
"ADCS[NsinglesA]/F");
629 t3->Branch(
"OF",OF,
"OF[NsinglesA]/I");
630 t3->Branch(
"TADCS",TADCS,
"TADCS[NsinglesA]/F");
631 t3->Branch(
"PEAK",PEAK,
"PEAK[NsinglesA]/F");
633 t3->Branch(
"NsinglesT", &NsinglesT,
"NsinglesT/I");
634 t3->Branch(
"PlaneST",PlaneST,
"PlaneSA[NsinglesT]/I");
635 t3->Branch(
"PaddleST",PaddleST,
"PaddleSA[NsinglesT]/I");
636 t3->Branch(
"LRT",LRT,
"LRT[NsinglesT]/I");
637 t3->Branch(
"TDCST",TDCST,
"TDCST[NsinglesT]/F");
~JEventProcessor_TOF_calib()
uint32_t pedestal
pedestal info used by FPGA (if any)
sprintf(text,"Post KinFit Cut")
uint32_t nsamples_integral
number of samples used in integral
JEventProcessor_TOF_calib()
jerror_t MakeHistograms(void)
jerror_t WriteRootFile(void)
jerror_t evnt(jana::JEventLoop *eventLoop, uint64_t eventnumber)
uint32_t nsamples_pedestal
number of samples used in pedestal
int end
left/right 0/1 or North/South 0/1
jerror_t brun(jana::JEventLoop *eventLoop, int32_t runnumber)
uint32_t pulse_time
identified pulse time as returned by FPGA algorithm
uint32_t pulse_peak
maximum sample in pulse
int plane
plane (0: vertical, 1: horizontal)
uint32_t pulse_integral
identified pulse integral as returned by FPGA algorithm