KaliVeda  1.13/01
Heavy-Ion Analysis Toolkit
KVPartitionGenerator.cpp
Go to the documentation of this file.
1 //Created by KVClassFactory on Thu Jun 17 14:20:16 2010
2 //Author: bonnet
3 
4 #include "KVPartitionGenerator.h"
5 #include "TMath.h"
6 #include "KVCouple.h"
7 #include "TFile.h"
8 #include "TTree.h"
9 #include "TChain.h"
10 #include "TDatime.h"
11 #include "TNamed.h"
12 
13 
15 
16 
17 //_______________________________________________________
18 
19 
23 {
24  // Default constructor
25  init();
26 
27 }
28 
29 
30 
34 
36 {
37  //protected method
38  //Initisalisation des variables
39  tabz = 0;
40  ztot = mtot = 0;
41 
42  kcurrent = 0;
43  kzt = kmt = 0;
44  mshift = zshift = 0;
45 
47 
48  npar = npar_zt_mt = 0;
49  tree = 0;
50  tname = "PartitionTree";
51  cname = "";
52 
53  kwriting_path = "";
54  flist = 0;
55 
56 }
57 
58 
59 
62 
64 {
65  // Destructor
66  if (kcurrent) {
67  delete [] kcurrent;
68  kcurrent = 0;
69  }
70  if (tabz) {
71  delete [] tabz;
72  tabz = 0;
73  }
74 
75 }
76 
77 
78 
83 
85 {
86  // Defini le chemin ou les arbres seront ecris
87  //prevoir des zones pouvant recevoir de gros volumes de données
88  //si les calculs de partitions se fait a partir de grosse taille initiale
89  kwriting_path = path;
90 
91 }
92 
93 
94 
113 
115 {
116  //protected method
117  //Cree un fichier avec nom formate :
118  // From_[ClassName]_Zt[Ztot]_Mt[Mtot]_Zm[Zinf].root
119  //
120  //Defini l'arbre ou seront enregistrees les partitions
121  //
122  //Determine toute les partitions pour un
123  //couple donné de parametres : (Ztot, Mtot, Zinf)
124  //avec :
125  // - Ztot -> taille totale de la partition
126  // - Mtot -> multiplicité de partition
127  // - Zinf -> taille minimale pour les fragments de la partition
128  //--------------------------------
129  //Enregistre l arbre et ferme le fichier
130  //
131  //Routine centrale de la classe appelée par toutes les methodes de type Break_Using...Criterion()
132  //
133 
134  SetConditions(Ztot, Mtot, Zinf);
135 
136  PreparTree();
137 
138  Process();
139 
141 
142 }
143 
144 
145 
151 
153 {
154  //protected method
155  //Repercute les parametres passes via la methode SetConditions
156  //Prepare les tableaux necessaires
157  //
158  kzt = Ztot;
159  kmt = Mtot;
160  kzinf = Zinf;
161 
162  if (kcurrent)
163  delete kcurrent;
164  kcurrent = new Int_t[kmt];
165  for (Int_t mm = 0; mm < kmt; mm += 1)
166  kcurrent[mm] = 0;
167 
168  npar_zt_mt = 0;
169 
170 }
171 
172 
173 
178 
180 {
181  //protected method
182  //Creation du fichier formate suivant les parametres passes via la methode SetConditions
183  //Creation de l'arbre
184  mtot = kmt + mshift;
185  ztot = kzt + zshift;
186 
187  KVString snom;
188  snom.Form("%sFrom_%s_Zt%d_Mt%d_Zi%d.root", kwriting_path.Data(), this->Class_Name(), ztot, mtot, kzinf);
189  TFile* file = new TFile(snom.Data(), "recreate");
190  flist->Add(new TNamed(file->GetName(), ""));
191  tree = new TTree(tname.Data(), this->Class_Name());
192 
193  if (tabz) delete [] tabz;
194 
195  tabz = new Int_t[mtot];
196 
197  tree->Branch("ztot", &ztot, "ztot/I");
198  tree->Branch("mtot", &mtot, "mtot/I");
199  tree->Branch("tabz", tabz, "tabz[mtot]/I");
200 
201  if (mshift) tabz[0] = zshift;
202 
203 }
204 
205 
206 
216 
218 {
219  //protected method
220  //Determine toute les partitions pour un
221  //couple donné de parametres : (Ztot, Mtot, Zinf)
222  //avec :
223  // - Ztot -> taille totale de la partition
224  // - Mtot -> multiplicité de partition
225  // - Zinf -> taille minimale pour les fragments de la partition
226  //
227 
228  if (kmt == 1) {
229  tabz[0 + mshift] = kzt;
230  TreatePartition();
231  return;
232  }
233 
234  Int_t zutilise = (kmt * kzinf);
235  Int_t zdispo = kzt - zutilise;
236 
237  Int_t nb_cassure = kmt - 1;
238  KVCouple* coup[nb_cassure];
239  Int_t ncouple[nb_cassure];
240  Int_t niter[nb_cassure];
241  for (Int_t nc = 0; nc < nb_cassure; nc += 1) {
242  ncouple[nc] = 0;
243  coup[nc] = 0;
244  niter[nc] = 0;
245  }
246 
247  Int_t nc;
248  Int_t zsup = zdispo;
249  for (nc = 0; nc < nb_cassure; nc += 1) {
250 
251  if (!coup[nc]) {
252  coup[nc] = new KVCouple(zdispo, zsup, kmt - nc);
253 
254  ncouple[nc] = coup[nc]->GetNbreCouples();
255  niter[nc] = 0;
256  }
257  if (niter[nc] < ncouple[nc]) {
258 
259  zdispo = coup[nc]->GetZ2(niter[nc]);
260  zsup = coup[nc]->GetZ1(niter[nc]);
261  kcurrent[nc] = coup[nc]->GetZ1(niter[nc]);
262  kcurrent[nc + 1] = coup[nc]->GetZ2(niter[nc]);
263 
264  }
265  }
266 
267  Bool_t finish = kFALSE;
268  while (!finish) {
269 
270  nc = nb_cassure - 1;
271  while (niter[nc] < ncouple[nc]) {
272 
273  kcurrent[nc] = coup[nc]->GetZ1(niter[nc]);
274  kcurrent[nc + 1] = coup[nc]->GetZ2(niter[nc]);
275 
276  for (Int_t ii = 0; ii < kmt; ii += 1)
277  tabz[ii + mshift] = kcurrent[ii] + kzinf;
278 
279  if (to_be_checked) {
280  if (tabz[0] >= tabz[mshift]) {
281  TreatePartition();
282  }
283  }
284  else {
285  TreatePartition();
286  }
287 
288  niter[nc] += 1;
289  }
290  delete coup[nc];
291  coup[nc] = 0;
292 
293  Int_t previous = nc - 1;
294  while (niter[previous] == (ncouple[previous] - 1) && previous >= 0) {
295 
296  delete coup[previous];
297  coup[previous] = 0;
298  previous -= 1;
299 
300  if (previous < 0) break;
301  }
302 
303  if (previous < 0) {
304  finish = kTRUE;
305  }
306  else {
307  niter[previous] += 1;
308  zdispo = coup[previous]->GetZ2(niter[previous]);
309  zsup = coup[previous]->GetZ1(niter[previous]);
310 
311  kcurrent[previous] = coup[previous]->GetZ1(niter[previous]);
312 
313  for (Int_t ncbis = previous + 1; ncbis < nb_cassure; ncbis += 1) {
314  if (!coup[ncbis]) {
315  coup[ncbis] = new KVCouple(zdispo, zsup, kmt - ncbis);
316 
317  ncouple[ncbis] = coup[ncbis]->GetNbreCouples();
318  niter[ncbis] = 0;
319  }
320  else { }
321  if (niter[ncbis] < ncouple[ncbis]) {
322 
323  zdispo = coup[ncbis]->GetZ2(niter[ncbis]);
324  zsup = coup[ncbis]->GetZ1(niter[ncbis]);
325  kcurrent[ncbis] = coup[ncbis]->GetZ1(niter[ncbis]);
326  kcurrent[ncbis + 1] = coup[ncbis]->GetZ2(niter[ncbis]);
327  }
328  }
329  }
330  }
331 
332  Info("Process", "ztot:%d en mtot:%d avec zinf:%d donne %lf combinaisons (total %lf)", kzt, kmt, kzinf, npar_zt_mt, npar);
333 
334 
335 }
336 
337 
338 
339 
345 
347 {
348  //protected method
349  //Creation de la liste pour creation de la TChain
350  //stop du chrono
351  //
352  flist = new KVUniqueNameList();
353  flist->SetOwner(kTRUE);
354  Start();
355 
356 }
357 
358 
359 
367 
369 {
370  //protected method
371  //Permet de creer une TChain recapitulant tout les arbres
372  //crees et suvegardes lors de la determination de toutes les
373  //partitions par une des methodes BreakUsing_[Critere]_Criterion()
374  //stop du chrono
375  //
376 
377  Stop();
378  TFile* file = new TFile(cname.Data(), "recreate");
379  TChain* ch = new TChain(tname.Data());
380  TIter nf(flist);
381  TNamed* tn = 0;
382  while ((tn = (TNamed*)nf.Next()))
383  ch->AddFile(tn->GetName());
384  ch->Write();
385  file->Close();
386  delete flist;
387 
388 }
389 
390 
391 
401 
403 {
404  //Determine toutes les partitions pour :
405  // - une taille totale de la partition donnée (Ztot)
406  // - une taille minimale pour les fragments de la partition (Zinf)
407  // - le nom du fichier ou la TChain recapitulant tous les arbres crees va etre enregistree
408  // (par defaut, si chain_name=="", le nom de fichier est formate en fonction des arguments
409  //Les arguments min et max permettent de restreindre le calcul a une plage en multiplicité
410  // si min==-1 (defaut) -> mfmin=1
411  // si max==-1 (defaut) -> mfmax=Ztot/Zinf
412  cname = chain_name;
413  if (cname == "") cname.Form("Partitions_Zf%d_Zi%d.root", Ztot, Zinf);
414  BeforeBreak();
415 
416  Int_t mtmin = 1;
417  Int_t mtmax = Ztot / Zinf;
418 
419  if (min != -1 && min <= mtmax)
420  mtmin = min;
421 
422  if (max != -1 && max <= mtmax && max >= mtmin)
423  mtmax = max;
424 
425  for (Int_t Mtot = mtmin; Mtot <= mtmax; Mtot += 1) {
426  MakePartitions(Ztot, Mtot, Zinf);
427  }
428 
429  AfterBreak();
430  Info("BreakUsing_Ztot_Zinf_Criterion", "%lf partitions crees en %d seconds", npar, GetDeltaTime());
431 
432 }
433 
434 
435 
443 
445 {
446  //Determine toutes les partitions pour :
447  // - une taille totale de la partition donnée (Ztot)
448  // - une multiplicité de partition donnée (Mtot)
449  // - une taille minimale pour les fragments de la partition (Zinf)
450  // - le nom du fichier ou la TChain recapitulant tous les arbres crees va etre enregistree
451  // (par defaut, si chain_name=="", le nom de fichier est formate en fonction des arguments
452  cname = chain_name;
453  if (cname == "") cname.Form("Partitions_Zt%d_Mt%d_Zi%d.root", Ztot, Mtot, Zinf);
454  BeforeBreak();
455 
456  MakePartitions(Ztot, Mtot, Zinf);
457 
458  AfterBreak();
459  Info("BreakUsing_Ztot_Mtot_Zinf_Criterion", "%lf partitions crees en %d seconds", npar, GetDeltaTime());
460 
461 }
462 
463 
464 
472 
474 {
475  //Determine toutes les partitions pour :
476  // - une taille totale de la partition donnée (Ztot)
477  // - une taille donnée du plus gros fragment de la partition (Zmax)
478  // - une taille minimale pour les fragments de la partition (Zinf)
479  // - le nom du fichier ou la TChain recapitulant tous les arbres crees va etre enregistree
480  // (par defaut, si chain_name=="", le nom de fichier est formate en fonction des arguments
481  cname = chain_name;
482  if (cname == "") cname.Form("Partitions_Zt%d_Zm%d_Zi%d.root", Ztot, Zmax, Zinf);
483  BeforeBreak();
484 
485  if (Ztot == Zmax) {
486  MakePartitions(Ztot, 1, Zinf);
487  }
488  else if (Ztot - Zmax >= Zinf) {
489 
490  Int_t mfmin = 2;
491  Int_t np = 0;
492  KVCouple* cp = new KVCouple(Ztot, Zmax, mfmin);
493  np = cp->GetNbreCouples();
494  while (np <= 0) {
495  if (cp) delete cp;
496  cp = 0;
497  mfmin += 1;
498  cp = new KVCouple(Ztot, Zmax, mfmin);
499  np = cp->GetNbreCouples();
500  }
501  printf("a priori mfmin=%d OK\n", mfmin);
502  for (Int_t ii = 0; ii < cp->GetNbreCouples(); ii += 1) {
503  printf("%d %d\n", cp->GetZ1(ii), cp->GetZ2(ii));
504  }
505  delete cp;
506  cp = 0;
507 
508 
509  Int_t mfmax = ((Ztot - Zmax) / Zinf) + 1;
510  np = 0;
511  cp = new KVCouple(Ztot, Zmax, mfmax);
512  np = cp->GetNbreCouples();
513  while (np <= 0) {
514  if (cp) delete cp;
515  cp = 0;
516  mfmax -= 1;
517  cp = new KVCouple(Ztot, Zmax, mfmax);
518  np = cp->GetNbreCouples();
519  }
520  printf("a priori mfmax=%d OK\n", mfmax);
521  for (Int_t ii = 0; ii < cp->GetNbreCouples(); ii += 1) {
522  printf("%d %d\n", cp->GetZ1(ii), cp->GetZ2(ii));
523  }
524  delete cp;
525  cp = 0;
526 
527 
528  for (Int_t Mtot = mfmin; Mtot <= mfmax; Mtot += 1) {
529  mshift = 1;
530  zshift = Zmax;
532  MakePartitions(Ztot - zshift, Mtot - mshift, Zinf);
533  }
534 
535  }
536  else {
537  printf("%d %d ??? \n", Ztot - Zmax, Zinf);
538  }
539 
540  AfterBreak();
541  Info("BreakUsing_Ztot_Zmax_Zinf_Criterion", "%lf partitions crees en %d seconds", npar, GetDeltaTime());
542 }
543 
544 
545 
553 
555 {
556  //Determine toutes les partitions pour :
557  // - une multiplicité de partition donnée (Mtot)
558  // - une taille donnée du plus gros fragment de la partition (Zmax)
559  // - une taille minimale pour les fragments de la partition (Zinf)
560  // - le nom du fichier ou la TChain recapitulant tous les arbres crees va etre enregistree
561  // (par defaut, si chain_name=="", le nom de fichier est formate en fonction des arguments
562  cname = chain_name;
563  if (cname == "") cname.Form("Partitions_Mt%d_Zm%d_Zi%d.root", Mtot, Zmax, Zinf);
564  BeforeBreak();
565 
566  Int_t ztmin = Zmax + (Mtot - 1) * Zinf;
567  Int_t ztmax = Zmax * Mtot;
568 
569  for (Int_t Ztot = ztmin; Ztot <= ztmax; Ztot += 1) {
570  mshift = 1;
571  zshift = Zmax;
573  MakePartitions(Ztot - zshift, Mtot - mshift, Zinf);
574  }
575 
576  AfterBreak();
577  Info("BreakUsing_Mtot_Zmax_Zinf_Criterion", "%lf partitions crees en %d seconds", npar, GetDeltaTime());
578 }
579 
580 
581 
585 
587 {
588  //Rempli l arbre avec la partition courante
589  //Incremente les compteurs sur le nombre de particules creees
590  tree->Fill();
591 
592  npar_zt_mt += 1;
593  npar += 1;
594 
595 }
596 
597 
598 
606 
608 {
609  //Test le fichier courant (pointeur gFile)
610  //Si tout va bien
611  //Ecriture de l arbre dans le fichier (tout deux definis dans PreparTree)
612  //et ajout du nom de fichier
613  //dans une liste permettant de generer la TChain en fin de processus
614  //
615  if (gFile && gFile->IsOpen()) {
616 
617  if (tree && gFile->IsWritable()) {
618 
619  Info("WriteTreeAndCloseFile", "Ecriture du fichier:\n%s avec l'arbre:\n %s (%lld entrees)", gFile->GetName(), tree->GetName(), tree->GetEntries());
620  tree->ResetBranchAddresses();
621  flist->Add(new TNamed(gFile->GetName(), ""));
622  gFile->Write();
623  }
624  gFile->Close();
625  }
626 
627 }
628 
629 
630 
634 
636 {
637  //protected method
638  //Signal start
639  TDatime time;
640  tstart = time.GetHour() * 3600 + time.GetMinute() * 60 + time.GetSecond();
641 
642 }
643 
644 
645 
649 
651 {
652  //protected method
653  //Signal stop
654  TDatime time;
655  tstop = time.GetHour() * 3600 + time.GetMinute() * 60 + time.GetSecond();
656  tellapsed = tstop - tstart;
657 
658 }
659 
660 
661 
666 
668 {
669  //protected method
670  //Retoune le temps ecoules (en seconde)
671  //entre un appel Start() et un appel Stop()
672  return tellapsed;
673 
674 }
675 
676 
int Int_t
ClassImp(KVPartitionList) void KVPartitionList
Initialisation.
const Bool_t kFALSE
bool Bool_t
const Bool_t kTRUE
#define gFile
Handles binary decomposition of an integer.
Definition: KVCouple.h:15
Int_t GetNbreCouples()
Definition: KVCouple.h:57
Int_t GetZ2(Int_t idx)
Definition: KVCouple.h:53
Int_t GetZ1(Int_t idx)
Definition: KVCouple.h:49
Permet de determiner numeriquement et exactement un ensemble de partitions d'entrees remplissante cer...
void SetPathForFile(KVString path)
Int_t tstart
To give an estimation of time consuming.
void BreakUsing_Ztot_Zmax_Zinf_Criterion(Int_t Ztot, Int_t Zmax, Int_t Zinf, KVString chain_name="")
KVString kwriting_path
Chemin ou les arbres seront ecrits.
virtual ~KVPartitionGenerator()
Destructor.
void BreakUsing_Ztot_Zinf_Criterion(Int_t Ztot, Int_t Zinf, KVString chain_name="", Int_t min=-1, Int_t max=-1)
KVUniqueNameList * flist
void MakePartitions(Int_t Ztot, Int_t Mtot, Int_t Zinf)
virtual void WriteTreeAndCloseFile()
void BreakUsing_Ztot_Mtot_Zinf_Criterion(Int_t Ztot, Int_t Mtot, Int_t Zinf, KVString chain_name="")
void SetConditions(Int_t Ztot, Int_t Mtot, Int_t Zinf)
Double_t npar
Compteurs de nombre de partitions crees.
void BreakUsing_Mtot_Zmax_Zinf_Criterion(Int_t Mtot, Int_t Zmax, Int_t Zinf, KVString chain_name="")
virtual void SetOwner(Bool_t enable=kTRUE)
Extension of ROOT TString class which allows backwards compatibility with ROOT v3....
Definition: KVString.h:72
Optimised list in which named objects can only be placed once.
virtual void Add(TObject *obj)
virtual Int_t AddFile(const char *name, Long64_t nentries=TTree::kMaxEntries, const char *tname="")
Int_t GetHour() const
Int_t GetSecond() const
Int_t GetMinute() const
TObject * Next()
virtual const char * GetName() const
const char * Data() const
void Form(const char *fmt,...)
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
const long double mm
Definition: KVUnits.h:69
void Info(const char *location, const char *va_(fmt),...)