KaliVeda
Toolkit for HIC analysis
KVIntegerList.cpp
1 //Created by KVClassFactory on Mon Mar 29 14:58:00 2010
2 //Author: bonnet
3 #include "KVIntegerList.h"
4 #include "TClass.h"
5 #include "TMath.h"
6 #include "TObjArray.h"
7 #include "TObjString.h"
8 #include "TBuffer.h"
9 
11 
12 
13 
14 
18 void KVIntegerList::init()
19 {
20 //Initialisation
21 // La population est mise à 1
22  SetPopulation(1);
23  fRegle = new TArrayI(100);
24  fLimiteRegle = fRegle->fN - 1;
25  fMult = 0;
26  fLength = 0;
27 }
28 
29 
30 
33 
35 {
36 // Default constructor
37  init();
38 }
39 
40 
41 
44 
46 {
47 //Destructor
48 
49  if (fRegle) delete fRegle;
50  fRegle = 0;
51 
52 }
53 
54 
55 
58 
60 {
61 //protected method, Mise a zero de l'ensemble des valeurs
62  for (Int_t ii = 0; ii < fRegle->fN; ii += 1)
63  fRegle->AddAt(0, ii);
64 
65 }
66 
67 
68 
71 
73 {
74 //Classe dérivée de TNamed, Reinitialisation de l'object
75  TNamed::Clear();
76  ResetRegle();
78  fMult = 0;
79 
80 }
81 
82 
83 
86 
87 void KVIntegerList::Copy(TObject& obj) const
88 {
89 //Classe dérivée de TNamed, fait une copie vers l'objet obj
90  TNamed::Copy(obj);
91  ((KVIntegerList&)obj).DeducePartitionFromTNamed();
92  ((KVIntegerList&)obj).SetPopulation(this->GetPopulation());
93 
94 }
95 
96 
97 
100 
102 {
103 //Classe dérivée de TNamed, Imprime la liste formattée et la population associée
104  Info("Print", "%s : population %d", GetName(), GetPopulation());
105 }
106 
107 
108 
112 
114 {
115 //protected method, utilisée par le Streamer qui utilise le champ fName de la classe TNamed
116 //voir également KVIntegerList::DeducePartitionFromTNamed
117  KVString st(par);
118  st.Begin(" ");
119  TObjArray* toks = 0;
120  while (!st.End()) {
121  KVString tamp = st.Next();
122  Int_t val;
123  Int_t freq;
124  if (tamp.Contains("(")) {
125  if (!tamp.Contains(")")) {
126  KVError::Warning(this, "SetPartition", "%s ->pb de coherence dans les parentheses", tamp.Data());
127  return;
128  }
129  else {
130  toks = tamp.Tokenize("(");
131  val = ((TObjString*)toks->At(0))->GetString().Atoi();
132  freq = ((TObjString*)toks->At(1))->GetString().Atoi();
133  delete toks;
134  }
135  }
136  else {
137  val = tamp.Atoi();
138  freq = 1;
139  }
140  Add(val, freq);
141  }
142 
143 }
144 
145 
148 
150 {
151 //protected method, test si les grandeurs associées à la liste doivent etre mises a jour
152  return TestBit(kHastobeComputed);
153 
154 }
155 
156 
157 
161 
163 {
164 //Methode permettant de mettre à jour la liste, elle est a appeler si l'utilisateur a appelé précédemment
165 //une méthode Add ou Remove
166  if (ToBeUpdated())
167  Update();
168 }
169 
170 
171 
176 
178 {
179 //protected method, Mise a jour du nom de la partition (via SetName()), de sa longueur (fLength)
180 //Le bit kHastobeComputed es mis à 0 pour indiquer que la mise à jour a été faite
181 //
182  KVString snom = "", stamp = "";
183  for (Int_t ii = fLimiteRegle; ii >= 0; ii -= 1) {
184  Int_t contenu = fRegle->At(ii);
185  if (contenu > 0) {
186  //Formattage du nom de la partition
187  stamp.Form("%d", ii);
188  snom += stamp;
189  if (contenu > 1) {
190  stamp.Form("(%d)", contenu);
191  snom += stamp;
192  }
193  snom += " ";
194  }
195  }
196  if (snom != "") snom.Remove(snom.Length() - 1);
197  SetName(snom.Data());
198  fLength = snom.Length();
199 
201 
202 }
203 
204 
205 // void KVIntegerList::Fill(TArrayI* tab)
206 // {
207 // // La liste est re initialisée via KVIntegerList::Clear()
208 // //remplie, puis mise à jour KVIntegerList::Update()
209 // Clear();
210 // Add(tab);
211 // SetPopulation(1);
212 // Update();
213 //
214 // }
215 
216 
220 
222 {
223 // La liste est re initialisée via KVIntegerList::Clear()
224 //remplie, puis mise à jour KVIntegerList::Update()
225 
226  Clear();
227  Add(tab, mult);
228  SetPopulation(1);
229  Update();
230 
231 }
232 
233 
234 // void KVIntegerList::Fill(Double_t* tab,Int_t mult)
235 // {
236 // // La liste est re initialisée via KVIntegerList::Clear()
237 // //remplie, puis mise à jour KVIntegerList::Update()
238 //
239 // Clear();
240 // Add(tab,mult);
241 // SetPopulation(1);
242 // Update();
243 //
244 // }
245 
246 // void KVIntegerList::Fill(KVEvent* evt,Option_t* opt)
247 // {
248 // // La liste est re initialisée via KVIntegerList::Clear()
249 // //remplie, puis mise à jour KVIntegerList::Update()
250 //
251 // if (!evt) return;
252 // Clear();
253 //
254 // KVNucleus* nuc=0;
255 // while ( (nuc = (KVNucleus* )evt->GetNextParticle(opt)) )
256 // Add(nuc->GetZ());
257 // SetPopulation(1);
258 // Update();
259 //
260 // }
261 
262 
274 
276 {
277 //protected method, Ajout de "freq" fois la valeur val
278 //Verification de la taille du tableau (fLimiteRegle) et extension si besoin
279 //
280 //Routine appelée par toutes les autres routines Add(...), c'est celle-ci qui doit etre derivée
281 //dans les classes filles
282 //Le bit kHastobeComputed es mis à 1 pour indiquer la nécéssité de mettre a jour la partition
283 //voir KVIntegerList::CheckForUpdate()
284 //
285 //Cette methode incremente la multiplicité fMult
286 //
287 
288  if (val > fLimiteRegle) {
289  fRegle->Set(val + 1);
290  fLimiteRegle = val;
291  }
292  fMult += freq;
293  fRegle->AddAt(fRegle->At(val) + freq, val);
295 
296 }
297 
298 
299 
302 
304 {
305 //Ajout de "freq" fois la valeur val
306  add_values(val, freq);
307 
308 }
309 
310 
311 
314 
316 {
317 //Ajout d'un tableau d'entiers de "mult" valeurs
318  for (Int_t ii = 0; ii < mult; ii += 1)
319  Add(tab[ii], 1);
320 }
321 
322 
323 
326 
328 {
329 //Ajout de valeurs via un TArrayI
330  Int_t mult = tab->GetSize();
331  for (Int_t ii = 0; ii < mult; ii += 1)
332  Add(tab->At(ii), 1);
333 }
334 
335 
336 
339 
341 {
342 //Ajout d'un tableau de "mult" valeurs, version Double_t (Conversion Double_t -> Int_t (arrondi, TMath::Nint()))
343  for (Int_t ii = 0; ii < mult; ii += 1)
344  Add(tab[ii], 1);
345 }
346 
347 
348 
351 
353 {
354 //Ajout de la valeur val (Int_t)
355  Add(val, 1);
356 }
357 
358 
359 
362 
364 {
365 //Ajout de la valeur val version Double_t (Conversion Double_t -> Int_t (arrondi, TMath::Nint()))
366  Add(TMath::Nint(val), 1);
367 }
368 
369 
370 
373 
375 {
376 //Ajout de "freq" fois la valeur val
377 
378  Add(TMath::Nint(val), freq);
379 }
380 
381 
382 
383 
395 
397 {
398 //protected method, On retire "freq" fois la valeur val
399 //la methode retourne kTRUE si cette valeur etait effectivement presente, kFALSE sinon
400 //Si freq > la frequence initiale ( KVIntegerList::GetFrequency(Int_t ) )de la valeur, on la retire complétement
401 //Le bit kHastobeComputed es mis à 1 pour indiquer la nécéssité de mettre a jour la partition
402 //voir KVIntegerList::CheckForUpdate()
403 //Cette methode est appelée par les autres routines de type Remove...(...), c'est celle-ci qui doit etre derivée
404 //dans les classes filles
405 //
406 //Cette methode décremente la multiplicité fMult
407 //
408 
409  if (val > fLimiteRegle) return kFALSE;
410  else if (!Contains(val)) {
411  return kFALSE;
412  }
413  else {
414  Int_t freq_rel = TMath::Min(fRegle->At(val), freq);
415  fRegle->AddAt(TMath::Max(fRegle->At(val) - freq, 0), val);
416  fMult -= freq_rel;
418  return kTRUE;
419  }
420 
421 }
422 
423 
424 
430 
432 {
433 //On retire "freq" fois la valeur val
434 //la methode retourne kTRUE si cette valeur etait effectivement presente, kFALSE sinon
435 //Si freq > la frequence initiale ( KVIntegerList::GetFrequency(Int_t ) )de la valeur, on la retire complétement
436 //
437  return remove_values(val, freq);
438 
439 }
440 
441 
442 
449 
451 {
452 //On retire 1 fois la valeur val
453 //la methode retourne kTRUE si cette valeur etait effectivement presente, kFALSE sinon
454 //Le bit kHastobeComputed es mis à 1 pour indiquer la nécéssité de mettre a jour la partition
455 //voir KVIntegerList::CheckForUpdate()
456 //
457 
458  return Remove(val, 1);
459 
460 }
461 
462 
463 
471 
473 {
474 //Reture completement la valeur val
475 //la methode retourne kTRUE si cette valeur etait effectivement presente, kFALSE sinon
476 //
477 //Le bit kHastobeComputed es mis à 1 pour indiquer la nécéssité de mettre a jour la partition
478 //voir KVIntegerList::CheckForUpdate()
479 //
480 
481  return Remove(val, GetFrequency(val));
482 }
483 
484 
485 
488 
490 {
491 //Remet à 1 la population (comme dans le ctor)
492  SetPopulation(1);
493 }
494 
495 
496 
498 
500 {
501  return fPop;
502 }
503 
504 
505 
508 
510 {
511 //Incrémente la population de "pop" fois
512  fPop += pop;
513 }
514 
515 
516 
519 
521 {
522 //Initialise la population à "pop"
523  fPop = pop;
524 }
525 
526 
527 
529 
531 {
532 
533  return fMult;
534 
535 }
536 
537 /*
538 KVPartition* KVIntegerList::CreateKVPartition(Int_t mom_max)
539 {
540 //Cree un objet KVPartition
541 //l'argument mom_max, correspond à l'ordre maximal pour lequel, les moments
542 //de la partition sont calculés automatiquement voir KVPartition
543 //L'objet cree doit etre effacé après utilisation par l'utilisateur
544  KVPartition* par = new KVPartition(fLimiteRegle,mom_max);
545  TArrayI* tab = CreateTArrayI();
546  par->Fill(tab);
547  delete tab;
548  return par;
549 }
550 */
551 
557 
559 {
560 //Cree un objet TNamed
561 //le nom de la partition est le champ TNamed::fName et la population de la partition dans le champ TNamed::fTitle
562 //voir TNamed
563 //L'objet cree doit etre effacé après utilisation par l'utilisateur
564  TNamed* nm = new TNamed(GetName(), Form("%d", GetPopulation()));
565  return nm;
566 }
567 
568 
569 
570 
574 
576 {
577 //Cree un objet TArrayI de dimension fMult ( KVIntegerList::GetNbre() ) et rempli par ordre decroissant toutes les valeurs de la partition
578 //L'objet cree doit etre effacé après utilisation par l'utilisateur
579 
580  TArrayI* tab = new TArrayI(GetNbre());
581  Int_t mm = 0;
582  for (Int_t ii = fLimiteRegle; ii >= 0; ii -= 1) {
583  Int_t contenu = fRegle->At(ii);
584  for (Int_t cc = 0; cc < contenu; cc += 1)
585  tab->AddAt(ii, mm++);
586  }
587  return tab;
588 
589 }
590 
591 
592 
597 
599 {
600 //Cree un objet tableau d'entier de dimension fMult ( KVIntegerList::GetNbre() )
601 //et rempli par ordre decroissant toutes les valeurs de la partition
602 //L'objet cree doit etre effacé après utilisation par l'utilisateur
603 
604  Int_t* tab = new Int_t[GetNbre()];
605  Int_t mm = 0;
606  for (Int_t ii = fLimiteRegle; ii >= 0; ii -= 1) {
607  Int_t contenu = fRegle->At(ii);
608  for (Int_t cc = 0; cc < contenu; cc += 1)
609  tab[mm++] = ii;
610  }
611  return tab;
612 
613 }
614 
615 
616 
623 
625 {
626 //Classe dérivée de TNamed
627 //Compare deux objets de type KVIntegerList, le premier test concerne la longueur du nom (KVIntegerList::GetLengthName())
628 //Si elle est identique, on test caractere par caractere, les deux noms TNamed::GetName()
629 //Retourne 0 si les noms des deux KVIntegerList sont exactement les memes, -1 sinon;
630 //
631  const char* s1 = this->GetName();
632  const char* s2 = obj->GetName();
633 
634  Ssiz_t len1 = this->GetLengthName();
635 
636  if (len1 != ((KVIntegerList*)obj)->GetLengthName()) return -1;
637 
638  Int_t ii = 0;
639  while (s1[ii] == s2[ii]) {
640  if (ii == len1) return 0;
641  ii += 1;
642  }
643  return -1;
644 
645 }
646 
647 
648 
652 
654 {
655 //Retourne l'occurence de la valeur "val", si elle n'est pas présente
656 //dans la liste retourne -1
657  return (val <= fLimiteRegle ? fRegle->At(val) : -1);
658 
659 }
660 
661 
662 
666 
668 {
669 //Retourne kTRUE si la valeur "val" est dans la liste, kFALSE sinon
670 //dans la liste retourne -1
671  return (GetFrequency(val) > 0);
672 
673 }
674 
675 
676 
680 
682 {
683 //Retourne la longueur du nom de la partition formatée GetName()
684 // utilisée dans la methode Compare
685  return fLength;
686 
687 }
688 
689 
690 
697 
699 {
700 //Streamer specifique
701 //l'écriture dans un fichier root se fait par l'intermédiaire de la classe TNamed
702 //seul, le nom et la partition et sa population sont enregistrées dans le fichier
703 //la lecture utilise aussi le streamer de TNamed, puis il y a un appel a la routine
704 // protected DeducePartitionFromTNamed() qui permet de recréer complètement l'objet KVIntegerList
705  if (R__b.IsReading()) {
706  R__b.ReadClassBuffer(TNamed::Class(), this);
708  }
709  else {
710  SetTitle(Form("%d", GetPopulation()));
711  R__b.WriteClassBuffer(TNamed::Class(), this);
712  }
713 }
714 
715 
716 
721 
723 {
724 //protected method, Methode utilisee par le Streamer
725 //Récupère les champs de TNamed:fName et TNamed:fTitle
726 //et met à jour
729 
730 }
731 
732 
735 
737 {
738 //protected method, utilisee par le Streamer
739 
740  KVString st(GetTitle());
741  SetPopulation(st.Atoi());
742 
743 }
744 
745 
748 
750 {
751 //protected method, utilisee par le Streamer
752 
754 
755 }
756 
757 
758 
int Int_t
#define s1(x)
bool Bool_t
int Ssiz_t
char Char_t
constexpr Bool_t kFALSE
double Double_t
constexpr Bool_t kTRUE
const char Option_t
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 stamp
char * Form(const char *fmt,...)
Handle a list of positive integers (partition)
Definition: KVIntegerList.h:68
Int_t fMult
Nombre d'éléments dans la liste.
Definition: KVIntegerList.h:75
void Copy(TObject &named) const override
Classe dérivée de TNamed, fait une copie vers l'objet obj.
Int_t * CreateTableOfValues()
void Add(TArrayI *tab)
void Fill(Double_t* tab,Int_t mult);
void Print(Option_t *option="") const override
Classe dérivée de TNamed, Imprime la liste formattée et la population associée.
virtual Bool_t remove_values(Int_t val, Int_t freq)
Ssiz_t fLength
Longueur du nom de la liste/partition usilisée dans Compare.
Definition: KVIntegerList.h:76
virtual void DeducePartitionFromName()
protected method, utilisee par le Streamer
virtual void SetPartition(const Char_t *par)
Int_t fLimiteRegle
taille max de fRegle
Definition: KVIntegerList.h:73
void ResetPopulation()
Remet à 1 la population (comme dans le ctor)
virtual void add_values(Int_t val, Int_t freq)
virtual void DeducePartitionFromTNamed()
Ssiz_t GetLengthName() const
void AddPopulation(Int_t pop)
Incrémente la population de "pop" fois.
Int_t GetFrequency(Int_t val) const
Int_t fPop
population de la liste/partition consideree, permet le comptage de partitions identiques dansun lot d...
Definition: KVIntegerList.h:74
Bool_t Contains(Int_t val) const
TNamed * CreateTNamed()
KVPartition* CreateKVPartition(Int_t mom_max=5);.
TArrayI * fRegle
tableau d'entiers où sont stockée l'occurence des valeurs
Definition: KVIntegerList.h:72
void Clear(Option_t *option="") override
Classe dérivée de TNamed, Reinitialisation de l'object.
void Fill(Int_t *tab, Int_t mult)
void Fill(TArrayI* tab);
Int_t GetNbre() const
virtual void DeducePopulationFromTitle()
protected method, utilisee par le Streamer
void SetPopulation(Int_t pop)
Initialise la population à "pop".
Int_t GetPopulation() const
Bool_t Remove(Int_t val, Int_t freq)
TArrayI * CreateTArrayI()
Int_t Compare(const TObject *obj) const override
Bool_t RemoveAll(Int_t val)
virtual ~KVIntegerList()
Destructor.
virtual void ResetRegle()
protected method, Mise a zero de l'ensemble des valeurs
Bool_t ToBeUpdated()
protected method, test si les grandeurs associées à la liste doivent etre mises a jour
virtual void Update()
KVIntegerList()
Default constructor.
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 Set(Int_t n) override
Int_t At(Int_t i) const
void AddAt(Int_t c, Int_t i)
Int_t fN
Int_t GetSize() const
virtual Int_t ReadClassBuffer(const TClass *cl, void *pointer, const TClass *onfile_class=nullptr)=0
Bool_t IsReading() const
virtual Int_t WriteClassBuffer(const TClass *cl, void *pointer)=0
void Copy(TObject &named) const override
virtual void SetTitle(const char *title="")
const char * GetName() const override
void Streamer(TBuffer &) override
const char * GetTitle() const override
void Clear(Option_t *option="") override
static TClass * Class()
virtual void SetName(const char *name)
TObject * At(Int_t idx) const override
virtual const char * GetName() const
void SetBit(UInt_t f)
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual void Info(const char *method, const char *msgfmt,...) const
Ssiz_t Length() const
Int_t Atoi() const
const char * Data() const
TObjArray * Tokenize(const TString &delim) const
TString & Remove(EStripType s, char c)
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
void Warning(UserClass p, const char *location, const char *va_(fmt),...)
Definition: KVError.h:125
Double_t Min(Double_t a, Double_t b)
Int_t Nint(T x)
Double_t Max(Double_t a, Double_t b)
ClassImp(TPyArg)