1 |
/** |
2 |
* \file ExtTrkingAlg.h |
3 |
* \author Elena Vannuccini |
4 |
*/ |
5 |
#ifndef exttrkingalg_h |
6 |
#define exttrkingalg_h |
7 |
|
8 |
// PAMELA classes |
9 |
#include <TrkLevel1.h> |
10 |
#include <TrkLevel2.h> |
11 |
|
12 |
#include <ToFLevel2.h> |
13 |
|
14 |
#include <CaloLevel1.h> |
15 |
#include <CaloLevel2.h> |
16 |
|
17 |
#include <ExtTrack.h> |
18 |
|
19 |
// ROOT classes |
20 |
#include <TClonesArray.h> |
21 |
|
22 |
|
23 |
|
24 |
#include <stdlib.h> |
25 |
#include <map> |
26 |
#include <iostream> |
27 |
#include <iomanip> |
28 |
|
29 |
|
30 |
#define nCP 22; |
31 |
#define nCV 2; |
32 |
#define nCS 9; |
33 |
|
34 |
// relative to pamela reference system (convenzione emiliano): |
35 |
// |
36 |
// y ^ |
37 |
// | |
38 |
// | 6 7 8 sisensor |
39 |
// | 3 4 5 |
40 |
// | 0 1 2 |
41 |
// ------------> x |
42 |
// |
43 |
// relative to silicon sensor |
44 |
// |
45 |
// S ^ |
46 |
// | | |
47 |
// 2 | | <- strip direction |
48 |
// sensor 1 | | |
49 |
// 0 |...|... |
50 |
// ------------> L |
51 |
// 0 1 2 |
52 |
// ladder |
53 |
// |
54 |
// |
55 |
|
56 |
int GetCaloSensor(int view, int sis){ |
57 |
if(sis<0||sis>8)return -1; |
58 |
if(view<0||view>1)return -1; |
59 |
if(!view)return (int)(sis/3); |
60 |
else return sis%3; |
61 |
}; |
62 |
int GetCaloLadder(int view, int sis){ |
63 |
if(sis<0||sis>8)return -1; |
64 |
if(view<0||view>1)return -1; |
65 |
if(!view)return sis%3; |
66 |
else return (int)(sis/3); |
67 |
}; |
68 |
int GetCaloLadder(int strip){ |
69 |
return (int)(strip/32); |
70 |
}; |
71 |
int GetCaloSiSensor(int view, int l, int s){ |
72 |
if(view<0||view>1)return -1; |
73 |
if(s<0||s>2)return -1; |
74 |
if(!view) return 3*s+l; |
75 |
else return 3*l+s; |
76 |
}; |
77 |
|
78 |
/** |
79 |
* |
80 |
* Extended CaloStrip class, to account for rototraslation parameters |
81 |
* |
82 |
*/ |
83 |
class CaloStripRoto { |
84 |
|
85 |
private: |
86 |
|
87 |
float fPitch; // = 1.; |
88 |
float shift[3]; //= {0.,0.,0.};//(L,S,Z) |
89 |
float alpha;// = 0.; |
90 |
|
91 |
int siSensor; // 0-8 |
92 |
int sView;//0-1 |
93 |
int sPlane;//0-21 |
94 |
CaloStrip st; |
95 |
|
96 |
void Set(int view, int plane, float strip, int sisensor); ///< Set strip giving view [0-1], plane [0-22] and number [0-95] |
97 |
void SetSiSensor( int si=-1 ){ siSensor = si;}; |
98 |
void SetView(int view){sView = view;}; |
99 |
void SetPlane(int plane){sPlane = plane;}; |
100 |
|
101 |
public: |
102 |
|
103 |
/* CaloStrip st; */ |
104 |
|
105 |
|
106 |
float fXA; //< X position in cm of the strip |
107 |
float fYA; //< Y position in cm of the strip |
108 |
float fZA; //< Z position in cm of the strip |
109 |
|
110 |
float fXB; //< X position in cm of the strip |
111 |
float fYB; //< Y position in cm of the strip |
112 |
float fZB; //< Z position in cm of the strip |
113 |
|
114 |
// |
115 |
CaloStripRoto(int view, int plane, int sisensor, bool usemechanicalalignement = true); ///< Default Constructor. |
116 |
|
117 |
|
118 |
|
119 |
void ResetAligParams(); |
120 |
void SetAligParams__fPitch( float f ){ fPitch = f; }; |
121 |
void SetAligParams__shift( float *s ){ for(int i=0; i<3; i++)shift[i]=s[i]; }; |
122 |
void SetAligParams__alpha( float a ){ alpha = a; }; |
123 |
|
124 |
void SetStrip(float strip){Set(GetView(),GetPlane(),strip,GetSiSensor());}; ///< Set strip giving view [0-1], plane [0-22] and number [0-95] |
125 |
|
126 |
|
127 |
|
128 |
/* int GetSensor(int view, int sisensor); */ |
129 |
/* int GetLadder(int view, int sisensor); */ |
130 |
/* int GetSiSensor(int view, int ladder, int sensor); */ |
131 |
// CaloStrip GetCaloStrip(){return st;}; |
132 |
bool SensorContains(float x, float y); |
133 |
|
134 |
int GetView(){return sView;}; |
135 |
int GetPlane(){return sPlane;}; |
136 |
int GetStrip(){return st.GetStrip();}; |
137 |
int GetSensor(); |
138 |
int GetLadder(); |
139 |
int GetSiSensor(){ return siSensor; }; |
140 |
|
141 |
float GetSpatialResolution(float def, float degx=0., float degy=0., float beta=1.); |
142 |
|
143 |
float GetDistanceTo(float xP, float yP, float& xM, float &yM); |
144 |
float GetDistanceTo(float xP, float yP){ float xM,yM; return GetDistanceTo(xP,yP,xM,yM); }; |
145 |
|
146 |
}; |
147 |
|
148 |
|
149 |
/** |
150 |
* |
151 |
* Extended hit class |
152 |
* |
153 |
*/ |
154 |
|
155 |
|
156 |
class ExtHit{ |
157 |
|
158 |
private: |
159 |
|
160 |
|
161 |
public: |
162 |
|
163 |
|
164 |
Float_t coordCm; //centimeters |
165 |
Float_t coordPU; //pitch units |
166 |
Float_t resCm; |
167 |
Float_t signal; |
168 |
Int_t start; |
169 |
Int_t mult; |
170 |
Int_t view; |
171 |
|
172 |
|
173 |
void Reset(){ |
174 |
coordCm = 1000.; |
175 |
coordPU = 1000.; |
176 |
resCm = 1000.; |
177 |
signal = 0.; |
178 |
start = -1; |
179 |
mult = 0; |
180 |
view = -1; |
181 |
}; |
182 |
void Set(int s, int v){start=s; view=v;} |
183 |
/* void Set(int s, int v){coordPU=s; view=v;} */ |
184 |
|
185 |
ExtHit(){Reset();}; |
186 |
ExtHit(int s, int v){Reset(); Set(s,v); }; |
187 |
~ExtHit(){Reset();}; |
188 |
|
189 |
ExtHit( const ExtHit& h ){ |
190 |
coordCm = h.coordCm; |
191 |
coordPU = h.coordPU; |
192 |
resCm = h.resCm; |
193 |
signal = h.signal; |
194 |
start = h.start; |
195 |
mult = h.mult; |
196 |
view = h.view; |
197 |
} |
198 |
|
199 |
void Add(float cc, float pp, float ss){ |
200 |
if(ss<0)cout << "void ExtHit(cc="<<cc<<",ss="<<ss<<") -- not valid argument"; |
201 |
if(ss<0)return; |
202 |
mult++; |
203 |
float sumcc = coordCm * signal; |
204 |
float sumpp = coordPU * signal; |
205 |
signal+=ss; |
206 |
sumcc += ss * cc; |
207 |
sumpp += ss * pp; |
208 |
coordCm = sumcc/signal; |
209 |
coordPU = sumpp/signal; |
210 |
}; |
211 |
|
212 |
void Dump(){ |
213 |
cout << " View "<<view<<endl; |
214 |
cout << " Coordinate (cm) "<<coordCm<<endl; |
215 |
cout << " Coordinate (p.u.) "<<coordPU<<endl; |
216 |
cout << " Resolution (cm) "<<resCm<<endl; |
217 |
cout << " Multiplicity "<<mult<<endl; |
218 |
cout << " Signal (MIP) "<<signal<<endl; |
219 |
}; |
220 |
|
221 |
// ClassDef(ExtHit,1); |
222 |
|
223 |
}; |
224 |
|
225 |
/** |
226 |
* |
227 |
* Algorythm class |
228 |
* |
229 |
*/ |
230 |
|
231 |
|
232 |
|
233 |
class ExtTrkingAlg : public TObject { |
234 |
|
235 |
private: |
236 |
|
237 |
Int_t _whichAlg; ///< algorythm id |
238 |
|
239 |
TClonesArray *_trkArray; ///< array of tracks |
240 |
|
241 |
TrkLevel1* _trk_l1; |
242 |
TrkLevel2* _trk_l2; |
243 |
|
244 |
CaloLevel1* _cal_l1; |
245 |
CaloLevel2* _cal_l2; |
246 |
vector<ExtHit> _cal_cl;///< calorimeter hits |
247 |
|
248 |
ToFLevel2* _tof_l2; |
249 |
vector<ExtHit> _trk_cl;///< tracker hits |
250 |
|
251 |
ExtTrack* _extTrack; |
252 |
float* _zMech; |
253 |
|
254 |
Int_t _sel_nClstrMAX; ///< selection parameter: maximum number of cluster |
255 |
Int_t _sel_nPlaneXMIN; ///< selection parameter: minimum number of hit x-views |
256 |
Int_t _sel_nPlaneYMIN; ///< selection parameter: minimum number of hit y-views |
257 |
|
258 |
Int_t _alg_nClFixX; ///< algorythm parameter: n.hits required on X view |
259 |
Int_t _alg_nClFixY; ///< algorythm parameter:n.hits required on Y view |
260 |
Int_t _alg_nTrackMAX; ///< algorythm parameter: maximum num. of track candidates |
261 |
Int_t _alg_nViewCal; ///< algorythm parameter: n. calorimeter planes included |
262 |
|
263 |
Int_t NEXTVIEWS; |
264 |
Int_t NEXTPLANES; |
265 |
|
266 |
float _caloCoord[2][22][96]; |
267 |
float _caloZ[44]; |
268 |
Trajectory* _caloTj; |
269 |
Trajectory* _tgf; |
270 |
|
271 |
|
272 |
vector<CaloStripRoto> _caloStripRoto; // rotatore di calorimetri! sapevatelo! |
273 |
|
274 |
Bool_t _debug; |
275 |
|
276 |
public: |
277 |
|
278 |
void Clear(Option_t* option = ""); ///< Clear the event |
279 |
void Delete(); ///< Delete all (deallocate arrays) |
280 |
|
281 |
ExtTrkingAlg(Int_t id=0); |
282 |
// ExtTrkingAlg(){ ExtTrkingAlg(0); }; |
283 |
~ExtTrkingAlg(){ Delete(); }; |
284 |
|
285 |
// ExtTrkingAlg(Int_t id); |
286 |
|
287 |
void SetTrkLevel1( TrkLevel1* trkl1 = NULL ) { _trk_l1 = trkl1;}; |
288 |
void SetTrkLevel2( TrkLevel2* trkl2 = NULL ) { _trk_l2 = trkl2; }; |
289 |
void SetToFLevel2( ToFLevel2* tofl2 = NULL ) { _tof_l2 = tofl2; }; |
290 |
void SetCaloLevel1( CaloLevel1* call1 = NULL ) { _cal_l1 = call1; }; |
291 |
void SetCaloLevel2( CaloLevel2* call2 = NULL ) { _cal_l2 = call2; }; |
292 |
|
293 |
|
294 |
void FillClusterMap(multimap<int,int> &map,TrkLevel1* l1,Int_t vOffset = 0); |
295 |
void FillClusterMap(multimap<int,int> &map,CaloLevel1* l1,Int_t vOffset = 12); |
296 |
|
297 |
Bool_t CheckEvent(); ///< pre-selection |
298 |
void ProcessEvent0(Bool_t force = false); ///< apply tracking algorythm 0 |
299 |
void ProcessEvent1(Bool_t force = false); ///< apply tracking algorythm 1 |
300 |
void ProcessEvent2(Bool_t force = false); ///< apply tracking algorythm 1 |
301 |
void ProcessEvent(Bool_t force = false); |
302 |
bool EvaluateClusterPosition_Tracker( int, int, int, int, float*, float*, float*); |
303 |
bool EvaluateClusterPosition_Calorimeter( int icl, int& sensor, float *xmABar, float *ymABar, float *zmAB, float def=0.); |
304 |
|
305 |
|
306 |
TClonesArray *GetTrackArray(Bool_t reset = false); |
307 |
|
308 |
void SetSelectionParams(double* par); |
309 |
void SetAlgorythmParams(double* par); |
310 |
|
311 |
|
312 |
void SetDebug(Bool_t dbg = false){ _debug = dbg; }; |
313 |
|
314 |
void Dump(); |
315 |
|
316 |
TClonesArray** GetPointerToTrackArray(){ return &_trkArray; }; |
317 |
|
318 |
vector<ExtHit> GetCaloClusters(){ return _cal_cl; }; |
319 |
vector<ExtHit> GetTrkClusters(){ return _trk_cl; }; |
320 |
|
321 |
CaloStripRoto GetCaloStripRoto(int index){ return _caloStripRoto[index]; }; |
322 |
|
323 |
|
324 |
}; |
325 |
|
326 |
|
327 |
#endif |