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