ROOT logo
#ifndef HPR_FITHIST
#define HPR_FITHIST
#include "TArrayI.h"
#include "TArrayF.h"
#include <TH1.h>
#include <TH2.h>
#include <TPad.h>
#include <TCutG.h>
#include <TTree.h>
#include <TStyle.h>
#include "TUnixSystem.h"
#include <TList.h>
#include <TPaveText.h>
#include "TGWindow.h"
#include "TVirtualPad.h"
#include "TButton.h"
#include "TTimer.h"
#include "HTCanvas.h"
#include "TRootCanvas.h"
#include "FhMarker.h"
#include "FhPeak.h"
#include "TableOfLabels.h"
#include "FindPeakDialog.h"
#include "CalibrationDialog.h"
#include "Save2FileDialog.h"
#include "HprLegend.h"

namespace std {} using namespace std;


class TMrbWindow2D;
class TMrbWindow;
class FitOneDimDialog;
class Fit2DimDialog;
class HprGaxis;
//______________________________ globals ____________________________________

static const char attrname[]="FH_setdefaults.C";
static const char fitmacroname[]="fit_user_function.C";

//______________________________________________________________________

class FitHist : public TNamed, public TQObject {
private:
	TTimer  fTimer;
	Int_t   fBinX_1, fBinX_2, fBinY_1, fBinY_2;  // lower, upper bin selected
	Int_t   fBinlx, fBinux, fBinly, fBinuy;     // lower, upper bin in expanded
	Axis_t  fExplx, fExpux, fExply, fExpuy;     // lower, upper edge in expanded
	Axis_t  fX_1,   fX_2,   fY_1,   fY_2;     // lower, upper lim selected
	Axis_t  fRangeLowX, fRangeUpX, fRangeLowY, fRangeUpY;
	Axis_t  fOrigLowX, fOrigUpX, fOrigLowY, fOrigUpY;
	Double_t fFrameX1, fFrameX2,fFrameY1,fFrameY2;
	Double_t fRoad2;
	Bool_t fSetRange;
	Bool_t fKeepParameters;
	Bool_t fCallMinos;
	Int_t  fOldMode;
	TH1    *fSelHist, *fOrigHist;          // pointer to the selected histogram
	TH1    *fCalHist;
	FitHist  *fCalFitHist;
	TF1      *fCalFunc;
	FitOneDimDialog *fFit1DimD;
	Fit2DimDialog *fFit2DimD;
//   HistPresent* hp;
	HTCanvas *fCanvas;
	TH1     *fExpHist, *fProjHistX, *fProjHistY;
	TString fHname;
	TString fCname;
	TString fCtitle;
	TString fEname;
	TString fCutname;

	TVirtualPad *fSelPad;          // pointer to the selected pad

	TList *fActiveFunctions;
	TList *fAllFunctions;
	TList *fActiveWindows;
	TList *fAllWindows;
	TList *fAllCuts;
	TList *fPeaks;
	TList *fActiveCuts;
	FhMarkerList *fMarkers;
	TObjArray *peaks;
	TList *fCmdLine;
	Int_t fExpInd;
	Int_t fSerialPx;
	Int_t fSerialPy;
	Int_t fSerialPf;
	Int_t fSerialRot;
	Int_t fFuncNumb;
	Int_t fCutNumber;
	Int_t fProjectedBoth;
	Int_t wdw_numb;
	Int_t fColSuperimpose;
	void ExpandProject(Int_t);
	Int_t fLogx;
	Int_t fLogy;
	Int_t fLogz;
	Bool_t fSelInside;
	Bool_t fAutoDisplayS2FD;
	Int_t fUserContourLevels;
	Bool_t fSetLevels;
	Bool_t fSetColors;
	Bool_t fHasExtraAxis;

	Float_t fMax, fMin, fXmax, fXmin, fYmax, fYmin;
	TRootCanvas *mycanvas;
//   TPaveText *datebox;
	Int_t fDimension;
	Bool_t fCanvasIsAlive;
	TString fXtitle;
	TString fYtitle;
	TString fZtitle;
	TString fFitMacroName;
	TString fTemplateMacro;
	TString fFitSliceYMacroName;
	Int_t fFirstUse;
	Bool_t fDeleteCalFlag;
	HTCanvas * fCutPanel;
	TableOfLabels * fTofLabels;
	Int_t fFill1Dim;
	Color_t fFillColor;
	Color_t fLineColor;
	Float_t fLineWidth;
	Float_t fMarkerSize;
	Int_t fShowMarkers;
	Int_t fFillStyle;
	Int_t fShowContour;
	Int_t fShowDateBox;
	Int_t fShowStatBox;
	Int_t fOptStat;
	Int_t fUseTimeOfDisplay;
	Int_t fShowTitle;
	Int_t fShowFitBox;
	Int_t fLiveStat1Dim;
	Int_t fLiveStat2Dim;
	Int_t fLiveGauss;
	Int_t fLiveBG;
	Int_t fLiveConstBG;
	Int_t   fSmoothLine;
	Int_t   fSimpleLine;
	Int_t   fBarChart;
	Int_t   fBarChart3D;
	Int_t   fBarChartH;
	Int_t   fPieChart;
	Int_t   fText;
	Int_t   fTextAngle;
	Int_t fShowZScale;
	Int_t fShowZScale3Dim;
	Int_t fAdjustMinY;
	Int_t fDrawAxisAtTop;
	TString fDrawOpt2Dim;
	Int_t fTitleCenterX;
	Int_t fTitleCenterY;
	Int_t fTitleCenterZ;
	TText * fDateText;
	Save2FileDialog *fDialog;
	Color_t fHistFillColor2Dim;
	Color_t fHistFillStyle2Dim;
	Color_t fHistLineColor2Dim;
	Color_t fHistLineStyle2Dim;
	Color_t fHistLineWidth2Dim;
	Color_t fMarkerColor2Dim; 
	Color_t f2DimBackgroundColor;
	Style_t fMarkerStyle2Dim;  
	Size_t  fMarkerSize2Dim; 
	TString fErrorMode;
	Int_t   fOneDimLogX;
	Int_t   fOneDimLogY;
	Int_t   fTwoDimLogX;
	Int_t   fTwoDimLogY;
	Int_t   fTwoDimLogZ;
	Int_t   fLabelsTopX;
	Int_t   fLabelsRightY;
	TString fDrawOpt3Dim;
	Color_t fHistFillColor3Dim;
	Color_t fHistLineColor3Dim;
	Color_t fMarkerColor3Dim; 
	Color_t f3DimBackgroundColor;
	Style_t fMarkerStyle3Dim;  
	Size_t  fMarkerSize3Dim; 
	Int_t   fApplyTranspCut;
	Int_t   f3DimPolyMarker;
	TButton * fCmdButton;
	
public:
	enum EFitHistBits {
		 kSelected = BIT(15)
	};
public:
	FitHist(const Text_t *name, const Text_t *title, TH1 *hist,
			  const Text_t *hname, Int_t win_topx = 520, Int_t win_topy = 5,
			  Int_t win_widx = 750, Int_t win_widy = 550, TButton * cmdb = NULL);
	~FitHist();
	void SetCmdButton(TButton * b) {fCmdButton = b;};
	TButton * GetCmdButton() { return fCmdButton; };
	void DisconnectFromPadModified();
	void SaveDefaults(Bool_t recalculate = kTRUE);
	void RestoreDefaultRanges();
	void DisplayHist(TH1*, Int_t, Int_t, Int_t, Int_t);  // display hists
//   void DrawHist();                      //
	void Draw1Dim();                      //
	void Draw2Dim();                      //
	void Draw3Dim();                      //
	void Draw3DimPolyMarker();
	void Draw3DimView();
	const Char_t * GetCanvasName(){return fCanvas->GetName();};             //
	TRootCanvas* GetMyCanvas(){return mycanvas;};
	HTCanvas* GetCanvas(){return fCanvas;};
	void  SetMyCanvas(TRootCanvas *myc){mycanvas = myc;};
	TH1* GetSelHist(){return fSelHist;};
	TH1* SetHist(TH1* newhist){
		TH1* temp = fSelHist;
		fSelHist = newhist;
		if(newhist->InheritsFrom("TH2"))Draw2Dim();
		else                            Draw1Dim();
		return temp;
	};
	Bool_t IsThereAnyHist();
	void Entire();                  //
	void SetXaxisRange();                  //
	void SetYaxisRange();                  //
	void SetZaxisRange();                  //
	void ProfileX();                  //
	void ProfileY();                  //
	void RebinOne();                  //
	void ExecDefMacro();                  //
	void ExecFitMacro();                  //
	void EditFitMacro();                  //
	void ExecFitSliceYMacro();                  //
	void EditFitSliceYMacro();                  //
	void SetTemplateMacro(const char * name){fTemplateMacro = name;};
	void SetFitSliceYMacroName(const char *name){fFitSliceYMacroName = name;};                  //
	void SetRangeAxis();                  //
	void RedefineAxis();                  //
	void RestoreAxis();                  //
	void AddAxis(Int_t where);           //
	void ObjMoved(Int_t px, Int_t py, TObject *obj);
	void ObjCreated(Int_t , Int_t , TObject *){};
	void Magnify();                 //
	void GetLimits();               //
	void GetRange();                // get range from another hist
	void AddMark(TPad *, Int_t, Int_t);

	Int_t GetMarks(TH1*);
	void ClearMarks();               //
	Bool_t GetKeepPar(){return fKeepParameters;};
	void SetKeepPar(Bool_t keeppar)
		  {fKeepParameters=keeppar;if(!keeppar)fOldMode=-1;};
	void SetCallMinos(Bool_t cminos) {fCallMinos=cminos;};
	Bool_t GetCallMinos() {return fCallMinos;};
	void SetInside(Bool_t inside){fSelInside=inside;};
	void SetAutoDisplayS2FD(Bool_t ads){fAutoDisplayS2FD = ads;};
	Bool_t GetAutoDisplayS2FD(){return fAutoDisplayS2FD;};
	void SetLogx(Int_t state);
	void SetLogy(Int_t state);
	void SetLogz(Int_t state);
	void SaveUserContours();               //
	void SetUserContours();               //
	void ClearUserContours();               //
	void UseSelectedContour();

	Int_t GetLogx() {return fLogx;};
	Int_t GetLogy() {return fLogy;};
	Int_t GetLogz() {return fLogz;};

	Bool_t InsideState(){return fSelInside;};
	void PaintMarks();               //
	void PrintMarks();               //
	void Set2Marks();               //
	TObjArray* GetPointertoMarks(){return fMarkers;};
	void AddFunctionsToHist();
	void ClearRegion();
	void MarksToWindow();               //
	void ClearWindows();               //
	void DrawWindows();               //
	void WriteOutWindows();               //
	void ListWindows();                       //
	void AddWindow(const char *, const char * bp=NULL);            //
	void AddWindowsToHist();
	void RemoveWindowsFromHist();
	void EditWindow(const char *, const char *);

	Int_t Nwindows(){return fActiveWindows->GetSize();};
	Int_t Ncuts(){return fActiveCuts->GetSize();};                  //
	void InitCut();                       //
	void EditCut(const char *, const char *);
	void PrintOneCut(TMrbWindow2D *);      //
	void CloseCuts();                       //
	void ListCuts();                       //
	void AddCut(const char *, const char * bp=NULL);            //
	Float_t DrawCut();                      //
	void DrawCutName();                      //
	void MarksToCut();               //
	void AddCutsToHist();
	void DrawDate();                      //
	Bool_t UseCut(TMrbWindow2D *);         //
	Bool_t UseWindow(TMrbWindow *);         //
	Bool_t InsideCut(Float_t, Float_t);               //
	void ClearCut();                   //
	void RemoveAllCuts();
	void UpdateCut();                  //
	void UpdateDrawOptions();
	Bool_t IsCalibrated() {return fSetRange;}                       //
	Bool_t Its2dim(){return fOrigHist->InheritsFrom("TH2");};               //
//   void FitGBg(Int_t tail, Int_t force_zero_bg =0);  // fit gaus + lin bg max 3 peaks
	void Fit1DimDialog(Int_t type = 1);       // fit gaus + lin bg any number of peaks
	void Fit2DimD(Int_t type = 1);       // fit gaus + lin bg any number of peaks
//   Int_t Fit1dim(Int_t, Int_t);            // fit polynoms
	Int_t Fit2dim(Int_t, Int_t);            // fit polynoms
	Int_t FitPolyHist(Int_t);               // fit polynoms hist
	Int_t FitPolyMarks(Int_t);              // fit  polynoms to marks
	void  HelpFit2dim();
	void  HelpFit2dimMarks();
	void  Expand();                     // expand
	void  ProjectX();
	void  ProjectX_Func();
	void  ProjectY();
	void  ProjectBoth();
	void  ProjectF();                   // project along a function
	void  ProjectOnAnyAxis();
	void  Transpose(Int_t invert);
	void  Rotate(Int_t sense);
	void OutputStat(Int_t fill_hist);
//   void ListFunctions();
	void WriteFunctions();
//   void WriteFunctionList();
	void PictToPSFile(Int_t);
	void PictToLP();
	void WriteOutCanvas();
	void WriteOutHist();
	void WriteOutCut();
	void Superimpose(Int_t);
	void KolmogorovTest();
	void SetCanvasIsDeleted(){fCanvasIsAlive = kFALSE;};
	void SetSelectedPad(){fCanvas->cd();};
	void UpdateCanvas(){
		if(!gStyle->GetOptStat()){
			if(fCanvas->GetPrimitive("stats"))delete fCanvas->GetPrimitive("stats");
		}
		if(!gStyle->GetOptTitle()){
			if(fCanvas->GetPrimitive("title"))delete fCanvas->GetPrimitive("title");
		}
//      gPad = (TVirtualPad*)fCanvas;
//      fCanvas->cd(); 
//		fCanvas->Modified(kTRUE); fCanvas->Update();
//      cout << " UpdateCanvas() done " << endl;
	};
	void RecursiveRemove(TObject * obj);
	void handle_mouse();
	void DrawTopAxis();
	void ColorMarked();

	void ClearTofl() {
//      cout << "ClearTofl()" << endl;
		fTofLabels = 0;
	}
	void DrawSelectedFunctions();
	void SubtractFunction();
	void FindPeaks();
	void Calibrate();

	void FastFT();
	void HandleLinLogChanged(TObject *obj);
	void HandlePadModified();
	void DoSaveLimits();
	
ClassDef(FitHist,0)      // A histogram presenter
};
#endif
 FitHist.h:1
 FitHist.h:2
 FitHist.h:3
 FitHist.h:4
 FitHist.h:5
 FitHist.h:6
 FitHist.h:7
 FitHist.h:8
 FitHist.h:9
 FitHist.h:10
 FitHist.h:11
 FitHist.h:12
 FitHist.h:13
 FitHist.h:14
 FitHist.h:15
 FitHist.h:16
 FitHist.h:17
 FitHist.h:18
 FitHist.h:19
 FitHist.h:20
 FitHist.h:21
 FitHist.h:22
 FitHist.h:23
 FitHist.h:24
 FitHist.h:25
 FitHist.h:26
 FitHist.h:27
 FitHist.h:28
 FitHist.h:29
 FitHist.h:30
 FitHist.h:31
 FitHist.h:32
 FitHist.h:33
 FitHist.h:34
 FitHist.h:35
 FitHist.h:36
 FitHist.h:37
 FitHist.h:38
 FitHist.h:39
 FitHist.h:40
 FitHist.h:41
 FitHist.h:42
 FitHist.h:43
 FitHist.h:44
 FitHist.h:45
 FitHist.h:46
 FitHist.h:47
 FitHist.h:48
 FitHist.h:49
 FitHist.h:50
 FitHist.h:51
 FitHist.h:52
 FitHist.h:53
 FitHist.h:54
 FitHist.h:55
 FitHist.h:56
 FitHist.h:57
 FitHist.h:58
 FitHist.h:59
 FitHist.h:60
 FitHist.h:61
 FitHist.h:62
 FitHist.h:63
 FitHist.h:64
 FitHist.h:65
 FitHist.h:66
 FitHist.h:67
 FitHist.h:68
 FitHist.h:69
 FitHist.h:70
 FitHist.h:71
 FitHist.h:72
 FitHist.h:73
 FitHist.h:74
 FitHist.h:75
 FitHist.h:76
 FitHist.h:77
 FitHist.h:78
 FitHist.h:79
 FitHist.h:80
 FitHist.h:81
 FitHist.h:82
 FitHist.h:83
 FitHist.h:84
 FitHist.h:85
 FitHist.h:86
 FitHist.h:87
 FitHist.h:88
 FitHist.h:89
 FitHist.h:90
 FitHist.h:91
 FitHist.h:92
 FitHist.h:93
 FitHist.h:94
 FitHist.h:95
 FitHist.h:96
 FitHist.h:97
 FitHist.h:98
 FitHist.h:99
 FitHist.h:100
 FitHist.h:101
 FitHist.h:102
 FitHist.h:103
 FitHist.h:104
 FitHist.h:105
 FitHist.h:106
 FitHist.h:107
 FitHist.h:108
 FitHist.h:109
 FitHist.h:110
 FitHist.h:111
 FitHist.h:112
 FitHist.h:113
 FitHist.h:114
 FitHist.h:115
 FitHist.h:116
 FitHist.h:117
 FitHist.h:118
 FitHist.h:119
 FitHist.h:120
 FitHist.h:121
 FitHist.h:122
 FitHist.h:123
 FitHist.h:124
 FitHist.h:125
 FitHist.h:126
 FitHist.h:127
 FitHist.h:128
 FitHist.h:129
 FitHist.h:130
 FitHist.h:131
 FitHist.h:132
 FitHist.h:133
 FitHist.h:134
 FitHist.h:135
 FitHist.h:136
 FitHist.h:137
 FitHist.h:138
 FitHist.h:139
 FitHist.h:140
 FitHist.h:141
 FitHist.h:142
 FitHist.h:143
 FitHist.h:144
 FitHist.h:145
 FitHist.h:146
 FitHist.h:147
 FitHist.h:148
 FitHist.h:149
 FitHist.h:150
 FitHist.h:151
 FitHist.h:152
 FitHist.h:153
 FitHist.h:154
 FitHist.h:155
 FitHist.h:156
 FitHist.h:157
 FitHist.h:158
 FitHist.h:159
 FitHist.h:160
 FitHist.h:161
 FitHist.h:162
 FitHist.h:163
 FitHist.h:164
 FitHist.h:165
 FitHist.h:166
 FitHist.h:167
 FitHist.h:168
 FitHist.h:169
 FitHist.h:170
 FitHist.h:171
 FitHist.h:172
 FitHist.h:173
 FitHist.h:174
 FitHist.h:175
 FitHist.h:176
 FitHist.h:177
 FitHist.h:178
 FitHist.h:179
 FitHist.h:180
 FitHist.h:181
 FitHist.h:182
 FitHist.h:183
 FitHist.h:184
 FitHist.h:185
 FitHist.h:186
 FitHist.h:187
 FitHist.h:188
 FitHist.h:189
 FitHist.h:190
 FitHist.h:191
 FitHist.h:192
 FitHist.h:193
 FitHist.h:194
 FitHist.h:195
 FitHist.h:196
 FitHist.h:197
 FitHist.h:198
 FitHist.h:199
 FitHist.h:200
 FitHist.h:201
 FitHist.h:202
 FitHist.h:203
 FitHist.h:204
 FitHist.h:205
 FitHist.h:206
 FitHist.h:207
 FitHist.h:208
 FitHist.h:209
 FitHist.h:210
 FitHist.h:211
 FitHist.h:212
 FitHist.h:213
 FitHist.h:214
 FitHist.h:215
 FitHist.h:216
 FitHist.h:217
 FitHist.h:218
 FitHist.h:219
 FitHist.h:220
 FitHist.h:221
 FitHist.h:222
 FitHist.h:223
 FitHist.h:224
 FitHist.h:225
 FitHist.h:226
 FitHist.h:227
 FitHist.h:228
 FitHist.h:229
 FitHist.h:230
 FitHist.h:231
 FitHist.h:232
 FitHist.h:233
 FitHist.h:234
 FitHist.h:235
 FitHist.h:236
 FitHist.h:237
 FitHist.h:238
 FitHist.h:239
 FitHist.h:240
 FitHist.h:241
 FitHist.h:242
 FitHist.h:243
 FitHist.h:244
 FitHist.h:245
 FitHist.h:246
 FitHist.h:247
 FitHist.h:248
 FitHist.h:249
 FitHist.h:250
 FitHist.h:251
 FitHist.h:252
 FitHist.h:253
 FitHist.h:254
 FitHist.h:255
 FitHist.h:256
 FitHist.h:257
 FitHist.h:258
 FitHist.h:259
 FitHist.h:260
 FitHist.h:261
 FitHist.h:262
 FitHist.h:263
 FitHist.h:264
 FitHist.h:265
 FitHist.h:266
 FitHist.h:267
 FitHist.h:268
 FitHist.h:269
 FitHist.h:270
 FitHist.h:271
 FitHist.h:272
 FitHist.h:273
 FitHist.h:274
 FitHist.h:275
 FitHist.h:276
 FitHist.h:277
 FitHist.h:278
 FitHist.h:279
 FitHist.h:280
 FitHist.h:281
 FitHist.h:282
 FitHist.h:283
 FitHist.h:284
 FitHist.h:285
 FitHist.h:286
 FitHist.h:287
 FitHist.h:288
 FitHist.h:289
 FitHist.h:290
 FitHist.h:291
 FitHist.h:292
 FitHist.h:293
 FitHist.h:294
 FitHist.h:295
 FitHist.h:296
 FitHist.h:297
 FitHist.h:298
 FitHist.h:299
 FitHist.h:300
 FitHist.h:301
 FitHist.h:302
 FitHist.h:303
 FitHist.h:304
 FitHist.h:305
 FitHist.h:306
 FitHist.h:307
 FitHist.h:308
 FitHist.h:309
 FitHist.h:310
 FitHist.h:311
 FitHist.h:312
 FitHist.h:313
 FitHist.h:314
 FitHist.h:315
 FitHist.h:316
 FitHist.h:317
 FitHist.h:318
 FitHist.h:319
 FitHist.h:320
 FitHist.h:321
 FitHist.h:322
 FitHist.h:323
 FitHist.h:324
 FitHist.h:325
 FitHist.h:326
 FitHist.h:327
 FitHist.h:328
 FitHist.h:329
 FitHist.h:330
 FitHist.h:331
 FitHist.h:332
 FitHist.h:333
 FitHist.h:334
 FitHist.h:335
 FitHist.h:336
 FitHist.h:337
 FitHist.h:338
 FitHist.h:339
 FitHist.h:340
 FitHist.h:341
 FitHist.h:342
 FitHist.h:343
 FitHist.h:344
 FitHist.h:345
 FitHist.h:346
 FitHist.h:347
 FitHist.h:348
 FitHist.h:349
 FitHist.h:350
 FitHist.h:351
 FitHist.h:352
 FitHist.h:353
 FitHist.h:354
 FitHist.h:355
 FitHist.h:356
 FitHist.h:357
 FitHist.h:358
 FitHist.h:359
 FitHist.h:360
 FitHist.h:361
 FitHist.h:362
 FitHist.h:363
 FitHist.h:364
 FitHist.h:365
 FitHist.h:366
 FitHist.h:367
 FitHist.h:368
 FitHist.h:369
 FitHist.h:370