ROOT logo
#include <TMath.h>
#include <TGraph.h>
#include <TCanvas.h>
#include <TArrayI.h>
#include <TRandom.h>
#include <TLegend.h>
#include <iostream>
#include <TH1.h>

void
convert(UShort_t rate, Int_t adc, Int_t last, TArrayI& counts)
{
  if (rate == 1) { 
    Float_t a = adc;
    if (a < 0) a = 0;
    counts[0] = UShort_t(TMath::Min(a, 1023.F));
    return;
  }
  Float_t b = 6;
  for (Ssiz_t i = 0; i < rate; i++) { 
    Float_t t = Float_t(i) / rate + 1./rate;
    Float_t s = adc + (last - adc) * TMath::Exp(-b * t);
    Float_t a = s;
    if (a < 0) a = 0;
    counts[i] = UShort_t(TMath::Min(a, 1023.F));
    std::cout << " rate=" << rate << "\tadc=" << adc 
	      << "\tcount[" << i << "]=" << counts[i] 
	      << "\ts=" << adc << " + (" << last << " - " 
	      << adc << ") * exp(-" << b << " * " << t 
	      << ")=" << s << std::endl;
  }
  return;
}

TGraph* 
makeGraph(const TArrayI& adcs, Int_t rate) 
{
  Int_t    last = adcs.fArray[0];
  TArrayI  counts(4);
  TGraph*  graph = new TGraph(rate * adcs.fN);
  graph->SetLineColor(rate);
  graph->SetMarkerColor(rate);
  graph->SetMarkerStyle(20+rate);
  graph->SetLineStyle(rate);
  graph->SetName(Form("rate%d", rate));
  graph->SetTitle(Form("Rate %d", rate));
  for (Int_t i = 0; i < adcs.fN; i++) { 
    counts.Reset(-1);
    convert(rate, adcs.fArray[i], last, counts);
    
    for (Int_t j = 0; j < rate; j++) { 
      Int_t    idx = (i * rate + j);
      Double_t x   = (i + (rate > 1 ? Float_t(j+1) / rate-1 : 0));
      graph->SetPoint(idx, x, counts[j]);
    }
    last = counts[rate - 1];
  }
  return graph;
}

void
TestShaping(int max=4)
{
  TArrayI adcs(10);
  TGraph* orig = new TGraph(adcs.fN);
  orig->SetName("Original");
  orig->SetTitle("Original");
  orig->SetMarkerStyle(25);
  orig->SetMarkerColor(1);
  orig->SetMarkerSize(2);
  orig->SetLineColor(1);
  for (Int_t i = 0; i < adcs.fN; i++) { 
    adcs.fArray[i] = Int_t(gRandom->Uniform(0, 1023));
    orig->SetPoint(i, i, adcs.fArray[i]);
  }

  TCanvas* c = new TCanvas("c", "c");
  c->SetFillColor(0);
  c->SetTopMargin(.02);
  c->SetRightMargin(.02);
  
  TH1* h = new TH1F("frame","frame", adcs.fN+1, -2, adcs.fN);
  h->SetMinimum(0);
  h->SetMaximum(1300);
  h->SetStats(0);
  h->Draw("");
  orig->Draw("pl same");

  TLegend* l = new TLegend(adcs.fN*3./4, 1023, adcs.fN, 1300, "", "");
  l->SetFillColor(0);
  l->SetBorderSize(1);
  l->AddEntry(orig, orig->GetTitle(), "lp");
  
  for (int i = 1; i <= max; i++) {
    TGraph* g = makeGraph(adcs, i);
    g->Draw("pl same");
    l->AddEntry(g, g->GetTitle(), "lp");
  }
  l->Draw();
  
  c->Modified();
  c->Update();
  c->cd();
}

  
  
    

     
 TestShaping.C:1
 TestShaping.C:2
 TestShaping.C:3
 TestShaping.C:4
 TestShaping.C:5
 TestShaping.C:6
 TestShaping.C:7
 TestShaping.C:8
 TestShaping.C:9
 TestShaping.C:10
 TestShaping.C:11
 TestShaping.C:12
 TestShaping.C:13
 TestShaping.C:14
 TestShaping.C:15
 TestShaping.C:16
 TestShaping.C:17
 TestShaping.C:18
 TestShaping.C:19
 TestShaping.C:20
 TestShaping.C:21
 TestShaping.C:22
 TestShaping.C:23
 TestShaping.C:24
 TestShaping.C:25
 TestShaping.C:26
 TestShaping.C:27
 TestShaping.C:28
 TestShaping.C:29
 TestShaping.C:30
 TestShaping.C:31
 TestShaping.C:32
 TestShaping.C:33
 TestShaping.C:34
 TestShaping.C:35
 TestShaping.C:36
 TestShaping.C:37
 TestShaping.C:38
 TestShaping.C:39
 TestShaping.C:40
 TestShaping.C:41
 TestShaping.C:42
 TestShaping.C:43
 TestShaping.C:44
 TestShaping.C:45
 TestShaping.C:46
 TestShaping.C:47
 TestShaping.C:48
 TestShaping.C:49
 TestShaping.C:50
 TestShaping.C:51
 TestShaping.C:52
 TestShaping.C:53
 TestShaping.C:54
 TestShaping.C:55
 TestShaping.C:56
 TestShaping.C:57
 TestShaping.C:58
 TestShaping.C:59
 TestShaping.C:60
 TestShaping.C:61
 TestShaping.C:62
 TestShaping.C:63
 TestShaping.C:64
 TestShaping.C:65
 TestShaping.C:66
 TestShaping.C:67
 TestShaping.C:68
 TestShaping.C:69
 TestShaping.C:70
 TestShaping.C:71
 TestShaping.C:72
 TestShaping.C:73
 TestShaping.C:74
 TestShaping.C:75
 TestShaping.C:76
 TestShaping.C:77
 TestShaping.C:78
 TestShaping.C:79
 TestShaping.C:80
 TestShaping.C:81
 TestShaping.C:82
 TestShaping.C:83
 TestShaping.C:84
 TestShaping.C:85
 TestShaping.C:86
 TestShaping.C:87
 TestShaping.C:88
 TestShaping.C:89
 TestShaping.C:90
 TestShaping.C:91
 TestShaping.C:92
 TestShaping.C:93
 TestShaping.C:94
 TestShaping.C:95
 TestShaping.C:96
 TestShaping.C:97
 TestShaping.C:98
 TestShaping.C:99
 TestShaping.C:100
 TestShaping.C:101
 TestShaping.C:102
 TestShaping.C:103
 TestShaping.C:104
 TestShaping.C:105
 TestShaping.C:106
 TestShaping.C:107
 TestShaping.C:108
 TestShaping.C:109
 TestShaping.C:110
 TestShaping.C:111