GammaWare  Head Version for release 0.9
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
DanteWatchers.C
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2010 by Olivier Stezowski *
3  * stezow(AT)ipnl.in2p3.fr *
4  * *
5  * This program is free software; you can redistribute it and/or modify *
6  * it under the terms of the GNU General Public License as published by *
7  * the Free Software Foundation; either version 2 of the License, or *
8  * (at your option) any later version. *
9  * *
10  * This program is distributed in the hope that it will be useful, *
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13  * GNU General Public License for more details. *
14  * *
15  * You should have received a copy of the GNU General Public License *
16  * along with this program; if not, write to the *
17  * Free Software Foundation, Inc., *
18  * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
19  ***************************************************************************/
20 
21 
22 #include "DanteWatchers.h"
23 #include "TMath.h"
24 
25 #include <fstream>
26 
28 
30 
32 {
33  Double_t xtmp = X, ytmp = Y;
34 
35  X = AX + BX*xtmp + CX*TMath::Power(xtmp,2) ;
36  Y = AY + BY*ytmp + CY*TMath::Power(ytmp,2) ;
37 
38  if ( X < threshold_x_left || X > threshold_x_right ) {
39  has_fired = false;
40  }
41  if ( Y < threshold_y_down || Y > threshold_y_up ) {
42  has_fired = false;
43  }
44 }
45 
46 BaseDanteWatcher::BaseDanteWatcher(const char *name, const char *title,TDirectory *sp_dir, TDirectory *tag_dir):
47 RancLegnaroWatcher(name,title,sp_dir,tag_dir)
48 {
49  // to be sure the LUT is initialized
50  InitLUT();
51  fNumberOfModules = 0;
52 
53  if ( !LoadCalibration("Dante.conf") )
54  fLog << warning << "Dante.conf not found in the current directory ... LoadCalibration should be called at least once !! " << dolog;
55 }
56 
58 {
59 }
60 
61 // should add nmore test to be sure the file is consistant ...
62 Bool_t BaseDanteWatcher::LoadCalibration(const char *calib_file)
63 {
64  std::ifstream in(calib_file); std::string tmp;
65 
66  if ( in.is_open() == false )
67  return false;
68 
69  getline(in,tmp);
70  tmp += " ";
71  while ( in.good() && !in.eof() ) { // read input stream line by line
72 
73  if ( tmp[0] == '#' ) {
74  getline(in,tmp);
75  continue;
76  } // this line is a comment
77  {
78  Float_t dz, rz1, ry, rz2, rx, tx1, tx2,ty1, ty2, ax, bx, cx, ay, by, cy ;
79  Int_t which;
80  std::istringstream decode(tmp);
81 
82  decode >> which;
83  if ( which == -1 ) { // this is LUT
84  for (Short_t i = 0; i < fNumberOfModules; i++ )
85  for (Short_t j = 0; j < gNumberOfItems; j++ )
86  decode >> gLUT[j][i] ;
87 
88  /* cout << " LUT " << endl;
89  for (Short_t i = 0; i < fNumberOfModules; i++ )
90  for (Short_t j = 0; j < gNumberOfItems; j++ )
91  cout << j << " " << i << " " << gLUT[j][i] << endl ; */
92  }
93  else { // this a module
94  if ( which < gMaxNumberOfModules ) {
95 
96  decode >> dz >> rz1 >> ry >> rz2 >> rx >> tx1 >> tx2 >> ty1 >> ty2 >> ax >> bx >> cx >> ay >> by >> cy ;
97 
99 
100  fDante[which].Z = dz;
101 
102  fDante[which].AX = ax;
103  fDante[which].BX = bx;
104  fDante[which].CX = cx;
105 
106  fDante[which].AY = ay;
107  fDante[which].BY = by;
108  fDante[which].CY = cy;
109 
110  /*
111  fDante[which].AX = ay;
112  fDante[which].BX = by;
113  fDante[which].CX = cy;
114 
115  fDante[which].AY = ax;
116  fDante[which].BY = bx;
117  fDante[which].CY = cx; */
118 
119 
120  fDante[which].threshold_x_left = tx1;
121  fDante[which].threshold_x_right = tx2;
122  fDante[which].threshold_y_down = ty1;
123  fDante[which].threshold_y_up = ty2;
124 
125  fRotation_tmp[0][which].RotateZ(rz1*TMath::Pi()/180.);
126  fRotation_tmp[1][which].RotateY(ry*TMath::Pi()/180.);
127  fRotation_tmp[2][which].RotateZ(rz2*TMath::Pi()/180.);
128  fRotation_tmp[3][which].RotateX((360.-rx)*TMath::Pi()/180.);
129 
130  fRotation[which].RotateZ(rz1*TMath::Pi()/180.);
131  fRotation[which].RotateY(ry*TMath::Pi()/180.);
132  fRotation[which].RotateZ(rz2*TMath::Pi()/180.);
133  fRotation[which].RotateX((360.-rx)*TMath::Pi()/180.);
134  }
135  else {;}
136  }
137  }
138  // add null character at the end since getline
139  // does not store \n and it may give troubles when decoding
140  getline(in,tmp);
141  tmp += " ";
142  }
143  in.close();
144 
145  fLog << " Dante has been configured with " << fNumberOfModules << dolog;
146 
147  return true;
148 }
149 
151 {
152  // module 1
153  gLUT[0][0] = 96;
154  gLUT[1][0] = 97;
155  gLUT[2][0] = 0;
156  // module 2
157  gLUT[0][1] = 98;
158  gLUT[1][1] = 99;
159  gLUT[2][1] = 0;
160  // module 3
161  gLUT[0][2] = 100;
162  gLUT[1][2] = 101;
163  gLUT[2][2] = 0;
164  // module 2
165  gLUT[0][3] = 0;
166  gLUT[1][3] = 0;
167  gLUT[2][3] = 0;
168  // module 3
169  gLUT[0][4] = 0;
170  gLUT[1][4] = 0;
171  gLUT[2][4] = 0;
172 }
173 
175 {
176  if ( !(which < fNumberOfModules) )
177  return;
178 
179  TVector3 v(fDante[which].X,fDante[which].Y,fDante[which].Z);
180 
181  v = fRotation_tmp[0][which]*v; v = fRotation_tmp[1][which]*v; v = fRotation_tmp[2][which]*v; v = fRotation_tmp[3][which]*v;
182  // v = fRotation[which]*v;
183 
184  fDante[which].Xr = v.X();
185  fDante[which].Yr = v.Y();
186  fDante[which].Zr = v.Z();
187 }
188 
189 
190 void BaseDanteWatcher::Exec(Option_t *option)
191 {
192  // be sure the frame has been set properly
193  if ( fFrame == 0x0 )
194  { SetLastExecStatus(1); return; }
195  else {
196  if ( !fFrame->IsValid() )
197  { SetLastExecStatus(1); return; }
198  }
199 
200  // fill the array of floats
201  RancLegnaroWatcher::Exec(option);
202 
203  // fill up the different modules : calibrates and check the threshold
204  // to know the number of detector fired in this event
205  for (Int_t i = 0u; i < fNumberOfModules; i++) {
206 
207  fDante[i].has_fired = true;
208 
209  if ( rawBuf[gLUT[0][i]] < fDante[i].threshold_adc
210  || rawBuf[gLUT[1][i]] < fDante[i].threshold_adc
211  || rawBuf[gLUT[2][i]] < fDante[i].threshold_adc ) {
212 
213  // fDante[i].has_fired = false;
214  }
215 
216  // fill the data part
217  fDante[i].X = rawBuf[gLUT[0][i]];
218  fDante[i].Y = rawBuf[gLUT[1][i]];
219  fDante[i].T = rawBuf[gLUT[2][i]];
220  fDante[i].A = rawBuf[gLUT[3][i]];
221 
223  }
224 }
225 
226 #ifndef Gw_AgataEventContainer
227 #include "AgataEventContainer.h"
228 #endif
229 
230 #ifndef Gw_AgataEventDisplay
231 #include "AgataEventDisplay.h"
232 #endif
233 
234 #ifndef Gw_AgataGeometryTransformer
236 #endif
237 
239 
240 Float_t DisplayDante::fgMetric = 10.;
241 
242 DisplayDante::DisplayDante(const char *name, const char *title,TDirectory *sp_dir, TDirectory *tag_dir):
243 BaseDanteWatcher(name,title,sp_dir,tag_dir),
244 fCounts(0x0),
245 fPositions(0x0),
246 fPositionsC(0x0),
247 fPos3D(0x0),
248 fR(0x0),
249 fTheta(0x0),
250 fPhi(0x0),
251 fThetaxPhi(0x0),
252 fMaxCycle(100),
253 fConfFileName(Gw::AgataEventDisplay::GetDefaultDanteConf()),
254 fPathFile(Gw::AgataEventDisplay::GetDefaultAgataPath())
255 {
256 
257  fTypeName = AgataEventDisplay::Instance()->RegisterBranch();
258 
259  AgataEventDisplay::Instance()->SetTrackStyle("Rectangle", fTypeName);
260 
261  fCounts = MakeTH1<TH1F>("NbModules","To get the number of modules fired",gMaxNumberOfModules,0,gMaxNumberOfModules);
262 
263  // one histogram for each module
264  fPositions = new TObjArray(gMaxNumberOfModules);
265  fPositions->SetOwner(false);
266  fPositionsC = new TObjArray(gMaxNumberOfModules);
267  fPositionsC->SetOwner(false);
268 
269  for (Short_t i = 0u; i < gMaxNumberOfModules; i++) {
270 
271  TString tmp; TH2F *h;
272 
273  tmp = Form("Dante_X_Y_%d",i);
274  h = MakeTH2<TH2F>(tmp.Data(),"Raw Position in Dante",2048,0,4096,2048,0,4096);
275  fPositions->Add ( h ) ;
276 
277  tmp = Form("Dante_X_Y_%d_C",i);
278  h = MakeTH2<TH2F>(tmp.Data(),"Calibrated Positions in Dante;X;Y",1000,-30,30,1000,-30,30);
279  fPositionsC->Add ( h ) ;
280  }
281  fPos3D = MakeTH3<TH3F>("Pos3D","Positions of recoils in beam system;X;Y;Z",100,-150,150,100,-150,150,100,-150,150);
282 
283  fR = MakeTH1<TH1F>("R","R position",100,0,200);
284  fTheta = MakeTH1<TH1F>("Theta","Theta angles",90,0,180);
285  fPhi = MakeTH1<TH1F>("Phi","Phi angles",90,-180,180);
286 
287  fThetaxPhi = MakeTH2<TH2F>("ThetaxPhi","Raw Position in Dante",180,0,180,360,-180,180);
288 }
289 
291 {
292 
293 }
294 
295 void DisplayDante::SetActive(Bool_t active)
296 {
297  TTask::SetActive(active);
298  AgataEventDisplay::Instance()->Reset();
299 }
300 
301 void DisplayDante::DoCanvas(TCanvas *c, Option_t *o)
302 {
303  TString option = o;
304  if ( option == "" ) {
305 
306  UShort_t which_pad = 1u;
307  c->Divide(fNumberOfModules, 2, 0.001, 0.001); //
308 
309  for (Short_t i = 0u; i < fNumberOfModules; i++) {
310  c->cd(which_pad++);
311  fPositions->At(i)->Draw();
312  }
313  for (Short_t i = 0u; i < fNumberOfModules; i++) {
314  c->cd(which_pad++);
315  fPositionsC->At(i)->Draw();
316  }
317  }
318  if ( option.Contains("3D") ) {
319  printf(" ==> OPTION %s \n",o);
320  if ( option.Contains("OGL") )
321  fPos3D->Draw("glbox1");
322  else {
323  fPos3D->Draw("col");
324  }
325  }
326  if ( option == "2D" ) {
327  c->Divide(2, 2, 0.001, 0.001); //
328 
329  c->cd(1);
330  fR->Draw();
331  c->cd(2);
332  fTheta->Draw();
333  c->cd(3);
334  fPhi->Draw();
335  c->cd(4);
336  fThetaxPhi->Draw("col");
337  }
338 }
339 
340 void DisplayDante::ShowEve(const Char_t* danteConfFile, const Char_t* agataPathFile)
341 {
342  AgataEventDisplay::SetDefaultDanteConf(danteConfFile);
343  AgataEventDisplay::SetDefaultAgataPath(agataPathFile);
344  AgataEventDisplay::Instance()->BuildDefaultGeometry(true, false);
345  AgataEventDisplay::Instance()->ShowDisplay();
346 }
347 
348 void DisplayDante::Exec(Option_t *option)
349 {
350  // fill the array of floats
351  BaseDanteWatcher::Exec(option);
352 
353  // count the nummber of detectors that have fired
354  UShort_t nb_fired = 0u;
355  /*
356  AgataEventContainer* agataContainer = AgataEventDisplay::Instance()->GetEventContainer();
357 
358  if (agataContainer->GetNofEvents() > fMaxCycle) {
359  TTask::SetActive(false);
360  }
361  */
362  for (Int_t i = 0u; i < fNumberOfModules; i++) {
363  // TrackHit* hit = 0x0;
364  if ( fDante[i].has_fired ) {
365  // hit = agataContainer->NewTrackHit(fTypeName);
366  nb_fired++;
367  }
368  TH2F *h;
369  // raw positions
370  h = (TH2F *)fPositions->At(i);
371  h->Fill(rawBuf[gLUT[0][i]],rawBuf[gLUT[1][i]]);
372 
373  // calibrated
374  if ( fDante[i].has_fired ) {
375  h = (TH2F *)fPositionsC->At(i); h->Fill(fDante[i].X,fDante[i].Y);
376  /* StdHit* thit = hit->NewHit();
377  thit->SetX(-fDante[i].X/fgMetric);
378  thit->SetY(fDante[i].Y/fgMetric);
379  thit->SetZ(fDante[i].Z/fgMetric);
380  thit->SetE(fDante[i].A);
381  StdHit* shit = agataContainer->NewHit(fTypeName);
382  shit->SetX(-fDante[i].X/fgMetric);
383  shit->SetY(fDante[i].Y/fgMetric);
384  shit->SetZ(fDante[i].Z/fgMetric);
385  shit->SetE(fDante[i].A); */
386  }
387  //cout << fDante[i].Xr << " " << fDante[i].Yr << " " << fDante[i].Zr << endl;
388 
389  if ( fDante[i].has_fired ) {
390  fPos3D->Fill(fDante[i].Xr,fDante[i].Yr,fDante[i].Zr);
391 
392  TVector3 vtmp(fDante[i].Xr,fDante[i].Yr,fDante[i].Zr);
393  fR->Fill(vtmp.Mag());
394  fTheta->Fill(vtmp.Theta()*180./TMath::Pi());
395  fPhi->Fill(vtmp.Phi()*180./TMath::Pi());
396  fThetaxPhi->Fill(vtmp.Theta()*180./TMath::Pi(),vtmp.Phi()*180./TMath::Pi());
397  }
398  }
399  fCounts->Fill(nb_fired);
400  // agataContainer->FillTracks(fTypeName);
401  // agataContainer->FillHits(fTypeName);
402 }
403 
404 
406 
407 MyDanteTree::MyDanteTree(const char *name, const char *title, TTree *tree) :
408 BaseDanteWatcher(name,title), TTreeBuilder(name,title,tree)
409 {
410  fWhichDante = new UShort_t [gMaxNumberOfModules];
411  // hit in the dante module in global reference system
412  fDanteXr = new Float_t[gMaxNumberOfModules]; //[fNbModule]
413  fDanteYr = new Float_t[gMaxNumberOfModules]; //[fNbModule]
414  fDanteZr = new Float_t[gMaxNumberOfModules]; //[fNbModule]
415  // amplitude of the signal
416  fDanteA = new Float_t[gMaxNumberOfModules]; //[fNbModule]
417  // calibrated poistion in the module reference system
418  fDanteXc = new Float_t[gMaxNumberOfModules]; //[fNbModule]
419  fDanteYc = new Float_t[gMaxNumberOfModules]; //[fNbModule]
420 
421  if ( GetTree() ) { // just add the branch for that watcher
422  SetBranches();
423  }
424 }
425 
427 {
428  GetTree()->Branch("NbDante", &fNbDante, "NbDante/I");
429  GetTree()->Branch("WhichDante", fWhichDante, "WhichDante[NbDante]/s");
430 
431  GetTree()->Branch("DanteXc", fDanteXc, "Xc[NbDante]/F");
432  GetTree()->Branch("DanteYc", fDanteYc, "Yc[NbDante]/F");
433 
434  GetTree()->Branch("DanteA", fDanteA, "A[NbDante]/F");
435 
436  GetTree()->Branch("DanteXr", fDanteXr, "DanteXr[NbDante]/F");
437  GetTree()->Branch("DanteYr", fDanteYr, "DanteYr[NbDante]/F");
438  GetTree()->Branch("DanteZr", fDanteZr, "DanteZr[NbDante]/F");
439 
440  GetTree()->Branch("DanteBeta", &fDanteBeta, "DanteBeta/F");
441 }
442 
444 {
445  delete [] fWhichDante;
446  delete [] fDanteXr;
447  delete [] fDanteYr;
448  delete [] fDanteZr;
449  delete [] fDanteA;
450  delete [] fDanteXc;
451  delete [] fDanteYc;
452 }
453 
454 void MyDanteTree::Exec(Option_t *option)
455 {
456  if ( gDebug > 3 )
457  printf("MyDanteTree::Exec is called \n");
458 
459  // fill the array of floats and compute the physics
460  BaseDanteWatcher::Exec(option);
461 
462  fNbDante = 0;
463  for (Int_t i = 0u; i < fNumberOfModules; i++) {
464  if ( !fDante[i].has_fired ) {
465  continue;
466  }
467 
468  fWhichDante[fNbDante] = i;
469  fDanteXc[fNbDante] = fDante[i].X;
470  fDanteYc[fNbDante] = fDante[i].Y;
471 
472  fDanteXr[fNbDante] = fDante[i].Xr;
473  fDanteYr[fNbDante] = fDante[i].Yr;
474  fDanteZr[fNbDante] = fDante[i].Zr;
475 
476  fDanteA[fNbDante] = fDante[i].A;
477  fDanteBeta = 0.5;
478 
479  fNbDante++;
480  // printf("MyDanteTree::Exec is called with %d %d\n", fDante[i].X, fDante[i].Y);
481  }
482 
483  // fill the tree only if this is the owner of the tree ... otherwise by TreeMaster
484  FillTree();
485 }
486 
488 
489 DoDanteDoppler::DoDanteDoppler(const char *name, const char *title,TDirectory *sp_dir, TDirectory *tag_dir):
490  BaseDanteWatcher(name,title,sp_dir,tag_dir),
491  VertexBuilder()
492 {
493  fVertexFrame = MainFrameFactory::theMainFactory().
494  NewSharedFrame( FactoryItem("Agata","meta:vertex",Version(0,0)), FactoryItem("Agata","meta:vertex",Version(1,1)) );
495 
496  fIsToBeDeleted = true;
497 
498  fMeanBeta = 0.06;
499 }
500 
502 {
503  fMeanBeta = mean;
504 }
505 
506 void DoDanteDoppler::Exec(Option_t *option)
507 {
508  // fill the array of floats and compute the dante physics
509  BaseDanteWatcher::Exec(option);
510 
511  // look to get the one that fired
512  Short_t nb_fired = 0u, which = -1;
513  for (Int_t i = 0u; i < fNumberOfModules; i++) {
514 
515  if ( !fDante[i].has_fired )
516  continue;
517 
518  nb_fired++; which = i;
519  }
520  if ( nb_fired == 1 && which == 1 ) {
521 
522  // fill the current vertex
523 
524  VertexInterface *gdata = GetVertex();;
525  gdata->SetPosition(0,0,0);
526  gdata->SetDirection(fDante[which].Xr,fDante[which].Yr,fDante[which].Zr);
527  gdata->SetBeta(fMeanBeta);
528  }
529  else {
530  VertexInterface *gdata = GetVertex();
531  gdata->SetPosition(0,0,0);
532  gdata->SetDirection(fDante[which].Xr,fDante[which].Yr,fDante[which].Zr);
533  gdata->SetBeta(0);
534  }
535 
536 }
537 
538 
539 
540 
541 
542 
543 
544 
Double_t threshold_y_up
Definition: DanteWatchers.h:59
TRotation fRotation_tmp[4][gMaxNumberOfModules]
virtual Bool_t IsValid() const
true if it is a valid pointer
Definition: Frame.h:616
virtual VertexInterface * GetVertex()
Get the vertex data interface.
printf("******************************************************************** \n")
Double_t BY
Definition: DanteWatchers.h:63
Bool_t has_fired
Definition: DanteWatchers.h:51
Double_t T
Definition: DanteWatchers.h:47
Double_t AX
Definition: DanteWatchers.h:62
virtual void ShowEve(const Char_t *danteConfFile, const Char_t *agataPathFile)
show eve event display
Interface for any watcher that is a VertexBuilder.
virtual void SetBranches()
Double_t AY
Definition: DanteWatchers.h:63
Double_t CX
Definition: DanteWatchers.h:62
LogMessage & warning(LogMessage &)
TObjArray * fPositions
Double_t Y
Definition: DanteWatchers.h:39
AgataEventDisplay a class to work on a specific event display.
Double_t fMeanBeta
virtual void DoCanvas(TCanvas *c, Option_t *o)
To be overwritten by real implementation if a canvas is produced.
Double_t Zr
Definition: DanteWatchers.h:44
virtual void SetPosition(Double_t, Double_t, Double_t, Double_t=0.0)=0
Set the position of the source (last argument is used in case the position depends on time) ...
Double_t BX
Definition: DanteWatchers.h:62
Base for a watcher on an ancillary (raw) frame.
Bool_t fIsToBeDeleted
True if the vertex frame is to be deleted by this. Otherwise it is extracted from a trigger i...
Double_t X
Definition: DanteWatchers.h:38
Apply the doppler correction.
static Short_t gLUT[gNumberOfItems][gMaxNumberOfModules]
Definition: DanteWatchers.h:98
virtual ~DisplayDante()
static void InitLUT()
TH2F * fThetaxPhi
Double_t Yr
Definition: DanteWatchers.h:43
void SetLastExecStatus(Short_t s=0)
reset last status. 0 means no error, 0 < means error, > 0 means ok with conditions ...
Definition: Watchers.h:294
BaseDanteWatcher(const char *, const char *, TDirectory *sp_dir=0x0, TDirectory *tag_dir=0x0)
Definition: DanteWatchers.C:46
Base class for a Watcher that fill a TTree or some branches of a TTree.
Definition: TTreeWatchers.h:51
LogMessage fLog
Definition: Watchers.h:86
Base class for version numbers.
Definition: Version.h:38
virtual void Exec(Option_t *option="")
watch the current frame
virtual void Exec(Option_t *option="")
watch the current frame
Int_t Z[3000]
Base class for Dante Watcher.
Definition: DanteWatchers.h:90
LogMessage & dolog(LogMessage &)
To display the basic spectra for Dante.
virtual void Exec(Option_t *option="")
watch the current frame
virtual ~BaseDanteWatcher()
Definition: DanteWatchers.C:57
MyDante fDante[gMaxNumberOfModules]
Double_t Z
Definition: DanteWatchers.h:40
TObjArray * fPositionsC
Double_t threshold_y_down
Definition: DanteWatchers.h:58
ADF::SharedFP * fFrame
DisplayDante(const char *, const char *, TDirectory *sp_dir=0x0, TDirectory *tag_dir=0x0)
virtual void FillTree()
Fill the tree if it is the owner of the tree.
virtual void Exec(Option_t *option="")
watch the current frame
Float_t rawBuf[gMaxSlots *gMaxChannels+gExtraSize]
TRotation fRotation[gMaxNumberOfModules]
virtual void Exec(Option_t *option="")
watch the current frame
void SetActive(Bool_t active=true)
Toggle active task.
virtual void SetDirection(Double_t, Double_t, Double_t, Double_t=0.0)=0
set the direction of the source (last argument is used in case the position depends on time) ...
static const Short_t gMaxNumberOfModules
Definition: DanteWatchers.h:94
Double_t threshold_x_right
Definition: DanteWatchers.h:57
SharedFP * fVertexFrame
Pointer to a Vertex Frame. Has to do SharedFP since can be in the data flow.
Double_t Xr
Definition: DanteWatchers.h:42
virtual void SetBeta(Double_t, Double_t=0.0)=0
set recoil velocity
TString fTypeName
Double_t threshold_x_left
Definition: DanteWatchers.h:56
ClassImp(BaseDanteWatcher)
MyDanteTree(const char *name, const char *title, TTree *tree=0x0)
DoDanteDoppler(const char *, const char *, TDirectory *sp_dir=0x0, TDirectory *tag_dir=0x0)
Bool_t LoadCalibration(const char *calib_file="Dante.conf")
Definition: DanteWatchers.C:62
Double_t A
Definition: DanteWatchers.h:48
void ChangeMeanBeta(Double_t b)
void Calibrate()
Definition: DanteWatchers.C:31
static const Short_t gNumberOfItems
Definition: DanteWatchers.h:96
Short_t fNumberOfModules
Base class that described an item in a Factory.
Definition: FactoryItem.h:52
void ComputeRealPosition(Short_t)
TTree * GetTree()
to get the current Tree
Double_t CY
Definition: DanteWatchers.h:63