Signal2Noise_module.cc
Go to the documentation of this file.
1 ////////////////////////////////////////////////////////////////////////
2 // Class: Signal2Noise
3 // Plugin Type: analyzer (art v3_05_00)
4 // File: Signal2Noise_module.cc
5 //
6 // Generated at Mon May 4 10:06:28 2020 by Wanwei Wu using cetskelgen
7 // from cetlib version v3_10_00.
8 ////////////////////////////////////////////////////////////////////////
9 
17 #include "fhiclcpp/ParameterSet.h"
19 
21 #include "art_root_io/TFileService.h"
22 #include "art_root_io/TFileDirectory.h"
23 #include "canvas/Persistency/Common/FindManyP.h"
25 
35 #include "lardataobj/RawData/raw.h"
60 
61 #include "TFile.h"
62 #include "TTree.h"
63 #include "TDirectory.h"
64 #include "TH1.h"
65 #include "TH2.h"
66 #include "TF1.h"
67 #include "TProfile.h"
68 #include "TROOT.h"
69 #include "TStyle.h"
70 #include "TMath.h"
71 #include "TGraphErrors.h"
72 #include "TMinuit.h"
73 #include "TString.h"
74 #include "TTimeStamp.h"
75 
76 using namespace std;
77 
78 
79 const int kMaxTracks = 1000;
80 const int kMaxHits = 2000;
81 
82 class Signal2Noise;
83 
84 
85 class Signal2Noise : public art::EDAnalyzer {
86 public:
87  explicit Signal2Noise(fhicl::ParameterSet const& p);
88  // The compiler-generated destructor is fine for non-base
89  // classes without bare pointers or other resource use.
90 
91  // Plugins should not be copied or assigned.
92  Signal2Noise(Signal2Noise const&) = delete;
93  Signal2Noise(Signal2Noise&&) = delete;
94  Signal2Noise& operator=(Signal2Noise const&) = delete;
95  Signal2Noise& operator=(Signal2Noise&&) = delete;
96 
97  // Required functions.
98  void analyze(art::Event const& e) override;
99 
100  void beginJob() override;
101 
102 private:
103 
104  // Declare member data here.
113  std::vector<int> fSelectedWires;
114 
115  // reset
116  void reset();
117 
118  // TTree
119  TTree *fEventTree;
120 
121  // event information
122  int event;
123  int run;
124  int subrun;
125  double evttime;
128 
129  // track
130  int ntrks;
131  int trkid[kMaxTracks];
132  float trkstart[kMaxTracks][3];
133  float trkend[kMaxTracks][3];
134  float trklen[kMaxTracks];
135  float trkthetaxz[kMaxTracks];
136  float trkthetayz[kMaxTracks];
137  float trkstartcosxyz[kMaxTracks][3];
138  float trkendcosxyz[kMaxTracks][3];
139 
140  // lifetime
141  int ntrkhits[kMaxTracks][3];
142  float trkdqdx[kMaxTracks][3][kMaxHits];
143  //float trkdedx[kMaxTracks][3][kMaxHits];
144  float trkx[kMaxTracks][3][kMaxHits];
145  float trkt[kMaxTracks][3][kMaxHits];
146 
147  // hit
148  double trkhitx[kMaxHits][3][kMaxHits];
149  double trkhity[kMaxHits][3][kMaxHits];
150  double trkhitz[kMaxHits][3][kMaxHits];
151 
152  int wireid[kMaxTracks][kMaxHits];
153  int chid[kMaxTracks][kMaxHits];
154  int tpcid[kMaxTracks][kMaxHits];
155  float hit_plane[kMaxTracks][kMaxHits];
156 
157  double cosgma[kMaxTracks][kMaxHits];
158 
159  float amp[kMaxTracks][kMaxHits];
160  int tamp[kMaxTracks][kMaxHits];
161  float ped[kMaxTracks][kMaxHits];
162 
163  float noiserms[kMaxTracks][kMaxHits]; // calculate directly
164  float noisermsfit[kMaxTracks][kMaxHits]; // rms from gaus fit
165 
166  // waveform
167  int fNticks;
169  float fSampleRate;
170  TH1F* fWaveForm[10];
171  float fMaxNoise = 40.; // set an upper limit for noise ADC
172  TH1F* fWaveFormHist[10];
173 };
174 
175 
177  : EDAnalyzer{p} // ,
178  // More initializers here.
179 {
180  // Call appropriate consumes<>() for any products to be retrieved by this module.
181  fRawDigitLabel = p.get<std::string>("RawDigitLabel");
182  fRawInstanceLabel = p.get<std::string>("RawInstanceLabel", "daq");
183  fWireProducerLabel = p.get<std::string>("WireProducerLabel");
184  fWireInstanceLabel = p.get<std::string>("WireInstanceLabel", "dataprep");
185  fHitModuleLabel = p.get<std::string>("HitModuleLabel");
186  fTrackModuleLabel = p.get<std::string>("TrackModuleLabel");
187  fCalorimetryModuleLabel = p.get<std::string>("CalorimetryModuleLabel");
188  fSaveWaveForm = p.get<bool>("SaveWaveForm");
189  fSelectedWires = p.get<std::vector<int>>("SelectedWires");
190 
191  if (fRawDigitLabel.empty() && fWireProducerLabel.empty()) {
192  throw cet::exception("AdcThresholdRoiFinder") << "Both RawDigitLabel and WireProducerLabel are empty";
193  }
194 
195  if ((!fRawDigitLabel.empty()) && (!fWireProducerLabel.empty())){
196  throw cet::exception("AdcThresholdRoiFinder") << "Only one of RawDigitLabel and WireProducerLabel should be set";
197  }
198 
199  // DetectorPropertiesService
200  auto const clockData = art::ServiceHandle<detinfo::DetectorClocksService>()->DataForJob();
201  auto const detProp = art::ServiceHandle<detinfo::DetectorPropertiesService>()->DataForJob(clockData);
202  fNticks = detProp.NumberTimeSamples(); // number of clock ticks per event
203  fNticksReadout = detProp.ReadOutWindowSize(); // number of clock ticks per readout window
204  fSampleRate = sampling_rate(clockData); // period of the TPC readout electronics clock
205  cout << "Numer of clock ticks per event: " << fNticks << endl;
206  cout << "Numer of clock ticks per readout window: " << fNticksReadout << endl;
207  cout << "Sampling rate: " << fSampleRate << endl;
208 }
209 
210 
212 {
213  // Implementation of required member function here.
214  reset();
215 
216  // event info
217  run = e.run();
218  subrun = e.subRun();
219  event = e.id().event();
220  art::Timestamp ts = e.time();
221  TTimeStamp tts(ts.timeHigh(), ts.timeLow());
222  evttime = tts.AsDouble();
223 
224  //cout << "tts " << tts << endl;
225  //cout << "evttime " << evttime << endl;
226 
227  UInt_t year=0;
228  UInt_t month=0;
229  UInt_t day=0;
230 
231  year_month_date=tts.GetDate(kTRUE,0,&year,&month,&day);
232 
233  UInt_t hour=0;
234  UInt_t min=0;
235  UInt_t sec=0;
236 
237  hour_min_sec=tts.GetTime(kTRUE,0,&hour,&min,&sec);
238 
239  // channel status
240  lariov::ChannelStatusProvider const& channelStatus
242 
243  // get RawDigit
244  std::vector< art::Ptr<raw::RawDigit> > rawdigitlist;
246  auto rawdigitListHandle = e.getHandle< std::vector<raw::RawDigit> >(itag1);
247  if (rawdigitListHandle) {
248  art::fill_ptr_vector(rawdigitlist, rawdigitListHandle);
249  }
250 
251  //cout << "rawdigitlist.size(): " << rawdigitlist.size() << endl;
252 
253  // get Wire
254  std::vector<art::Ptr<recob::Wire> > wirelist;
255  art::InputTag itag2(fWireProducerLabel, "dataprep");
256  auto wireListHandle = e.getHandle< std::vector<recob::Wire> >(itag2);
257  if (wireListHandle) {
258  art::fill_ptr_vector(wirelist, wireListHandle);
259  }
260 
261  //cout << "wirelist.size(): " << wirelist.size() << endl;
262 
263  // hit
264  std::vector< art::Ptr<recob::Hit> > hitlist;
265  auto hitListHandle = e.getHandle< std::vector<recob::Hit> >(fHitModuleLabel);
266  if (hitListHandle) {
267  art::fill_ptr_vector(hitlist, hitListHandle);
268  }
269 
270  // track
271  std::vector< art::Ptr<recob::Track> > tracklist;
272  auto trackListHandle = e.getHandle< std::vector<recob::Track> >(fTrackModuleLabel);
273  if (trackListHandle) {
274  art::fill_ptr_vector(tracklist, trackListHandle);
275  }
276 
278 
279  art::FindManyP<recob::Hit> fmtrkhit(trackListHandle, e, fTrackModuleLabel);
280  art::FindManyP<anab::Calorimetry> fmtrkcalo(trackListHandle, e, fCalorimetryModuleLabel);
281  //art::FindManyP<raw::RawDigit> fmhitrawdigit(hitListHandle, e, fHitModuleLabel);
282  //art::FindManyP<recob::Wire> fmhitwire(hitListHandle, e, fHitModuleLabel);
283  //art::FindManyP<raw::RawDigit> fmwirerawdigit(wireListHandle, e, "digitwire");
284  art::FindManyP<recob::Hit, recob::TrackHitMeta> fmhittrkmeta(trackListHandle, e, fTrackModuleLabel);
285 
286  auto const detProp = art::ServiceHandle<detinfo::DetectorPropertiesService>()->DataFor(e);
287 
288  // waveform: save several waveforms for check
289  int nwaveform = 0; // only save 10 waveforms
290  int nwaveform_plane_0 = 0; // only save 3 waveforms
291  int nwaveform_plane_1 = 0; // only save 3 waveforms
292  int nwaveform_plane_2 = 0; // only save 3 waveforms
293 
294  ntrks = 0;
295  for (const auto& trk : tracklist) {
296 
297  trkid[ntrks] = trk->ID();
298  trklen[ntrks] = trk->Length();
299 
300  // TVector3
301  auto start = trk->Vertex();
302  auto end = trk->End();
303  auto start_dir = trk->VertexDirection();
304  auto end_dir = trk->EndDirection();
305 
306  trkthetaxz[ntrks] = std::atan2(start_dir.X(), start_dir.Z());
307  trkthetayz[ntrks]= std::atan2(start_dir.Y(), start_dir.Z());
308 
309  trkstart[ntrks][0] = start.X();
310  trkstart[ntrks][1] = start.Y();
311  trkstart[ntrks][2] = start.Z();
312 
313  trkend[ntrks][0] = end.X();
314  trkend[ntrks][1] = end.Y();
315  trkend[ntrks][2] = end.Z();
316 
317  trkstartcosxyz[ntrks][0] = start_dir.X();
318  trkstartcosxyz[ntrks][1] = start_dir.Y();
319  trkstartcosxyz[ntrks][2] = start_dir.Z();
320 
321  trkendcosxyz[ntrks][0] = end_dir.X();
322  trkendcosxyz[ntrks][1] = end_dir.Y();
323  trkendcosxyz[ntrks][2] = end_dir.Z();
324 
325  // calometry
326  if (fmtrkcalo.isValid()) {
327  std::vector<art::Ptr<anab::Calorimetry>> calos = fmtrkcalo.at(ntrks);
328  for (size_t icalo=0; icalo<calos.size(); icalo++) {
329  if (!calos[icalo]) continue;
330  if (!calos[icalo]->PlaneID().isValid) continue;
331  int planenum = calos[icalo]->PlaneID().Plane;
332  if (planenum<0 || planenum>2) continue;
333 
334  const size_t NHits = calos[icalo] -> dEdx().size();
335  ntrkhits[ntrks][planenum] = NHits;
336 
337  double minx = 1e9;
338  for (size_t iHit=0; iHit<NHits; ++iHit) {
339  cout << "plane: "<< planenum << "; pitch: " << (calos[icalo]->TrkPitchVec())[iHit] << endl;
340  if ((calos[icalo]->TrkPitchVec())[iHit]>1) continue;
341  const auto& TrkPos = (calos[icalo] -> XYZ())[iHit];
342  if (TrkPos.X()<minx)
343  minx = TrkPos.X();
344  }// loop NHits
345 
346  for(size_t iHit = 0; iHit < NHits; ++iHit) {
347  if ((calos[icalo]->TrkPitchVec())[iHit]>1) continue;
348  const auto& TrkPos1 = (calos[icalo] -> XYZ())[iHit];
349  double x = TrkPos1.X()-minx; //subtract the minx to get correct t0
350  double XDriftVelocity = detProp.DriftVelocity()*1e-3; //cm/ns
351  double t = x/(XDriftVelocity*1000); //change the velocity units to cm/ns to cm/us
352  trkx[ntrks][planenum][iHit] = x;
353  trkt[ntrks][planenum][iHit] = t;
354  trkdqdx[ntrks][planenum][iHit] = (calos[icalo]->dQdx())[iHit];
355  } // loop over NHits iHit
356  } // end loop over icalo
357  } // end if fmtrkcalo
358 
359  // hits associated with trk
360  std::vector<art::Ptr<recob::Hit>> allhits = fmtrkhit.at(ntrks); // use either trk.key() or ntrks
361 
362  for (size_t ihit=0; ihit<allhits.size(); ihit++) {
363  // wire plane information
364  unsigned int wireplane = allhits[ihit]->WireID().Plane;
365  if (wireplane <0 || wireplane>2) continue;
366  unsigned int wire = allhits[ihit]->WireID().Wire;
367  unsigned int tpc = allhits[ihit]->WireID().TPC;
368  unsigned int channel = allhits[ihit]->Channel();
369 
370  if (channelStatus.IsBad(channel)) continue;
371 
372  // hit position: not all hits are associated with space points, using neighboring space points to interpolate
373  double xyz[3] = {-9999.0, -9999.0, -9999.0};
374  bool fBadhit = false;
375 
376  if (fmhittrkmeta.isValid()) {
377  auto vhit = fmhittrkmeta.at(ntrks);
378  auto vmeta = fmhittrkmeta.data(ntrks);
379 
380  for (size_t ii=0; ii<vhit.size(); ii++) {
381  if (vhit[ii].key() == allhits[ihit].key()) {
382 
383  // nb. LArPandoraTrackCreation_module.cc fills the max of a signed int in an unsigned int
384  // to indicate an invalid index
385 
386  if (vmeta[ii]->Index() >= (unsigned int) std::numeric_limits<int32_t>::max()) {
387  fBadhit = true;
388  continue;
389  }
390 
391  if (vmeta[ii]->Index() >= trk->NumberTrajectoryPoints()) {
392  throw cet::exception("Calorimetry_module.cc") << "Requested track trajectory index "<<vmeta[ii]->Index()<<" exceeds the total number of trajectory points "<<trk->NumberTrajectoryPoints()<<" for track index "<<ntrks<<". Something is wrong with the track reconstruction. Please contact tjyang@fnal.gov!!";
393  }
394 
395  if (!trk->HasValidPoint(vmeta[ii]->Index())) {
396  fBadhit = true;
397  continue;
398  }
399 
400  auto loc = trk->LocationAtPoint(vmeta[ii]->Index());
401  xyz[0] = loc.X();
402  xyz[1] = loc.Y();
403  xyz[2] = loc.Z();
404 
405  break;
406  } // if (vhit[ii].key() == allhits[ihit].key())
407 
408  } // end of for ii
409 
410  } // if fmhittrkmeta.isValid()
411 
412  if (fBadhit) continue;
413 
414  trkhitx[ntrks][wireplane][ihit] = xyz[0];
415  trkhity[ntrks][wireplane][ihit] = xyz[1];
416  trkhitz[ntrks][wireplane][ihit] = xyz[2];
417 
418  wireid[ntrks][ihit] = wire;
419  chid[ntrks][ihit] = channel;
420  tpcid[ntrks][ihit] = tpc;
421  hit_plane[ntrks][ihit] = wireplane;
422 
423  // calculate track angle w.r.t. wire
424  double angleToVert = geom->WireAngleToVertical(geom->View(allhits[ihit]->WireID()), allhits[ihit]->WireID().TPC, allhits[ihit]->WireID().Cryostat)-0.5*::util::pi<>();
425 
426  //cout << "tpc: " << tpc << "; plane: " << wireplane << "; wire: " << wire << "channel: " << channel << "; WireangleToVert: " << angleToVert << "; x: " << xyz[0] << endl;
427 
428  const auto& dir = trk->DirectionAtPoint(0);
429  // angleToVert: return the angle w.r.t y+ axis, anti-closewise
430  // dir: 3d track direction: u = (x,y,z);
431  // vector that perpendicular to wires in yz plane v = (0, sin(angleToVert), cos(angleToVert))
432  // cos gamma = u.Dot(v)/(u.mag()*v.mag()) here, u.mag()=v.mag()=1
433  double tmp_cosgamma = abs(sin(angleToVert)*dir.Y() + std::cos(angleToVert)*dir.Z());
434  cosgma[ntrks][ihit] = tmp_cosgamma;
435 
436  //cout << "track direction: " << trkstartcosxyz[ntrks][0] << ", " << trkstartcosxyz[ntrks][1] << ", " << trkstartcosxyz[ntrks][2] << endl;
437  //cout << "angleToVert: " << angleToVert << endl;
438  //cout << "dir: " << dir.X() << ", " << dir.Y() << ", " << dir.Z() << endl;
439 
440  /*
441  // check wire direction on each plane
442  cout << geom->Plane(wireplane).Wire(wire).ThetaZ(true) << endl;
443  double wirestart[3];
444  double wireend[3];
445  geom->Plane(wireplane).Wire(wire).GetStart(wirestart);
446  geom->Plane(wireplane).Wire(wire).GetEnd(wireend);
447  cout << "wirestart: (" << wirestart[0] << ", " << wirestart[1] << ", "<< wirestart[2] << ")" << endl;
448  cout << "wireend: (" << wireend[0] << ", " << wireend[1] << ", "<< wireend[2] << ")" << endl;
449  */
450 
451  int datasize = fNticks;
452 
453  std::vector<float> adcvec(datasize);
454 
455  // loop over wires
456  // use either rawdigitlist or wirelist (one is empty, the other is not) to find the associated ADCVec with same channel of the hit
457  if (!rawdigitlist.empty()) {
458  int key_rawdigit = -1;
459  for (size_t ird=0; ird<rawdigitlist.size(); ++ird) {
460  if (rawdigitlist[ird]->Channel() == channel) {
461  key_rawdigit = ird;
462  break;
463  }
464  }
465 
466  if (key_rawdigit == -1) continue; // in case of poor bad channel configuration
467  int datasize_tmp = rawdigitlist[key_rawdigit]->Samples();
468  if (datasize_tmp != datasize) continue; // in case of poor bad channel configuration
469 
470  // to use a compressed RawDigit, one has to create a new buffer, fill and use it
471  std::vector<short> rawadc(datasize); // create a buffer
472  raw::Uncompress(rawdigitlist[key_rawdigit]->ADCs(), rawadc, rawdigitlist[key_rawdigit]->Compression());
473 
474  // pedestal
475  ped[ntrks][ihit] = rawdigitlist[key_rawdigit]->GetPedestal(); // Pedestal level (ADC counts)
476 
477  for (size_t jj=0; jj<rawadc.size(); jj++) {
478  adcvec[jj] = rawadc[jj] - ped[ntrks][ihit];
479  }
480  } // if (!rawdigitlist.empty())
481  else if (!wirelist.empty()) {
482  int key_wire = -1;
483  for (size_t iw=0; iw<wirelist.size(); ++iw) {
484  if (wirelist[iw]->Channel() == channel) {
485  key_wire = iw;
486  break;
487  }
488  }
489 
490  if (key_wire == -1) continue;
491  const auto & signal = wirelist[key_wire]->Signal();
492  if (int(signal.size()) != datasize) continue;
493 
494  for (size_t jj=0; jj<signal.size(); jj++) {
495  adcvec[jj] = signal[jj];
496  }
497  } // if (!wirelist.empty())
498 
499  // ROI from the reconstructed hits
500  int t0 = allhits[ihit]->PeakTime() - 5*(allhits[ihit]->RMS());
501  if (t0<0) t0 = 0;
502  int t1 = allhits[ihit]->PeakTime() + 5*(allhits[ihit]->RMS());
503  if (t1>= datasize) t1 = datasize - 1;
504  //cout << "t0: " << t0 << " ; t1: " << t1 << endl;
505 
506  // maximum pulse height of waveform
507  float temp_max_pulseheight = -9999.;
508  //float temp_min_pulseheight = 9999.;
509  int temp_t_max_pulseheight = -1; // time in unit of ticks
510  for (int itime=t0; itime <=t1; itime++) {
511  if (adcvec[itime] > temp_max_pulseheight) {
512  temp_max_pulseheight = adcvec[itime];
513  temp_t_max_pulseheight = itime;
514  }
515 
516  //if (adcvec[itime] < temp_min_pulseheight) {
517  // temp_min_pulseheight = adcvec[itime];
518  //}
519  }
520  //if (temp_max_pulseheight < 0) {
521  // std::cout << "amp: " << temp_max_pulseheight << "; plane: " << wireplane << std::endl;
522  // cout << "amp min: " << temp_min_pulseheight << endl;
523  // cout << "t0: " << t0 << " ; t1: " << t1 << endl;
524  //}
525 
526  amp[ntrks][ihit] = temp_max_pulseheight;
527  tamp[ntrks][ihit] = temp_t_max_pulseheight;
528 
529  // noise rms calculation: ideally, this should be done for all wires, not only wires that have hits
530  // method 1: calculate rms directly
531  int start_ped = 0;
532  int end_ped = datasize-1;
533  float temp_sum = 0.;
534  int temp_number = 0;
535  for (int iped=start_ped; iped<=end_ped; iped++) {
536  if (iped > t0 && iped < t1) continue; // ideally we should use this to skip ROI region
537  if (abs(adcvec[iped]) > fMaxNoise) continue; // skip ROI with a threshold, protection for multiple hits on a wire
538  temp_sum += adcvec[iped]*adcvec[iped];
539  temp_number++;
540  }
541  noiserms[ntrks][ihit] = sqrt(temp_sum/temp_number);
542 
543  // method 2: fit noise histogram with a gaus
544  TH1F *h1_noise = new TH1F(TString::Format("noise_trk%d_hit%d",ntrks, (int)ihit), TString::Format("noise_trk%d_hit%d",ntrks, (int)ihit), (int)fMaxNoise, -fMaxNoise, fMaxNoise);
545 
546  // fill the readout datasize for each wire with hit: signal is included but would not affect the noise rms since signals are far way from the noise peak. One may also exclude signals by using ROI threshold cuts
547  for (int jj=0; jj<datasize; jj++) {
548  if (jj > t0 && jj < t1) continue; // ideally we should use this to skip ROI region
549  if (abs(adcvec[jj]) > fMaxNoise) continue; // skip ROI with a threshold, protection for multiple hits on a wire
550  h1_noise->Fill(adcvec[jj]);
551  }
552  TF1 *f1_noise = new TF1("f1_noise", "gaus" , -fMaxNoise, fMaxNoise);
553  double par[3];
554  h1_noise->Fit(f1_noise, "WWQ");
555  f1_noise->GetParameters(&par[0]);
556  noisermsfit[ntrks][ihit] = par[2]; // sigma from gaus fit
557 
558  if (fSaveWaveForm && nwaveform<10 && nwaveform_plane_0<4 && nwaveform_plane_1<4 && nwaveform_plane_2<5) {
559  if (wireplane==0) nwaveform_plane_0++;
560  if (wireplane==1) nwaveform_plane_1++;
561  if (wireplane==2) nwaveform_plane_2++;
562 
563  fWaveForm[nwaveform]->SetNameTitle(Form("plane_%d_AdcChannel_%d", wireplane, channel), Form("AdcChannel%d", channel));
564 
565  for (int jj=0; jj<datasize; jj++) {
566  fWaveForm[nwaveform]->SetBinContent(jj+1, adcvec[jj]);
567  }//fWaveForm
568 
569  fWaveFormHist[nwaveform]->SetNameTitle(Form("Noise_%d_AdcChannel_%d", wireplane, channel), Form("NhistChannel%d", channel));
570  for (int tt=1; tt<=h1_noise->GetNbinsX(); tt++){
571  fWaveFormHist[nwaveform]->SetBinContent(tt, h1_noise->GetBinContent(tt));
572  }//fWaveFormHist
573  nwaveform++;
574  }
575 
576  delete h1_noise;
577  delete f1_noise;
578 
579  } // end of for ihit
580 
581  ++ ntrks;
582  } // end of for trk
583  fEventTree->Fill();
584 }
585 
586 
589  fEventTree = tfs->make<TTree>("Event", "Event");
590  fEventTree->Branch("event", &event, "event/I");
591  fEventTree->Branch("run", &run, "run/I");
592  fEventTree->Branch("subrun", &subrun, "subrun/I");
593  fEventTree->Branch("evttime", &evttime, "evttime/D");
594  fEventTree->Branch("year_month_date", &year_month_date, "year_month_date/I");
595  fEventTree->Branch("hour_min_sec", &hour_min_sec, "hour_min_sec/I");
596 
597  // track
598  fEventTree->Branch("ntrks", &ntrks, "ntrks/I");
599  fEventTree->Branch("trkid", trkid, "trkid[ntrks]/I");
600  fEventTree->Branch("trkstart", trkstart, "trkstart[ntrks][3]/F");
601  fEventTree->Branch("trkend", trkend, "trkend[ntrks][3]/F");
602  fEventTree->Branch("trklen", trklen, "trklen[ntrks]/F");
603  fEventTree->Branch("trkthetaxz", trkthetaxz, "trkthetaxz[ntrks]/F");
604  fEventTree->Branch("trkthetayz", trkthetayz, "trkthetayz[ntrks]/F");
605  fEventTree->Branch("trkstartcosxyz", trkstartcosxyz, "trkstartcosxyz[ntrks][3]/F");
606  fEventTree->Branch("trkendcosxyz", trkendcosxyz, "trkendcosxyz[ntrks][3]/F");
607 
608  fEventTree->Branch("ntrkhits", ntrkhits, "ntrkhits[ntrks][3]/I");
609  fEventTree->Branch("trkdqdx", trkdqdx, "trkdqdx[ntrks][3][1000]/F");
610  //fEventTree->Branch("trkdedx", trkdedx, "trkdedx[ntrks][3][1000]/F");
611  fEventTree->Branch("trkx", trkx, "trkx[ntrks][3][1000]/F");
612  fEventTree->Branch("trkt", trkt, "trkt[ntrks][3][1000]/F");
613 
614 
615 
616  // hit
617  fEventTree->Branch("trkhitx", trkhitx, "trkhitx[ntrks][3][1000]/D");
618  fEventTree->Branch("trkhity", trkhity, "trkhity[ntrks][3][1000]/D");
619  fEventTree->Branch("trkhitz", trkhitz, "trkhitz[ntrks][3][1000]/D");
620 
621  fEventTree->Branch("wireid", wireid, "wireid[ntrks][1000]/I");
622  fEventTree->Branch("chid", wireid, "chid[ntrks][1000]/I");
623  fEventTree->Branch("tpcid", wireid, "tpcid[ntrks][1000]/I");
624 
625  fEventTree->Branch("hit_plane", hit_plane, "hit_plane[ntrks][1000]/F");
626  fEventTree->Branch("ped", ped, "ped[ntrks][1000]/F");
627  fEventTree->Branch("amp", amp, "amp[ntrks][1000]/F");
628  fEventTree->Branch("tamp", tamp, "tamp[ntrks][1000]/I");
629  fEventTree->Branch("cosgma", cosgma, "cosgma[ntrks][1000]/D");
630 
631  fEventTree->Branch("noiserms", noiserms, "noiserms[ntrks][1000]/F");
632  fEventTree->Branch("noisermsfit", noisermsfit, "noisermsfit[ntrks][1000]/F");
633 
634 
635  // waveform
636  if (fSaveWaveForm) {
637  for (int i=0; i<10; i++) {
638  fWaveForm[i] = tfs->make<TH1F>(Form("waveform_%d",i), "wire waveform", fNticksReadout, 0, fNticksReadout);
639  fWaveForm[i]->SetStats(0);
640  fWaveForm[i]->GetXaxis()->SetTitle("Time [ticks]");
641  fWaveForm[i]->GetYaxis()->SetTitle("ADC");
642  fWaveFormHist[i] = tfs->make<TH1F>(Form("Noise_%d",i), "noise", (int)fMaxNoise, -fMaxNoise, fMaxNoise);
643  }
644  }
645 }
646 
648  run = -99999;
649  subrun = -99999;
650  event = -99999;
651  evttime = -99999;
652  year_month_date = -99999;
653  hour_min_sec = -99999;
654 
655 
656  ntrks = -99999;
657  for (size_t i=0; i<kMaxTracks; ++i) {
658  trkid[i] = -1;
659  trklen[i] = -1.0;
660  trkthetaxz[i] = -9999.0;
661  trkthetayz[i] = -9999.0;
662  for (int j=0; j<3; j++) {
663  trkstart[i][j] = -9999.0;
664  trkend[i][j] = -9999.0;
665  trkstartcosxyz[i][j] = -9999.0;
666  trkendcosxyz[i][j] = -9999.0;
667 
668  ntrkhits[i][j] = -9999;
669 
670  for (int k=0; k<kMaxHits; k++) {
671  trkhitx[i][j][k] = -9999.0;
672  trkhity[i][j][k] = -9999.0;
673  trkhitz[i][j][k] = -9999.0;
674 
675  trkdqdx[i][j][k] = -9999.0;
676  //trkdedx[i][j][k] = -9999.0;
677  trkx[i][j][k] = -9999.0;
678  trkt[i][j][k] = -9999.0;
679  }
680  }
681 
682  for (int k=0; k<kMaxHits; k++) {
683  wireid[i][k] = -99;
684  chid[i][k] = -99;
685  tpcid[i][k] = -99;
686 
687  hit_plane[i][k] = -1;
688  ped[i][k] = -9999.0;
689  amp[i][k] = -9999.0;
690  tamp[i][k] = -1;
691 
692  noiserms[i][k] = -999.;
693  noisermsfit[i][k] = -999.;
694 
695  cosgma[i][k] = -99.;
696 
697  }
698 
699  }
700 
701 
702 }
703 
def analyze(root, level, gtrees, gbranches, doprint)
Definition: rootstat.py:69
virtual bool IsBad(raw::ChannelID_t channel) const =0
Returns whether the specified channel is bad in the current run.
end
while True: pbar.update(maxval-len(onlies[E][S])) #print iS, "/", len(onlies[E][S]) found = False for...
code to link reconstructed objects back to the MC truth information
float noisermsfit[kMaxTracks][kMaxHits]
int wireid[kMaxTracks][kMaxHits]
constexpr std::uint32_t timeLow() const
Definition: Timestamp.h:29
std::string fCalorimetryModuleLabel
int chid[kMaxTracks][kMaxHits]
Format
Definition: utils.h:7
int tamp[kMaxTracks][kMaxHits]
Handle< PROD > getHandle(SelectorBase const &) const
Definition: DataViewImpl.h:382
std::string string
Definition: nybbler.cc:12
constexpr std::uint32_t timeHigh() const
Definition: Timestamp.h:34
float trkdqdx[kMaxTracks][3][kMaxHits]
Class to keep data related to recob::Hit associated with recob::Track.
float trkthetaxz[kMaxTracks]
float ped[kMaxTracks][kMaxHits]
STL namespace.
float hit_plane[kMaxTracks][kMaxHits]
std::vector< int > fSelectedWires
uint8_t channel
Definition: CRTFragment.hh:201
string dir
unsigned int Index
int tpcid[kMaxTracks][kMaxHits]
Particle class.
void analyze(art::Event const &e) override
float noiserms[kMaxTracks][kMaxHits]
float trkend[kMaxTracks][3]
float trkx[kMaxTracks][3][kMaxHits]
object containing MC flux information
art framework interface to geometry description
float trkthetayz[kMaxTracks]
TH1F * fWaveFormHist[10]
double trkhitx[kMaxHits][3][kMaxHits]
std::string fTrackModuleLabel
float amp[kMaxTracks][kMaxHits]
Definition: type_traits.h:61
T abs(T value)
QTextStream & reset(QTextStream &s)
double dEdx(float dqdx, float Efield)
Definition: doAna.cpp:21
const double e
Timestamp time() const
#define DEFINE_ART_MODULE(klass)
Definition: ModuleMacros.h:67
IDparameter< geo::WireID > WireID
Member type of validated geo::WireID parameter.
void beginJob()
Definition: Breakpoints.cc:14
def key(type, name=None)
Definition: graph.py:13
double trkhity[kMaxHits][3][kMaxHits]
std::string fWireInstanceLabel
void beginJob() override
const int kMaxTracks
p
Definition: test.py:223
SubRunNumber_t subRun() const
Definition: DataViewImpl.cc:78
float trkstart[kMaxTracks][3]
Class providing information about the quality of channels.
RunNumber_t run() const
Definition: DataViewImpl.cc:71
static int max(int a, int b)
Signal2Noise(fhicl::ParameterSet const &p)
View_t View(geo::PlaneID const &pid) const
Returns the view (wire orientation) on the channels of specified TPC plane.
Definition of data types for geometry description.
std::string fRawInstanceLabel
float trkendcosxyz[kMaxTracks][3]
const int kMaxHits
Declaration of signal hit object.
std::string fHitModuleLabel
float trklen[kMaxTracks]
T min(sqlite3 *const db, std::string const &table_name, std::string const &column_name)
Definition: statistics.h:55
int ntrkhits[kMaxTracks][3]
std::string fRawDigitLabel
Provides recob::Track data product.
std::string fWireProducerLabel
Interface for experiment-specific channel quality info provider.
EventNumber_t event() const
Definition: EventID.h:116
Declaration of basic channel signal object.
detail::Node< FrameID, bool > PlaneID
Definition: CRTID.h:125
list x
Definition: train.py:276
double trkhitz[kMaxHits][3][kMaxHits]
void fill_ptr_vector(std::vector< Ptr< T >> &ptrs, H const &h)
Definition: Ptr.h:297
Interface for experiment-specific service for channel quality info.
void Uncompress(const std::vector< short > &adc, std::vector< short > &uncompressed, raw::Compress_t compress)
Uncompresses a raw data buffer.
Definition: raw.cxx:776
float trkstartcosxyz[kMaxTracks][3]
int trkid[kMaxTracks]
double sampling_rate(DetectorClocksData const &data)
Returns the period of the TPC readout electronics clock.
float trkt[kMaxTracks][3][kMaxHits]
double WireAngleToVertical(geo::View_t view, geo::TPCID const &tpcid) const
Returns the angle of the wires in the specified view from vertical.
EventID id() const
Definition: Event.cc:34
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
QTextStream & endl(QTextStream &s)
Event finding and building.
double cosgma[kMaxTracks][kMaxHits]