ROOT logo
using namespace std;
#include "honlinemonstack.h"
#include "honlinehistarray.h"
#include "honlinetrendhist.h"
#include <iostream> 
#include <iomanip>
#include "TObjString.h"
#include "TLegend.h"
#include "TGraph.h"
#include "TList.h"

ClassImp(HOnlineMonStack)


HOnlineMonStack::HOnlineMonStack(const Char_t* name, const Char_t* title )
    :  HOnlineMonHistAddon(name,title,1,1)
{
    stack = new TObjArray();
    firstName = "";
}

HOnlineMonStack::HOnlineMonStack(HOnlineMonStack& h)
    :  HOnlineMonHistAddon(h.GetName(),h.GetTitle(),1,1)
{

    cout<<"copy Object"<<endl;

    stack = new TObjArray();

    TIterator* iter = stack->MakeIterator();
    TObject* obj = NULL;
    while ( (obj = iter->Next()) !=NULL)
    {
	TString clname = obj->ClassName();
	if(clname.CompareTo("HOnlineMonHist") == 0) {
	    stack->Add(new HOnlineMonHist(*((HOnlineMonHist*)obj)));

	} else if (clname.CompareTo("HOnlineMonHist2")==0 ) {
	    stack->Add(new HOnlineMonHist2(*((HOnlineMonHist2*)obj)));

	} else if (clname.CompareTo("HOnlineHistArray")==0 ) {
	    stack->Add(new HOnlineHistArray(*((HOnlineHistArray*)obj)));

	} else if (clname.CompareTo("HOnlineHistArray2")==0 ) {
	    stack->Add(new HOnlineHistArray2(*((HOnlineHistArray2*)obj)));

	} else if (clname.CompareTo("HOnlineTrendArray")==0 ) {
	    stack->Add(new HOnlineTrendArray(*((HOnlineTrendArray*)obj)));

	} else if (clname.CompareTo("TLegend")==0 ) {
	    stack->Add(new TLegend(*((TLegend*)obj)));

	} else if (clname.CompareTo("TGraph")==0 ) {
	    stack->Add(new TGraph(*((TGraph*)obj)));

	} else {
	    Error("HOnlineMonStack()","Unsupported Object type =%s!",clname.Data());
	}

    }
    delete iter;

    firstName = "";
}

void HOnlineMonStack::reset(Int_t level,Int_t count)
{

    if(level < 10 ) return; // online on client side!
    TIterator* iter = stack->MakeIterator();
    TObject* obj = NULL;
    while ( (obj = iter->Next()) !=NULL)
    {

	TString clname = obj->ClassName();
	if(clname.CompareTo("HOnlineMonHist") == 0 ||
           clname.CompareTo("HOnlineMonHist2") == 0 ||
           clname.CompareTo("HOnlineHistArray") == 0 ||
           clname.CompareTo("HOnlineHistArray2") == 0 ||
           clname.CompareTo("HOnlineTrendArray") == 0

	  ) {

	    ((HOnlineMonHistAddon*)obj)->reset(0,0);

	} else if (clname.CompareTo("TGraph")==0 ) {


	}
	if(obj->InheritsFrom("TH1")) {
	    ((TH1*)obj)->Reset();
	}

    }
    delete iter;

}

void HOnlineMonStack::add(HOnlineMonHistAddon* h)
{
    HOnlineMonStack* st = (HOnlineMonStack*) h;

    TIterator* iter = stack->MakeIterator();
    TObject* obj = NULL;
    while ( (obj = iter->Next()) !=NULL)
    {

	TString clname = obj->ClassName();
	if(clname.CompareTo("HOnlineMonHist") == 0 ||
           clname.CompareTo("HOnlineMonHist2") == 0 ||
           clname.CompareTo("HOnlineHistArray") == 0 ||
           clname.CompareTo("HOnlineHistArray2") == 0 ||
           clname.CompareTo("HOnlineTrendArray") == 0

	  ) {
	    HOnlineMonHistAddon* addon  = (HOnlineMonHistAddon*)obj;
	    HOnlineMonHistAddon* addon2 = (HOnlineMonHistAddon*) st->getStack()->FindObject(addon->GetName());

	    addon->add(addon2);

	} else if (clname.CompareTo("TGraph")==0 ) {


	}
	if(obj->InheritsFrom("TH1")) {
	    TH1* h  = (TH1*)obj;
	    TH1* h2 = (TH1*) st->getStack()->FindObject(h->GetName());

	    h->Add(h2);
	}


    }
    delete iter;

}

void HOnlineMonStack::getMinMax(Double_t& min,Double_t& max)
{

    max = -1e200;
    min =  1e200;

    Double_t minL = min;
    Double_t maxL = max;

    TIterator* iter = stack->MakeIterator();
    TObject* obj = NULL;
    while ( (obj = iter->Next()) !=NULL)
    {
	TString clname = obj->ClassName();
	if(obj->InheritsFrom("HOnlineMonHistAddon")){
	    ((HOnlineMonHistAddon*)obj)->getMinMax(minL,maxL);
            if(minL < min) min = minL;
            if(maxL > max) max = maxL;
	} else if (clname.CompareTo("TGraph")==0 ) {


	} else if (obj->InheritsFrom("TH1") ) {

	    if(clname.Contains("TH1")) {

                TH1* h = (TH1*)obj;

		for(Int_t i = 0; i < h->GetNbinsX(); i++ ) {
		    Double_t val = h->GetBinContent(i+1);
		    if(val < min) min = val;
		    if(val > max) max = val;

		}
	    }

            if(clname.Contains("TH2")) {

                TH2* h = (TH2*)obj;

		for(Int_t i = 0; i < h->GetNbinsX(); i++ ) {
		    for(Int_t j = 0; j < h->GetNbinsY(); j++ ) {
			Double_t val = h->GetBinContent(i+1,j+1);
			if(val < min) min = val;
			if(val > max) max = val;
		    }
		}
	    }
	}
    }
    delete iter;


}


void HOnlineMonStack::draw(Bool_t allowHiddenZero)
{


    Double_t min,max;
    getMinMax(min,max);

    TIterator* iter = stack->MakeIterator();
    TObject* obj = NULL;
    Bool_t first =kTRUE;

    while ( (obj = iter->Next()) !=NULL)
    {

	TString clname = obj->ClassName();

	Int_t linecol     = -1;
        Int_t linestyle   = -1;
        Int_t fillcol     = -1;
        Int_t fillstyle   = -1;
        Int_t markercol   = -1;
        Int_t markerstyle = -1;
        Float_t markersize  = -1;
        TString Option    = "no";

        //---------------------------------------------------
        // options support
	if(clname.CompareTo("HOnlineMonHist")   == 0 ||
           clname.CompareTo("HOnlineMonHist2")  == 0 ||
           clname.CompareTo("HOnlineTrendHist") == 0 ||
           obj->InheritsFrom("TH1")                  ||
           clname.CompareTo("TGraph")==0
	  ){
	    TString name = ((TNamed*)obj)->GetName();

	    if(options.find(name) != options.end()){

		TString option = options[name];

		TObjArray* myarguments = option.Tokenize(" ");
		TIterator* myiter = myarguments->MakeIterator();
                TObjString* stemp;
	        TString argument;
	        // iterate over the list of arguments
		while ((stemp=(TObjString*)myiter->Next())!= 0)
		{   //LINE#0:0 FILL#0:0 MARKER#0:0:0 OPT#
		    argument=stemp->GetString();
		    if(argument.Contains("LINE#")){
			argument.ReplaceAll(":"," ");
			sscanf(argument.Data(),"%i%i",&linecol,&linestyle);

		    } else if (argument.Contains("FILL#")) {
			argument.ReplaceAll("FILL#","");
			argument.ReplaceAll(":"," ");
			sscanf(argument.Data(),"%i%i",&fillcol,&fillstyle);

		    } else if (argument.Contains("MARKER#")) {
			argument.ReplaceAll("MARKER#","");
			argument.ReplaceAll(":"," ");
			sscanf(argument.Data(),"%i%i%f",&markercol,&markerstyle,&markersize);

                    } else if (argument.Contains("OPT#")) {
			argument.ReplaceAll("OPT#","");
			Option=argument;
		    }

		}

		delete myiter;
		myarguments->Delete();
		delete myarguments;

	    }



	}
        //---------------------------------------------------



	if(obj->InheritsFrom("HOnlineMonHistAddon")){

            if(!first) ((HOnlineMonHistAddon*)obj)->setDrawSame(kTRUE);

	    if(clname.CompareTo("HOnlineHistArray") == 0 ){
		((HOnlineHistArray*)obj)->drawAll( kTRUE ,min,max);
	    } else if(clname.CompareTo("HOnlineHistArray2") == 0 ){
		((HOnlineHistArray2*)obj)->drawAll( kTRUE ,min,max);
            } else if(clname.CompareTo("HOnlineTrendArray") == 0 ){
		((HOnlineTrendArray*)obj)->drawAll( kTRUE ,min,max);
	    } else ((HOnlineMonHistAddon*)obj)->draw();


	    first = kFALSE;

	} else if (clname.CompareTo("TGraph")==0 && !first) {


            if(linecol     > 0) ((TGraph*)obj)->SetLineColor(linecol);
            if(linestyle   > 0) ((TGraph*)obj)->SetLineStyle(linestyle);
            if(markerstyle > 0) ((TGraph*)obj)->SetMarkerStyle(markercol);
            if(markercol   > 0) ((TGraph*)obj)->SetMarkerColor(markercol);
            if(markersize  > 0) ((TGraph*)obj)->SetMarkerSize(markersize);

	    if(!first) {
		if(Option == "no") ((TGraph*)obj)->Draw("Psame");
        	else               ((TGraph*)obj)->Draw(Form("%ssame",Option.Data()));
            }
	} else if (obj->InheritsFrom("TH1") ) {

	    if(clname.Contains("TH1")){
		((TH1*)obj)->SetMinimum(min*1.1);
		((TH1*)obj)->SetMaximum(max*1.1);
		if(linecol     > 0) ((TH1*)obj)->SetLineColor(linecol);
		if(linestyle   > 0) ((TH1*)obj)->SetLineStyle(linestyle);
		if(markerstyle > 0) ((TH1*)obj)->SetMarkerStyle(markercol);
		if(markercol   > 0) ((TH1*)obj)->SetMarkerColor(markercol);
		if(markersize  > 0) ((TH1*)obj)->SetMarkerSize(markersize);

	    }

	    if(clname.Contains("TH2")){
		// nothing to do
		if(markerstyle > 0) ((TH1*)obj)->SetMarkerStyle(markercol);
		if(markercol   > 0) ((TH1*)obj)->SetMarkerColor(markercol);
		if(markersize  > 0) ((TH1*)obj)->SetMarkerSize(markersize);
	    }


	    if(first){
		if(Option == "no")((TH1*)obj)->Draw();
		else              ((TH1*)obj)->Draw(Option.Data());
	    } else {
		if(Option == "no")((TH1*)obj)->Draw("same");
		else              ((TH1*)obj)->Draw(Form("%ssame",Option.Data()));
	    }
	    first = kFALSE;

	} else if (clname.CompareTo("TLegend")==0 ) {

	    ((TLegend*)obj)->Draw();
	}



    }
    delete iter;

}


HOnlineMonStack::~HOnlineMonStack()
{
    if(stack) delete stack;
    stack = 0;
}
void HOnlineMonStack::addTimeStamp( TString timestamp)
{
    if(stack->GetEntries() > 0){
	TObject* obj = stack->At(0);

	if(obj && firstName == "" && obj->InheritsFrom("TNamed")){
	    firstName = ((TNamed*)obj)->GetTitle();
	}

	if(obj) ((TNamed*)obj) ->SetTitle(Form("%s%s",firstName.Data(),timestamp.Data()));
    }
}
void  HOnlineMonStack::addToStack(TObject* obj,TString option)
{
    if(option.CompareTo("") != 0 && obj->InheritsFrom("TNamed")){
	TString name = ((TNamed*)(obj))->GetName();
	if(name.CompareTo("") != 0){
	    if(options.find(name) == options.end()) {
		options[name] = option;
	    }
	}
    }
    stack->Add(obj);
}

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