KaliVeda
Toolkit for HIC analysis
Loading...
Searching...
No Matches
KVIntegerList.cpp
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
18
19void 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
77 ResetRegle();
79 fMult = 0;
80
81}
82
83
84
87
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
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/*
539KVPartition* 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
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
#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)
Int_t fMult
Nombre d'éléments dans la liste.
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.
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
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...
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
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: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 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
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
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)