GSI Object Oriented Online Offline (Go4)  GO4-6.3.0
TXXXAnlProc.cxx
Go to the documentation of this file.
1 // $Id: TXXXAnlProc.cxx 478 2009-10-29 12:26:09Z linev $
2 //-----------------------------------------------------------------------
3 // The GSI Online Offline Object Oriented (Go4) Project
4 // Experiment Data Processing at EE department, GSI
5 //-----------------------------------------------------------------------
6 // Copyright (C) 2000- GSI Helmholtzzentrum fuer Schwerionenforschung GmbH
7 // Planckstr. 1, 64291 Darmstadt, Germany
8 // Contact: http://go4.gsi.de
9 //-----------------------------------------------------------------------
10 // This software can be used under the license agreements as stated
11 // in Go4License.txt file which is part of the distribution.
12 //-----------------------------------------------------------------------
13 
14 #include "TXXXAnlProc.h"
15 
16 #include "TH1.h"
17 #include "TGraph.h"
18 
19 #include "TGo4Log.h"
20 #include "TGo4WinCond.h"
21 #include "TGo4Fitter.h"
22 
23 #include "TXXXAnlEvent.h"
24 #include "TXXXUnpackEvent.h"
25 #include "TXXXParameter.h"
26 #include "TXXXCalibPar.h"
27 
28 //***********************************************************
31 {
32 }
33 
34 //***********************************************************
35 // this one is used in TXXXAnlFact
36 TXXXAnlProc::TXXXAnlProc(const char *name) :
37  TGo4EventProcessor(name)
38 {
39  TGo4Log::Info("TXXXAnlProc: Create %s", name);
41  fParam1 = (TXXXParameter *) GetParameter("XXXPar1");
42  fParam2 = (TXXXParameter *) GetParameter("XXXPar2");
43  fWinCon = (TGo4WinCond *) GetAnalysisCondition("wincon1");
44 
45  fSum1 = MakeTH1('I', "Sum1", "Sum over 8 channels", 5000, 1., 5001.);
46  fSum2 = MakeTH1('I', "Sum2", "Sum over 8 channels shift 1", 5000, 1., 5001.);
47  fSum3 = MakeTH1('I', "Sum3", "Sum over 8 channels shift 2", 5000, 1., 5001.);
48  fCaliSum1 = MakeTH1('I', "Sum1Calib", "Sum over 8 channels(keV)", 5000, 1., 20.);
49 
50  fFitSrc = MakeTH1('I', "FitSource","Copy of fit data", 1000, 0., 1000.);
51  fFitRes = MakeTH1('I', "FitTarget","Copy of fit result", 1000, 0., 1000.);
52 
53  fCaligraph = (TGraph *) GetObject("Calibration");
54  if (!fCaligraph) {
55  fCaligraph = new TGraph;
56  fCaligraph->SetName("Calibration");
57  fCaligraph->SetMarkerStyle(3);
59  }
60 
61  fFitter = (TGo4Fitter *) GetObject("Fitter");
62  if (!fFitter) {
63  fFitter = new TGo4Fitter("Fitter", TGo4Fitter::ff_chi_square, kTRUE);
64  fFitter->AddH1("data", nullptr, kFALSE, 100., 1000.);
65  fFitter->AddPolynomX("data", "Pol", 1);
67  }
68 
69  fCalipar = (TXXXCalibPar *) GetParameter("CaliPar");
70  if (!fCalipar) {
71  // calibration parameter not yet existing, we set it up:
72  fCalipar = new TXXXCalibPar("CaliPar",GetHistogram("Cr1Ch01"),fCaligraph);
74  }
75 
76  fFitCounter = 0;
77 }
78 //***********************************************************
80 {
81 }
82 
83 //-----------------------------------------------------------
84 
86 {
88  TXXXAnlEvent* out_evt = (TXXXAnlEvent*) dest;
89 
90  out_evt->SetValid(kFALSE); // events are not stored until kTRUE is set
91  if(!inp_evt || !inp_evt->IsValid()) return kFALSE; // do not process unvalid event
92  out_evt->SetValid(kTRUE); // events are not stored until kTRUE is set
93  Int_t cnt = 0;
94  TXXXUnpackEvent& ev=*inp_evt; // ref instead pointer for array syntax below
95  for (Int_t cr = 1; cr < 3; cr++) {
96  // loop over first filled crates 1 and 2
97  for (Int_t ii = 0; ii < 4; ii++) {
98  // get first channels of each crate
99  TXXXModule* mod=dynamic_cast<TXXXModule*>( &ev[cr][ii]); // 2d array with composite event operator[]
100  if(!mod) continue;
101  Float_t val= mod->GetData();
102  out_evt->frData[cnt] = val;
103  if(val) fCaliSum1->Fill(fCalipar->Energy(val));
104  cnt++;
105  }
106  }
107 
108  for (Int_t ii = 0; ii < 8; ii++)
109  if (out_evt->frData[ii]) {
110  if(fWinCon && fWinCon->Test(out_evt->frData[ii])) fSum1->Fill(out_evt->frData[ii]);
111  if (fParam1) fSum2->Fill(out_evt->frData[ii] + fParam1->frP1);
112  if (fParam2) fSum3->Fill(out_evt->frData[ii] + fParam2->frP1);
113  }
114 
115  fFitCounter++;
116 
117  if ((fFitCounter % 500000 == 0) && fFitter) {
118  TH1 *histo1 = GetHistogram("Crate1/Cr1Ch04");
119 
120  if (histo1) {
121  fFitter->SetH1("data", histo1, kFALSE);
122  fFitter->DoActions();
123 
124  fFitSrc->Reset();
125  fFitSrc->SetBins(histo1->GetNbinsX(), histo1->GetXaxis()->GetXmin(), histo1->GetXaxis()->GetXmax());
126  fFitSrc->Add(histo1);
127 
128  TH1 *histo2 = (TH1 *) fFitter->CreateDrawObject("FitResult", "data", kTRUE);
129  fFitRes->Reset();
130  if (histo2) {
131  fFitRes->SetBins(histo2->GetNbinsX(), histo2->GetXaxis()->GetXmin(), histo2->GetXaxis()->GetXmax());
132  fFitRes->Add(histo2);
133 
134  TString title = TString::Format("Result K=%5.3f B=%7.1f", fFitter->GetParValue("Pol_1.Ampl"), fFitter->GetParValue("Pol_0.Ampl"));
135  fFitRes->SetTitle(title.Data());
136  delete histo2;
137  }
138  }
139  }
140 
141  return kTRUE;
142 }
TH1 * fFitSrc
Definition: TXXXAnlProc.h:45
TH1 * MakeTH1(char type, const char *fullname, const char *title, Int_t nbinsx, Double_t xlow, Double_t xup, const char *xtitle=nullptr, const char *ytitle=nullptr)
TNamed * GetObject(const char *name, const char *folder=nullptr)
virtual ~TXXXAnlProc()
Definition: TXXXAnlProc.cxx:54
void SetValid(Bool_t on)
static void Info(const char *text,...) GO4_PRINTF_ARGS
Definition: TGo4Log.cxx:294
TGo4Fitter * fFitter
Definition: TXXXAnlProc.h:43
Bool_t AddParameter(TGo4Parameter *par, const char *subfolder=nullptr)
void AddPolynomX(const char *DataName, const char *NamePrefix, Int_t MaxOrder=1, Int_t GroupIndex=0, Double_t lrange=0., Double_t rrange=0.)
Definition: TGo4Fitter.cxx:235
TH1 * fSum3
Definition: TXXXAnlProc.h:34
TGraph * fCaligraph
Definition: TXXXAnlProc.h:36
TXXXParameter * fParam1
Definition: TXXXAnlProc.h:38
Bool_t IsValid() const
Double_t Energy(Int_t channel)
TXXXParameter * fParam2
Definition: TXXXAnlProc.h:39
TH1 * fSum2
Definition: TXXXAnlProc.h:33
TH1 * fFitRes
Definition: TXXXAnlProc.h:46
TH1 * fSum1
Definition: TXXXAnlProc.h:32
Int_t GetData() const
TGo4Condition * GetAnalysisCondition(const char *name, const char *cond_cl=nullptr)
TObject * CreateDrawObject(const char *ObjName, const char *DataName, Bool_t IsModel=kFALSE, const char *ModelName=nullptr)
Definition: TGo4Fitter.cxx:935
TGo4EventElement * GetInputEvent()
Bool_t BuildEvent(TGo4EventElement *dest) override
Definition: TXXXAnlProc.cxx:62
TGo4Parameter * GetParameter(const char *name, const char *par_class=nullptr)
Int_t fFitCounter
Definition: TXXXAnlProc.h:44
TXXXCalibPar * fCalipar
Definition: TXXXAnlProc.h:40
TGo4WinCond * fWinCon
Definition: TXXXAnlProc.h:37
Bool_t Test(Double_t v1) override
Definition: TGo4WinCond.cxx:86
TGo4FitDataHistogram * SetH1(const char *DataName, TH1 *histo, Bool_t Owned=kFALSE)
Definition: TGo4Fitter.cxx:136
Bool_t AddObject(TNamed *anything, const char *subfolder=nullptr)
TH1 * GetHistogram(const char *name)
TH1 * fCaliSum1
Definition: TXXXAnlProc.h:35
void DoActions(Bool_t AllowFitterChange=kFALSE, TObjArray *Actions=nullptr)
Float_t frData[XXX_NUM_CHAN]
Definition: TXXXAnlEvent.h:28
Double_t GetParValue(const char *ParName)
TGo4FitDataHistogram * AddH1(const char *DataName, TH1 *histo, Bool_t Owned=kFALSE, Double_t lrange=0., Double_t rrange=0.)
Definition: TGo4Fitter.cxx:127