KaliVeda
Toolkit for HIC analysis
KVIDZAFromZGrid.cpp
1 //Created by KVClassFactory on Tue Mar 8 10:00:16 2016
2 //Author: Diego Gruyer
3 
4 #include "KVIDZAFromZGrid.h"
5 #include "TMultiGraph.h"
6 #include "KVIDZALine.h"
7 #include "TCanvas.h"
8 
12 
13 
14 
15 
20 {
21  // Default constructor
22  // Grid is declared as a 'ZOnlyGrid' by default (this is internal mechanics)
23 
24  init();
25  fFits.SetOwner();
26  SetOnlyZId();
27  fIgnoreMassID = false;
28 }
29 
30 
31 
32 
40 
42 {
43  // This method copies the current state of 'this' object into 'obj'
44  // You should add here any member variables, for example:
45  // (supposing a member variable KVIDZAFromZGrid::fToto)
46  // CastedObj.fToto = fToto;
47  // or
48  // CastedObj.SetToto( GetToto() );
49 
50  KVIDZAGrid::Copy(obj);
52  i.fZmaxInt = fZmaxInt;
53  i.fPIDRange = fPIDRange;
54  i.fZminInt = fZminInt;
55  fTables.Copy(i.fTables);
58 }
59 
60 
61 
62 
71 
72 void KVIDZAFromZGrid::ReadFromAsciiFile(std::ifstream& gridfile)
73 {
74 // fPIDRange = kFALSE;
75 // KVIDGraph::ReadFromAsciiFile(gridfile);
76 // if (GetParameters()->HasParameter("PIDRANGE")) {
77 // fPIDRange = kTRUE;
78 // fZmaxInt = GetParameters()->GetIntValue("PIDRANGE");
79 // LoadPIDRanges();
80 // }
81 
82  fPIDRange = kFALSE;
83 // fHasMassCut = kFALSE;
85 
86 // if (GetIdentifier("MassID")) fHasMassCut = kTRUE;
87 
88  if (GetParameters()->HasParameter("PIDRANGE")) {
89  fPIDRange = kTRUE;
90  TString pidrange = GetParameters()->GetStringValue("PIDRANGE");
91  if (pidrange.Contains("-")) {
92  TString min = (pidrange(0, pidrange.Index("-")));
93  fZminInt = min.Atoi();
94  min = (pidrange(pidrange.Index("-") + 1, pidrange.Length()));
95  fZmaxInt = min.Atoi();
96  }
97  else {
98  fZminInt = 1;
99  fZmaxInt = pidrange.Atoi();
100  }
101  LoadPIDRanges();
102  }
103  // if <PARAMETER> IgnoreMassID=1 appears in file, we are only using the PID intervals to clean
104  // up a messy de-e plot, not to give mass identification. particles will only be identified in Z.
105  if (GetParameters()->HasParameter("IgnoreMassID") && GetParameters()->GetIntValue("IgnoreMassID") == 1)
106  fIgnoreMassID = true;
107  else
108  fIgnoreMassID = false;
109 }
110 
111 
112 
114 
115 void KVIDZAFromZGrid::WriteToAsciiFile(std::ofstream& gridfile)
116 {
117  ExportToGrid();
118  KVIDGraph::WriteToAsciiFile(gridfile);
119 }
120 
121 
122 
124 
126 {
127  fZminInt = 100000;
128  fZmaxInt = 0;
129 
130  KVIDentifier* id = 0;
131  TIter it(GetIdentifiers());
132  while ((id = (KVIDentifier*)it())) {
133  int zz = id->GetZ();
134  if (!GetParameters()->HasParameter(Form("PIDRANGE%d", zz))) continue;
135  KVString mes = GetParameters()->GetStringValue(Form("PIDRANGE%d", zz));
136  if (mes.IsWhitespace()) continue;
137  int type = (mes.Contains(",") ? 2 : 1);
138  interval_set* itv = new interval_set(zz, type);
139  itv->SetName(GetName());
140  mes.Begin("|");
141  while (!mes.End()) {
142  KVString tmp = mes.Next();
143  tmp.Begin(":");
144  int aa = tmp.Next().Atoi();
145  KVString val = tmp.Next();
146  double pidmin, pidmax, pid;
147  if (type == 1) itv->add(aa, val.Atof());
148  else if (type == 2) {
149  val.Begin(",");
150  pidmin = val.Next().Atof();
151  pid = val.Next().Atof();
152  pidmax = val.Next().Atof();
153  itv->add(aa, pid, pidmin, pidmax);
154 // itv->add(aa, pid, pid-0.02, pid+0.02);
155  }
156  }
157  if (zz < fZminInt) fZminInt = zz;
158  if (zz > fZmaxInt) fZmaxInt = zz;
159  fTables.Add(itv);
160  }
161  fPIDRange = kTRUE;
162  // PrintPIDLimits();
163 }
164 
165 
166 
168 
170 {
171  fTables.Clear("all");
172  fPIDRange = kFALSE;
173 }
174 
175 
176 
178 
180 {
181  fTables.Clear("all");
182  LoadPIDRanges();
183 }
184 
185 
186 
188 
190 {
191  interval_set* itv = 0;
192  TIter it(&fTables);
193  while ((itv = (interval_set*)it())) if (itv->GetZ() == zint) return itv;
194  return 0;
195 }
196 
197 
198 
205 
207 {
208 // ((interval_set*)fTables.At(12))->fIntervals.ls();
209 
210 // for (int zz = fZminInt; zz <= fZmaxInt; zz++) {
211 // Info("PrintPIDLimits", "Z=%2d [%.4lf %.4lf]", zz, ((interval_set*)fTables.At(zz - fZminInt))->fPIDmins.at(0),
212 // ((interval_set*)fTables.At(zz - fZminInt))->fPIDmaxs.at(((interval_set*)fTables.At(zz - fZminInt))->fNPIDs - 1));
213 // }
214 }
215 
216 
217 
219 
221 {
222  if (GetParameters()->HasParameter("PIDRANGE")) GetParameters()->RemoveParameter("PIDRANGE");
223  for (int ii = 1; ii < 30; ii++) {
224  if (GetParameters()->HasParameter(Form("PIDRANGE%d", ii))) GetParameters()->RemoveParameter(Form("PIDRANGE%d", ii));
225  }
226 }
227 
228 
229 
236 
237 int KVIDZAFromZGrid::is_inside(double pid) const
238 {
239  // Look for a set of mass-interval definitions in which the given PID
240  // falls (PID from linearisation of Z identification).
241  // In principle this should be the set corresponding to Z=nint(PID),
242  // but if not Z+/-1 are also tried.
243  // Returns the value of Z for the set found (or 0 if no set found)
244 
245  int zint = TMath::Nint(pid);
246  interval_set* it = GetIntervalSet(zint);
247  if (it) {
248  if (it->is_inside(pid)) return zint;
249  else if (it->is_above(pid)) {
250 
251  it = GetIntervalSet(zint + 1);
252  if (it && it->is_inside(pid)) return zint + 1;
253  else return 0;
254  }
255  else {
256  it = GetIntervalSet(zint - 1);
257  if (it && it->is_inside(pid)) return zint - 1;
258  else return 0;
259  }
260  }
261  else return 0;
262 }
263 
264 
265 
272 
274 {
275  // General initialisation method for identification grid.
276  // This method MUST be called once before using the grid for identifications.
277  // The ID lines are sorted.
278  // The natural line widths of all ID lines are calculated.
279  // The line with the largest Z (Zmax line) is found.
280 
281  SetOnlyZId();
283  // Zmax should be Z of last line in sorted list
284 
285  TIter it(GetIdentifiers());
286  KVIDentifier* id = 0;
287 
288  fZMax = 0;
289  while ((id = (KVIDentifier*)it())) {
290  if (!id->InheritsFrom("KVIDZALine")) continue;
291  int zz = ((KVIDZALine*)id)->GetZ();
292  if (zz > fZMax) fZMax = zz;
293  }
294 
295  // set to true if grid has a limited region for mass identification, indicated by an info "MassID"
296  fHasMassIDRegion = (GetInfos()->FindObject("MassID") != nullptr);
297 
298  // set up mass fits (if any)
299  fFits.Clear();
300  if (GetParameters()->HasStringParameter("MASSFITS")) {
301  KVNumberList zlist(GetParameters()->GetStringValue("MASSFITS"));
302  for (auto z : zlist) {
303  auto massfit = GetParameters()->GetTStringValue(Form("MASSFIT_%d", z));
304  massfit.ReplaceAll(":", "=");
305  KVNameValueList fitparams;
306  fitparams.Set(massfit);
307  fFits.Add(new KVMultiGaussIsotopeFit(z, fitparams));
308  }
309  }
310 }
311 
312 
313 
315 
317 {
318  double P;
319  auto A = fitfunc->GetA(idr->PID, P);
320  if (A) {
321  idr->A = A;
322  idr->PID = fitfunc->GetInterpolatedA(idr->PID);
323  if (P > 0.5) idr->IDquality = KVIDZAGrid::kICODE0; // probability of A is >50%
324  else idr->IDquality = KVIDZAGrid::kICODE3;// OK, slight ambiguity of A
325  }
326  else {
327  // returned A=0 => background noise
329  return false;
330  }
331  return true;
332 }
333 
334 
335 
347 
349 {
350  // Fill the KVIdentificationResult object with the results of identification for point (x,y)
351  // corresponding to some physically measured quantities related to a reconstructed nucleus.
352  //
353  // If identification is successful, idr->IDOK = true.
354  // In this case, idr->Aident and idr->Zident indicate whether isotopic or only Z identification
355  // was acheived.
356  //
357  // In case of unsuccessful identification, idr->IDOK = false,
358  // BUT idr->Zident and/or idr->Aident may be true: this is to indicate which kind of
359  // identification was attempted but failed (this changes the meaning of the quality code)
360 
361  idr->Aident = idr->Zident = kFALSE;
362 
363  KVIDZAGrid::Identify(x, y, idr);
364  idr->Zident = kTRUE; // meaning Z identification was attempted, even if it failed
365  if (!idr->IDOK) return;
366 
367  bool have_pid_range_for_Z = fPIDRange && (idr->Z <= fZmaxInt) && (idr->Z > fZminInt - 1);
368  auto mass_fit_for_Z = GetMultiGaussFit(idr->Z);
369  bool have_mass_fit_for_Z = (mass_fit_for_Z != nullptr);
370  bool mass_id_success = false;
371 
372  if ((have_mass_fit_for_Z || have_pid_range_for_Z)
373  && (!fHasMassIDRegion || idr->HasFlag(GetName(), "MassID"))) { // if a mass ID region is defined, we must be inside it
374  // try mass identification
375  if (have_mass_fit_for_Z)
376  mass_id_success = MassIdentificationFromMultiGaussFit(mass_fit_for_Z, idr);
377  else
378  mass_id_success = (DeduceAfromPID(idr) > 0);
379  if (mass_id_success) {
380  // mass identification was at least attempted
381  // make sure grid's quality code is consistent with KVIdentificationResult
382  const_cast<KVIDZAFromZGrid*>(this)->fICode = idr->IDquality;
383  idr->Aident = kTRUE; // meaning A identification was attempted, even if it failed
384  }
385  else {
386  // the pid falls outside of any mass ranges for a Z which has assigned isotopes
387  // therefore although the Z identification was good, we cannot consider this
388  // particle to be identified
389  const_cast<KVIDZAFromZGrid*>(this)->fICode = kICODE4;
390  idr->IDquality = fICode; // otherwise identfication result quality code is not coherent with comment (see below)
391  }
392  idr->IDOK = (fICode < kICODE4);
393  }
394 
395  // ignore isotopic successful isotopic identification if fIgnoreMassID=true
396  if (fIgnoreMassID && idr->IDOK && idr->Aident) idr->Aident = false;
397 
398  // set comments in identification result
399  switch (fICode) {
400  case kICODE0:
401  idr->SetComment("ok");
402  break;
403  case kICODE1:
404  if (mass_id_success) idr->SetComment("slight ambiguity of A, which could be larger");
405  else idr->SetComment("slight ambiguity of Z, which could be larger");
406  break;
407  case kICODE2:
408  if (mass_id_success) idr->SetComment("slight ambiguity of A, which could be smaller");
409  else idr->SetComment("slight ambiguity of Z, which could be smaller");
410  break;
411  case kICODE3:
412  if (mass_id_success) idr->SetComment("slight ambiguity of A, which could be larger or smaller");
413  else idr->SetComment("slight ambiguity of Z, which could be larger or smaller");
414  break;
415  case kICODE4:
416  if (mass_id_success) idr->SetComment("point is outside of mass identification range");
417  else idr->SetComment("point is in between two lines of different Z, too far from either to be considered well-identified");
418  break;
419  case kICODE5:
420  if (mass_id_success) idr->SetComment("point is in between two isotopes A & A+2 (e.g. 5He, 8Be, 9B)");
421  else idr->SetComment("point is in between two lines of different Z, too far from either to be considered well-identified");
422  break;
423  case kICODE6:
424  idr->SetComment("(x,y) is below first line in grid");
425  break;
426  case kICODE7:
427  idr->SetComment("(x,y) is above last line in grid");
428  break;
429  default:
430  idr->SetComment("no identification: (x,y) out of range covered by grid");
431  }
432 }
433 
434 
435 
436 
442 
444 {
445  // First look for a set of mass intervals in which the PID of the identification result falls,
446  // if there is one (see KVIDZAFromZGrid::is_inside).
447  // If an interval set is found for a Z different to the original identification, idr->Z is changed.
448  // Then call interval_set::eval for the mass interval for this Z.
449 
450  int zint = is_inside(idr->PID);
451  if (!zint) return -1;
452  if (zint != idr->Z) idr->Z = zint;
453 
454  double res = 0.;
455  interval_set* it = GetIntervalSet(zint);
456  if (it) res = it->eval(idr);
457  return res;
458 }
459 
460 
461 
462 
464 
466 {
468  KVNumberList pids;
469  interval_set* itvs = 0;
470  TIter npid(GetIntervalSets());
471  while ((itvs = (interval_set*)npid())) {
472  if (!itvs->GetNPID()) continue;
473  pids.Add(itvs->GetZ());
474  }
475  GetParameters()->SetValue("PIDRANGE", pids.AsString());
476 
477  itvs = 0;
478  TIter next(GetIntervalSets());
479  while ((itvs = (interval_set*)next())) {
480  if (!itvs->GetNPID()) continue;
481  KVString par = Form("PIDRANGE%d", itvs->GetZ());
482  KVString val = "";
483  interval* itv = 0;
484  TIter ni(itvs->GetIntervals());
485  while ((itv = (interval*)ni())) {
486  val += Form("%d:%lf,%lf,%lf|", itv->GetA(), itv->GetPIDmin(), itv->GetPID(), itv->GetPIDmax());
487  }
488  val.Remove(val.Length() - 1);
489  GetParameters()->SetValue(par.Data(), val.Data());
490  }
491 }
492 
493 
494 
495 
496 
498 
500 {
501  double pid = idr->PID;
502  if (pid < 0.5) return 0.;
503  // calculate interpolated mass from PID
504  double res = fPIDs.Eval(pid);
505  int ares = 0;
506 
508 
509  // look for mass interval PID is in
510  // in case it falls between two intervals remember also the interval
511  // immediately to the left & right of the PID
512  interval* left_int(nullptr), *right_int(nullptr);
513  interval* inter;
514  TIter it(&fIntervals);
515  while ((inter = (interval*)it())) {
516  if (inter->is_inside(pid)) {
517  ares = inter->GetA();
518  break;
519  }
520  else if (inter->is_left_of(pid)) {
521  left_int = inter;
522  }
523  else if (!right_int && inter->is_right_of(pid)) {
524  right_int = inter;
525  }
526  }
527  if (ares != 0) {
528  // the PID is inside a defined mass interval
529  idr->A = ares;
530  idr->PID = res;
532  }
533  else {
534  // the PID is not inside a defined mass interval
535  //
536  // * if it is in between two consecutive masses i.e. A and A+1 then it is
537  // Z- and A-identified with a slight ambiguity of A
538  // * if it is in between two non-consecutive masses i.e. A and A+2 then it
539  // is not identified (e.g. 5He, 8Be, 9B)
540  if (!right_int || !left_int) {
541  // case where no left or right interval were found
542  // to prevent from crashes but should not appen
543  idr->A = ares;
544  idr->PID = res;
546  }
547  else {
548  int dA = right_int->GetA() - left_int->GetA();
549  if (dA == 1) {
550  // OK, slight ambiguity of A
551  ares = TMath::Nint(res);
552  idr->A = ares;
553  idr->PID = res;
555  }
556  else {
557  // in a hole where no isotopes should be (e.g. 5He, 8Be, 9B)
558  idr->A = ares;
559  idr->PID = res;
561  }
562  }
563  }
564  }
565  else {
566  ares = TMath::Nint(res);
567  idr->A = ares;
568  idr->PID = res;
569  if (ares > fPIDs.GetX()[0] && ares < fPIDs.GetX()[fNPIDs - 1]) {
571  }
572  else {
574  }
575  }
576  return res;
577 }
578 
579 
580 
582 
583 bool interval_set::is_inside(double pid)
584 {
585  if (fType != KVIDZAFromZGrid::kIntType) return kTRUE;
586 
587 // Info("is_inside","min: %d max:%d npids:%d", ((interval*)fIntervals.At(0))->GetA(), ((interval*)fIntervals.At(fNPIDs-1))->GetA(), fNPIDs);
588 
589  if (pid > ((interval*)fIntervals.At(0))->GetPIDmin() && pid < ((interval*)fIntervals.At(fNPIDs - 1))->GetPIDmax()) return kTRUE;
590  else return kFALSE;
591 }
592 
593 
594 
596 
597 bool interval_set::is_above(double pid)
598 {
599  if (fType != KVIDZAFromZGrid::kIntType) return kTRUE;
600 
601  if (pid > ((interval*)fIntervals.At(fNPIDs - 1))->GetPIDmax()) return kTRUE;
602  else return kFALSE;
603 }
604 
605 
606 
607 
609 
611 {
612  if (!GetNPID()) return "-";
613  KVNumberList alist;
614  for (int ii = 0; ii < GetNPID(); ii++) alist.Add(((interval*)fIntervals.At(ii))->GetA());
615  return alist.AsString();
616 }
617 
618 
619 
621 
622 interval_set::interval_set(int zz, int type)
623 {
624  fType = type;
625  fZ = zz;
626  fNPIDs = 0;
627 }
628 
629 
630 
636 
637 void interval_set::add(int aa, double pid, double pidmin, double pidmax)
638 {
639 // if (fNPIDs && pid < fPIDs.GetX()[fNPIDs - 1]) {
640 // Error("add", "Please give me peaks in the right order for Z=%d and A=%d...", fZ, aa);
641 // return;
642 // }
643  if (fType == KVIDZAFromZGrid::kIntType && !(pid > pidmin && pid < pidmax)) {
644  return;
645  }
646 
647  fPIDs.SetPoint(fNPIDs, pid, aa);
649  if (pid) fIntervals.AddLast(new interval(fZ, aa, pid, pidmin, pidmax));
650  }
651  fNPIDs++;
652 }
653 
654 
655 
656 
657 
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
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 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 * Form(const char *fmt,...)
virtual void WriteToAsciiFile(std::ofstream &gridfile)
Definition: KVIDGraph.cpp:442
const KVList * GetInfos() const
Definition: KVIDGraph.h:344
virtual void ReadFromAsciiFile(std::ifstream &gridfile)
Definition: KVIDGraph.cpp:601
const Char_t * GetName() const override
Definition: KVIDGraph.cpp:1344
const KVNameValueList * GetParameters() const
Definition: KVIDGraph.h:314
const KVList * GetIdentifiers() const
Definition: KVIDGraph.h:324
void Initialize() override
Definition: KVIDGrid.cpp:218
Hybrid charge & mass identification grid.
Bool_t fHasMassIDRegion
set to true if grid has a limited region for mass identification, indicated by an info "MassID"
bool MassIdentificationFromMultiGaussFit(KVMultiGaussIsotopeFit *, KVIdentificationResult *) const
void Initialize() override
KVList fTables
intervals for mass id
interval_set * GetIntervalSet(int zint) const
void WriteToAsciiFile(std::ofstream &gridfile) override
void Identify(Double_t x, Double_t y, KVIdentificationResult *) const override
virtual double DeduceAfromPID(KVIdentificationResult *idr) const
KVUniqueNameList fFits
multi-gaussian fits for mass id
KVMultiGaussIsotopeFit * GetMultiGaussFit(int z) const
void SetOnlyZId(Bool_t=kTRUE) override
KVList * GetIntervalSets()
void ReadFromAsciiFile(std::ifstream &gridfile) override
void Copy(TObject &obj) const override
int is_inside(double pid) const
void Copy(TObject &) const override
Copy this to 'obj'.
Definition: KVIDZAGrid.cpp:66
UShort_t fZMax
largest Z of lines in grid
Definition: KVIDZAGrid.h:70
Int_t fICode
code de retour
Definition: KVIDZAGrid.h:85
void Identify(Double_t x, Double_t y, KVIdentificationResult *) const override
Base class for identification ridge lines corresponding to different nuclear species.
Definition: KVIDZALine.h:33
Base class for graphical cuts used in particle identification.
Definition: KVIDentifier.h:28
Full result of one attempted particle identification.
Bool_t IDOK
general quality of identification, =kTRUE if acceptable identification made
void SetComment(const Char_t *c)
Bool_t Aident
= kTRUE if A of particle established
Double_t PID
= "real" Z if Zident==kTRUE and Aident==kFALSE, "real" A if Zident==Aident==kTRUE
Int_t A
A of particle found (if Aident==kTRUE)
Int_t Z
Z of particle found (if Zident==kTRUE)
Int_t IDquality
specific quality code returned by identification procedure
Bool_t HasFlag(std::string grid_name, TString flag)
Bool_t Zident
=kTRUE if Z of particle established
Function for fitting PID mass spectra.
Handles lists of named parameters with different types, a list of KVNamedParameter objects.
void SetValue(const Char_t *name, value_type value)
void RemoveParameter(const Char_t *name)
Bool_t HasStringParameter(const Char_t *name) const
const Char_t * GetStringValue(const Char_t *name) const
bool Set(const KVString &)
TString GetTStringValue(const Char_t *name) const
Strings used to represent a set of ranges of values.
Definition: KVNumberList.h:85
const Char_t * AsString(Int_t maxchars=0) const
void Add(Int_t)
Add value 'n' to the list.
void Copy(TObject &obj) const override
void Add(TObject *obj) override
TObject * FindObject(const char *name) const override
void AddLast(TObject *obj) override
void Clear(Option_t *option="") override
TObject * At(Int_t idx) const 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
void Add(TObject *obj) override
virtual void SetPoint(Int_t i, Double_t x, Double_t y)
Double_t * GetX() const
virtual Double_t Eval(Double_t x, TSpline *spline=nullptr, Option_t *option="") const
virtual void SetName(const char *name)
Ssiz_t Length() const
Int_t Atoi() const
Double_t Atof() const
const char * Data() const
Bool_t IsWhitespace() const
TString & Remove(EStripType s, char c)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
TString & ReplaceAll(const char *s1, const char *s2)
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
TString GetListOfMasses()
bool is_inside(double pid)
bool is_above(double pid)
void add(int aa, double pid, double pidmin=-1., double pidmax=-1.)
double eval(KVIdentificationResult *idr)
interval_set(int zz, int type)
KVList * GetIntervals()
bool is_right_of(double pid)
double GetPID()
bool is_left_of(double pid)
double GetPIDmin()
double GetPIDmax()
bool is_inside(double pid)
Double_t y[n]
Double_t x[n]
void init()
double min(double x, double y)
Int_t Nint(T x)
ClassImp(TPyArg)