Re: [ROOT] ToggleEventStatus and peak labels

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon Nov 24 2003 - 10:30:02 MET


Hi Constantin,

Constantin Vaman wrote:
> 
> Hi All,
> I am trying to use Root in acquisition system for gamma spectroscopy, and
> have a couple of probably naive questions.
> After creating a TCanvas instance, ToggleEventStatus() method will display
> in the status bar the cross hair position as nr. of channels. What I am
> interested in, is to display the cursor position in terms of energy. E.g.
> for a 0.25 keV/ch, I want an energy of 100 to be displayed as the x coordinate
> in the status bar, when the cursor is above channel 400.

This is already the case

> Also, I would like to know how can avoid having the x coordinate being
> displayed in scientific format for x > 1000, when the cross hair is not
> precisely on the histogram contour.

Take the version from CVS. I have modified the format.

> Finally, I can find the peaks automatically, but I can't figure out how to
> display automatically and nicely the energy corresponding to a particular
> peak, above the peak, on the histogram.
>

see an example in the macro in attachement

Rene Brun 
> I would very much appreciate any help, and/or references to samples of
> code.
> 
> Best regards,
> 
> Constantin Vaman,
> SUNY at Stony Brook.

// Example to illustrate the peak finder (class TSpectrum).
// This script generates a random number of gaussian peaks
// on top of a linear background.
// The position of the peaks is found via TSpectrum
// To execute this example, do
//  root > .x showpeaks.C  (generate 20 peaks by default)
//  root > .x showpeaks.C(30) (generates 30 peaks)
//
// Author: Rene Brun

#include "TCanvas.h"
#include "TH1.h"
#include "TF1.h"
#include "TRandom.h"
#include "TSpectrum.h"
   
Int_t npeaks;
Double_t fpeaks(Double_t *x, Double_t *par) {
   Double_t result = par[0] + par[1]*x[0];
   for (Int_t p=0;p<npeaks;p++) {
      Double_t norm  = par[3*p+2];
      Double_t mean  = par[3*p+3];
      Double_t sigma = par[3*p+4];
      result += norm*TMath::Gaus(x[0],mean,sigma);
   }
   return result;
}
void showpeaks(Int_t np=20) {
   npeaks = np;
   TH1F *h = new TH1F("h","test",500,0,1000);
   //generate n peaks at random
   Double_t par[3000];
   par[0] = 0.8;
   par[1] = -0.6/1000;
   Int_t p;
   for (p=0;p<npeaks;p++) {
      par[3*p+2] = 1;
      par[3*p+3] = 10+gRandom->Rndm()*980;
      par[3*p+4] = 3+2*gRandom->Rndm();
   }
   TF1 *f = new TF1("f",fpeaks,0,1000,2+3*npeaks);
   f->SetNpx(1000);
   f->SetParameters(par);
   TCanvas *c1 = new TCanvas("c1","c1",10,10,1000,600);
   h->FillRandom("f",200000);
   h->Draw();

   //Use TSpectrum to find the peak candidates
   TSpectrum *s = new TSpectrum(2*npeaks);
   Int_t nfound = s->Search(h,1,"");
   Float_t *xpeaks = s->GetPositionX();
   TArrow arrow;
   arrow.SetFillColor(kBlue);
   Double_t dy = 0.1*h->GetMaximum();
   for (p=0;p<nfound;p++) {
      Float_t xp = xpeaks[p];
      Int_t bin = h->GetXaxis()->FindBin(xp);
      Float_t yp = h->GetBinContent(bin);
      arrow.DrawArrow(xp,yp+dy,xp,yp+0.2*dy,0.02,"|>");
   }
}



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:17 MET