#ifndef _PDISTRIBUTIONMANAGERUTIL_H_
#define _PDISTRIBUTIONMANAGERUTIL_H_
#include "TObjArray.h"
#include "TF1.h"
#include "TF2.h"
#include "PParticle.h"
#include "PDistribution.h"
#include "PDynamicData.h"
#include "PChannel.h"
#define MAX_DISTRIBUTION_LIST 1000
#define MAX_GROUP_LIST 100
#define MAX_CORR_LIST 10000
class PDistributionManagerUtil;
PDistributionManagerUtil &fDistributionManagerUtil();
PDistributionManagerUtil *makeDistributionManagerUtil();
class PDistributionManagerUtil : public TObject {
  
 public:
    PDistributionManagerUtil();
    int  Add(PDistribution *dist); 
    int  Add(PDistribution *dist, const Char_t *gr); 
    int  Add(TObjArray *arr);      
    void AlternativeTo(const char *a, const char *b);
    void Print(const Option_t* delme="root") const;
    Int_t PrintGroup(Int_t group_id, Int_t width, Int_t indent,
		     const Char_t *name,
		     Int_t *num_enabled_mods, Int_t *num_total_mods,
		     Int_t *num_subs, Int_t *will_print) const;
    int  Attach(PChannel *ch);     
    Bool_t Disable(const Char_t *id);     
    Bool_t Enable(const Char_t *id);     
    PDistribution *GetDistribution(const Char_t *id);
    void SetVerbose(Int_t v) {
	verbosity=v;
    };
    void LinkDB(void);             
    void ExpandGroup(const char *, Int_t ex=1);
    Int_t   AddGroup(const Char_t *id, const Char_t *de);
    void    SetGroup(const Char_t *id);  
    Int_t   AddSubGroup(const Char_t *id, const Char_t *de, const Char_t *sub);
    Bool_t no_warning;
 private:
  
    Int_t position;
    PDistribution *distribution[MAX_DISTRIBUTION_LIST];
    int alt_distribution[MAX_DISTRIBUTION_LIST];
  
    Int_t group_position;
    const Char_t *group_identifier[MAX_GROUP_LIST], *group_description[MAX_GROUP_LIST];
    Int_t group_expanded[MAX_GROUP_LIST];
    Int_t group_corr[MAX_GROUP_LIST];
  
    Int_t GetGroup(const Char_t *id, Int_t warning=1);  
    
    Int_t current_group;
    Int_t AddCorrelation(Int_t gr, Int_t dis);  
    Int_t corr_position;
    Int_t corr_gr[MAX_CORR_LIST], corr_dis[MAX_CORR_LIST];
    void DisableAlts(int id);
    Int_t verbosity;
    Int_t linkdb_done; 
    ClassDef(PDistributionManagerUtil,0)  
	
};
#endif
 PDistributionManagerUtil.h:1  PDistributionManagerUtil.h:2  PDistributionManagerUtil.h:3  PDistributionManagerUtil.h:4  PDistributionManagerUtil.h:5  PDistributionManagerUtil.h:6  PDistributionManagerUtil.h:7  PDistributionManagerUtil.h:8  PDistributionManagerUtil.h:9  PDistributionManagerUtil.h:10  PDistributionManagerUtil.h:11  PDistributionManagerUtil.h:12  PDistributionManagerUtil.h:13  PDistributionManagerUtil.h:14  PDistributionManagerUtil.h:15  PDistributionManagerUtil.h:16  PDistributionManagerUtil.h:17  PDistributionManagerUtil.h:18  PDistributionManagerUtil.h:19  PDistributionManagerUtil.h:20  PDistributionManagerUtil.h:21  PDistributionManagerUtil.h:22  PDistributionManagerUtil.h:23  PDistributionManagerUtil.h:24  PDistributionManagerUtil.h:25  PDistributionManagerUtil.h:26  PDistributionManagerUtil.h:27  PDistributionManagerUtil.h:28  PDistributionManagerUtil.h:29  PDistributionManagerUtil.h:30  PDistributionManagerUtil.h:31  PDistributionManagerUtil.h:32  PDistributionManagerUtil.h:33  PDistributionManagerUtil.h:34  PDistributionManagerUtil.h:35  PDistributionManagerUtil.h:36  PDistributionManagerUtil.h:37  PDistributionManagerUtil.h:38  PDistributionManagerUtil.h:39  PDistributionManagerUtil.h:40  PDistributionManagerUtil.h:41  PDistributionManagerUtil.h:42  PDistributionManagerUtil.h:43  PDistributionManagerUtil.h:44  PDistributionManagerUtil.h:45  PDistributionManagerUtil.h:46  PDistributionManagerUtil.h:47  PDistributionManagerUtil.h:48  PDistributionManagerUtil.h:49  PDistributionManagerUtil.h:50  PDistributionManagerUtil.h:51  PDistributionManagerUtil.h:52  PDistributionManagerUtil.h:53  PDistributionManagerUtil.h:54  PDistributionManagerUtil.h:55  PDistributionManagerUtil.h:56  PDistributionManagerUtil.h:57  PDistributionManagerUtil.h:58  PDistributionManagerUtil.h:59  PDistributionManagerUtil.h:60  PDistributionManagerUtil.h:61  PDistributionManagerUtil.h:62  PDistributionManagerUtil.h:63  PDistributionManagerUtil.h:64  PDistributionManagerUtil.h:65  PDistributionManagerUtil.h:66  PDistributionManagerUtil.h:67  PDistributionManagerUtil.h:68  PDistributionManagerUtil.h:69  PDistributionManagerUtil.h:70  PDistributionManagerUtil.h:71  PDistributionManagerUtil.h:72  PDistributionManagerUtil.h:73  PDistributionManagerUtil.h:74  PDistributionManagerUtil.h:75  PDistributionManagerUtil.h:76  PDistributionManagerUtil.h:77  PDistributionManagerUtil.h:78  PDistributionManagerUtil.h:79  PDistributionManagerUtil.h:80  PDistributionManagerUtil.h:81  PDistributionManagerUtil.h:82  PDistributionManagerUtil.h:83  PDistributionManagerUtil.h:84  PDistributionManagerUtil.h:85  PDistributionManagerUtil.h:86  PDistributionManagerUtil.h:87  PDistributionManagerUtil.h:88  PDistributionManagerUtil.h:89  PDistributionManagerUtil.h:90  PDistributionManagerUtil.h:91