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("SI1+SI2-CSI") && 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  // change naming of Si-CsI telescopes
251  fSiCsI_idtype = "SI_CSI";
252  idt->SetName(Form("ID_SI_CSI_%d", csi->GetIndex()));
253  add_telescope(idt, csi->GetGroup());
254  }
255  }
256  }
257  }
258  if (si2) {
259  if (id_tel_list.Contains("SI2-PSA")) {
260  auto idt = new KVFAZIAIDSiPSA;
261  idt->AddDetector(si2);
262  add_telescope(idt, si2->GetGroup());
263  }
264  }
265  if (si1 && si2) {
266  if (id_tel_list.Contains("SI1-SI2")) {
267  auto idt = new KVFAZIAIDSiSi;
268  idt->AddDetector(si1);
269  idt->AddDetector(si2);
270  add_telescope(idt, si2->GetGroup());
271  }
272  }
273  if (si1) {
274  if (id_tel_list.Contains("SI1-PSA")) {
275  auto idt = new KVFAZIAIDSiPSA;
276  idt->AddDetector(si1);
277  add_telescope(idt, si1->GetGroup());
278  }
279  }
280  }
281 }
282 
283 
284 
290 
292 {
293  // Check for weird trajectories: any misalignment of FAZIA telescopes w.r.t.
294  // theoretical geometry will lead to weird trajectories being generated
295  //
296  // We discard any trajectory with > 3 nodes
297 
298  TIter it(&fTrajectories);
299  KVGeoDNTrajectory* geo_dn_traj;
300  KVList rubbish;
301  while ((geo_dn_traj = (KVGeoDNTrajectory*)it())) {
302  if (geo_dn_traj->GetN() != 3) {
303  Warning("AssociateNodesAndTrajectories",
304  "Discarding garbage trajectory: %s", geo_dn_traj->GetPathString().Data());
305  rubbish.Add(geo_dn_traj);
306  }
307  else {
308  // check all detectors have same index
309  geo_dn_traj->IterateFrom();
310  KVGeoDetectorNode* gdn;
311  std::optional<int> index;
312  while ((gdn = geo_dn_traj->GetNextNode())) {
313  if (index) {
314  if (*index != gdn->GetDetector()->GetIndex()) {
315  Warning("AssociateNodesAndTrajectories",
316  "Discarding garbage trajectory: %s", geo_dn_traj->GetPathString().Data());
317  rubbish.Add(geo_dn_traj);
318  break;
319  }
320  }
321  else
322  index = gdn->GetDetector()->GetIndex();
323  }
324  }
325  }
326 
327  for (auto tr : rubbish) {
328  fTrajectories.Remove(tr);
329  }
331 }
332 
333 
334 
335 
338 
340 {
341  // Destructor
342 
343  if (gFazia == this) gFazia = nullptr;
344 }
345 
346 
347 
349 
351 {
352  if (fDetectorLabels == "") fDetectorLabels += label;
353  else if (!fDetectorLabels.Contains(label)) fDetectorLabels += Form(",%s", label);
354 }
355 
356 
357 
361 
363 {
364  // Look for the geometry object <-> detector name correspondance file in the dataset directory
365  // If not found, we create it
366 
367  fCorrespondanceFile = "";
368  if (gDataSet) fCorrespondanceFile = gDataSet->GetFullPathToDataSetFile(Form("%s.names", ClassName()));
369  if (fCorrespondanceFile != "") return;
370 
371 #ifdef WITH_GNU_INSTALL
373 #else
374  fCorrespondanceFile.Form("%s/%s.names", gDataSet->GetDataSetDir(), ClassName());
375 #endif
376  Info("GenerateCorrespondanceFile", "Creation de %s", fCorrespondanceFile.Data());
377  KVEnv env;
378 
379  fDetectorLabels = "SI1,SI2,CSI";
380 
381  SetNameOfDetectors(env);
382  if (env.GetTable() && env.GetTable()->GetEntries() > 0) {
383  env.AddCommentLine(Form("Automatic generated file by %s::GenerateCorrespondanceFile", ClassName()));
384  env.AddCommentLine("Make link between geometric ROOT objects and detector names");
386  }
387  fDetectorLabels = "";
388 }
389 
390 
391 
399 
401 {
402  //define the format of detectors name
403  // label-index
404  // where index = block*100+quartet*10+telescope
405  // example :
406  // SI1-123 is the Silicon 1 of the block 1, the quartet 2 and the telescope 3
407  //
408 
409  for (Int_t bb = fStartingBlockNumber; bb < fNblocks; bb += 1) {
410  for (Int_t qq = 1; qq <= 4; qq += 1) {
411  for (Int_t tt = 1; tt <= 4; tt += 1) {
412  fDetectorLabels.Begin(",");
413  while (!fDetectorLabels.End()) {
414  KVString sdet = fDetectorLabels.Next();
415  env.SetValue(
416  Form("BLOCK_%d_QUARTET_%d_%s-T%d", bb, qq, sdet.Data(), tt),
417  Form("%s-%d", sdet.Data(), bb * 100 + qq * 10 + tt)
418  );
419  }
420  }
421  }
422  }
423 }
424 
425 
426 
430 
432 {
433  // Finalise description of array performing all operations which require ROOT
434  // geometry to be closed
435 
438  imp.SetDetectorPlugin(GetDataSetEnv<TString>(GetDataSet(), "FAZIADetectorPlugin", "FAZIADetector"));
440  // any additional structure name formatting definitions
442  imp.AddAcceptedDetectorName("SI1-");
443  imp.AddAcceptedDetectorName("SI2-");
444  imp.AddAcceptedDetectorName("CSI-");
445 
446  // the following parameters are optimized for a 12-block compact
447  // geometry placed at 80cm with rings 1-5 of INDRA removed.
448  // make sure that the expected number of detectors get imported!
450 
452 
454  SetBit(kIsBuilt);
455 }
456 
457 
458 
461 
463 {
464  //Called by the Build method
465  AbstractMethod("GetGeometryParameters");
466 }
467 
468 
469 
489 
491 {
492  // Read and set up definitions of trigger patterns for this dataset.
493  // These should be given by variables such as:
494  //
495  //~~~~
496  // +[dataset].FAZIA.TriggerPatterns: [name1]
497  // [dataset].FAZIA.TriggerPattern.[name1]: [value1]
498  // +[dataset].FAZIA.TriggerPatterns: [name2]
499  // [dataset].FAZIA.TriggerPattern.[name2]: [value2]
500  //~~~~
501  //
502  // where [name*]='Mult1','Mult1/100','Mult2', etc. (see KVFAZIATrigger for known trigger patterns).
503  //
504  // and [value*] is the value of the corresponding bit pattern, e.g. if bit '3' (0b100) corresponds to
505  // 'Mult2' (i.e. multiplicity >= 2) then this would give
506  //
507  //~~~~
508  // [dataset].FAZIA.TriggerPattern.Mult2: 4
509  //~~~~
510 
511  auto patterns = GetDataSetEnv<KVString>(dataset, "FAZIA.TriggerPatterns");
512  if (patterns.Length()) {
513  patterns.Begin(" ");
514  while (!patterns.End()) {
515  auto pattern = patterns.Next(kTRUE);
516  uint16_t val = (uint16_t)GetDataSetEnv(dataset, Form("FAZIA.TriggerPattern.%s", pattern.Data()), 0.);
517  fTrigger.AddTriggerPattern(pattern, val);
518  }
519  }
520 }
521 
522 
523 
526 
528 {
529  //Called by the Build method
530  Info("BuildFAZIA", "to be defined in child class ...");
531 
532 }
533 
534 
535 
537 
539 {
540 
541  KVMaterial target_holder_mat("Al");
542  new TGeoBBox("TARGET_FRAME", 3., 3., 0.1 / 2.);
543  new TGeoEltu("TARGET_HOLE", 2., 2., 0.1 / 2.);
544  TGeoCompositeShape* cs = new TGeoCompositeShape("TARGET_FRAME", "TARGET_FRAME - TARGET_HOLE");
545  TGeoVolume* target_frame = new TGeoVolume("TARGET_FRAME", cs, target_holder_mat.GetGeoMedium());
546  gGeoManager->GetTopVolume()->AddNode(target_frame, 1);
547 
548  KVTarget* T = GetTarget();
549  if (T) {
550  KVMaterial* targMat = (KVMaterial*)T->GetLayers()->First();
551  TGeoVolume* target = gGeoManager->MakeEltu("TARGET", targMat->GetGeoMedium(), 2., 2., targMat->GetThickness() / 2.);
553  }
554 }
555 
556 
557 
560 
562 {
563  // Build the FAZIA array
566 
568 
569  BuildFAZIA();
570 
571  if (fBuildTarget)
572  BuildTarget();
573 
574  if (fCloseGeometryNow) {
577  }
578 
580 }
581 
582 
583 
595 
597 {
598  // First step in event reconstruction based on current status of detectors in array.
599  //
600  // Fills the given KVDetectorEvent with the list of all groups which have fired.
601  // i.e. loop over all groups of the array and test whether KVGroup::Fired() returns true or false.
602  //
603  // This can be made more efficient if the detectors which were hit in the event are already known:
604  // then their list should be given to argument dets
605  //
606  // If the list of fired detectors dets is not given, we use the internal fFiredDetectors list
607  // which is filled with all hit detectors when raw data is treated in treat_event()
608 
609  if (!IsSimMode() && !fHandledRawData) {
610  //Info("GetDetectorEvent","i didnt handle any data...");
611  return;
612  }
613  if (!dets || !dets->GetEntries()) {
614  if (fFiredDetectors.GetEntries()) {
615  dets = &fFiredDetectors;
616  //Info("GetDetectorEvent", "using internal list");
617  }
618  }
619  if (dets && dets->GetEntries()) {
620  TIter next_det(dets);
621 
622  KVDetector* det = 0;
623  while ((det = (KVDetector*)next_det())) {
624 
625  if (det->GetGroup()->Fired()) detev->AddGroup(det->GetGroup());
626 
627  }
628  }
629  else {
630  //Info("GetDetectorEvent", "Calling base method");
632  }
633 }
634 
635 
636 
641 
643 {
644  // Protected method, called when required to fill fDetList with pointers to
645  // the detectors whose names are stored in fDetNames.
646  // Also set all raw data values in the detectors.
647 
648  KVFAZIADetector* det = 0;
649 
650  DetList->Clear();
651  DetNames.Begin("/");
652  while (!DetNames.End()) {
653  KVString sdet = DetNames.Next(kTRUE);
654  det = (KVFAZIADetector*)GetDetector(sdet.Data());
655  if (!det) {
657  }
658 
659  if (det) {
660  DetList->Add(det);
661  // read and set from the particle's parameter list any relevant detector signal values
662  // each signal is stored with a name "[detname].[signal name]"
663  // except GTTag and DetTag which have the same value for all detectors of the same telescope
664  // and so are only stored once with name "DetTag" or "GTTag".
665 
666  TIter it(&det->GetListOfDetectorSignals());
667  KVDetectorSignal* ds;
668  while ((ds = (KVDetectorSignal*)it())) {
669  if (ds->IsRaw() && !ds->IsExpression())
670  // only look for raw data, excluding any expressions based only on raw data
671  {
672  TString pname = Form("%s.%s", det->GetName(), ds->GetName());
673  if (rnuc->GetParameters()->HasParameter(pname))
674  ds->SetValue(rnuc->GetParameters()->GetDoubleValue(pname));
675  }
676  }
677  if (rnuc->GetParameters()->HasParameter("GTTag"))
678  det->SetGTTag(rnuc->GetParameters()->GetIntValue("GTTag"));
679  if (rnuc->GetParameters()->HasParameter("DetTag"))
680  det->SetDetTag(rnuc->GetParameters()->GetIntValue("DetTag"));
681  }
682  }
683 }
684 
685 
686 
689 
691 {
692  // Specialized group reconstructor for FAZIA
693  KVGroupReconstructor* gr(nullptr);
694  if (GetGroup(g->GetName())) { // make sure group belongs to us
695  if (IsSimMode())
696  gr = KVGroupReconstructor::Factory("FAZIA.Filter", g);
697  else
698  gr = KVGroupReconstructor::Factory("FAZIA", g);
699  }
700  return gr;
701 }
702 
703 
704 
706 
708 {
709 
710  TString sname;
711  if (bb == 4) {
712  if (fDataSet == "FAZIASYM") {
713  sname.Form("%s-RUTH", FzDataType_str[idsig]);
714  }
715  else {
716  sname.Form("%s-%d", FzDataType_str[idsig], 100 * bb + 10 * qq + tt);
717  }
718  }
719  else if (bb == 6) {
720  if (fDataSet == "FAZIAPRE") {
721  sname.Form("%s-RUTH", FzDataType_str[idsig]);
722  }
723  else {
724  sname.Form("%s-%d", FzDataType_str[idsig], 100 * bb + 10 * qq + tt);
725  }
726  }
727  else {
728  sname.Form("%s-%d", FzDataType_str[idsig], 100 * bb + 10 * qq + tt);
729  }
730  return sname;
731 
732 }
733 
734 
735 #ifdef WITH_PROTOBUF
736 
738 
740 {
741  return treat_event(((KVFzDataReader&)R).get_fazia_event());
742 }
743 
744 
745 
747 
749 {
750  Int_t value = (val << 2);
751  value >>= 2;
752  Double_t dval = -1.;
753  switch (sigid) {
754  case DAQ::FzData_FzDataType_QH1:
755  if (eid == 0) dval = value / (fQH1risetime * 1e3 / 10.);
756  break;
757  case DAQ::FzData_FzDataType_I1:
758  break;
759  case DAQ::FzData_FzDataType_QL1:
760  break;
761  case DAQ::FzData_FzDataType_Q2:
762  if (eid == 0) dval = value / (fQ2risetime * 1e3 / 10.);
763  break;
764  case DAQ::FzData_FzDataType_I2:
765  break;
766  case DAQ::FzData_FzDataType_Q3:
767  if (eid == 0) dval = value / (fQ3slowrisetime * 1e3 / 10.);
768  if (eid == 1) dval = value / (fQ3fastrisetime * 1e3 / 10.);
769  break;
770  }
771  return dval;
772 }
773 
774 
775 
778 
779 Bool_t KVFAZIA::treat_event(const DAQ::FzEvent& e)
780 {
781  // Read raw data for an event
782 
783  Bool_t good = kTRUE;
784 
785  //get info from trigger
786  int ts = e.trinfo_size();
787  double dt = 0;
788  uint64_t tot = 0;
789  for (Int_t tr = ts - 1; tr >= 0; tr--) {
790  const DAQ::FzTrigInfo& rdtrinfo = e.trinfo(tr);
791  uint64_t triggervalue = rdtrinfo.value();
792  if (tr == ts - 5) {
793  fReconParameters.SetValue("FAZIA.TRIGPAT", (int)triggervalue);
794  SetTriggerPattern((uint16_t)triggervalue);
795  }
796  else if (tr == ts - 6) fReconParameters.SetValue64bit("FAZIA.EC", ((triggervalue << 12) + e.ec()));
797  else if (tr == ts - 8) {
798  dt = triggervalue / (1e6);
799  fReconParameters.SetValue("FAZIA.TRIGRATE.DT", dt);
800  double faziats = fReconParameters.GetValue64bit("FAZIA.TS") * 1.e-8;
801  if (oldfaziats > 0.) fReconParameters.SetValue("FAZIA.CENTRUM.DT", faziats - oldfaziats);
802  oldfaziats = faziats;
803  }
804  else if (tr == ts - 9) fReconParameters.SetValue("FAZIA.TRIGRATE.EXT", 1.*triggervalue / dt);
805  else if (tr == ts - 10) fReconParameters.SetValue("FAZIA.TRIGRATE.MAN", 1.*triggervalue / dt);
806  else if (tr == ts - 11) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
807  else if (tr == ts - 12) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
808  else if (tr == ts - 13) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
809  else if (tr == ts - 14) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
810  else if (tr == ts - 15) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
811  else if (tr == ts - 16) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
812  else if (tr == ts - 17) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
813  else if (tr == ts - 18) fReconParameters.SetValue(Form("FAZIA.TRIGRATE.PAT%d", tr - 2), 1.*triggervalue / dt);
814  else if (tr == ts - 19) {
815  fReconParameters.SetValue("FAZIA.TRIGRATE.TOT", 1.*triggervalue / dt);
816  tot = triggervalue;
817  }
818  else if (tr == ts - 20) {
819  fReconParameters.SetValue("FAZIA.TRIGRATE.VAL", 1.*triggervalue / dt);
820  fReconParameters.SetValue("FAZIA.DEADTIME", 100.*(1. - 1.*triggervalue / tot));
821  }
822  else {}
823  }
824 
825 // if (tot > 0) fReconParameters.ls();
826 
827  for (int b = 0; b < e.block_size(); ++b) {
828 
829  // check block errors
830  if (e.block(b).len_error() || e.block(b).crc_error() || (!good)) {
831  //Warning("treat_event", "BLOCK LEN OR CRC ERROR B%03d", e.block(b).blkid());
832  good = kFALSE;
833  break; //stop iteration on blocks
834  }
835  int fIdBlk = e.block(b).blkid();
836 
837  for (int f = 0; f < e.block(b).fee_size(); ++f) {
838 
839  const DAQ::FzFee& rdfee = e.block(b).fee(f);
840 
841  for (int h = 0; h < rdfee.hit_size(); ++h) {
842 
843  const DAQ::FzHit& rdhit = rdfee.hit(h);
844  // check fee errors
845  if (rdfee.len_error() || rdfee.crc_error() || (!good)) {
846  Warning("treat_event", "FEE LEN OR CRC ERROR B%03d-FE%d", e.block(b).blkid(), rdfee.feeid());
847  good = kFALSE;
848  break; //stop iteration on hits
849  }
850  int fIdFee = rdhit.feeid();
851  int fIdTel = rdhit.telid();
852 
853  for (Int_t mm = 0; mm < rdhit.data_size(); mm++) {
854  const DAQ::FzData& rdata = rdhit.data(mm);
855  int fIdSignal = rdata.type();
856 
857  int DetTag = rdhit.dettag();
858  int GTTag = rdhit.gttag();
859  if (DetTag >= 16384 && GTTag < 16384) GTTag += 32768;
860 
861  //on decompile le HIT
862  int fIdQuartet = fQuartet[fIdFee][fIdTel];
863  int fIdTelescope = fTelescope[fIdFee][fIdTel];
864 
865  KVFAZIADetector* det = (KVFAZIADetector*)GetDetector(Form("%s-%d", FzDetector_str[fIdSignal], 100 * fIdBlk + 10 * fIdQuartet + fIdTelescope));
866  if (!det) {
867  Error("treat_event", "No detector %s-%d found in FAZIA geometry...", FzDetector_str[fIdSignal], 100 * fIdBlk + 10 * fIdQuartet + fIdTelescope);
868  continue;
869  }
870  det->SetDetTag(DetTag);
871  det->SetGTTag(GTTag);
872 
873  if (!rdata.has_energy() && !rdata.has_waveform()) {
874  if (FzDataType_str[fIdSignal] != "I2") Warning("treat_event", "[NO DATA] [%s %s]", det->GetName(), FzDataType_str[fIdSignal]);
875  continue;
876  }
877 
878  if (rdata.has_energy()) {
879  const DAQ::Energy& ren = rdata.energy();
880  for (Int_t ee = 0; ee < ren.value_size(); ee++) {
881  Double_t energy = TreatEnergy(fIdSignal, ee, ren.value(ee));
882  auto esig = det->SetFPGAEnergy(fIdSignal, ee, energy);
883  if (esig)
884  fFiredSignals.Add(esig);
885  else
886  Warning("treat_event", "FPGAEnergy signal not found for %s", det->GetName());
887  }
888  fFiredDetectors.Add(det);
889  }
890  if (rdata.has_baseline()) {
891  Float_t bl = rdata.baseline();
892  auto bsig = det->SetBaseLine(fIdSignal, bl);
893  if (bsig)
894  fFiredSignals.Add(bsig);
895  else
896  Warning("treat_event", "BaseLine signal not found for %s", det->GetName());
897  }
898  if (rdata.has_waveform()) {
899  const DAQ::Waveform& rwf = rdata.waveform();
900  Int_t supp;
901 
902  if (fIdSignal <= 5) {
903  TString sname = GetSignalName(fIdBlk, fIdQuartet, fIdTelescope, fIdSignal);//QH1-123 etc.
904  if (sname == "")
905  Warning("treat_event", "signal name is empty !!! blk=%d qua=%d tel=%d\n", fIdBlk, fIdQuartet, fIdTelescope);
906 
907  TGraph sig(rwf.sample_size());
908 
909  for (Int_t nn = 0; nn < rwf.sample_size(); nn++) {
910  if (fIdSignal != DAQ::FzData::ADC) {
911  if (rwf.sample(nn) > 8191) {
912  supp = rwf.sample(nn) | 0xFFFFC000;
913  }
914  else {
915  supp = rwf.sample(nn);
916  }
917  }
918  else {
919  supp = rwf.sample(nn);
920  }
921  sig.SetPoint(nn, nn, supp);
922  }
923  det->SetSignal(&sig, sname);
924  }
925  else {
926  if (fIdSignal > 5)
927  Warning("treat_event", "datatype %d>5 - taille = %d\n", fIdSignal, rwf.sample_size());
928  }
929  }
930  }
931  }
932  }
933  }
934 
935 // cout << "good=" << good << endl;
936 // fFPGAParameters.ls();
937 // fSignals.ls();
938 
939  return good;
940 }
941 
942 #endif
943 
944 #ifdef WITH_MFM
945 
950 
952 {
953  // Treatment of raw data in MFM frames with type MFM_FAZIA_FRAME_TYPE
954  // The timestamp is extracted from the frame header and added to fReconParameters
955  // in a 64 bit parameter with name "FAZIA.TS"
956 
957  if (f.GetFrameType() != MFM_FAZIA_FRAME_TYPE) return kFALSE;
958  fReconParameters.SetValue64bit("FAZIA.TS", f.GetTimeStamp());
959 
960 #ifdef WITH_PROTOBUF
961  DAQ::FzEventSet fazia_set;
962  DAQ::FzEvent fazia_event;
963  // Parse protobuf data in MFM frame
964  if (fazia_set.ParseFromArray(f.GetPointUserData(), ((MFMFaziaFrame&)f).GetEventSize())) {
965  // Parsed an event set
966  if (fazia_set.ev_size() > 1) {
967  Warning("handle_raw_data_event_mfmframe",
968  "Got a FzEventSet from data: cannot handle multiple events at once!");
969  return kFALSE;
970  }
971  return treat_event(fazia_set.ev(0));
972  }
973  else if (fazia_event.ParseFromArray(f.GetPointUserData(), ((MFMFaziaFrame&)f).GetEventSize())) {
974  // Parsed an event
975  return treat_event(fazia_event);
976  }
977 #endif
978  return kTRUE;
979 }
980 
981 #endif
982 
983 
987 
989 {
990  // set up correspondence between FPGA number/FEE number (from acquisition)
991  // and Quartet/Telescope numbers
992 
993  TString DataFilePath;
994  if (!KVBase::SearchKVFile("ElecDetLink.env", DataFilePath, "data")) {
995  Error("CreateCorrespondence", "ElecDetLink.env not found");
996  return;
997  }
998  KVEnv DetLink;
999  DetLink.ReadFile(DataFilePath, kEnvUser);
1000  for (int t = 1; t <= 4; t++) {
1001  for (int q = 1; q <= 4; q++) {
1002  TString elec = DetLink.GetValue(Form("T%1d-Q%1d", t, q), " ");
1003  if (!elec.IsWhitespace()) {
1004  int fee, fpga;
1005  sscanf(elec.Data(), "FPGA%d-FE%d", &fpga, &fee);
1006  fQuartet[fee][fpga] = q;
1007  fTelescope[fee][fpga] = t;
1008  }
1009  else {
1010  Error("CreateCorrespondence", "Problem reading FAZIA ElecDetLink.env file : T%1d-Q%1d = %s", t, q, elec.Data());
1011  }
1012  }
1013  }
1014 }
1015 
1016 
1017 
1032 
1034 {
1035  // Read a file containing runlists for each principal trigger used during an experiment
1036  //
1037  // The file should be in TEnv format like so:
1038  //
1039  //~~~~
1040  // Mult1: 100-122,541-1938
1041  // Mult2: 91-765
1042  //~~~~
1043  //
1044  // where each trigger pattern name must be known and declared to occur during the dataset
1045  // (see SetTriggerPatternsForDataSet()) and the list of runs are given using KVNumberList syntax.
1046  //
1047  // The data is added to the database in a table 'FAZIA.Triggers'.
1048 
1049  TString fullpath;
1050  if (!db->FindCalibFile("Triggers", fullpath)) return;
1051 
1052  Info("ReadTriggerPatterns()", "Reading FAZIA triggers used during runs...");
1053  auto trigs = db->AddTable("FAZIA.Triggers", "Principal triggers used by FAZIA");
1054 
1055  KVDBRecord* dbrec = 0;
1056  TEnv env;
1057  TEnvRec* rec = 0;
1058  env.ReadFile(fullpath.Data(), kEnvAll);
1059  TIter it(env.GetTable());
1060 
1061  while ((rec = (TEnvRec*)it.Next())) {
1062  KVString srec(rec->GetName());
1063  KVNumberList nl(rec->GetValue());
1064  dbrec = new KVDBRecord(rec->GetName(), "FAZIA Trigger");
1065  dbrec->AddKey("Runs", "List of Runs");
1066  trigs->AddRecord(dbrec);
1067  db->LinkRecordToRunRange(dbrec, nl);
1068  }
1069 }
1070 
1071 
1072 
1075 
1077 {
1078  // Set the FAZIA-specific general identification code for the given telescope
1079 
1080  if (idt->InheritsFrom(KVFAZIAIDSiPSA::Class())) {
1081  if (idt->GetDetector(1)->IsLabelled("SI1")) idt->SetIDCode(IDCodes::ID_SI1_PSA);
1082  else idt->SetIDCode(IDCodes::ID_SI2_PSA);
1083  }
1084  else if (idt->InheritsFrom(KVFAZIAIDSiSi::Class())) idt->SetIDCode(IDCodes::ID_SI1_SI2);
1085  else if (idt->InheritsFrom(KVFAZIAIDSiCsI::Class())) idt->SetIDCode(IDCodes::ID_SI2_CSI);
1086  else if (idt->InheritsFrom(KVFAZIAIDSiSiCsI::Class())) {
1087  // ID code for these telescopes depends on what detectors the grid's VARY uses
1088  auto labsY = idt->GetDetectorLabelsForGridCoord("y");
1089  if (labsY.Contains("SI1") && labsY.Contains("SI2"))
1090  idt->SetIDCode(IDCodes::ID_SI12_CSI);
1091  else if (labsY.Contains("SI1"))
1092  idt->SetIDCode(IDCodes::ID_SI1_CSI);
1093  else if (labsY.Contains("SI2"))
1094  idt->SetIDCode(IDCodes::ID_SI2_CSI);
1095  }
1096  else if (idt->InheritsFrom(KVFAZIAIDCsI::Class())) idt->SetIDCode(IDCodes::ID_CSI_PSA);
1097  else {
1098  Error("SetIDCodeForIDTelescope", "Request for telescope name=%s of unknown class=%s",
1099  idt->GetName(), idt->IsA()->GetName());
1100  }
1101 }
1102 
1103 
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:804
const KVSeqCollection & GetListOfDetectorSignals() const
Definition: KVDetector.h:779
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:431
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
TString fSiCsI_idtype
Definition: KVFAZIA.h:68
Double_t TreatEnergy(Int_t sigid, Int_t eid, UInt_t val)
Definition: KVFAZIA.cpp:748
Double_t fQ3slowrisetime
Definition: KVFAZIA.h:59
void SetTriggerPatternsForDataSet(const TString &dataset)
used to name Si-CsI idtelescopes 'ID_[fSiCsI_idtype]_xxxx'
Definition: KVFAZIA.cpp:490
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:245
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:951
void SetIDCodeForIDTelescope(KVIDTelescope *) const override
Set the FAZIA-specific general identification code for the given telescope.
Definition: KVFAZIA.cpp:1076
std::string GetTriggerForCurrentRun() const
Definition: KVFAZIA.cpp:126
void AddDetectorLabel(const Char_t *label)
Definition: KVFAZIA.cpp:350
void GetDetectorEvent(KVDetectorEvent *detev, const TSeqCollection *dets) override
Definition: KVFAZIA.cpp:596
virtual void BuildTarget()
Definition: KVFAZIA.cpp:538
void AssociateTrajectoriesAndNodes() override
Definition: KVFAZIA.cpp:291
void Build(Int_t=-1) override
Build the FAZIA array.
Definition: KVFAZIA.cpp:561
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:400
Double_t fImport_Zorg
for geometry import
Definition: KVFAZIA.h:52
virtual void BuildFAZIA()
methods to be implemented in child classes
Definition: KVFAZIA.cpp:527
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:642
void ReadTriggerPatterns(KVExpDB *db)
Definition: KVFAZIA.cpp:1033
virtual void DefineStructureFormats(KVGeoImport &)
Definition: KVFAZIA.h:85
void GenerateCorrespondanceFile()
Definition: KVFAZIA.cpp:362
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:779
virtual ~KVFAZIA()
Destructor.
Definition: KVFAZIA.cpp:339
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:690
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:462
void SetTriggerPattern(uint16_t fp)
Definition: KVFAZIA.h:71
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:739
TString GetSignalName(Int_t bb, Int_t qq, Int_t tt, Int_t idsig)
Definition: KVFAZIA.cpp:707
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:988
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)