GSI Object Oriented Online Offline (Go4)  GO4-6.3.0
TGo4MbsRandom.cxx
Go to the documentation of this file.
1 // $Id$
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 "TGo4MbsRandom.h"
15 
16 
17 #include "TRandom.h"
18 #include <cmath>
19 
20 #include "TGo4Log.h"
21 #include "TGo4MbsRandomParameter.h"
22 
23 
24 extern "C"
25 {
26 #include "random-coll.h"
27 }
28 
29 double TGo4MbsRandom::fgdPeak[] = { 200., 302., 653., 1024., 2800.};
30 double TGo4MbsRandom::fgdSigma[] = { 10., 22., 153., 104., 38.};
31 double TGo4MbsRandom::fgdPeak2[] = { 300., 402., 853., 2000., 3024.};
32 double TGo4MbsRandom::fgdSigma2[] = { 22., 153., 104., 100., 20.};
33 
35  TGo4MbsSource(),
36  fiDLen(0),
37  fiNumSub(0),
38  fiNumDat(0)
39 {
40  GO4TRACE((15,"TGo4MbsRandom::TGo4MbsRandom()",__LINE__, __FILE__));
41 }
42 
43 
45  TGo4MbsSource(par, 1),
46  fiDLen(0),
47  fiNumSub(0),
48  fiNumDat(0)
49 {
50  GO4TRACE((15,"TGo4MbsRandom::TGo4MbsRandom(TGo4MbsRandomParameter*)",__LINE__, __FILE__));
51 
52  TGo4Log::Debug(" New Event Source MbsRandom %s: ",GetName());
53 
54  Open();
55 }
56 
57 TGo4MbsRandom::TGo4MbsRandom(const char *name) :
58  TGo4MbsSource(name, 1),
59  fiDLen(0),
60  fiNumSub(0),
61  fiNumDat(0)
62 {
63  GO4TRACE((15,"TGo4MbsRandom::TGo4MbsRandom(const char *)",__LINE__, __FILE__));
64 
65  TGo4Log::Debug(" New Event Source MbsRandom %s: ",name);
66  Open();
67 }
68 
69 
71 {
72  GO4TRACE((15,"TGo4MbsRandom::~TGo4MbsRandom()",__LINE__, __FILE__));
73  Close();
74 }
75 
77 {
78  GO4TRACE((12,"TGo4MbsRandom::NextEvent()",__LINE__, __FILE__));
79  // here we fill mbs event structure at fxEvent ptr.
80  void *clearfield = (void *) (fxEvent+1); // we skip header and clear the rest
81  size_t clearlen = fiDLen*2 - 8;
82  memset(clearfield, 0, clearlen); // clear old values
83  fxEvent->l_count++;
84  // now fill in some new values:
85  fxEvent->l_dlen = 0;
86  s_ves10_1* subevt = (s_ves10_1*) clearfield;
87  for (Int_t i = 0; i < fiNumSub; ++i) {
88  int l_val_num = (int)(get_int(1., 7.)+0.5); // random number for number of data longwords
89  if(l_val_num>fiNumDat) l_val_num=fiNumDat; // never exceed allocated field
90  // setup subevent header:
91  subevt->i_type=10;
92  subevt->i_subtype=1;
93  subevt->h_subcrate=i+1; // set subevent id numbers:
94  subevt->h_control=2*i;
95  subevt->i_procid=4*i;
96  //subevt->l_dlen=fiNumDat*2+2; // length in short units + 2
97  subevt->l_dlen=l_val_num*2+2; // subevent length in short units + 2
98  fxEvent->l_dlen+=(l_val_num*sizeof(Int_t)) / 2 ; // add datalength to total length in shorts
99 
100  Int_t *subdata = (Int_t *) (subevt+1); // data starts after subevt
101  for (Int_t j = 0; j < l_val_num; ++j) {
102  *(subdata + j) = rand_event(j + 1); // later use random generator here
103  } // for (... numdat ...)
104  subevt=(s_ves10_1*) (subdata+l_val_num); // next subheader after last data
105  } // for(...numsub)
106  fxEvent->l_dlen+=(sizeof(s_ve10_1)-sizeof(s_evhe)+fiNumSub*sizeof(s_ves10_1))/2;
107  // finally, add length of headers to totalevent length
108  return 0;
109 }
110 
111 
113 {
114  GO4TRACE((12,"TGo4MbsRandom::Open()",__LINE__, __FILE__));
115  //
116  if(fbIsOpen) return -1;
117 
118  get_rand_seed();
119  fiNumSub = 2; // number of subevents, fix
120  fiNumDat = 16; // maximum allocated data longs per subevent
121  fiDLen = (sizeof(s_ve10_1)-sizeof(s_evhe)+fiNumSub*(sizeof(s_ves10_1)+fiNumDat*sizeof(Int_t))) / 2 ;
122  // fiDLen is not in char (=size_t), but short units
123  fxEventMem = new Short_t[fiDLen+sizeof(s_evhe)];
125  fxEvent->l_dlen = fiDLen;
126  fxEvent->i_subtype = 1;
127  fxEvent->i_type = 10;
128  fxEvent->i_trigger = 1;
129  fxEvent->l_count = 0;
130 
131  fbIsOpen = kTRUE;
132 
133  return 0;
134 }
135 
136 
138 {
139  GO4TRACE((12,"TGo4MbsRandom::Close()",__LINE__, __FILE__));
140  if(!fbIsOpen) return -1;
141  delete [] fxEventMem;
142  fxEventMem = nullptr;
143  fxEvent = nullptr;
144  fbIsOpen = kFALSE;
145  return 0;
146 }
147 
149 
150 void TGo4MbsRandom::get_rand_seed() /* obtains seed for generator */
151 {
152 // struct timeval tv;
153 // struct timezone tz;
154 
155 // gettimeofday(&tv, &tz); /* may not be supported in your C */
156 // fuSeed=tv.tv_sec + tv.tv_usec; /* if not, replace with clock() */
157 // srand48(fuSeed);
158 
159  gRandom->SetSeed(0);
160 }
161 
162 
163 double TGo4MbsRandom::gauss_rnd(double mean, double sigma)
164 {
165  static int iset = 0;
166  static double gset;
167  double v1, v2, s, u1;
168 
169  if (sigma < 0.) {
170  v1 = gRandom->Rndm(); // drand48();
171  return (log(1 - v1) / sigma + mean);
172  } else {
173  if (iset == 0) {
174  do {
175  // v1 = 2.*drand48()-1.;
176  // v2 = 2.*drand48()-1.;
177 
178  v1 = 2. * gRandom->Rndm() - 1.;
179  v2 = 2. * gRandom->Rndm() - 1.;
180 
181  s = v1 * v1 + v2 * v2;
182  } while (s >= 1.0 || s == 0.0);
183 
184  u1 = sigma * v1 * (sqrt(-2. * log(s) / s)) + mean;
185  gset = u1;
186  iset = 1;
187 
188  return (sigma * v2 * (sqrt(-2. * log(s) / s)) + mean);
189  } else {
190  iset = 0;
191  return gset;
192  }
193  }
194 }
195 
196 double TGo4MbsRandom::get_int(double low, double high)
197 {
198 // return ((high-low)*drand48()+low);
199  return ((high-low)*gRandom->Rndm()+low);
200 }
201 
202 
203 long TGo4MbsRandom::rand_event(long choice)
204 {
205  int cnt;
206  switch(choice) {
207  case 1:
208  cnt = (int)(get_int(0., (double)NUM_PEAK));
209  return ((long)(gauss_rnd(fgdPeak[cnt], fgdSigma[cnt])));
210  case 2:
211  cnt = (int)(get_int(0., (double)NUM_PEAK));
212  return ((long)(p_dNormal(fgdPeak2[cnt], fgdSigma2[cnt], &fuSeed)));
213  case 3:
214  return ((long)(4096*p_dUniform(&fuSeed)));
215  case 4:
216  return ((long)(gauss_rnd(0., -.001)));
217  case 5:
218  return ((long)(p_dExponential(100., &fuSeed)));
219  case 6:
220  cnt = (int)(get_int(0., (double)NUM_PEAK));
221  return ((long)((p_dExponential(200., &fuSeed)) + gauss_rnd(fgdPeak[cnt], fgdSigma[cnt])));
222  case 7:
223  cnt = (int)(get_int(3., (double)NUM_PEAK));
224  return ((long)((4096*p_dUniform(&fuSeed)) + gauss_rnd(fgdPeak[cnt], fgdSigma[cnt])));
225  }
226 
227  return 0;
228 }
229 
231 {
232  return nullptr;
233 }
double p_dUniform(unsigned *seed)
Definition: random-coll.c:126
long rand_event(long choice)
CHARS h_subcrate
Definition: s_ves10_1.h:41
static double fgdSigma2[]
Definition: TGo4MbsRandom.h:81
double p_dNormal(double mean, double sigma, unsigned int *seed)
Definition: random-coll.c:422
#define NUM_PEAK
Definition: TGo4MbsRandom.h:19
Short_t * fxEventMem
Definition: TGo4MbsRandom.h:65
Definition: s_evhe.h:32
INTS2 i_procid
Definition: s_ves10_1.h:40
double gauss_rnd(double mean, double sigma)
INTS4 l_dlen
Definition: s_ve10_1.h:37
static double fgdSigma[]
Definition: TGo4MbsRandom.h:79
INTS4 l_dlen
Definition: s_ves10_1.h:37
static void Debug(const char *text,...) GO4_PRINTF_ARGS
Definition: TGo4Log.cxx:281
virtual ~TGo4MbsRandom()
Int_t NextEvent() override
double p_dExponential(double lambda, unsigned int *seed)
Definition: random-coll.c:229
s_ve10_1 * fxEvent
Int_t Close() override
static double fgdPeak2[]
Definition: TGo4MbsRandom.h:80
#define GO4TRACE(X)
Definition: TGo4Log.h:25
INTS2 i_type
Definition: s_ves10_1.h:38
Int_t Open() override
double get_int(double low, double high)
static double fgdPeak[]
Definition: TGo4MbsRandom.h:78
INTS2 i_subtype
Definition: s_ves10_1.h:39
INTS4 l_count
Definition: s_ve10_1.h:42
s_bufhe * GetBufferHeader() override
CHARS h_control
Definition: s_ves10_1.h:42