KaliVeda
Toolkit for HIC analysis
KVINDRA.cpp
1 /***************************************************************************
2 $Id: KVINDRA.cpp,v 1.68 2009/01/21 10:05:51 franklan Exp $
3  kvindra.cpp - description
4  -------------------
5  begin : Mon May 20 2002
6  copyright : (C) 2002 by J.D. Frankland
7  email : frankland@ganil.fr
8  ***************************************************************************/
9 
10 /***************************************************************************
11  * *
12  * This program is free software; you can redistribute it and/or modify *
13  * it under the terms of the GNU General Public License as published by *
14  * the Free Software Foundation; either version 2 of the License, or *
15  * (at your option) any later version. *
16  * *
17  ***************************************************************************/
18 
19 #include "KVINDRA.h"
20 #include "KVDataSet.h"
21 #include "KVMaterial.h"
22 #include "KVDetector.h"
23 #include "KVIDTelescope.h"
24 #include "KVIDSiCsI.h"
25 #include "KVIDINDRACsI.h"
26 #include "KVIDChIoSi.h"
27 #include "KVIDChIoCsI.h"
28 #include "KVIDChIoSi75.h"
29 #include "KVIDSi75SiLi.h"
30 #include "KVIDPhoswich.h"
31 #include "KVGroup.h"
32 #include "KVChIo.h"
33 #include "KVCsI.h"
34 #include "KVDetectorEvent.h"
35 #include "TEnv.h"
36 #include "INDRAGeometryBuilder.h"
37 #include "KVGeoNavigator.h"
38 #include "KVGeoImportINDRA.h"
39 #ifdef WITH_BUILTIN_GRU
40 #include <KVGANILDataReader.h>
41 #endif
42 #include <KVDBChIoPressures.h>
43 #include <KVGeoImport.h>
44 #include <KVRangeTableGeoNavigator.h>
45 #include <KVRawDataReader.h>
46 #ifdef WITH_MFM
47 #include "KVMFMDataFileReader.h"
48 #include "MFMEbyedatFrame.h"
49 #ifdef WITH_MESYTEC
50 #include "MFMMesytecMDPPFrame.h"
51 #include "mesytec_buffer_reader.h"
52 #endif
53 #endif
54 #include "KVGeoImportINDRA.h"
55 #include "KVINDRAGroupReconstructor.h"
56 #include <cassert>
57 
58 using namespace std;
59 
61 
62 //Use this static array to translate EBaseIndra_type
63 //signal type to a string giving the signal type
64 
65 
68  "", //dummy for index=0
69  "GG", "PG", "T",
70  "GG", "PG", "T",
71  "R", "L", "T",
72  "GG", "PG", "T",
73  "GG", "PG", "T"
74 };
75 
76 
77 #define KV_DEBUG 1
78 
79 KVINDRA* gIndra;
80 
84 
86 {
87  //Default constructor
88  //Set up lists of ChIo, Si, CsI, Phoswich
89  fChIo.SetCleanup(kTRUE);
90  fSi.SetCleanup(kTRUE);
91  fCsI.SetCleanup(kTRUE);
92  fPhoswich.SetCleanup(kTRUE);
93  fTrigger = 0;
94  gIndra = this;
95  fPHDSet = kFALSE;
96  fSelecteur = nullptr;
97  fMesytecData = kFALSE;
98  fEbyedatData = kFALSE;
99 }
100 
101 
102 
105 
106 KVINDRA::~KVINDRA()
107 {
108  //Resets global gIndra pointer.
109 
110  if (gIndra == this) gIndra = nullptr;
111 }
112 
113 
114 
115 
118 
120 {
121  // Correspondance between CsI detectors and pin lasers is set up if known.
122 
123  if (run != -1) {
124  fCurrentRun = run;
125  }
126  BuildGeometry();
127 
128  if (fCloseGeometryNow) {
129  PerformClosedROOTGeometryOperations();
130  }
131 }
132 
133 
134 
137 
139 {
140  //Fill lists of ChIo, Si, CsI and phoswich
141 
142  fChIo.Clear();
143  fSi.Clear();
144  fCsI.Clear();
145  fPhoswich.Clear();
146  TIter next_det(GetDetectors());
147  KVDetector* kvd;
148  while ((kvd = (KVDetector*) next_det())) {
149  kvd->SetNameOfArray("INDRA");
150  if (kvd->InheritsFrom("KVChIo")) {
151  fChIo.Add(kvd);
152  }
153  if (kvd->InheritsFrom("KVSilicon")) {
154  fSi.Add(kvd);
155  }
156  if (kvd->InheritsFrom("KVCsI")) {
157  fCsI.Add(kvd);
158  }
159  if (kvd->InheritsFrom("KVPhoswich")) {
160  fPhoswich.Add(kvd);
161  }
162  }
163 }
164 
165 
166 
170 
172 {
173 
174  //Returns a pointer to the Ionisation Chamber placed directly in front of the
175  //detector "detname". If no ChIo is present, a null pointer is returned.
176 
177  KVINDRADetector* kvd;
178  kvd = dynamic_cast<KVINDRADetector*>(GetDetector(detname));
179  return (kvd ? (KVChIo*)kvd->GetChIo() : NULL);
180 }
181 
182 
183 
184 
188 
189 KVLayer* KVINDRA::GetChIoLayer(void)
190 {
191  //Return pointer to layer in INDRA structure corresponding to ionisation
192  //chambers.
193 
194  return (KVLayer*)GetStructure("LAYER", "CHIO");
195 }
196 
197 
198 
199 
203 
205 {
206  // Define multiplicity trigger used for acquisition and filter.
207  // Events with multipicity >= trig are OK.
208 
209  fTrigger = trig;
210 }
211 
212 
213 
239 
241 {
242  //Find a detector based on the old BaseIndra type definitions:
243  //
244 //enum EBaseIndra_type {
245 // ChIo_GG=1,
246 // ChIo_PG,//=2
247 // ChIo_T,//=3
248 // Si_GG,//=4
249 // Si_PG,//=5
250 // Si_T,//=6
251 // CsI_R,//=7
252 // CsI_L,//=8
253 // CsI_T,//=9
254 // Si75_GG,//=10
255 // Si75_PG,//=11
256 // Si75_T,//=12
257 // SiLi_GG,//=13
258 // SiLi_PG,//=14
259 // SiLi_T//=15
260 //};
261 //enum EBaseIndra_typePhos {
262 // Phos_R=1,
263 // Phos_L,//=2
264 // Phos_T,//=3
265 //};
266 
267  KVINDRADetector* det = 0;
268 
269  char nom_det[20];
270  if (cou == 1) {
271  if (type >= Phos_R && type <= Phos_T) {
272  sprintf(nom_det, "PHOS_%02d", mod);
273  det =
274  (KVINDRADetector*) GetListOfPhoswich()->FindObjectByName(nom_det);
275  }
276  }
277  if (det)
278  return det;
279  else if (type >= ChIo_GG && type <= ChIo_T) {
280  sprintf(nom_det, "CI_%02d%02d", cou, mod);
281  det = (KVINDRADetector*) GetListOfChIo()->FindObject(nom_det);
282  return det;
283  }
284  else if (type >= Si_GG && type <= Si_T) {
285  sprintf(nom_det, "SI_%02d%02d", cou, mod);
286  det = (KVINDRADetector*) GetListOfSi()->FindObject(nom_det);
287  return det;
288  }
289  else if (type >= SiLi_GG && type <= SiLi_T) {
290  sprintf(nom_det, "SILI_%02d", cou);
291  det = (KVINDRADetector*) GetListOfSi()->FindObject(nom_det);
292  return det;
293  }
294  else if (type >= Si75_GG && type <= Si75_T) {
295  sprintf(nom_det, "SI75_%02d", cou);
296  det = (KVINDRADetector*) GetListOfSi()->FindObject(nom_det);
297  return det;
298  }
299  else if (type >= CsI_R && type <= CsI_T) {
300  sprintf(nom_det, "CSI_%02d%02d", cou, mod);
301  det = (KVINDRADetector*) GetListOfCsI()->FindObject(nom_det);
302  return det;
303  }
304  return 0;
305 }
306 
307 
308 
313 
315 {
316  // Change default names of ID telescopes to INDRA standard
317  //
318  // This method also sets the types of the ID telescopes
319 
320  TIter it(GetListOfIDTelescopes());
321  KVIDTelescope* idt;
322  const TString etalon_numbers[] = {"1002", "1102", "1202", "1304", "1403", "1503", "1602", "1702"};
323  while ((idt = (KVIDTelescope*)it())) {
324  KVString N = idt->GetDetector(1)->GetName();
325  N.Begin("_");
326  KVString de_type = N.Next();
327  KVString de_number = N.Next();
328  if (idt->GetSize() == 1) {
329  if (de_type == "PHOS") {
330  idt->SetName(Form("%s_R_L_%s", de_type.Data(), de_number.Data()));
331  idt->SetType(Form("%s_R_L", de_type.Data()));
332  }
333  else {
334  // CsI identification telescopes are called either CSI_R_L_RRMM (before 2021)
335  // or CSI_RRMM (for datasets from 2021 onwards)
336  TString csi_id_name_fmt = KVBase::GetDataSetEnv(fDataSet, "INDRA.CSI.IDTelescopeNameFormat", "CSI_%s");
337  idt->SetName(Form(csi_id_name_fmt, de_number.Data()));
338  // similarly, the type of CSI identifications was CSI_R_L before 2021, CSI from 2021 onwards
339  if (csi_id_name_fmt.Contains("R_L")) {
340  idt->SetType("CSI_R_L");
342  }
343  else idt->SetType("CSI");
344  }
345  }
346  else {
347  N = idt->GetDetector(2)->GetName();
348  N.Begin("_");
349  KVString e_type = N.Next();
350  KVString e_number = N.Next();
351  if (e_type == "SILI" || e_type == "SI75") {
352  e_number = etalon_numbers[dynamic_cast<KVINDRADetector*>(idt->GetDetector(2))->GetRingNumber() - 10];
353  }
354  idt->SetName(Form("%s_%s_%s", de_type.Data(), e_type.Data(), e_number.Data()));
355  idt->SetType(Form("%s_%s", de_type.Data(), e_type.Data()));
356  }
357  }
358  // changed names of all id telescope objects in hashlist: must rehash
359  dynamic_cast<KVHashList*>(GetListOfIDTelescopes())->Rehash();
360 }
361 
362 
363 
367 
369 {
370  // Finalise the ROOT geometry description by performing operations which can
371  // only be done once the geometry is closed
372 
374  gimp.SetNameCorrespondanceList("INDRA.names");
375  // INDRAGeometryBuilder instance holds list of directions to test for import which
376  // corresponds to detectors which are actually present in array
377  gimp.ImportGeometry(fIGB->GetDirectionsToTestForImport());
378  fIGB->CheckImportResults(GetDetectors());
379 
380  FillListsOfDetectorsByType();
381 
382  SetNamesOfIDTelescopes();
383 
384  SetIdentifications();
385 
386  //set flag to say Build() was called
387  SetBit(kIsBuilt);
388 
389  SetPinLasersForCsI();
390 
391  SetExpectedDetectorSignalNames();
392 
393  // link EBYEDAT parameter names to detectors
394  TIter next_det(GetDetectors());
395  KVDetector* det;
396  while ((det = (KVDetector*)next_det())) {
397  TString det_name(det->GetName());
398  if (det_name.BeginsWith("CI") || det_name.BeginsWith("SI")) {
399  fEbyedatParamDetMap.SetValue(det_name + "_PG", det_name);
400  fEbyedatParamDetMap.SetValue(det_name + "_GG", det_name);
401  }
402  else if (det_name.BeginsWith("CSI")) {
403  fEbyedatParamDetMap.SetValue(det_name + "_R", det_name);
404  fEbyedatParamDetMap.SetValue(det_name + "_L", det_name);
405  }
406  // handle change of "time marker" parameter type for certain experiments
407  TString time_marker_type = gDataSet->GetDataSetEnv(Form("KVACQParam.%s.T", det_name.Data()), "T");
408  time_marker_type.Prepend("_");
409  fEbyedatParamDetMap.SetValue(det_name + time_marker_type, det_name);
410  }
411 }
412 
413 
414 
416 
417 void KVINDRA::handle_ebyedat_raw_data_parameter(const char* param_name, uint16_t val)
418 {
419  KVString detname;
420  KVDetector* det = nullptr;
421  KVString sig_type;
422  // use look-up table parname => detectorname
423  if (fEbyedatParamDetMap.HasParameter(param_name)) {
424  det = GetDetector(fEbyedatParamDetMap.GetStringValue(param_name));
425  detname = det->GetName();
426  // parameter type given by whatever comes after final '_'
427  std::string lab(param_name);
428  sig_type = lab.substr(lab.rfind('_') + 1);
429  }
430  else { // no detector associated to parameter
431  sig_type = param_name;
432  }
433  add_and_set_detector_signal(det, detname, val, sig_type);
434 }
435 
436 
437 
445 
447 {
448  // Put values of all fired detector signals into the parameter list which will be copied
449  // into the reconstructed event.
450  //
451  // If Mesytec data is being read, we set the parameter "INDRA.MESYTEC", or if Ebyedat data, "INDRA.EBYEDAT".
452  // Note that in old reconstructed data these parameters did not exist, therefore in their
453  // absence EBYEDAT is assumed.
454 
455  if (fMesytecData) fReconParameters.SetValue("INDRA.MESYTEC", kTRUE);
456  else if (fEbyedatData) fReconParameters.SetValue("INDRA.EBYEDAT", kTRUE);
458 }
459 
460 
461 
485 
487 {
488  // Read ChIo pressures from a file with the following format:
489  //
490  //~~~
491  //PressureSet: A
492  //A.RunList: 1-22
493  //A.CI_02: 50.0
494  //A.CI_04: 30.0
495  //A.CI_06: 20.0
496  //
497  //+PressureSet: B
498  //B.Units: torr
499  //B.RunList: 23-50
500  //B.CI_08: 33.0
501  //B.CI_13: 11.6
502  //~~~
503  //
504  // `Units` can be either `mbar` or `torr`: `mbar` is used by default (e.g. for set `A` in the example).
505  //
506  // The different ionization chambers are designated by `CI_02`, `CI_04`, `CI_06`, `CI_08`, `CI_13`
507  // The same pressure will be applied to all cells of each ChIo which are present in the current geometry.
508  //
509  // If `RunList` is not given, the pressures will be applied to all runs in the database.
510 
511  TString fullpath;
512  if (!db->FindCalibFile("Pressures", fullpath, "INDRA")) return;
513  Info("ReadChIoPressures()", "Reading INDRA ChIo pressures used during runs...");
514 
515  auto pressure_table = db->AddTable("INDRA.ChIo Pressures", "INDRA ChIo gas pressures");
516 
517  KVString the_chios[] = {"CI_02", "CI_04", "CI_06", "CI_08", "CI_13"};
518 
519  TEnv env;
520  env.ReadFile(fullpath.Data(), kEnvAll);
521  KVString pressure_sets = env.GetValue("PressureSet", "");
522  pressure_sets.Begin(" ");
523  while (!pressure_sets.End()) {
524  auto pressure_set = pressure_sets.Next();
525  // set units
526  auto units = KVUnits::mbar;
527  if (KVString(env.GetValue(Form("%s.Units", pressure_set.Data()), "mbar")) != "mbar")
528  units = KVUnits::torr;
529  // set runlist if given
530  KVNumberList runlist(env.GetValue(Form("%s.RunList", pressure_set.Data()), ""));
531  if (runlist.IsEmpty()) runlist = db->GetRunList();
532  // get and set pressures
533  auto dbp = new KVDBChIoPressures;
534  int ichio = 0;
535  for (auto& chio : the_chios) {
536  Float_t P = 0;
537  if ((P = env.GetValue(Form("%s.%s", pressure_set.Data(), chio.Data()), 0.0)) > 0.0) {
538  dbp->SetPressure(ichio, P * units);
539  }
540  ++ichio;
541  }
542  pressure_table->AddRecord(dbp);
543  db->LinkRecordToRunRange(dbp, runlist);
544  }
545 }
546 
547 
548 
554 
556 {
557  //Update ChIo pressures for this run with values in database (if any)
558  //
559  //Any ChIo with zero pressure has KVDetector::IsDetecting() set to false
560  //(and hence KVDetector::IsOK() will also return false).
561 
562  KVRList* param_list = kvrun->GetLinks("INDRA.ChIo Pressures");
563  if (!param_list) {
564  return;
565  }
566  KVChIo* kvd;
567  KVDBChIoPressures* kvps;
568  TIter next_ps(param_list);
569  auto chios = GetListOfChIo();
570  if (!chios) {
571  Error("SetChIoPressures",
572  "GetListOfChIo() returns null list pointer");
573  return;
574  }
575  cout << "--> Setting ChIo pressures" << endl;
576  TIter next_chio(chios);
577  while ((kvps = (KVDBChIoPressures*) next_ps())) {
578  if (kvps->GetPressure(CHIO_2_3))
579  cout << " Ring 2/3: " << kvps->
580  GetPressure(CHIO_2_3) / KVUnits::mbar << " mbar" << endl;
581  if (kvps->GetPressure(CHIO_4_5))
582  cout << " Ring 4/5: " << kvps->
583  GetPressure(CHIO_4_5) / KVUnits::mbar << " mbar" << endl;
584  if (kvps->GetPressure(CHIO_6_7))
585  cout << " Ring 6/7: " << kvps->
586  GetPressure(CHIO_6_7) / KVUnits::mbar << " mbar" << endl;
587  if (kvps->GetPressure(CHIO_8_12))
588  cout << " Ring 8/12: " << kvps->
589  GetPressure(CHIO_8_12) / KVUnits::mbar << " mbar" << endl;
590  if (kvps->GetPressure(CHIO_13_17))
591  cout << " Ring 13/17: " << kvps->
592  GetPressure(CHIO_13_17) / KVUnits::mbar << " mbar" << endl;
593  while ((kvd = (KVChIo*) next_chio())) {
594  if (!strcmp(kvd->GetType(), "CI")) {
595  //check detector type: ="CI" for standard INDRA chio
596  if (kvd->GetRingNumber() == 2)
597  kvd->SetPressure(kvps->GetPressure(CHIO_2_3) / KVUnits::mbar);
598  if (kvd->GetRingNumber() == 4)
599  kvd->SetPressure(kvps->GetPressure(CHIO_4_5) / KVUnits::mbar);
600  if (kvd->GetRingNumber() == 6)
601  kvd->SetPressure(kvps->GetPressure(CHIO_6_7) / KVUnits::mbar);
602  if (kvd->GetRingNumber() >= 8 && kvd->GetRingNumber() <= 12)
603  kvd->SetPressure(kvps->GetPressure(CHIO_8_12) / KVUnits::mbar);
604  if (kvd->GetRingNumber() >= 13 && kvd->GetRingNumber() <= 17)
605  kvd->SetPressure(kvps->GetPressure(CHIO_13_17) / KVUnits::mbar);
606  if (kvd->GetPressure() == 0.0) {
607  kvd->SetDetecting(kFALSE);
608  }
609  else {
610  kvd->SetDetecting(kTRUE);
611  }
612  }
613  }
614  next_chio.Reset();
615  }
616 }
617 
618 
619 
622 
624 {
625  // Override base method in order to set ChIo pressures (if defined)
627  SetChIoPressures(dbr);
628 }
629 
630 
631 
633 
635 {
636  CreateGeoManager();
637 
638  fIGB.reset(new INDRAGeometryBuilder(fDataSet, fCurrentRun));
639  fIGB->Build(kFALSE, fCloseGeometryNow);
640 
641  SetName(fIGB->GetName());
642  SetTitle(fIGB->GetTitle());
643 }
644 
645 
646 #ifdef WITH_BUILTIN_GRU
647 
651 
653 {
654  // Set raw data in detectors/array coming from a GANIL EBYEDAT format
655  // acquisition file.
656 
657  fEbyedatData = kTRUE;
658  // loop over fired data parameters
659  TIter nxt_frd(&rdr.GetFiredDataParameters());
660  KVEBYEDAT_ACQParam* eby_par;
661  while ((eby_par = (KVEBYEDAT_ACQParam*)nxt_frd())) {
662  handle_ebyedat_raw_data_parameter(eby_par->GetName(), eby_par->GetData());
663  }
664 
665  return kTRUE;
666 }
667 
668 #endif
669 
670 #ifdef WITH_MFM
671 
687 
689 {
690  // General method for reading raw data in MFM-encapsulated ebyedat format
691  // Fills list of hit acquisition parameters.
692  // Returns kTRUE if at least one parameter belonging to the array is present.
693  //
694  // Any unknown parameters in the event (i.e. ones for which no KVACQParam object
695  // has been defined) are written in the fReconParameters list with names
696  // "ACQPAR.[array name].[parameter name]"
697  //
698  // Retrieve CENTRUM timestamp from data if present.
699  // It will be added to fReconParameters as a 64-bit value "INDRA.TS" (if != 0)
700  // Event number is retrieved and stored as "INDRA.EN" (if != 0)
701  // Any parameter which appears as [name] and [name]_UP is an unsigned 32-bit value
702  // split into two 16-bit words. We replace the two parameters with a 64-bit
703  // value (to hold correctly all unsigned 32-bit values) with [name].
704 
705  fEbyedatData = kTRUE;
706 
707  uint16_t val;
708  std::string lab;
709 
710  for (int i = 0; i < f.GetNbItems(); ++i) {
711  f.GetDataItem(i, lab, val);
712  handle_ebyedat_raw_data_parameter(lab.c_str(), val);
713  }
714 
715  ULong64_t ts = f.GetCENTRUMTimestamp();
716  if (ts != 0) fReconParameters.SetValue64bit("INDRA.TS", ts);
717  ULong64_t en = f.GetEventNumber();
718  if (en != 0) fReconParameters.SetValue64bit("INDRA.EN", en);
719  int npars = fReconParameters.GetNpar();
720  std::vector<TString> names;
721  for (int i = 0; i < npars; ++i) {
722  TString name = fReconParameters.GetParameter(i)->GetName();
723  if (name.EndsWith("_UP")) names.push_back(name);
724  }
725  if (names.size()) {
726  for (std::vector<TString>::iterator it = names.begin(); it != names.end(); ++it) {
727  TString name = (*it);
728  name.Remove(name.Index("_UP"), 3);
729  TString name_up = (*it);
730  ULong64_t par_up = fReconParameters.GetIntValue(name_up);
731  ULong64_t par = fReconParameters.GetIntValue(name);
732  UInt_t par32 = (par_up << 16) + par;
733  fReconParameters.RemoveParameter(name_up);
734  fReconParameters.RemoveParameter(name);
735  fReconParameters.SetValue64bit(name, par32);
736  }
737  }
738  return kTRUE;
739 }
740 
741 #endif
742 
743 
746 
748 {
749  // Set the INDRA-specific general identification code for the given telescope
750 
751  if (idt->InheritsFrom(KVIDPhoswich::Class())) idt->SetIDCode(IDCodes::ID_PHOSWICH);
752  else if (idt->InheritsFrom(KVIDINDRACsI::Class())) idt->SetIDCode(IDCodes::ID_CSI_PSA);
753  else if (idt->InheritsFrom(KVIDSiCsI::Class())) idt->SetIDCode(IDCodes::ID_SI_CSI);
754  else if (idt->InheritsFrom(KVIDChIoSi::Class())) idt->SetIDCode(IDCodes::ID_CI_SI);
755  else if (idt->InheritsFrom(KVIDChIoCsI::Class())) idt->SetIDCode(IDCodes::ID_CI_CSI);
756  else if (idt->InheritsFrom(KVIDChIoSi75::Class())) idt->SetIDCode(IDCodes::ID_CI_SI75);
757  else if (idt->InheritsFrom(KVIDSi75SiLi::Class())) idt->SetIDCode(IDCodes::ID_SI75_SILI);
758  else if (idt->InheritsFrom(KVIDChIoSi75::Class())) idt->SetIDCode(IDCodes::ID_CI_SI75);
759  else {
760  Error("SetIDCodeForIDTelescope", "Request for telescope name=%s of unknown class=%s",
761  idt->GetName(), idt->IsA()->GetName());
762  }
763 }
764 
765 
766 
768 
770 {
772 }
773 
774 
775 
801 
803 {
804  // Sets the KVCsI::fPinLaser member of each CsI detector with the number of the
805  // pin laser associated for the stability control of these detectors.
806  //
807  // We look for a file with the following format:
808  //
809  // CSI_0101 1
810  // CSI_0102 1
811  // CSI_0103 1
812  // CSI_0104 1
813  // etc.
814  //
815  // i.e. 'name of CsI detector' 'number of pin laser (1-8)'
816  // Comment lines must begin with '#'
817  //
818  // The default name of this file is defined in .kvrootrc by
819  //
820  // INDRADB.CsIPinCorr: CsI_PILA.dat
821  //
822  // Dataset-specific version can be specified:
823  //
824  // INDRA_e999.INDRADB.CsIPinCorr: CorrCsIPin_2054.dat
825  //
826  // This file should be in the directory corresponding to the current dataset,
827  // i.e. in $KVROOT/KVFiles/name_of_dataset
828 
829  ifstream pila_file;
830  if (gDataSet->OpenDataSetFile(gDataSet->GetDataSetEnv("INDRADB.CsIPinCorr", ""), pila_file)) {
831 
832  Info("SetPinLasersForCsI", "Setting correspondance CsI-PinLaser using file %s.",
833  (const char*)gDataSet->GetDataSetEnv("INDRADB.CsIPinCorr", ""));
834  // read file, set correspondance
835  KVString line;
836  line.ReadLine(pila_file);
837  while (pila_file.good()) {
838  if (!line.BeginsWith("#")) {
839  line.Begin(" ");
840  KVString detname = line.Next(kTRUE);
841  KVCsI* det = (KVCsI*)GetDetector(detname.Data());
842  Int_t pila = line.Next(kTRUE).Atoi();
843  if (det) {
844  det->SetPinLaser(pila);
845  }
846  }
847  line.ReadLine(pila_file);
848  }
849  pila_file.close();
850  }
851  else {
852  Info("SetPinLasersForCsI", "File %s not found. Correspondance Csi-PinLaser is unknown.",
853  (const char*)gDataSet->GetDataSetEnv("CsIPinCorr", ""));
854  }
855 }
856 
857 
858 
859 
865 
867 {
868  // Overrides KVASMultiDetArray::GetDetectorEvent.
869  // If the list of fired detectors is given (meaning we are reading raw data)
870  // then we check that what we have read is in fact an INDRA event
871  // (see KVINDRATriggerInfo::IsINDRAEvent()) : if not, we do not try to find the hit groups.
872 
873  if (((fired_dets && fired_dets->GetEntries()) || fFiredDetectors.GetEntries())
874  && (GetTriggerInfo() && !GetTriggerInfo()->IsINDRAEvent())) return;
875  KVMultiDetArray::GetDetectorEvent(detev, fired_dets);
876 }
877 
878 
879 
880 
892 
894 {
895  // Special INDRA group reconstructors:
896  //
897  // * for data:
898  // - KVINDRAForwardGroupReconstructor rings 1-9
899  // - KVINDRABackwardGroupReconstructor rings 10-17
900  // - KVINDRAEtalonGroupReconstructor for groups with etalon telescopes
901  //
902  // * for filtered simulations:
903  // - KVINDRAFilterGroupReconstructor
904  // - KVINDRAFilterEtalonGroupReconstructor for groups with etalon telescopes
905 
906  KVGroupReconstructor* gr(nullptr);
907  if (GetGroup(g->GetName())) { // make sure group belongs to us
908  // etalons ?
909  if (g->GetDetectorByType("SILI") || g->GetDetectorByType("SI75")) {
910  if (IsSimMode())
911  gr = KVGroupReconstructor::Factory("INDRA.etalonFilter", g);
912  else
913  gr = KVGroupReconstructor::Factory("INDRA.etalon", g);
914  }
915  else {
916  if (IsSimMode()) return KVGroupReconstructor::Factory("INDRA.Filter", g);
917  KVINDRADetector* id = (KVINDRADetector*)g->GetDetectors()->First();
918  if (id->GetRingNumber() < 10) {
919  gr = KVGroupReconstructor::Factory("INDRA.forward", g);
920  }
921  else {
922  gr = KVGroupReconstructor::Factory("INDRA.backward", g);
923  }
924  }
925  }
926  return gr;
927 }
928 
929 
930 
933 
935 {
936  // If "INDRA.EN" parameter has been set, we use it to set the event number
937 
939  if (GetReconParameters().HasValue64bit("INDRA.EN")) e->SetNumber(GetReconParameters().GetValue64bit("INDRA.EN"));
940 }
941 
942 
943 
949 
951 {
952  // Overrides base method in KVMultiDetArray.
953  //
954  // If we are reading old reconstructed data with EBYEDAT parameters, we need special
955  // treatment to decode the detector name & signal type.
956 
957  if (!l.GetBoolValue("INDRA.MESYTEC") && !l.GetBoolValue("INDRA.EBYEDAT")) {
958  // assume we are reading old recon data with parameters in list such as "ACQPAR.INDRA.SI_0201_PG"
959  fMesytecData = kFALSE;
960  fEbyedatData = kTRUE;
961  prepare_to_handle_new_raw_data();
962 
963  int N = l.GetNpar();
964  for (int i = 0; i < N; ++i) {
965  KVNamedParameter* np = l.GetParameter(i);
966 
967  KVString name(np->GetName());
968  if (name.BeginsWith("ACQPAR")) {
969  // 2 '.' => 3 values
970  int dots = name.GetNValues(".");
971  assert(dots == 3); // sanity check
972  name.Begin(".");
973  name.Next(); // "ACQPAR"
974  if (name.Next() != "INDRA") continue; // check name of array - somebody else's parameter ?
975  std::string parname(name.Next());
976  KVString detname;
977  KVString sig_type;
978  KVDetector* det = nullptr;
979  if (parname.find('_') != kNPOS) {
980  // try to split into '[detname]_[partype]'
981  detname = parname.substr(0, parname.rfind('_'));
982  sig_type = parname.substr(parname.rfind('_') + 1);
983  det = GetDetector(detname);
984  }
985  else {
986  sig_type = parname;
987  }
988  add_and_set_detector_signal(det, detname, np->GetDouble(), sig_type);
989  }
990  }
991  }
992  else {
993  fMesytecData = l.GetBoolValue("INDRA.MESYTEC");
994  fEbyedatData = l.GetBoolValue("INDRA.EBYEDAT");
996  }
997 }
998 
999 
1000 
1003 
1005 {
1006  // Override base method in order to read ChIo pressures for each run
1008  // if the actual database class inherits from KVINDRADB (historic INDRA data),
1009  // the ChIo pressures have already been read (& from a file with a different format)
1010  if (!db->InheritsFrom("KVINDRADB")) ReadChIoPressures(db);
1011 }
1012 
1013 
1014 
1018 
1020 {
1021  // Call this method just after opening a raw data file in order to perform any
1022  // necessary initialisations, depending on the type of data
1023 
1025 
1026  fMesytecData = kFALSE;
1027  fEbyedatData = kFALSE;
1028 #ifdef WITH_MESYTEC
1029 #ifdef WITH_MFM
1030  if (r->GetDataFormat() == "MFM") {
1031  TString crate = gDataSet->GetDataSetEnv("MesytecCrateConf", "");
1032  if (crate != "") {
1033  Info("InitialiseRawDataReading", "Setting Mesytec crate config for run %d, raw run number=%d",
1034  GetCurrentRunNumber(), r->GetRunNumberReadFromFile());
1035 
1036  auto raw_run_number = r->GetRunNumberReadFromFile()>0 ? r->GetRunNumberReadFromFile() : GetCurrentRunNumber();
1037  TString channel_conf_list = gDataSet->GetDataSetEnv("MesytecChannelsConf", "");
1038  if (channel_conf_list != "") {
1039  TEnv conf_list;
1040  if (conf_list.ReadFile(gDataSet->GetFullPathToDataSetFile(channel_conf_list), kEnvUser) == -1) {
1041  Fatal("InitialiseRawDataReading",
1042  "Could not open file containing names of Mesytec channel config for each run: %s",
1043  gDataSet->GetFullPathToDataSetFile(channel_conf_list).Data());
1044  }
1045  KVString files = conf_list.GetValue("File", "");
1046  files.Begin(" ");
1047  while (!files.End()) {
1048  KVString next_file = files.Next(kTRUE);
1049  KVNumberList runlist = conf_list.GetValue(Form("%s.RunList", next_file.Data()), "");
1050  if (runlist.Contains(raw_run_number)) {
1051  // found file for this run
1052  Info("InitialiseRawDataReading", "Using file %s for raw run number %d",
1053  next_file.Data(), raw_run_number);
1054  dynamic_cast<KVMFMDataFileReader*>(r)->InitialiseMesytecConfig(
1055  gDataSet->GetFullPathToDataSetFile(crate).Data(),
1056  gDataSet->GetFullPathToDataSetFile(next_file).Data()
1057  );
1058  }
1059  }
1060  }
1061  else {
1062  Fatal("InitialiseRawDataReading",
1063  "Name of file containing names of Mesytec channel config for each run should be defined in dataset variable %s.MesytecChannelsConf",
1064  GetDataSet().Data());
1065  }
1066  }
1067  }
1068 #endif
1069 #endif
1070 }
1071 
1072 
1073 #ifdef WITH_MFM
1074 #ifdef WITH_MESYTEC
1076 {
1077  // Read a raw data event from a Mesytec MFM Frame.
1078  //
1079  // All data is transferred to KVDetectorSignal objects, either associated to detectors of the
1080  // array (if they can be identified), either associated more globally with the array/event
1081  // itself. The latter are created as needed and go into the fExtraRawDataSignals list.
1082 
1083  if (!fMesytecData) {
1084  // first time we read data, we tweak the parameter names
1085  mesytec::module::set_data_type_alias("qdc_long", "TotLight"); // => CsI
1086  mesytec::module::set_data_type_alias("qdc_short", "R"); // => like old CsI 'R' (rapide) parameter
1087  mesytec::module::set_data_type_alias("tdc", "T"); // => like old 'marqueur de temps' parameters
1088  mesytec::module::set_data_type_alias("adc", "ADC"); // => Si or ChIo signals
1089 
1090  fMesytecData = kTRUE;
1091  }
1092  fReconParameters.SetValue64bit("INDRA.TS", f.GetTimeStamp());
1093  auto mfmfilereader = dynamic_cast<KVMFMDataFileReader*>(fRawDataReader);
1094  mfmfilereader->GetMesytecBufferReader().read_event_in_buffer(
1095  (const uint8_t*)f.GetPointUserData(), f.GetBlobSize(),
1096 #ifdef MESYTEC_DATA_NO_MDPP_NAMESPACE
1097 #ifdef MESYTEC_DATA_BUFFER_READER_CALLBACK_WITH_EVENT_AND_SETUP
1098  [ = ](const mesytec::event & evt, const mesytec::experimental_setup & setup) {
1099 #else
1100  [ = ](const mesytec::event & evt) {
1101 #endif
1102 #else
1103  [ = ](const mesytec::mdpp::event & evt) {
1104 #endif
1105 #ifndef MESYTEC_DATA_BUFFER_READER_CALLBACK_WITH_EVENT_AND_SETUP
1106  auto& setup = mfmfilereader->GetMesytecBufferReader().get_setup();
1107 #endif
1108  // loop over module data in event, set data in detectors when possible
1109 #ifdef MESYTEC_DATA_NO_PUBLIC_MEMBERS
1110  for (auto& mdat : evt.get_module_data()) {
1111  auto mod_id = mdat.get_module_id();
1112 #else
1113  for (auto& mdat : evt.modules) {
1114  auto mod_id = mdat.module_id;
1115 #endif
1116  auto& current_module = setup.get_module(mod_id);
1117  if (current_module.is_mdpp_module()) {
1118  // data for detectors from MDPP module
1119 #ifdef MESYTEC_DATA_NO_PUBLIC_MEMBERS
1120  for (auto& voie : mdat.get_channel_data()) {
1121  KVString detname(setup.get_detector(mod_id, voie.get_channel_number()));
1122  KVString sig_type(current_module.get_data_type_name(voie.get_data_type()));
1123  Double_t sig_data = voie.get_data();
1124 #else
1125  for (auto& voie : mdat.data) {
1126  KVString detname(setup.get_detector(mod_id, voie.channel));
1127  KVString sig_type(voie.data_type);
1128  Double_t sig_data = voie.data;
1129 
1130 #endif
1131  add_and_set_detector_signal(GetDetector(detname), detname, sig_data, sig_type);
1132  }
1133  }
1134  else if (current_module.is_mvlc_scaler()) {
1135  // data from 64 bit scalers in MVLC
1136  //
1137  // 4 data words of 16 bits (least significant is first word) => 64 bit scaler
1138 #ifdef MESYTEC_DATA_NO_PUBLIC_MEMBERS
1139  if (mdat.get_channel_data().size() == 4) {
1140 #else
1141  if (mdat.data.size() == 4) {
1142 #endif
1143  ULong64_t x = 0;
1144  int i = 0;
1145 #ifdef MESYTEC_DATA_NO_PUBLIC_MEMBERS
1146  for (auto& d : mdat.get_channel_data()) x += ((uint64_t)d.get_data_word()) << (16 * (i++));
1147 #else
1148  for (auto& d : mdat.data) x += ((uint64_t)d.data_word) << (16 * (i++));
1149 #endif
1150  fReconParameters.SetValue64bit(current_module.name.c_str(), x);
1151  }
1152 // else {
1153 // Warning("handle_raw_data_event_mfmframe_mesytec_mdpp",
1154 // "Scaler data %s is corrupt : %d words instead of 4",
1155 // current_module.name.c_str(), mdat.data.size());
1156 // }
1157  }
1158  }
1159  },
1160  f.GetRevision()
1161  );
1162  return kTRUE;
1163 }
1164 #endif
1165 #endif
1166 
1168 {
1169  // Use file given by fullpath to set the real thicknesses of the detectors.
1170  //
1171  // Any detector which is not in the file will be left with its nominal thickness.
1172  //
1173  // See KVMultiDetArray::set_detector_thicknesses() for more info on file format.
1174  // Unlike KVMultiDetArray::set_detector_thicknesses() however, here only the active layer thickness
1175  // for different detectors can be specified, not the full set of asbsorber thicknesses for a multi-layer
1176  // detector.
1177  //
1178  // NOTE: KVINDRA::SetDetectorThicknesses() will not actually change the thickness of any
1179  // detector (unlike KVMultiDetArray::SetDetectorThicknesses() which changes directly both the
1180  // the KVDetector thicknesses and the size of the associated TGeoShape in the geometry).
1181  // As it is too difficult to modify the INDRA geometry after it is built, all detector thicknesses
1182  // have to be known before the geometry is created. Therefore this method is called to read in and
1183  // store any informations in the INDRAGeometryBuilder before building the geometry.
1184 
1185  TEnv thickdat;
1186  if (thickdat.ReadFile(fullpath, kEnvUser) != 0) {
1187  Error("SetDetectorThicknesses", "Problem opening file %s", fullpath.Data());
1188  return;
1189  }
1190  Info("SetDetectorThicknesses", "Reading thicknesses of detectors from file %s", fullpath.Data());
1191 
1192  TIter it(thickdat.GetTable());
1193  TEnvRec* rec;
1194  while ((rec = (TEnvRec*)it())) {
1195  KVString val = rec->GetValue();
1196  if (!val.IsFloat()) {
1197  Warning("SetDetectorThicknesses", "Non-numeric value %s given for thickness of detector %s : no change",
1198  val.Data(), rec->GetName());
1199  }
1200  else {
1201  if (TString(rec->GetName()).BeginsWith("SI")) // "SI", "SI75", "SILI" thicknesses given in microns
1202  fIGB->SetDetectorThickness(rec->GetName(), val.Atof()*KVUnits::um);
1203  else
1204  fIGB->SetDetectorThickness(rec->GetName(), val.Atof());
1205  }
1206  }
1207 }
1208 
int Int_t
unsigned int UInt_t
ROOT::R::TRInterface & r
#define d(i)
#define f(i)
#define e(i)
bool Bool_t
unsigned char UChar_t
char Char_t
float Float_t
constexpr Bool_t kFALSE
double Double_t
constexpr Ssiz_t kNPOS
constexpr Bool_t kTRUE
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 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 np
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
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
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 Atom_t Time_t type
char name[80]
R__EXTERN TGeoManager * gGeoManager
char * Form(const char *fmt,...)
Build INDRA geometry from Huguet CAO infos.
virtual void SetType(const Char_t *str)
Definition: KVBase.h:172
static ValType GetDataSetEnv(const KVString &dataset, const KVString &type, const ValType &defval)
Definition: KVBase.h:304
Ionisation chamber detectors of the INDRA multidetector array.
Definition: KVChIo.h:30
Double_t GetPressure() const override
Definition: KVChIo.h:46
void SetPressure(Double_t P) override
Definition: KVChIo.h:41
CsI(Tl) scintillation detectors of the INDRA multidetector array.
Definition: KVCsI.h:16
void SetPinLaser(Int_t n)
Definition: KVCsI.h:33
CHIO pressure parameters.
virtual void SetPressure(UInt_t n, Float_t pressure)
virtual Float_t GetPressure(UInt_t chio_number)
virtual KVRList * GetLinks(const Char_t *key) const
Returns the list of records linked to this record in table "key".
Definition: KVDBRecord.cpp:206
Description of an experimental run in database ,,.
Definition: KVDBRun.h:40
virtual Bool_t AddTable(KVDBTable *table)
Definition: KVDataBase.cpp:84
KVString GetDataSetEnv(const Char_t *type, const Char_t *defval="") const
Definition: KVDataSet.cpp:784
TString GetFullPathToDataSetFile(const Char_t *filename)
Definition: KVDataSet.cpp:1926
Bool_t OpenDataSetFile(const Char_t *filename, std::ifstream &file)
List of hit groups in a multidetector array.
GANIL VXI/VME 16 bit (maximum) EBYEDAT acquisition parameter.
UShort_t GetData() const
Base class to describe database of an experiment ,,.
Definition: KVExpDB.h:20
const KVNumberList & GetRunList() const
Definition: KVExpDB.h:101
virtual void LinkRecordToRunRange(KVDBRecord *rec, UInt_t first_run, UInt_t last_run)
Definition: KVExpDB.cpp:90
Bool_t FindCalibFile(const Char_t *type, TString &fullpath, const TString &array_name="") const
Definition: KVExpDB.cpp:486
Reads GANIL acquisition files (EBYEDAT)
const KVSeqCollection & GetFiredDataParameters() const
Specialised geometry importer for INDRA.
void ImportGeometry(std::vector< INDRAGeometryBuilder::theta_phi >)
Use the known (theta,phi) positions of the centre of each CsI/phoswich in order to scan the array.
void SetNameCorrespondanceList(const Char_t *)
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:19
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:84
KVDetector * GetDetector(UInt_t n) const
virtual void SetIDCode(UShort_t c)
UInt_t GetSize() const
Base class for detectors of INDRA array.
UInt_t GetRingNumber() const
KVINDRADetector * GetChIo() const
INDRA multidetector array geometry.
Definition: KVINDRA.h:66
void Build(Int_t run=-1) override
Correspondance between CsI detectors and pin lasers is set up if known.
Definition: KVINDRA.cpp:119
KVINDRA()
Definition: KVINDRA.cpp:85
KVGroupReconstructor * GetReconstructorForGroup(const KVGroup *) const override
Definition: KVINDRA.cpp:893
virtual KVChIo * GetChIoOf(const Char_t *detname)
Definition: KVINDRA.cpp:171
void handle_ebyedat_raw_data_parameter(const char *param_name, uint16_t val)
Definition: KVINDRA.cpp:417
void SetDetectorParametersForRun(KVDBRun *, const TString &="") override
Override base method in order to set ChIo pressures (if defined)
Definition: KVINDRA.cpp:623
void GetDetectorEvent(KVDetectorEvent *detev, const TSeqCollection *fired_dets=0) override
Definition: KVINDRA.cpp:866
void SetPinLasersForCsI()
Definition: KVINDRA.cpp:802
void copy_fired_parameters_to_recon_param_list() override
Definition: KVINDRA.cpp:446
KVLayer * GetChIoLayer()
Definition: KVINDRA.cpp:189
Bool_t handle_raw_data_event_mfmframe_mesytec_mdpp(const MFMMesytecMDPPFrame &) override
Definition: KVINDRA.cpp:1075
void SetChIoPressures(KVDBRun *)
Definition: KVINDRA.cpp:555
static Char_t SignalTypes[16][3]
Use this static array to translate EBaseIndra_type signal type to a string giving the signal type.
Definition: KVINDRA.h:69
void FillListsOfDetectorsByType()
Fill lists of ChIo, Si, CsI and phoswich.
Definition: KVINDRA.cpp:138
TString GetCsIIDType() const
Definition: KVINDRA.cpp:769
void SetReconParametersInEvent(KVReconstructedEvent *) const override
If "INDRA.EN" parameter has been set, we use it to set the event number.
Definition: KVINDRA.cpp:934
void PerformClosedROOTGeometryOperations() override
Definition: KVINDRA.cpp:368
void SetTrigger(UChar_t trig)
Definition: KVINDRA.cpp:204
void SetRawDataFromReconEvent(KVNameValueList &) override
Definition: KVINDRA.cpp:950
void MakeCalibrationTables(KVExpDB *) override
Override base method in order to read ChIo pressures for each run.
Definition: KVINDRA.cpp:1004
virtual KVINDRADetector * GetDetectorByType(UInt_t cou, UInt_t mod, UInt_t type) const
Definition: KVINDRA.cpp:240
void SetNamesOfIDTelescopes() const
Definition: KVINDRA.cpp:314
void SetIDCodeForIDTelescope(KVIDTelescope *) const override
Set the INDRA-specific general identification code for the given telescope.
Definition: KVINDRA.cpp:747
void ReadChIoPressures(KVExpDB *)
Definition: KVINDRA.cpp:486
void InitialiseRawDataReading(KVRawDataReader *) override
Definition: KVINDRA.cpp:1019
void set_detector_thicknesses(const TString &) override
Definition: KVINDRA.cpp:1167
Bool_t handle_raw_data_event_mfmframe_ebyedat(const MFMEbyedatFrame &) override
Definition: KVINDRA.cpp:688
void BuildGeometry()
Definition: KVINDRA.cpp:634
Bool_t handle_raw_data_event_ebyedat(KVGANILDataReader &) override
Definition: KVINDRA.cpp:652
Read MFM format acquisition data.
mesytec::buffer_reader & GetMesytecBufferReader() const
static KVIonRangeTable * GetRangeTable()
Definition: KVMaterial.cpp:158
virtual void GetDetectorEvent(KVDetectorEvent *detev, const TSeqCollection *fired_params=0)
virtual void InitialiseRawDataReading(KVRawDataReader *)
virtual void SetDetectorParametersForRun(KVDBRun *, const TString &="")
virtual void copy_fired_parameters_to_recon_param_list()
virtual void MakeCalibrationTables(KVExpDB *)
virtual void SetRawDataFromReconEvent(KVNameValueList &)
virtual void SetReconParametersInEvent(KVReconstructedEvent *) const
Copy any parameters in fReconParameters in to the reconstructed event parameter list.
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
A generic named parameter storing values of different types.
Strings used to represent a set of ranges of values.
Definition: KVNumberList.h:85
Bool_t Contains(Int_t val) const
returns kTRUE if the value 'val' is contained in the ranges defined by the number list
Bool_t IsEmpty() const
Definition: KVNumberList.h:175
Wrapper for TRefArray adding some functionality.
Definition: KVRList.h:37
Abstract base class for reading raw (DAQ) data.
Event containing KVReconstructedNucleus nuclei reconstructed from hits in detectors.
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
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)
void Reset()
const char * GetName() const override
static TClass * Class()
virtual void SetName(const char *name)
TClass * IsA() const override
virtual Bool_t InheritsFrom(const char *classname) const
Double_t Atof() const
Bool_t IsFloat() const
const char * Data() const
Bool_t BeginsWith(const char *s, ECaseCompare cmp=kExact) const
TString & Prepend(char c, Ssiz_t rep=1)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
unsigned long long ULong64_t
TLine * line
Double_t x[n]
gr SetName("gr")
TGraphErrors * gr
const long double torr
pressures
Definition: KVUnits.h:78
const long double um
Definition: KVUnits.h:68
const long double mbar
Definition: KVUnits.h:81
void Error(const char *location, const char *fmt,...)
void Info(const char *location, const char *fmt,...)
void Fatal(const char *location, const char *fmt,...)
void Warning(const char *location, const char *fmt,...)
rec
TLine l
ClassImp(TPyArg)