/[PAMELA software]/DarthVader/CalorimeterLevel2/src/CaloLevel1.cpp
ViewVC logotype

Contents of /DarthVader/CalorimeterLevel2/src/CaloLevel1.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.12 - (show annotations) (download)
Tue Nov 27 10:15:47 2007 UTC (17 years ago) by mocchiut
Branch: MAIN
CVS Tags: v5r00
Changes since 1.11: +1 -1 lines
Bug in CaloLevel1::qtotpl(Int_t,Bool_t&) fixed

1 /**
2 * \file src/CaloLevel1.cpp
3 * \author Emiliano Mocchiutti
4 *
5 **/
6 #include <CaloLevel1.h>
7 //
8 ClassImp(CaloStrip);
9 ClassImp(CaloLevel1);
10
11 Float_t CaloStrip::UXal = CTX;
12 Float_t CaloStrip::UYal = CTY;
13 Float_t CaloStrip::UZal = CTZ;
14 Bool_t CaloStrip::paramload = false;
15
16 /**
17 * CaloStrip default constructor
18 **/
19 CaloStrip::CaloStrip() {
20 c1 = 0;
21 this->Clear();
22 };
23
24 /**
25 * CaloStrip default constructor
26 **/
27 CaloStrip::CaloStrip(Bool_t mechalig) {
28 c1 = 0;
29 this->Clear();
30 if ( mechalig ){
31 ismech = true;
32 paramload = true;
33 UXal = MECHCTX;
34 UYal = MECHCTY;
35 UZal = MECHCTZ;
36 } else {
37 ismech = false;
38 UseStandardAlig();
39 };
40 };
41
42 /**
43 * CaloStrip default constructor
44 **/
45 CaloStrip::CaloStrip(CaloLevel1 *calo) {
46 c1 = calo->GetCaloLevel1();
47 this->Clear();
48 ismech = false;
49 UseStandardAlig();
50 };
51
52 /**
53 * CaloStrip default constructor
54 **/
55 CaloStrip::CaloStrip(CaloLevel1 *calo, Bool_t mechalig) {
56 c1 = calo->GetCaloLevel1();
57 this->Clear();
58 if ( mechalig ){
59 ismech = true;
60 paramload = true;
61 UXal = MECHCTX;
62 UYal = MECHCTY;
63 UZal = MECHCTZ;
64 } else {
65 ismech = false;
66 UseStandardAlig();
67 };
68 };
69
70 /**
71 * Clear variables
72 **/
73 void CaloStrip::Clear(Option_t *t) {
74 fE = 0.;
75 fX = 0.;
76 fY = 0.;
77 fZ = 0.;
78 fView = 0;
79 fPlane = 0;
80 fStrip = 0;
81 };
82
83 /**
84 * Connect to the DB and retrieve alignement parameters
85 **/
86 void CaloStrip::UseStandardAlig(){
87 //
88 if ( !paramload ){
89 //
90 paramload = true;
91 ismech = false;
92 //
93 stringstream aligfile;
94 Int_t error = 0;
95 FILE *f = 0;
96 ifstream badfile;
97 GL_PARAM *glparam = new GL_PARAM();
98 //
99 TString host = "mysql://localhost/pamelaprod";
100 TString user = "anonymous";
101 TString psw = "";
102 const char *pamdbhost=gSystem->Getenv("PAM_DBHOST");
103 const char *pamdbuser=gSystem->Getenv("PAM_DBUSER");
104 const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW");
105 if ( !pamdbhost ) pamdbhost = "";
106 if ( !pamdbuser ) pamdbuser = "";
107 if ( !pamdbpsw ) pamdbpsw = "";
108 if ( strcmp(pamdbhost,"") ) host = pamdbhost;
109 if ( strcmp(pamdbuser,"") ) user = pamdbuser;
110 if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw;
111 TSQLServer *dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
112 //
113 UXal = 0.;
114 UYal = 0.;
115 UZal = 0.;
116 //
117 if ( dbc ){
118 //
119 // determine where I can find calorimeter ADC to MIP conversion file
120 //
121 printf(" Querying DB for calorimeter parameters files...\n");
122 //
123 //
124 //
125 error = 0;
126 error = glparam->Query_GL_PARAM(1000,102,dbc);
127 if ( error >= 0 ){
128 //
129 aligfile.str("");
130 aligfile << glparam->PATH.Data() << "/";
131 aligfile << glparam->NAME.Data();
132 //
133 printf("\n Using parameter file: \n %s \n",aligfile.str().c_str());
134 f = fopen(aligfile.str().c_str(),"rb");
135 if ( f ){
136 //
137 fread(&UXal,sizeof(UXal),1,f);
138 fread(&UYal,sizeof(UYal),1,f);
139 fread(&UZal,sizeof(UZal),1,f);
140 //
141 fclose(f);
142 };
143 //
144 };
145 dbc->Close();
146 };
147 if ( !UXal ){
148 //
149 printf(" No able to query DB for calorimeter parameters files\n Using hard-coded parameters \n");
150 UXal = CTX;
151 UYal = CTY;
152 UZal = CTZ;
153 };
154 //
155 };
156 //
157 };
158
159 /**
160 * Given a strip returns its position in the PAMELA reference system
161 **/
162 void CaloStrip::Set(Int_t view, Int_t plane, Int_t strip) {
163 //
164 this->Clear();
165 //
166 if ( view < 0 || view > 1 ){
167 printf(" ERROR: 0 =< view =< 1 \n");
168 return;
169 };
170 if ( plane < 0 || plane > 21 ){
171 printf(" ERROR: 0 =< plane =< 21 \n");
172 return;
173 };
174 if ( strip < 0 || strip > 95 ){
175 printf(" ERROR: 0 =< strip =< 95 \n");
176 return;
177 };
178 //
179 Float_t lShift = 0.;
180 Float_t lPos = 0.;
181 extern struct shift shift_;
182 //
183 // Find MIPs for that strip
184 //
185 if ( c1 ) fE = c1->GetEstrip(view, plane, strip);
186 //
187 fView = view + 1;
188 fPlane = plane + 1;
189 fStrip = strip + 1;
190 //
191 if ( fPlane%2 ){
192 lShift = +0.5;
193 } else {
194 lShift = -0.5;
195 };
196 //
197 shift_.shift = lShift;
198 //
199 Float_t zplane[22];
200 zplane[0] = 0.;
201 Int_t ii = 0;
202 for ( Int_t i = 2; i < 23; i++){
203 ii = i-1;
204 if ( i%2 ){
205 zplane[ii] = zplane[ii-1] - 10.09;
206 } else {
207 zplane[ii] = zplane[ii-1] - 8.09;
208 };
209 };
210 //
211 millim_(&fStrip,&lPos);
212 //
213 if ( fView == 1 ){
214 //
215 // X view
216 //
217 fX = (lPos - UXal)/10.;
218 fY = 0.;
219 fZ = (zplane[fPlane-1] - 5.81 + UZal)/10.;
220 //
221 } else {
222 //
223 // Y view
224 //
225 fX = 0;
226 fY = (lPos - UYal)/10.;
227 fZ = (zplane[fPlane-1] + UZal)/10.;
228 };
229 //
230 };
231
232 /**
233 * Given a point in the space (PAMELA ref system) returns the closest strip
234 **/
235 void CaloStrip::Set(Float_t X, Float_t Y, Float_t Z) {
236 //
237 fX = X;
238 fY = Y;
239 fZ = Z;
240 //
241 Float_t zplane[22];
242 zplane[0] = 0.;
243 Int_t ii = 0;
244 for ( Int_t i = 2; i < 23; i++){
245 ii = i-1;
246 if ( i%2 ){
247 zplane[ii] = zplane[ii-1] - 10.09;
248 } else {
249 zplane[ii] = zplane[ii-1] - 8.09;
250 };
251 };
252 //
253 Float_t dzx[22];
254 Float_t dzy[22];
255 for ( Int_t i=0; i < 22; i++){
256 dzx[i] = fabs(fZ*10. - (zplane[i] - 5.81 + UZal));
257 dzy[i] = fabs(fZ*10. - (zplane[i] + UZal));
258 };
259 //
260 Float_t minx = TMath::MinElement(22,dzx);
261 Float_t miny = TMath::MinElement(22,dzy);
262 //
263 // find view
264 //
265 if ( minx < miny ){
266 fView = 1;
267 } else {
268 fView = 2;
269 };
270 //
271 // find plane
272 //
273 Float_t pos = 0.;
274 //
275 for ( Int_t i=0; i < 22; i++){
276 if ( fView == 1 ){
277 if ( dzx[i] == minx ){
278 fPlane = i+1;
279 pos = fX*10. + UXal;
280 };
281 } else {
282 if ( dzy[i] == miny ){
283 fPlane = i+1;
284 pos = fY*10. + UYal;
285 };
286 };
287 };
288 //
289 // find strip
290 //
291 Float_t dxy[96];
292 Float_t stpos = 0.;
293 //
294 CaloStrip *ca = new CaloStrip();
295 //
296 for ( Int_t i=0; i < 96; i++){
297 ca->Set(fView-1,fPlane-1,i);
298 if ( fView == 1 ){
299 stpos = ca->GetX()*10. + UXal;
300 } else {
301 stpos = ca->GetY()*10. + UYal;
302 };
303 dxy[i] = fabs(pos - stpos);
304 };
305 //
306 delete ca;
307 //
308 Float_t mins = TMath::MinElement(96,dxy);
309 //
310 for ( Int_t i=0; i < 96; i++){
311 if ( dxy[i] == mins ) fStrip = i+1;
312 };
313 };
314
315 /**
316 * CaloLevel1 constructor
317 **/
318 CaloLevel1::CaloLevel1() {
319 //
320 estrip = TArrayI(0,NULL);
321 //
322 this->Clear();
323 //
324 };
325
326 /**
327 * Clear the CaloLevel1 object
328 **/
329 void CaloLevel1::Clear(Option_t *t) {
330 //
331 istrip = 0;
332 estrip.Reset();
333 //
334 };
335
336 /**
337 * Returns the detected energy for the given strip once loaded the event
338 **/
339 Float_t CaloLevel1::GetEstrip(Int_t sview, Int_t splane, Int_t sstrip){
340 Int_t view = -1;
341 Int_t plane = -1;
342 Int_t strip = -1;
343 Float_t mip = 0.;
344 //
345 if ( istrip == 0 ) return(0.);
346 //
347 for (Int_t i = 0; i<istrip; i++ ){
348 //
349 mip = DecodeEstrip(i,view,plane,strip);
350 //
351 if ( view == sview && splane == plane && sstrip == strip ) return(mip);
352 //
353 // entry are ordered by strip, plane and view number. Go out if you pass the input strip
354 //
355 if ( view == sview && plane == splane && strip > sstrip ) return(0.);
356 if ( view == sview && plane > splane ) return(0.);
357 if ( view > sview ) return(0.);
358 //
359 };
360 return(0.);
361 };
362
363 /**
364 * Given estrip entry returns energy plus view, plane and strip numbers
365 **/
366 Float_t CaloLevel1::DecodeEstrip(Int_t entry, Int_t &view, Int_t &plane, Int_t &strip){
367 Bool_t sat = false;
368 Float_t mip=this->DecodeEstrip(entry,view,plane,strip,sat);
369 return(mip);
370 };
371
372 /**
373 * Given estrip entry returns energy plus view, plane, strip numbers and saturation info
374 **/
375 Float_t CaloLevel1::DecodeEstrip(Int_t entry, Int_t &view, Int_t &plane, Int_t &strip, Bool_t &saturated){
376 //
377 if ( entry>istrip ){
378 //
379 printf(" ERROR: problems decoding entry %i, it seems that number of entries is %i\n",entry,istrip);
380 //
381 return(0.);
382 };
383 //
384 // printf(" num lim %f \n",std::numeric_limits<Float_t>::max());
385 // printf(" estrip.At(%i) = %i \n",entry,estrip.At(entry));
386 //
387 Int_t eval = 0;
388 if ( estrip.At(entry) > 0. ){
389 view = 0;
390 eval = estrip.At(entry);
391 } else {
392 view = 1;
393 eval = -estrip.At(entry);
394 };
395 //
396 Int_t fbi = 0;
397 fbi = (Int_t)truncf((Float_t)(eval/1000000000));
398 //
399 Int_t plom = 0;
400 plom = (Int_t)truncf((Float_t)((eval-fbi*1000000000)/10000000));
401 //
402 Float_t tim = 100000.;
403 plane = plom;
404 if ( fbi == 1 ) tim = 10000.;
405 if ( plom > 21 ){
406 plane = plom - 22;
407 if ( fbi == 1 ){
408 tim = 1000.;
409 } else {
410 tim = 100.;
411 };
412 };
413 if ( plom > 43 ){
414 plane = plom - 44;
415 tim = 10.;
416 };
417 if ( plom > 65 ){
418 plane = plom - 66;
419 tim = 1.;
420 };
421 //
422 strip = (Int_t)truncf((Float_t)((eval - fbi*1000000000 -plom*10000000)/100000));
423 //
424 Float_t mip = ((Float_t)(eval - fbi*1000000000 -plom*10000000 -strip*100000))/tim;
425 //
426 saturated = false;
427 if ( mip > 5000. ){
428 mip -= 5000.;
429 saturated = true;
430 };
431 if ( mip > 0. && mip < 99999. ) return(mip);
432 //
433 printf(" ERROR: problems decoding value %i at entry %i \n",estrip.At(entry),entry);
434 //
435 view = -1;
436 plane = -1;
437 strip = -1;
438 return(0.);
439 }
440
441 /*
442 * Returns energy released on plane nplane (where 0<= nplane <= 43, 0 = 1Y, 1 = 1X, 2 = 2Y, 3 = 2X, etc. etc.).
443 */
444 Float_t CaloLevel1::qtotpl(Int_t nplane){
445 Bool_t sat = false;
446 Float_t mip = this->qtotpl(nplane,sat);
447 return(mip);
448 };
449
450 /*
451 * Returns energy released on plane nplane (where 0<= nplane <= 43, 0 = 1Y, 1 = 1X, 2 = 2Y, 3 = 2X, etc. etc.).
452 */
453 Float_t CaloLevel1::qtotpl(Int_t nplane, Bool_t &sat){
454 //
455 sat = false;
456 Int_t sview = 1;
457 if ( nplane%2 ) sview = 0;
458 //
459 // Int_t splane = nplane-(sview+1)/2;
460 Int_t splane = (nplane+sview-1)/2;
461 //
462 Float_t totmip = qtotpl(sview,splane,sat);
463 //
464 return(totmip);
465 //
466 };
467
468 /*
469 * Returns energy released on view "view" (0 = X, 1 = Y) and plane "plane" ( 0 <= plane <= 21 ).
470 */
471 Float_t CaloLevel1::qtotpl(Int_t sview, Int_t splane){
472 Bool_t sat = false;
473 Float_t mip = this->qtotpl(sview,splane,sat);
474 return(mip);
475 };
476
477 /*
478 * Returns energy released on view "view" (0 = X, 1 = Y) and plane "plane" ( 0 <= plane <= 21 ).
479 */
480 Float_t CaloLevel1::qtotpl(Int_t sview, Int_t splane, Bool_t &sat){
481 //
482 Int_t view = -1;
483 Int_t plane = -1;
484 Int_t strip = -1;
485 Bool_t lsat = false;
486 sat = false;
487 //
488 Float_t mip = 0.;
489 Float_t totmip = 0.;
490 //
491 if ( istrip == 0 ) return(0.);
492 //
493 for (Int_t i = 0; i<istrip; i++ ){
494 //
495 mip = DecodeEstrip(i,view,plane,strip,lsat);
496 //
497 if ( view == sview && splane == plane ){
498 if ( lsat ) sat = true;
499 totmip += mip;
500 };
501 //
502 // entry are ordered by strip, plane and view number. Go out if you pass the input strip
503 //
504 if ( view == sview && plane > splane ) return(totmip);
505 if ( view > sview ) return(totmip);
506 //
507 };
508 //
509 return(totmip);
510 //
511 };

  ViewVC Help
Powered by ViewVC 1.1.23