source: trunk/MagicSoft/Simulation/Detector/include-MTrigger/MTrigger.hxx@ 5304

Last change on this file since 5304 was 5248, checked in by moralejo, 20 years ago
*** empty log message ***
File size: 7.2 KB
Line 
1#ifndef __MTrigger__
2#define __MTrigger__
3
4#define CASE_SHOW 0
5#define CASE_NSB 1
6#define CASE_STAR 2
7
8// class MTrigger
9//
10// implemented by Harald Kornmayer
11//
12// This is a class to simulate the trigger.
13// It assumes a special response of the PMT for one single Photo-electron.
14//
15//
16//
17#include <iostream>
18#include <math.h>
19
20#include "TROOT.h"
21#include "TObject.h"
22#include "TRandom.h"
23#include "TH1.h"
24
25#include "Mdefine.h"
26#include "MMcEvt.hxx"
27
28#include "MGeomCam.h"
29
30#include "MTriggerDefine.h"
31
32
33//==========
34// MTrigger
35//
36// The simulation of the Trigger for MonteCarlo Events is using this
37// class. So all methods concerning the trigger should be done inside this
38// class.
39//
40// For a better understanding of the behavior of the trigger is here small
41// abstract of the trigger. This may change in the future.
42//
43//
44// We now from the camera program (This is the surrounding of the class
45// MTrigger.) that one photo electron leaves at time t the photo cathode
46// of the pixel number iPix).
47//
48// At the end of the PMT, the preamp, the optical fiber transmission we
49// get a signal of a given shape. After some discussion with Eckart the
50// standard response function looks like this :
51//
52// It is a gaussian Signal with a given FWHM.
53//
54// So whenever a photo electron leaves the photo cathod, on has to add
55// the standard response function to the analog signal of the pixel.
56//
57// Each pixel of the camera has such an summed-up analog signal. It may
58// look like this picture:
59//
60//
61// This is the input of the discriminator for the pixels. The output of
62// the discriminator is a digital signal. The response of the diskriminator
63// is not fixed at the moment. There are discussion about this topic.
64//
65// At the moment the response is very simple. Whenever the analog signal
66// is crossing a defined threshold from below to above, a digital signal
67// with a given length is created.
68//
69// No one can start with the simulation of different trigger levels.
70//
71// The TriggerLevelZero is a very easy one. It is just looking if there
72// are more then N digital signals at level ON (=1). If this is the case,
73// a TriggerLevelZero signal is created.
74//
75// The TriggerLevelOne is not implemented now. This will be a kind of next
76// neighbour condition (i.e. four neigbouring analog signals at the same
77// time, but this requests at least four digital signals at level ON, what
78// is equivalent with a TriggerLevelZero.
79//
80//
81class MTrigger {
82
83 private:
84 Int_t pixnum;
85 //
86 // then for all pixels the shape of all the analog signals
87 //
88 Bool_t *used; // a boolean to indicated if the pixels is used in this event
89 Int_t *nphotshow; // count the photo electrons per pixel coming from showers
90 Int_t *nphotnsb; // count the photo electrons per pixel coming from NSB
91 Int_t *nphotstar; // count the photo electrons per pixel coming from stars
92
93 Float_t **a_sig ; // the analog signal for pixels
94
95 Float_t *baseline; // for the baseline shift
96
97 //
98 // then for all pixels the shape of the digital signal
99 //
100 Bool_t *dknt ; // a boolean to indicated if the pixels has passed the diskrminator
101 Float_t **d_sig ; // the digital signal for all pixels
102
103 //
104 // and the sum of all digital signals
105 //
106 Float_t sum_d_sig[TRIGGER_TIME_SLICES] ;
107
108 //
109 // first the data for the response function
110 //
111 Float_t fwhm_resp ; // fwhm of the phe_response function
112 Float_t ampl_resp ; // amplitude of the phe_response function (in mV)
113 Float_t sing_resp[RESPONSE_SLICES_TRIG] ; // the shape of the phe_response function
114 Float_t peak_time ; // the time from the start of the response
115 // function to the maximum peak
116
117 TH1F *histPmt ;
118 Float_t histMean ; // Mean value of the distribution of Razmik (stored in histPmt)
119 TRandom *GenElec ; // RandomGenerator for the Electronic Noise
120
121 Float_t *noise;
122
123 //
124 // some values for the trigger settings
125 //
126
127 Float_t *chan_thres ; // the threshold (in mV) for each individuel pixels
128 Float_t gate_leng ; // the length of the digital signal if analog signal is above threshold
129
130 Float_t overlaping_time; // Minimum coincidence time
131
132 Float_t trigger_multi ; // Number of Pixels requested for a Trigger
133 Int_t trigger_geometry ; // 0 means a pixel with trigger_multi-1 neighbours
134 // 1 means trigger_multi neighbours
135 // 2 means trigger_multi closed neighbours
136 //
137 // The lookup table for the next neighbours
138 //
139
140 Int_t *NN[6] ;
141
142 //
143 // The lookup table for trigger cells
144 //
145
146 Int_t *TC[TRIGGER_CELLS] ;
147
148 //
149 // some information about the different TriggerLevels in each Event
150 //
151
152 Int_t nZero ; // how many ZeroLevel Trigger in one Event
153 Bool_t SlicesZero[TRIGGER_TIME_SLICES] ; // Times Slices at which the ZeroLevel Triggers occur
154
155 Int_t nFirst ; // how many FirstLevel Trigger in one Event
156 Int_t SlicesFirst[5] ; // Times Slices at which the FirstLevel Triggers occur
157 Int_t PixelsFirst[5] ; // Pixel which fires the trigger
158
159 Int_t nSecond ; // how many SecondLevel Trigger in one Event
160 Int_t SlicesSecond[5] ; // Times Slices at which the SecondLevel Triggers occur
161 Int_t PixelsSecond[5] ; // Pixel which fires the trigger
162
163private:
164
165 Float_t Fill( Int_t, Float_t, Int_t ) ;
166
167 Bool_t PassNextNeighbour( Bool_t m[], Bool_t *n) ;
168
169 void OverlapingTime( Bool_t m[], Bool_t *n, Int_t ifSli); // n[] will have pixels of
170 // m[] that are on for the required verlaping time
171
172public:
173
174 MTrigger(int pix=577) ;
175
176 MTrigger(int pix, MGeomCam *camgeom,
177 float gate, float overt, float ampl, float fwhm, int ct_id=0) ;
178
179 MTrigger(int pix,
180 float gate, float overt, float ampl, float fwhm) ;
181
182 ~MTrigger() ;
183
184 void SetSeed(UInt_t seed) {GenElec->SetSeed(seed);}
185
186 void Reset() ;
187
188 void ClearZero() ;
189
190 void ClearFirst() ;
191
192 Float_t FillShow( Int_t, Float_t ) ;
193
194 Float_t FillNSB( Int_t, Float_t ) ;
195
196 Float_t FillStar( Int_t, Float_t ) ;
197
198 void AddNSB( Int_t pix, Float_t resp[TRIGGER_TIME_SLICES]);
199
200 void SetElecNoise(Float_t factor=0.3);
201
202 void ElecNoise(Float_t factor = 0.3) ;
203
204 void SetResponseShape();
205
206 void SetMultiplicity (Int_t multi);
207
208 void SetTopology (Int_t topo);
209
210 void SetThreshold (Float_t thres[]);
211
212 void SetFwhm(Float_t fwhm);
213
214 void SetAmpl(Float_t ampl){
215 ampl_resp=ampl;
216 }
217
218 void CheckThreshold (float *thres, int cells);
219
220 void ReadThreshold (char name[]);
221
222 void ReadParam(char name[]);
223
224 Float_t GetMultiplicity (){
225 return(trigger_multi);
226 }
227
228 Int_t GetTopology (){
229 return(trigger_geometry);
230 }
231
232 Float_t GetThreshold (Int_t il){
233 return(chan_thres[il]);
234 }
235
236 void GetResponse( Float_t * resp) ;
237
238 void GetMapDiskriminator(Byte_t *map);
239
240 void Diskriminate() ;
241
242 void ShowSignal (MMcEvt *McEvt) ;
243
244 Int_t ZeroLevel() ;
245
246 Int_t FirstLevel() ;
247
248 Float_t GetFirstLevelTime( Int_t il ) ;
249
250 Int_t GetFirstLevelPixel( Int_t il ) ;
251
252 Float_t GetAmplitude() {
253 return ampl_resp ;
254 }
255
256 Float_t GetFwhm() {
257 return fwhm_resp ;
258 }
259
260} ;
261
262#endif
263
Note: See TracBrowser for help on using the repository browser.