KaliVeda
Toolkit for HIC analysis
KVFAZIA.cpp
1 //Created by KVClassFactory on Tue Jan 27 11:37:39 2015
2 //Author: ,,,
3 
4 #include "KVFAZIA.h"
5 #include "KVGeoImport.h"
6 #include "KVFAZIADetector.h"
7 #include "KVGroup.h"
8 #include "KVDetectorEvent.h"
9 #include "KVTarget.h"
10 #include "KVDataSet.h"
11 #include "KVConfig.h"
12 #include "KVFAZIAIDSiPSA.h"
13 #include "KVFAZIAIDCsI.h"
14 #include "KVFAZIAIDSiCsI.h"
15 #include "KVFAZIAIDSiSi.h"
16 
17 #include "TGeoCompositeShape.h"
18 #include "TGeoEltu.h"
19 
20 #include <KVFAZIAIDSiSiCsI.h>
21 #include <KVReconstructedNucleus.h>
22 
23 #ifdef WITH_MFM
24 #include "MFMFaziaFrame.h"
25 #endif
26 
27 #ifdef WITH_PROTOBUF
28 #include "FzEventSet.pb.h"
29 #include "KVFzDataReader.h"
30 #endif
31 
33 
34 // BEGIN_HTML <!--
36 /* -->
37 <h2>KVFAZIA</h2>
38 <h4>Base class for description of the FAZIA set up</h4>
39 <!-- */
40 // --> END_HTML
42 KVFAZIA* gFazia;
43 
44 static Char_t const* const FzDataType_str[] = { "QH1", "I1", "QL1", "Q2", "I2", "Q3", "ADC", "UNK" };
45 static Char_t const* const FzDetector_str[] = { "SI1", "SI1", "SI1", "SI2", "SI2", "CSI" };
46 
47 
50 
51 KVFAZIA::KVFAZIA(const Char_t* title)
52  : KVMultiDetArray("FAZIA", title)
53 {
54  // Default constructor
56  gFazia = this;
57  fDetectorLabels = "";
58  fSignalTypes = "QL1,I1,QH1,Q2,I2,Q3";
61 
62  // values of trapezoidal filter rise time set in the fpgas to be linked with a database...
63  fQH1risetime = GetSetupParameter("QH1.FPGARiseTime");
64  fQ2risetime = GetSetupParameter("Q2.FPGARiseTime");
65  fQ3slowrisetime = GetSetupParameter("Q3.slow.FPGARiseTime");
66  fQ3fastrisetime = GetSetupParameter("Q3.fast.FPGARiseTime");
67 
68  Info("KVFAZIA", "fpga shapers: %lf %lf %lf %lf", fQH1risetime, fQ2risetime, fQ3slowrisetime, fQ3fastrisetime);
69 }
70 
71 
72 
74 
76 {
77 
78  Double_t lval = -1;
79  if (gDataSet) lval = gDataSet->GetDataSetEnv(parname, 0.0);
80  else lval = gEnv->GetValue(parname, 0.0);
81  return lval;
82 }
83 
84 
85 
88 
90 {
91  // Overrides base method in order to set the value of the trigger bit pattern for the event
93  if (l.HasIntParameter("FAZIA.TRIGPAT")) SetTriggerPattern(l.GetIntValue("FAZIA.TRIGPAT"));
94  else SetTriggerPattern(0);// FAZIA absent from event
95 }
96 
97 
98 
101 
103 {
104  // Override base method in order to read FAZIA trigger for each run
105 
108 }
109 
110 
111 
125 
127 {
128  // Returns the symbolic name for the principal DAQ trigger used for the current run
129  // e.g. 'Mult2', 'Mult1/100', etc. (see SetTriggerPatternsForDataSet()).
130  //
131  // This can be used to test if the actual DAQ trigger for an event was consistent
132  // with the principal trigger by doing:
133  //
134  //~~~~{.cpp}
135  // if( gFazia->GetTrigger().IsTrigger( gFazia->GetTriggerForCurrentRun() ) )
136  // {
137  // ===ok in this case trigger is consistent==
138  // }
139  //~~~~
140 
141  if (gExpDB) {
142  if (gExpDB->GetTable("FAZIA.Triggers")) {
143  auto rundb = gExpDB->GetDBRun(GetCurrentRunNumber());
144  if (rundb) {
145  auto links = rundb->GetLinks("FAZIA.Triggers");
146  if (links && links->GetEntries())
147  return links->First()->GetName();
148  }
149  }
150  }
151  return "";
152 }
153 
154 
155 
179 
181 {
182  // Set identification telescope objects for FAZIA geometry by hand.
183  //
184  // The actual telescope classes used depends on the value of the variable:
185  //
186  //~~~
187  //[dataset].FAZIA.IDTelescopes
188  //~~~
189  //
190  // which can be different for different datasets.
191  //
192  // The default value is
193  //~~~
194  //FAZIA.IDTelescopes: SI1-PSA SI1-SI2 SI2-CSI CSI-PSA
195  //~~~
196  //
197  // The possible values are:
198  // - CSI-PSA
199  // - SI2-CSI
200  // - SI1+SI2-CSI (name: ID_SI_CSI_xxxx)
201  // - SI2-PSA
202  // - SI1-SI2
203  // - SI1-PSA
204 
205 
206  auto id_tel_list = GetDataSetEnv<KVString>(fDataSet, "FAZIA.IDTelescopes");
207 
209  TIter next_traj(GetTrajectories());
210  KVGeoDNTrajectory* traj;
211  while ((traj = (KVGeoDNTrajectory*)next_traj())) { // loop over all trajectories
212 
213  traj->IterateBackFrom(); // from closest-in to furthest-out detector
214 
216  KVDetector* csi{nullptr}, *si2{nullptr}, *si1{nullptr};
217  while ((N = traj->GetNextNode())) {
218  auto d = N->GetDetector();
219  if (d->IsLabelled("SI1") && d->IsOK()) si1 = d;
220  else if (d->IsLabelled("SI2") && d->IsOK()) si2 = d;
221  else if (d->IsLabelled("CSI") && d->IsOK()) csi = d;
222  }
223 
224  auto add_telescope = [ = ](KVIDTelescope * idt, KVGroup * g) {
225  idt->SetGroup(g);
226  traj->AccessIDTelescopeList()->Add(idt);
227  fIDTelescopes->Add(idt);
228  };
229 
230  if (csi) {
231  // add CSI, SI2-CSI and/or SI1-SI2-CSI telescopes
232  if (id_tel_list.Contains("CSI-PSA")) {
233  auto idt = new KVFAZIAIDCsI;
234  idt->AddDetector(csi);
235  add_telescope(idt, csi->GetGroup());
236  }
237  if (si2) {
238  if (id_tel_list.Contains("SI2-CSI")) {
239  auto idt = new KVFAZIAIDSiCsI;
240  idt->AddDetector(si2);
241  idt->AddDetector(csi);
242  add_telescope(idt, csi->GetGroup());
243  }
244  if (si1) {
245  if (id_tel_list.Contains("SI1+SI2-CSI")) {
246  auto idt = new KVFAZIAIDSiSiCsI;
247  idt->AddDetector(si1);
248  idt->AddDetector(si2);
249  idt->AddDetector(csi);
250  idt->SetName(Form("ID_SI_CSI_%d", csi->GetIndex()));
251  add_telescope(idt, csi->GetGroup());
252  }
253  }
254  }
255  }
256  if (si2) {
257  if (id_tel_list.Contains("SI2-PSA")) {
258  auto idt = new KVFAZIAIDSiPSA;
259  idt->AddDetector(si2);
260  add_telescope(idt, si2->GetGroup());
261  }
262  }
263  if (si1 && si2) {
264  if (id_tel_list.Contains("SI1-SI2")) {
265  auto idt = new KVFAZIAIDSiSi;
266  idt->AddDetector(si1);
267  idt->AddDetector(si2);
268  add_telescope(idt, si2->GetGroup());
269  }
270  }
271  if (si1) {
272  if (id_tel_list.Contains("SI1-PSA")) {
273  auto idt = new KVFAZIAIDSiPSA;
274  idt->AddDetector(si1);
275  add_telescope(idt, si1->GetGroup());
276  }
277  }
278  }
279 }
280 
281 
282 
288 
290 {
291  // Check for weird trajectories: any misalignment of FAZIA telescopes w.r.t.
292  // theoretical geometry will lead to weird trajectories being generated
293  //
294  // We discard any trajectory with > 3 nodes
295 
296  TIter it(&fTrajectories);
297  KVGeoDNTrajectory* geo_dn_traj;
298  KVList rubbish;
299  while ((geo_dn_traj = (KVGeoDNTrajectory*)it())) {
300  if (geo_dn_traj->GetN() != 3) {
301  Warning("AssociateNodesAndTrajectories",
302  "Discarding garbage trajectory: %s", geo_dn_traj->GetPathString().Data());
303  rubbish.Add(geo_dn_traj);
304  }
305  else {
306  // check all detectors have same index
307  geo_dn_traj->IterateFrom();
308  KVGeoDetectorNode* gdn;
309  std::optional<int> index;
310  while ((gdn = geo_dn_traj->GetNextNode())) {
311  if (index) {
312  if (*index != gdn->GetDetector()->GetIndex()) {
313  Warning("AssociateNodesAndTrajectories",
314  "Discarding garbage trajectory: %s", geo_dn_traj->GetPathString().Data());
315  rubbish.Add(geo_dn_traj);
316  break;
317  }
318  }
319  else
320  index = gdn->GetDetector()->GetIndex();
321  }
322  }
323  }
324 
325  for (auto tr : rubbish) {
326  fTrajectories.Remove(tr);
327  }
329 }
330 
331 
332 
333 
336 
338 {
339  // Destructor
340 
341  if (gFazia == this) gFazia = nullptr;
342 }
343 
344 
345 
347 
349 {
350  if (fDetectorLabels == "") fDetectorLabels += label;
351  else if (!fDetectorLabels.Contains(label)) fDetectorLabels += Form(",%s", label);
352 }
353 
354 
355 
359 
361 {
362  // Look for the geometry object <-> detector name correspondance file in the dataset directory
363  // If not found, we create it
364 
365  fCorrespondanceFile = "";
366  if (gDataSet) fCorrespondanceFile = gDataSet->GetFullPathToDataSetFile(Form("%s.names", ClassName()));
367  if (fCorrespondanceFile != "") return;
368 
369 #ifdef WITH_GNU_INSTALL
371 #else
372  fCorrespondanceFile.Form("%s/%s.names", gDataSet->GetDataSetDir(), ClassName());
373 #endif
374  Info("GenerateCorrespondanceFile", "Creation de %s", fCorrespondanceFile.Data());
375  KVEnv env;
376 
377  fDetectorLabels = "SI1,SI2,CSI";
378 
379  SetNameOfDetectors(env);
380  if (env.GetTable() && env.GetTable()->GetEntries() > 0) {
381  env.AddCommentLine(Form("Automatic generated file by %s::GenerateCorrespondanceFile", ClassName()));
382  env.AddCommentLine("Make link between geometric ROOT objects and detector names");
384  }
385  fDetectorLabels = "";
386 }
387 
388 
389 
397 
399 {
400  //define the format of detectors name
401  // label-index
402  // where index = block*100+quartet*10+telescope
403  // example :
404  // SI1-123 is the Silicon 1 of the block 1, the quartet 2 and the telescope 3
405  //
406 
407  for (Int_t bb = fStartingBlockNumber; bb < fNblocks; bb += 1) {
408  for (Int_t qq = 1; qq <= 4; qq += 1) {
409  for (Int_t tt = 1; tt <= 4; tt += 1) {
410  fDetectorLabels.Begin(",");
411  while (!fDetectorLabels.End()) {
412  KVString sdet = fDetectorLabels.Next();
413  env.SetValue(
414  Form("BLOCK_%d_QUARTET_%d_%s-T%d", bb, qq, sdet.Data(), tt),
415  Form("%s-%d", sdet.Data(), bb * 100 + qq * 10 + tt)
416  );
417  }
418  }
419  }
420  }
421 }
422 
423 
424 
428 
430 {
431  // Finalise description of array performing all operations which require ROOT
432  // geometry to be closed
433 
436  imp.SetDetectorPlugin(GetDataSetEnv<TString>(GetDataSet(), "FAZIADetectorPlugin", "FAZIADetector"));
438  // any additional structure name formatting definitions
440  imp.AddAcceptedDetectorName("SI1-");
441  imp.AddAcceptedDetectorName("SI2-");
442  imp.AddAcceptedDetectorName("CSI-");
443 
444  // the following parameters are optimized for a 12-block compact
445  // geometry placed at 80cm with rings 1-5 of INDRA removed.
446  // make sure that the expected number of detectors get imported!
448 
450 
452  SetBit(kIsBuilt);
453 }
454 
455 
456 
459 
461 {
462  //Called by the Build method
463  AbstractMethod("GetGeometryParameters");
464 }
465 
466 
467 
487 
489 {
490  // Read and set up definitions of trigger patterns for this dataset.
491  // These should be given by variables such as:
492  //
493  //~~~~
494  // +[dataset].FAZIA.TriggerPatterns: [name1]
495  // [dataset].FAZIA.TriggerPattern.[name1]: [value1]
496  // +[dataset].FAZIA.TriggerPatterns: [name2]
497  // [dataset].FAZIA.TriggerPattern.[name2]: [value2]
498  //~~~~
499  //
500  // where [name*]='Mult1','Mult1/100','Mult2', etc. (see KVFAZIATrigger for known trigger patterns).
501  //
502  // and [value*] is the value of the corresponding bit pattern, e.g. if bit '3' (0b100) corresponds to
503  // 'Mult2' (i.e. multiplicity >= 2) then this would give
504  //
505  //~~~~
506  // [dataset].FAZIA.TriggerPattern.Mult2: 4
507  //~~~~
508 
509  auto patterns = GetDataSetEnv<KVString>(dataset, "FAZIA.TriggerPatterns");
510  if (patterns.Length()) {
511  patterns.Begin(" ");
512  while (!patterns.End()) {
513  auto pattern = patterns.Next(kTRUE);
514  uint16_t val = (uint16_t)GetDataSetEnv(dataset, Form("FAZIA.TriggerPattern.%s", pattern.Data()), 0.);
515  fTrigger.AddTriggerPattern(pattern, val);
516  }
517  }
518 }
519 
520 
521 
524 
526 {
527  //Called by the Build method
528  Info("BuildFAZIA", "to be defined in child class ...");
529 
530 }
531 
532 
533 
535 
537 {
538 
539  KVMaterial target_holder_mat("Al");
540  new TGeoBBox("TARGET_FRAME", 3., 3., 0.1 / 2.);
541  new TGeoEltu("TARGET_HOLE", 2., 2., 0.1 / 2.);
542  TGeoCompositeShape* cs = new TGeoCompositeShape("TARGET_FRAME", "TARGET_FRAME - TARGET_HOLE");
543  TGeoVolume* target_frame = new TGeoVolume("TARGET_FRAME", cs, target_holder_mat.GetGeoMedium());
544  gGeoManager->GetTopVolume()->AddNode(target_frame, 1);
545 
546  KVTarget* T = GetTarget();
547  if (T) {
548  KVMaterial* targMat = (KVMaterial*)T->GetLayers()->First();
549  TGeoVolume* target = gGeoManager->MakeEltu("TARGET", targMat->GetGeoMedium(), 2., 2., targMat->GetThickness() / 2.);
551  }
552 }
553 
554 
555 
558 
560 {
561  // Build the FAZIA array
564 
566 
567  BuildFAZIA();
568 
569  if (fBuildTarget)
570  BuildTarget();
571 
572  if (fCloseGeometryNow) {
575  }
576 
578 }
579 
580 
581 
593 
595 {
596  // First step in event reconstruction based on current status of detectors in array.
597  //
598  // Fills the given KVDetectorEvent with the list of all groups which have fired.
599  // i.e. loop over all groups of the array and test whether KVGroup::Fired() returns true or false.
600  //
601  // This can be made more efficient if the detectors which were hit in the event are already known:
602  // then their list should be given to argument dets
603  //
604  // If the list of fired detectors dets is not given, we use the internal fFiredDetectors list
605  // which is filled with all hit detectors when raw data is treated in treat_event()
606 
607  if (!IsSimMode() && !fHandledRawData) {
608  //Info("GetDetectorEvent","i didnt handle any data...");
609  return;
610  }
611  if (!dets || !dets->GetEntries()) {
612  if (fFiredDetectors.GetEntries()) {
613  dets = &fFiredDetectors;
614  //Info("GetDetectorEvent", "using internal list");
615  }
616  }
617  if (dets && dets->GetEntries()) {
618  TIter next_det(dets);
619 
620  KVDetector* det = 0;
621  while ((det = (KVDetector*)next_det())) {
622 
623  if (det->GetGroup()->Fired()) detev->AddGroup(det->GetGroup());
624 
625  }
626  }
627  else {
628  //Info("GetDetectorEvent", "Calling base method");
630  }
631 }
632 
633 
634 
639 
641 {
642  // Protected method, called when required to fill fDetList with pointers to
643  // the detectors whose names are stored in fDetNames.
644  // Also set all raw data values in the detectors.
645 
646  KVFAZIADetector* det = 0;
647 
648  DetList->Clear();
649  DetNames.Begin("/");
650  while (!DetNames.End()) {
651  KVString sdet = DetNames.Next(kTRUE);
652  det = (KVFAZIADetector*)GetDetector(sdet.Data());
653  if (!det) {
655  }
656 
657  if (det) {
658  DetList->Add(det);
659  // read and set from the particle's parameter list any relevant detector signal values
660  // each signal is stored with a name "[detname].[signal name]"
661  // except GTTag and DetTag which have the same value for all detectors of the same telescope
662  // and so are only stored once with name "DetTag" or "GTTag".
663 
664  TIter it(&det->GetListOfDetectorSignals());
665  KVDetectorSignal* ds;
666  while ((ds = (KVDetectorSignal*)it())) {
667  if (ds->IsRaw() && !ds->IsExpression())
668  // only look for raw data, excluding any expressions based only on raw data
669  {
670  TString pname = Form("%s.%s", det->GetName(), ds->GetName());
671  if (rnuc->GetParameters()->HasParameter(pname))
672  ds->SetValue(rnuc->GetParameters()->GetDoubleValue(pname));
673  }
674  }
675  if (rnuc->GetParameters()->HasParameter("GTTag"))
676  det->SetGTTag(rnuc->GetParameters()->GetIntValue("GTTag"));
677  if (rnuc->GetParameters()->HasParameter("DetTag"))
678  det->SetDetTag(rnuc->GetParameters()->GetIntValue("DetTag"));
679  }
680  }
681 }
682 
683 
684 
687 
689 {
690  // Specialized group reconstructor for FAZIA
691  KVGroupReconstructor* gr(nullptr);
692  if (GetGroup(g->GetName())) { // make sure group belongs to us
693  if (IsSimMode())
694  gr = KVGroupReconstructor::Factory("FAZIA.Filter", g);
695  else
696  gr = KVGroupReconstructor::Factory("FAZIA", g);
697  }
698  return gr;
699 }
700 
701 
702 
704 
706 {
707 
708  TString sname;
709  if (bb == 4) {
710  if (fDataSet == "FAZIASYM") {
711  sname.Form("%s-RUTH", FzDataType_str[idsig]);
712  }
713  else {
714  sname.Form("%s-%d", FzDataType_str[idsig], 100 * bb + 10 * qq + tt);
715  }
716  }
717  else if (bb == 6) {
718  if (fDataSet == "FAZIAPRE") {
719  sname.Form("%s-RUTH", FzDataType_str[idsig]);
720  }
721  else {
722  sname.Form("%s-%d", FzDataType_str[idsig], 100 * bb + 10 * qq + tt);
723  }
724  }
725  else {
726  sname.Form("%s-%d", FzDataType_str[idsig], 100 * bb + 10 * qq + tt);
727  }
728  return sname;
729 
730 }
731 
732 
733 #ifdef WITH_PROTOBUF
734 
736 
738 {
739  return treat_event(((KVFzDataReader&)R).get_fazia_event());
740 }
741 
742 
743 
745 
747 {
748  Int_t value = (val << 2);
749  value >>= 2;
750  Double_t dval = -1.;
751  switch (sigid) {
752  case DAQ::FzData_FzDataType_QH1:
753  if (eid == 0) dval = value / (fQH1risetime * 1e3 / 10.);
754  break;
755  case DAQ::FzData_FzDataType_I1:
756  break;
757  case DAQ::FzData_FzDataType_QL1:
758  break;
759  case DAQ::FzData_FzDataType_Q2:
760  if (eid == 0) dval = value / (fQ2risetime * 1e3 / 10.);
761  break;
762  case DAQ::FzData_FzDataType_I2:
763  break;
764  case DAQ::FzData_FzDataType_Q3:
765  if (eid == 0) dval = value / (fQ3slowrisetime * 1e3 / 10.);
766  if (eid == 1) dval = value / (fQ3fastrisetime * 1e3 / 10.);
767  break;
768  }
769  return dval;
770 }
771 
772 
773 
776 
777 Bool_t KVFAZIA::treat_event(const DAQ::FzEvent& e)
778 {
779  // Read raw data for an event
780 
781  Bool_t good = kTRUE;
782 
783  //get info from trigger
784  int ts = e.trinfo_size();
785  double dt = 0;
786  uint64_t tot = 0;
787  for (Int_t tr = ts - 1; tr >= 0; tr--) {
788  const DAQ::FzTrigInfo& rdtrinfo = e.trinfo(tr);
789  uint64_t triggervalue = rdtrinfo.value();
790  if (tr == ts - 5) {
791  fReconParameters.SetValue("FAZIA.TRIGPAT", (int)triggervalue);
792  SetTriggerPattern((uint16_t)triggervalue);
793  }
794  else if (tr == ts - 6) fReconParameters.SetValue64bit("FAZIA.EC", ((triggervalue << 12) + e.ec()));
795  else if (tr == ts - 8) {
796  dt = triggervalue / (1e6);
797  fReconParameters.SetValue("FAZIA.TRIGRATE.DT", dt);
798  double faziats = fReconParameters.GetValue64bit("FAZIA.TS") * 1.e-8;
799  if (oldfaziats > 0.) fReconParameters.SetValue("FAZIA.CENTRUM.DT", faziats - oldfaziats);
800  oldfaziats = faziats;
801  }
802  else if (tr == ts - 9) fReconParameters.SetValue("FAZIA.TRIGRATE.EXT", 1.*triggervalue / dt);
803  else if (tr == ts - 10) fReconParameters.SetValue("FAZIA.TRIGRATE.MAN", 1.*triggervalue / dt);
804  else if (tr == ts - 11) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
805  else if (tr == ts - 12) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
806  else if (tr == ts - 13) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
807  else if (tr == ts - 14) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
808  else if (tr == ts - 15) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
809  else if (tr == ts - 16) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
810  else if (tr == ts - 17) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
811  else if (tr == ts - 18) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
812  else if (tr == ts - 19) {
813  fReconParameters.SetValue("FAZIA.TRIGRATE.TOT", 1.*triggervalue / dt);
814  tot = triggervalue;
815  }
816  else if (tr == ts - 20) {
817  fReconParameters.SetValue("FAZIA.TRIGRATE.VAL", 1.*triggervalue / dt);
818  fReconParameters.SetValue("FAZIA.DEADTIME", 100.*(1. - 1.*triggervalue / tot));
819  }
820  else {}
821  }
822 
823 // if (tot > 0) fReconParameters.ls();
824 
825  for (int b = 0; b < e.block_size(); ++b) {
826 
827  // check block errors
828  if (e.block(b).len_error() || e.block(b).crc_error() || (!good)) {
829  //Warning("treat_event", "BLOCK LEN OR CRC ERROR B%03d", e.block(b).blkid());
830  good = kFALSE;
831  break; //stop iteration on blocks
832  }
833  int fIdBlk = e.block(b).blkid();
834 
835  for (int f = 0; f < e.block(b).fee_size(); ++f) {
836 
837  const DAQ::FzFee& rdfee = e.block(b).fee(f);
838 
839  for (int h = 0; h < rdfee.hit_size(); ++h) {
840 
841  const DAQ::FzHit& rdhit = rdfee.hit(h);
842  // check fee errors
843  if (rdfee.len_error() || rdfee.crc_error() || (!good)) {
844  Warning("treat_event", "FEE LEN OR CRC ERROR B%03d-FE%d", e.block(b).blkid(), rdfee.feeid());
845  good = kFALSE;
846  break; //stop iteration on hits
847  }
848  int fIdFee = rdhit.feeid();
849  int fIdTel = rdhit.telid();
850 
851  for (Int_t mm = 0; mm < rdhit.data_size(); mm++) {
852  const DAQ::FzData& rdata = rdhit.data(mm);
853  int fIdSignal = rdata.type();
854 
855  int DetTag = rdhit.dettag();
856  int GTTag = rdhit.gttag();
857  if (DetTag >= 16384 && GTTag < 16384) GTTag += 32768;
858 
859  //on decompile le HIT
860  int fIdQuartet = fQuartet[fIdFee][fIdTel];
861  int fIdTelescope = fTelescope[fIdFee][fIdTel];
862 
863  KVFAZIADetector* det = (KVFAZIADetector*)GetDetector(Form("%s-%d", FzDetector_str[fIdSignal], 100 * fIdBlk + 10 * fIdQuartet + fIdTelescope));
864  if (!det) {
865  Error("treat_event", "No detector %s-%d found in FAZIA geometry...", FzDetector_str[fIdSignal], 100 * fIdBlk + 10 * fIdQuartet + fIdTelescope);
866  continue;
867  }
868  det->SetDetTag(DetTag);
869  det->SetGTTag(GTTag);
870 
871  if (!rdata.has_energy() && !rdata.has_waveform()) {
872  if (FzDataType_str[fIdSignal] != "I2") Warning("treat_event", "[NO DATA] [%s %s]", det->GetName(), FzDataType_str[fIdSignal]);
873  continue;
874  }
875 
876  if (rdata.has_energy()) {
877  const DAQ::Energy& ren = rdata.energy();
878  for (Int_t ee = 0; ee < ren.value_size(); ee++) {
879  Double_t energy = TreatEnergy(fIdSignal, ee, ren.value(ee));
880  auto esig = det->SetFPGAEnergy(fIdSignal, ee, energy);
881  if (esig)
882  fFiredSignals.Add(esig);
883  else
884  Warning("treat_event", "FPGAEnergy signal not found for %s", det->GetName());
885  }
886  fFiredDetectors.Add(det);
887  }
888  if (rdata.has_baseline()) {
889  Float_t bl = rdata.baseline();
890  auto bsig = det->SetBaseLine(fIdSignal, bl);
891  if (bsig)
892  fFiredSignals.Add(bsig);
893  else
894  Warning("treat_event", "BaseLine signal not found for %s", det->GetName());
895  }
896  if (rdata.has_waveform()) {
897  const DAQ::Waveform& rwf = rdata.waveform();
898  Int_t supp;
899 
900  if (fIdSignal <= 5) {
901  TString sname = GetSignalName(fIdBlk, fIdQuartet, fIdTelescope, fIdSignal);//QH1-123 etc.
902  if (sname == "")
903  Warning("treat_event", "signal name is empty !!! blk=%d qua=%d tel=%d\n", fIdBlk, fIdQuartet, fIdTelescope);
904 
905  TGraph sig(rwf.sample_size());
906 
907  for (Int_t nn = 0; nn < rwf.sample_size(); nn++) {
908  if (fIdSignal != DAQ::FzData::ADC) {
909  if (rwf.sample(nn) > 8191) {
910  supp = rwf.sample(nn) | 0xFFFFC000;
911  }
912  else {
913  supp = rwf.sample(nn);
914  }
915  }
916  else {
917  supp = rwf.sample(nn);
918  }
919  sig.SetPoint(nn, nn, supp);
920  }
921  det->SetSignal(&sig, sname);
922  }
923  else {
924  if (fIdSignal > 5)
925  Warning("treat_event", "datatype %d>5 - taille = %d\n", fIdSignal, rwf.sample_size());
926  }
927  }
928  }
929  }
930  }
931  }
932 
933 // cout << "good=" << good << endl;
934 // fFPGAParameters.ls();
935 // fSignals.ls();
936 
937  return good;
938 }
939 
940 #endif
941 
942 #ifdef WITH_MFM
943 
948 
950 {
951  // Treatment of raw data in MFM frames with type MFM_FAZIA_FRAME_TYPE
952  // The timestamp is extracted from the frame header and added to fReconParameters
953  // in a 64 bit parameter with name "FAZIA.TS"
954 
955  if (f.GetFrameType() != MFM_FAZIA_FRAME_TYPE) return kFALSE;
956  fReconParameters.SetValue64bit("FAZIA.TS", f.GetTimeStamp());
957 
958 #ifdef WITH_PROTOBUF
959  DAQ::FzEventSet fazia_set;
960  DAQ::FzEvent fazia_event;
961  // Parse protobuf data in MFM frame
962  if (fazia_set.ParseFromArray(f.GetPointUserData(), ((MFMFaziaFrame&)f).GetEventSize())) {
963  // Parsed an event set
964  if (fazia_set.ev_size() > 1) {
965  Warning("handle_raw_data_event_mfmframe",
966  "Got a FzEventSet from data: cannot handle multiple events at once!");
967  return kFALSE;
968  }
969  return treat_event(fazia_set.ev(0));
970  }
971  else if (fazia_event.ParseFromArray(f.GetPointUserData(), ((MFMFaziaFrame&)f).GetEventSize())) {
972  // Parsed an event
973  return treat_event(fazia_event);
974  }
975 #endif
976  return kTRUE;
977 }
978 
979 #endif
980 
981 
985 
987 {
988  // set up correspondence between FPGA number/FEE number (from acquisition)
989  // and Quartet/Telescope numbers
990 
991  TString DataFilePath;
992  if (!KVBase::SearchKVFile("ElecDetLink.env", DataFilePath, "data")) {
993  Error("CreateCorrespondence", "ElecDetLink.env not found");
994  return;
995  }
996  KVEnv DetLink;
997  DetLink.ReadFile(DataFilePath, kEnvUser);
998  for (int t = 1; t <= 4; t++) {
999  for (int q = 1; q <= 4; q++) {
1000  TString elec = DetLink.GetValue(Form("T%1d-Q%1d", t, q), " ");
1001  if (!elec.IsWhitespace()) {
1002  int fee, fpga;
1003  sscanf(elec.Data(), "FPGA%d-FE%d", &fpga, &fee);
1004  fQuartet[fee][fpga] = q;
1005  fTelescope[fee][fpga] = t;
1006  }
1007  else {
1008  Error("CreateCorrespondence", "Problem reading FAZIA ElecDetLink.env file : T%1d-Q%1d = %s", t, q, elec.Data());
1009  }
1010  }
1011  }
1012 }
1013 
1014 
1015 
1030 
1032 {
1033  // Read a file containing runlists for each principal trigger used during an experiment
1034  //
1035  // The file should be in TEnv format like so:
1036  //
1037  //~~~~
1038  // Mult1: 100-122,541-1938
1039  // Mult2: 91-765
1040  //~~~~
1041  //
1042  // where each trigger pattern name must be known and declared to occur during the dataset
1043  // (see SetTriggerPatternsForDataSet()) and the list of runs are given using KVNumberList syntax.
1044  //
1045  // The data is added to the database in a table 'FAZIA.Triggers'.
1046 
1047  TString fullpath;
1048  if (!db->FindCalibFile("Triggers", fullpath)) return;
1049 
1050  Info("ReadTriggerPatterns()", "Reading FAZIA triggers used during runs...");
1051  auto trigs = db->AddTable("FAZIA.Triggers", "Principal triggers used by FAZIA");
1052 
1053  KVDBRecord* dbrec = 0;
1054  TEnv env;
1055  TEnvRec* rec = 0;
1056  env.ReadFile(fullpath.Data(), kEnvAll);
1057  TIter it(env.GetTable());
1058 
1059  while ((rec = (TEnvRec*)it.Next())) {
1060  KVString srec(rec->GetName());
1061  KVNumberList nl(rec->GetValue());
1062  dbrec = new KVDBRecord(rec->GetName(), "FAZIA Trigger");
1063  dbrec->AddKey("Runs", "List of Runs");
1064  trigs->AddRecord(dbrec);
1065  db->LinkRecordToRunRange(dbrec, nl);
1066  }
1067 }
1068 
1069 
1070 
1073 
1075 {
1076  // Set the FAZIA-specific general identification code for the given telescope
1077 
1078  if (idt->InheritsFrom(KVFAZIAIDSiPSA::Class())) {
1079  if (idt->GetDetector(1)->IsLabelled("SI1")) idt->SetIDCode(IDCodes::ID_SI1_PSA);
1080  else idt->SetIDCode(IDCodes::ID_SI2_PSA);
1081  }
1082  else if (idt->InheritsFrom(KVFAZIAIDSiSi::Class())) idt->SetIDCode(IDCodes::ID_SI1_SI2);
1083  else if (idt->InheritsFrom(KVFAZIAIDSiCsI::Class())) idt->SetIDCode(IDCodes::ID_SI2_CSI);
1084  else if (idt->InheritsFrom(KVFAZIAIDSiSiCsI::Class())) {
1085  // ID code for these telescopes depends on what detectors the grid's VARY uses
1086  auto labsY = idt->GetDetectorLabelsForGridCoord("y");
1087  if (labsY.Contains("SI1") && labsY.Contains("SI2"))
1088  idt->SetIDCode(IDCodes::ID_SI12_CSI);
1089  else if (labsY.Contains("SI1"))
1090  idt->SetIDCode(IDCodes::ID_SI1_CSI);
1091  else if (labsY.Contains("SI2"))
1092  idt->SetIDCode(IDCodes::ID_SI2_CSI);
1093  }
1094  else if (idt->InheritsFrom(KVFAZIAIDCsI::Class())) idt->SetIDCode(IDCodes::ID_CSI_PSA);
1095  else {
1096  Error("SetIDCodeForIDTelescope", "Request for telescope name=%s of unknown class=%s",
1097  idt->GetName(), idt->IsA()->GetName());
1098  }
1099 }
1100 
1101 
int Int_t
unsigned int UInt_t
#define d(i)
#define f(i)
#define e(i)
bool Bool_t
char Char_t
float Float_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
R__EXTERN TEnv * gEnv
kEnvUser
kEnvAll
#define N
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t b
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t target
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t g
R__EXTERN TGeoManager * gGeoManager
float * q
char * Form(const char *fmt,...)
static const Char_t * WorkingDirectory()
Definition: KVBase.h:180
void Error(const char *method, const char *msgfmt,...) const override
Definition: KVBase.cpp:1709
Bool_t IsLabelled(const Char_t *l) const
Definition: KVBase.h:206
static ValType GetDataSetEnv(const KVString &dataset, const KVString &type, const ValType &defval={})
Definition: KVBase.h:305
static Bool_t SearchKVFile(const Char_t *name, TString &fullpath, const Char_t *kvsubdir="")
Definition: KVBase.cpp:541
void Warning(const char *method, const char *msgfmt,...) const override
Definition: KVBase.cpp:1696
Record folder for the database.
Definition: KVDBRecord.h:43
virtual Bool_t AddKey(KVDBKey *key, Bool_t check=kTRUE)
Definition: KVDBRecord.cpp:65
virtual KVRList * GetLinks(const Char_t *key) const
Returns the list of records linked to this record in table "key".
Definition: KVDBRecord.cpp:206
virtual KVDBTable * GetTable(const Char_t *table) const
Definition: KVDataBase.h:159
virtual Bool_t AddTable(KVDBTable *table)
Definition: KVDataBase.cpp:84
TString GetFullPathToDataSetFile(const Char_t *filename) const
Definition: KVDataSet.cpp:2067
const Char_t * GetDataSetDir() const
Definition: KVDataSet.cpp:762
ValType GetDataSetEnv(const Char_t *type, const ValType &defval={}) const
Definition: KVDataSet.h:269
List of hit groups in a multidetector array.
void AddGroup(KVGroup *grp)
Base class for output signal data produced by a detector.
virtual Bool_t IsExpression() const
virtual void SetValue(Double_t x)
virtual Bool_t IsRaw() const
Base class for detector geometry description, interface to energy-loss calculations.
Definition: KVDetector.h:160
KVGroup * GetGroup() const
virtual Int_t GetIndex() const
Definition: KVDetector.h:809
const KVSeqCollection & GetListOfDetectorSignals() const
Definition: KVDetector.h:784
Extension of TEnv to allow the writing of comments in the file.
Definition: KVEnv.h:18
void AddCommentLine(const Char_t *line)
Definition: KVEnv.cpp:70
Int_t WriteFile(const char *fname, EEnvLevel level=kEnvAll) override
Definition: KVEnv.cpp:140
Base class to describe database of an experiment ,,.
Definition: KVExpDB.h:61
KVDBRun * GetDBRun(Int_t number) const
Definition: KVExpDB.h:144
virtual void LinkRecordToRunRange(KVDBRecord *rec, UInt_t first_run, UInt_t last_run)
Definition: KVExpDB.cpp:290
Bool_t FindCalibFile(const Char_t *type, TString &fullpath, const TString &array_name="") const
Definition: KVExpDB.cpp:672
Base class for FAZIA detectors.
void SetSignal(TGraph *signal, const Char_t *signal_name)
KVDetectorSignal * SetFPGAEnergy(int sigid, Int_t idx, Double_t energy)
void SetGTTag(Int_t t)
void SetDetTag(Int_t t)
KVDetectorSignal * SetBaseLine(int sigid, Float_t baseline)
static const Char_t * GetNewName(KVString oldname)
Telescope for FAZIA identification using SI1 and/or SI2 with CSI.
void AddTriggerPattern(const TString &name, uint16_t value)
Description of a FAZIA detector geometry.
Definition: KVFAZIA.h:33
Double_t fImport_Xorg
for geometry import
Definition: KVFAZIA.h:50
void PerformClosedROOTGeometryOperations() override
Definition: KVFAZIA.cpp:429
Double_t fImport_ThetaMin
for geometry import
Definition: KVFAZIA.h:46
Double_t fQ2risetime
Definition: KVFAZIA.h:58
Double_t fQH1risetime
values of trapezoidal filter rise time set in the fpgas defined in .kvrootrc
Definition: KVFAZIA.h:57
Double_t TreatEnergy(Int_t sigid, Int_t eid, UInt_t val)
Definition: KVFAZIA.cpp:746
Double_t fQ3slowrisetime
Definition: KVFAZIA.h:59
void SetTriggerPatternsForDataSet(const TString &dataset)
Definition: KVFAZIA.cpp:488
void SetGeometryImportParameters(Double_t dt=0.25, Double_t dp=1.0, Double_t tmin=2., Double_t pmin=0, Double_t tmax=20., Double_t pmax=360., Double_t xorg=0, Double_t yorg=0, Double_t zorg=0)
Definition: KVFAZIA.h:243
int fQuartet[8][2]
quartet number from #FEE and #FPGA
Definition: KVFAZIA.h:53
Double_t GetSetupParameter(const Char_t *parname)
Definition: KVFAZIA.cpp:75
Double_t fImport_dTheta
for geometry import
Definition: KVFAZIA.h:44
Bool_t handle_raw_data_event_mfmframe(const MFMCommonFrame &) override
Definition: KVFAZIA.cpp:949
void SetIDCodeForIDTelescope(KVIDTelescope *) const override
Set the FAZIA-specific general identification code for the given telescope.
Definition: KVFAZIA.cpp:1074
std::string GetTriggerForCurrentRun() const
Definition: KVFAZIA.cpp:126
void AddDetectorLabel(const Char_t *label)
Definition: KVFAZIA.cpp:348
void GetDetectorEvent(KVDetectorEvent *detev, const TSeqCollection *dets) override
Definition: KVFAZIA.cpp:594
virtual void BuildTarget()
Definition: KVFAZIA.cpp:536
void AssociateTrajectoriesAndNodes() override
Definition: KVFAZIA.cpp:289
void Build(Int_t=-1) override
Build the FAZIA array.
Definition: KVFAZIA.cpp:559
Int_t fStartingBlockNumber
Definition: KVFAZIA.h:39
TString fCorrespondanceFile
Bool_t fBuildTarget; //kTRUE to include target frame in the geometry.
Definition: KVFAZIA.h:41
Double_t fImport_PhiMax
for geometry import
Definition: KVFAZIA.h:49
virtual void SetNameOfDetectors(KVEnv &env)
Definition: KVFAZIA.cpp:398
Double_t fImport_Zorg
for geometry import
Definition: KVFAZIA.h:52
virtual void BuildFAZIA()
methods to be implemented in child classes
Definition: KVFAZIA.cpp:525
void DeduceIdentificationTelescopesFromGeometry() override
Definition: KVFAZIA.cpp:180
KVFAZIA(const Char_t *title="")
Default constructor.
Definition: KVFAZIA.cpp:51
void FillDetectorList(KVReconstructedNucleus *rnuc, KVHashList *DetList, const KVString &DetNames) override
Definition: KVFAZIA.cpp:640
void ReadTriggerPatterns(KVExpDB *db)
Definition: KVFAZIA.cpp:1031
virtual void DefineStructureFormats(KVGeoImport &)
Definition: KVFAZIA.h:83
void GenerateCorrespondanceFile()
Definition: KVFAZIA.cpp:360
Double_t fQ3fastrisetime
Definition: KVFAZIA.h:60
KVString fSignalTypes
Definition: KVFAZIA.h:43
Bool_t treat_event(const DAQ::FzEvent &)
Read raw data for an event.
Definition: KVFAZIA.cpp:777
virtual ~KVFAZIA()
Destructor.
Definition: KVFAZIA.cpp:337
Double_t fImport_dPhi
for geometry import
Definition: KVFAZIA.h:45
Double_t fImport_ThetaMax
for geometry import
Definition: KVFAZIA.h:47
int fTelescope[8][2]
telescope number from #FEE and #FPGA
Definition: KVFAZIA.h:54
KVFAZIATrigger fTrigger
trigger pattern read from data for each event
Definition: KVFAZIA.h:63
KVGroupReconstructor * GetReconstructorForGroup(const KVGroup *) const override
Specialized group reconstructor for FAZIA.
Definition: KVFAZIA.cpp:688
void SetRawDataFromReconEvent(KVNameValueList &) override
Overrides base method in order to set the value of the trigger bit pattern for the event.
Definition: KVFAZIA.cpp:89
virtual void GetGeometryParameters()
Called by the Build method.
Definition: KVFAZIA.cpp:460
void SetTriggerPattern(uint16_t fp)
Definition: KVFAZIA.h:69
double oldfaziats
dummy ts to control trigger info transmission rate
Definition: KVFAZIA.h:66
Bool_t handle_raw_data_event_protobuf(KVProtobufDataReader &) override
Definition: KVFAZIA.cpp:737
TString GetSignalName(Int_t bb, Int_t qq, Int_t tt, Int_t idsig)
Definition: KVFAZIA.cpp:705
Double_t fImport_PhiMin
for geometry import
Definition: KVFAZIA.h:48
Int_t fNblocks
number of blocks
Definition: KVFAZIA.h:38
Double_t fImport_Yorg
for geometry import
Definition: KVFAZIA.h:51
KVString fDetectorLabels
Definition: KVFAZIA.h:42
void CreateCorrespondence()
Definition: KVFAZIA.cpp:986
void MakeCalibrationTables(KVExpDB *) override
Override base method in order to read FAZIA trigger for each run.
Definition: KVFAZIA.cpp:102
Handle FAZIA protobuf-format raw data files.
Path taken by particles through multidetector geometry.
KVGeoDetectorNode * GetNextNode() const
KVSeqCollection * AccessIDTelescopeList()
KVString GetPathString() const
void IterateFrom(const KVGeoDetectorNode *node0=nullptr) const
void IterateBackFrom(const KVGeoDetectorNode *node0=nullptr) const
Information on relative positions of detectors & particle trajectories.
KVDetector * GetDetector() const
Import detector array described by ROOT geometry and set up corresponding KVMultiDetArray object.
Definition: KVGeoImport.h:69
void AddAcceptedDetectorName(const char *name)
void SetOrigin(double x, double y, double z)
Definition: KVGeoImport.h:117
void SetDetectorPlugin(const TString &name)
Definition: KVGeoImport.h:111
void ImportGeometry(Double_t dTheta=0.1, Double_t dPhi=1.0, Double_t ThetaMin=0.0, Double_t PhiMin=0.0, Double_t ThetaMax=180.0, Double_t PhiMax=360.0)
void SetNameCorrespondanceList(const Char_t *)
virtual Bool_t Fired(Option_t *opt="any") const
virtual KVDetector * GetDetector(const Char_t *name) const
Return detector in this structure with given name.
Base class for particle reconstruction in one group of a detector array.
static KVGroupReconstructor * Factory(const TString &plugin="", const KVGroup *g=nullptr)
Group of detectors which can be treated independently of all others in array.
Definition: KVGroup.h:20
Extended version of ROOT THashList.
Definition: KVHashList.h:29
Base class for all detectors or associations of detectors in array which can identify charged particl...
Definition: KVIDTelescope.h:85
void SetGroup(KVGroup *kvg)
KVDetector * GetDetector(UInt_t n) const
virtual void SetIDCode(UShort_t c)
KVGroup * GetGroup() const
virtual void AddDetector(KVDetector *d)
KVString GetDetectorLabelsForGridCoord(const KVString &axis) const
Extended TList class which owns its objects by default.
Definition: KVList.h:22
Description of physical materials used to construct detectors & targets; interface to range tables.
Definition: KVMaterial.h:90
virtual Double_t GetThickness() const
Definition: KVMaterial.cpp:484
virtual TGeoMedium * GetGeoMedium(const Char_t *="")
static KVIonRangeTable * GetRangeTable()
Definition: KVMaterial.cpp:158
Base class for describing the geometry of a detector array.
virtual void GetDetectorEvent(KVDetectorEvent *detev, const TSeqCollection *fired_params=0)
static Bool_t fCloseGeometryNow
void CreateGeoManager(Double_t dx=500, Double_t dy=500, Double_t dz=500)
Bool_t fHandledRawData
set to true if multidetector handles data in last call to HandleRawData
KVTarget * GetTarget()
KVSeqCollection * fIDTelescopes
deltaE-E telescopes in groups
Bool_t IsSimMode() const
TString GetDataSet() const
KVGroup * GetGroup(const Char_t *name) const
virtual void MakeCalibrationTables(KVExpDB *)
UInt_t GetCurrentRunNumber() const
virtual void SetIdentifications()
const TSeqCollection * GetTrajectories() const
static Bool_t fBuildTarget
virtual void SetRawDataFromReconEvent(KVNameValueList &)
KVUniqueNameList fFiredDetectors
list of fired detectors after reading raw data event
KVUniqueNameList fTrajectories
list of all possible trajectories through detectors of array
KVNameValueList fReconParameters
general purpose list of parameters for storing information on data reconstruction
TString fDataSet
name of associated dataset, used with MakeMultiDetector()
virtual void AssociateTrajectoriesAndNodes()
KVUnownedList fFiredSignals
list of fired signals after reading raw data event
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
Int_t GetIntValue(const Char_t *name) const
Double_t GetDoubleValue(const Char_t *name) const
void SetValue(const Char_t *name, value_type value)
void SetValue64bit(const Char_t *name, ULong64_t)
ULong64_t GetValue64bit(const Char_t *name) const
Bool_t HasParameter(const Char_t *name) const
Strings used to represent a set of ranges of values.
Definition: KVNumberList.h:85
KVNameValueList * GetParameters() const
Definition: KVParticle.h:818
Read Google Protobuf DAQ files.
Nuclei reconstructed from data measured by a detector array .
TObject * Remove(TObject *obj) override
Remove object from list.
void Add(TObject *obj) override
void Clear(Option_t *option="") override
void Delete(Option_t *option="") override
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:73
void Begin(TString delim) const
Definition: KVString.cpp:565
Bool_t End() const
Definition: KVString.cpp:634
KVString Next(Bool_t strip_whitespace=kFALSE) const
Definition: KVString.cpp:695
Calculation/correction of energy losses of particles through an experimental target.
Definition: KVTarget.h:128
void Add(TObject *obj) override
virtual Int_t GetEntries() const
THashList * GetTable() const
virtual const char * GetValue(const char *name, const char *dflt) const
virtual Int_t ReadFile(const char *fname, EEnvLevel level)
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=nullptr)
void CloseGeometry(Option_t *option="d")
TGeoVolume * GetTopVolume() const
TGeoVolume * MakeEltu(const char *name, TGeoMedium *medium, Double_t a, Double_t b, Double_t dz)
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
TObject * Next()
const char * GetName() const override
static TClass * Class()
virtual void SetName(const char *name)
TClass * IsA() const override
void AbstractMethod(const char *method) const
virtual const char * GetName() const
void SetBit(UInt_t f)
virtual const char * ClassName() const
virtual Bool_t InheritsFrom(const char *classname) const
virtual void Info(const char *method, const char *msgfmt,...) const
TObject * First() const override
const char * Data() const
Bool_t IsWhitespace() const
void Form(const char *fmt,...)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TGraphErrors * gr
TH1 * h
double T(double x)
rec
constexpr Double_t R()
TLine l
auto * tt
ClassImp(TPyArg)