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

Annotation of /DarthVader/CalorimeterLevel2/src/CaloProcessing.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (hide annotations) (download)
Fri May 19 13:15:49 2006 UTC (18 years, 6 months ago) by mocchiut
Branch: MAIN
Branch point for: DarthVader
Initial revision

1 mocchiut 1.1 /**
2     * \file src/CaloProcessing.cpp
3     * \author Emiliano Mocchiutti
4     **/
5     //
6     // C/C++ headers
7     //
8     #include <sstream>
9     #include <fstream>
10     //
11     // ROOT headers
12     //
13     #include <TTree.h>
14     #include <TBranch.h>
15     #include <TFile.h>
16     #include <TObject.h>
17     //
18     // YODA headers
19     //
20     #include <PamelaRun.h>
21     #include <RegistryEvent.h>
22     #include <physics/calorimeter/CalorimeterEvent.h>
23     #include <CalibCalPedEvent.h>
24     //
25     //
26     //
27     #include <GLTables.h>
28     //
29     // this package headers
30     //
31     #include <delay.h>
32     #include <CaloProcessing.h>
33     //
34     //
35     // Declaration of the core fortran routines
36     //
37     #define calol2cm calol2cm_
38     extern "C" int calol2cm();
39     #define calol2tr calol2tr_
40     extern "C" int calol2tr();
41     //
42     using namespace std;
43     //
44     //
45     // Public methods
46     //
47    
48     CaloProcessing::~CaloProcessing(){
49     delete this;
50     }
51    
52     CaloProcessing::CaloProcessing(){
53     e_clevel1 = new struct FlCaLevel1;
54     e_clevel2 = new struct FlCaLevel2;
55     e_clevel2->ncore = 0;
56     e_clevel2->qcore = 0.;
57     e_clevel2->noint = 0.;
58     e_clevel2->ncyl = 0.;
59     e_clevel2->qcyl = 0.;
60     e_clevel2->qtrack = 0.;
61     e_clevel2->qtrackx = 0.;
62     e_clevel2->qtracky = 0.;
63     e_clevel2->dxtrack = 0.;
64     e_clevel2->dytrack = 0.;
65     e_clevel2->qlast = 0.;
66     e_clevel2->nlast = 0.;
67     e_clevel2->qpre = 0.;
68     e_clevel2->npre = 0.;
69     e_clevel2->qpresh = 0.;
70     e_clevel2->npresh = 0.;
71     e_clevel2->qlow = 0.;
72     e_clevel2->nlow = 0.;
73     e_clevel2->qtr = 0.;
74     e_clevel2->ntr = 0.;
75     e_clevel2->elen = 0.;
76     e_clevel2->selen = 0.;
77     e_clevel1->good2 = 0;
78     e_clevel1->trkchi2 = 0;
79     for (Int_t il = 0; il<2 ; il++){
80     for ( Int_t jl = 0; jl<22; jl++){
81     if ( jl < 5 ) e_clevel1->al_p[jl][il] = 0.;
82     for ( Int_t ml = 0; ml<96; ml++){
83     e_clevel1->estrip[ml][jl][il] = 0.;
84     };
85     };
86     };
87     e_clevel2->trigty = 0.;
88     e_clevel2->good = 0;
89     e_clevel2->nstrip = 0.;
90     e_clevel2->qtot = 0.;
91     e_clevel2->impx = 0.;
92     e_clevel2->impy = 0.;
93     e_clevel2->tanx = 0.;
94     e_clevel2->tany = 0.;
95     e_clevel2->qmax = 0.;
96     e_clevel2->nx22 = 0.;
97     e_clevel2->qx22 = 0.;
98     e_clevel2->planetot = 0.;
99     e_clevel2->qmean = 0.;
100     e_clevel2->dX0l = 0.;
101     for (Int_t il = 0; il<4 ; il++){
102     e_clevel2->perr[il] = 0;
103     e_clevel2->swerr[il] = 0;
104     e_clevel2->crc[il] = 0;
105     e_clevel2->qq[il] = 0.;
106     if ( il < 2 ){
107     e_clevel2->varcfit[il] = 0.;
108     e_clevel2->planemax[il] = 0;
109     e_clevel2->npcfit[il] = 0;
110     for ( Int_t jl = 0; jl<22; jl++){
111     e_clevel2->cibar[jl][il] = 0;
112     e_clevel2->tibar[jl][il] = 0;
113     e_clevel2->cbar[jl][il] = 0.;
114     e_clevel2->tbar[jl][il] = 0.;
115     };
116     };
117     };
118     //
119     extern struct FlCaLevel1 clevel1_;
120     extern struct FlCaLevel2 clevel2_;
121     clevel1 = &clevel1_;
122     clevel2 = &clevel2_;
123     //
124     trkseqno = 0;
125     ClearStructs();
126     for ( Int_t l = 0; l < 2; l++ ){
127     for ( Int_t m = 0; m < 22; m++ ){
128     for ( Int_t n = 0; n < 96; n++ ){
129     dexy[l][m][n] = 0.;
130     dexyc[l][m][n] = 0.;
131     mip[l][m][n] = 0.;
132     if ( n < 6 ){
133     base[l][m][n] = 0.;
134     sbase[l][m][n] = 0.;
135     };
136     };
137     };
138     };
139     calopar1 = true;
140     calopar2 = true;
141     ftcalopar1 = 0ULL;
142     ttcalopar1 = 0ULL;
143     ftcalopar2 = 0ULL;
144     ttcalopar2 = 0ULL;
145     }
146    
147     /**
148     * Initialize CaloProcessing object
149     **/
150     void CaloProcessing::ProcessingInit(TSQLServer *dbc, ULong64_t hs, Int_t &sgnl, TTree *l0tree, Bool_t isdeb, Bool_t isverb){
151     //
152     debug = isdeb;
153     verbose = isverb;
154     //
155     l0tr=(TTree*)l0tree;
156     de = new pamela::calorimeter::CalorimeterEvent();
157     l0calo = (TBranch*)l0tr->GetBranch("Calorimeter");
158     l0tr->SetBranchAddress("Calorimeter", &de);
159     //
160     trkseqno = 0;
161     ClearStructs();
162     //
163     GL_CALO_CALIB *glcalo = new GL_CALO_CALIB();
164     //
165     sgnl = 0;
166     //
167     for (Int_t s = 0; s < 4; s++){
168     idcalib[s] = 0ULL;
169     fromtime[s] = 0ULL;
170     totime[s] = 0ULL;
171     calibno[s] = 0;
172     ClearCalibVals(s);
173     //
174     sgnl = glcalo->Query_GL_CALO_CALIB(hs,s,dbc);
175     if ( sgnl < 0 ){
176     if ( verbose ) printf(" CALORIMETER - ERROR: error from GLTables\n");
177     return;
178     };
179     //
180     idcalib[s] = glcalo->ID_REG_CALIBCALPED;
181     fromtime[s] = glcalo->FROM_TIME;
182     totime[s] = glcalo->TO_TIME;
183     calibno[s] = glcalo->EV_REG_CALIBCALPED;
184     //
185     if ( totime[s] == 0ULL){
186     if ( verbose ) printf(" CALORIMETER - WARNING: data with no associated calibration\n");
187     ClearCalibVals(s);
188     sgnl = 100;
189     };
190     };
191     //
192     // determine path and name and entry of the calibration file
193     //
194     GL_ROOT *glroot = new GL_ROOT();
195     if ( verbose ) printf("\n");
196     for (Int_t s = 0; s < 4; s++){
197     if ( verbose ) printf(" ** SECTION %i **\n",s);
198     if ( totime[s] > 0ULL ){
199     //
200     sgnl = glroot->Query_GL_ROOT(idcalib[s],dbc);
201     if ( sgnl < 0 ){
202     if ( verbose ) printf(" CALORIMETER - ERROR: error from GLTables\n");
203     return;
204     };
205     //
206     stringstream name;
207     name.str("");
208     name << glroot->PATH.Data() << "/";
209     name << glroot->NAME.Data();
210     //
211     fcalname[s] = (TString)name.str().c_str();
212     if ( verbose ) printf(" - runheader at time %llu. From time %llu to time %llu \n use file %s \n calibration at entry %i \n\n",hs,fromtime[s],totime[s],fcalname[s].Data(),calibno[s]);
213     } else {
214     if ( verbose ) printf(" - runheader at time %llu. NO CALIBRATION INCLUDE THE RUNHEADER! ",hs);
215     };
216     sgnl = LoadCalib(s);
217     if ( sgnl ) break;
218     };
219     //
220     return;
221     //
222     }
223    
224     Int_t CaloProcessing::ChkCalib(TSQLServer *dbc, ULong64_t atime){
225     Int_t sgnl = 0;
226     for ( Int_t s = 0; s < 4; s++){
227     if ( atime > totime[s] ){
228     sgnl = Update(dbc,atime,s);
229     if ( sgnl < 0 ) return(sgnl);
230     };
231     };
232     return(sgnl);
233     }
234    
235     Int_t CaloProcessing::ChkParam(TSQLServer *dbc, ULong64_t runheader){
236     stringstream calfile;
237     stringstream aligfile;
238     Int_t error = 0;
239     FILE *f = 0;
240     GL_PARAM *glparam = new GL_PARAM();
241     //
242     if ( calopar1 || ( ttcalopar1 != 0 && ttcalopar1 < runheader ) ){
243     calopar1 = false;
244     //
245     // determine where I can find calorimeter ADC to MIP conversion file
246     //
247     if ( verbose ) printf(" Querying DB for calorimeter parameters files...\n");
248     //
249     error = 0;
250     error = glparam->Query_GL_PARAM(runheader,"Calorimeter ADC to MIP",dbc);
251     if ( error < 0 ) return(error);
252     //
253     calfile.str("");
254     calfile << glparam->PATH.Data() << "/";
255     calfile << glparam->NAME.Data();
256     ftcalopar1 = glparam->FROM_TIME;
257     ttcalopar1 = glparam->TO_TIME;
258     //
259     if ( verbose ) printf("\n Using ADC to MIP conversion file: \n %s \n",calfile.str().c_str());
260     f = fopen(calfile.str().c_str(),"rb");
261     if ( !f ){
262     if ( verbose ) printf(" CALORIMETER - ERROR: no ADC to MIP file!\n");
263     return(-105);
264     };
265     //
266     for (Int_t m = 0; m < 2 ; m++ ){
267     for (Int_t k = 0; k < 22; k++ ){
268     for (Int_t l = 0; l < 96; l++ ){
269     fread(&mip[m][k][l],sizeof(mip[m][k][l]),1,f);
270     };
271     };
272     };
273     fclose(f);
274     };
275     //
276     if ( calopar2 || ( ttcalopar2 != 0 && ttcalopar2 < runheader ) ){
277     calopar2 = false;
278     //
279     // determine where I can find calorimeter alignment file
280     //
281     //
282     error = 0;
283     error = glparam->Query_GL_PARAM(runheader,"Calorimeter alignement",dbc);
284     if ( error < 0 ) return(error);
285     //
286     aligfile.str("");
287     aligfile << glparam->PATH.Data() << "/";
288     aligfile << glparam->NAME.Data();
289     ftcalopar2 = glparam->FROM_TIME;
290     ttcalopar2 = glparam->TO_TIME;
291     //
292     if ( verbose ) printf("\n Using alignment file: \n %s \n\n",aligfile.str().c_str());
293     f = fopen(aligfile.str().c_str(),"rb");
294     if ( !f ){
295     if ( verbose ) printf(" CALORIMETER - ERROR: no alignement file!\n");
296     return(-106);
297     };
298     //
299     fread(&clevel1->xalig,sizeof(clevel1->xalig),1,f);
300     if ( debug ) printf(" xalig = %f \n",clevel1->xalig);
301     fread(&clevel1->yalig,sizeof(clevel1->yalig),1,f);
302     if ( debug ) printf(" yalig = %f \n",clevel1->yalig);
303     fread(&clevel1->zalig,sizeof(clevel1->zalig),1,f);
304     if ( debug ) printf(" zalig = %f \n",clevel1->zalig);
305     fread(&clevel1->emin,sizeof(clevel1->emin),1,f);
306     if ( debug ) printf(" signal threshold = %f \n",clevel1->emin);
307     //
308     fclose(f);
309     };
310     //
311     return(0);
312     }
313    
314    
315    
316     void CaloProcessing::FindBaseRaw(Int_t l, Int_t m, Int_t pre){
317     Float_t minstrip = 100000.;
318     Float_t rms = 0.;
319     base[l][m][pre] = 0.;
320     for (Int_t e = pre*16; e < (pre+1)*16 ; e++){
321     if ( calgood[l][m][e] == 0. && dexy[l][m][e]-calped[l][m][e] < minstrip && dexy[l][m][e] > 0.) {
322     minstrip = dexy[l][m][e]-calped[l][m][e];
323     rms = calthr[l][m][pre];
324     };
325     };
326     if ( minstrip != 100000. ) {
327     Float_t strip6s = 0.;
328     for (Int_t e = pre*16; e < (pre+1)*16 ; e++){
329     if ( (dexy[l][m][e]-calped[l][m][e]) >= minstrip && (dexy[l][m][e]-calped[l][m][e]) <= (minstrip+rms) ) {
330     strip6s += 1.;
331     base[l][m][pre] += (dexy[l][m][e] - calped[l][m][e]);
332     };
333     //
334     // compression
335     //
336     if ( abs((int)(dexy[l][m][e]-calped[l][m][e])) <= (minstrip+rms) ) {
337     dexyc[l][m][e] = 0.;
338     } else {
339     dexyc[l][m][e] = dexy[l][m][e];
340     };
341     };
342     if ( strip6s >= 9. ){
343     Double_t arro = base[l][m][pre]/strip6s;
344     Float_t deci = 1000.*((float)arro - float(int(arro)));
345     if ( deci < 500. ) {
346     arro = double(int(arro));
347     } else {
348     arro = 1. + double(int(arro));
349     };
350     base[l][m][pre] = arro;
351     } else {
352     base[l][m][pre] = 31000.;
353     for (Int_t e = pre*16; e < (pre+1)*16 ; e++){
354     dexyc[l][m][e] = dexy[l][m][e];
355     };
356     };
357     } else {
358     base[l][m][pre] = 31000.;
359     };
360     }
361    
362     Int_t CaloProcessing::Calibrate(Int_t ei){
363     //
364     // get entry ei
365     //
366     l0calo->GetEntry(ei);
367     //
368     // if it was not a selftrigger event, could it ever been a selftrigger event? if so trigty = 3.
369     //
370     Int_t val = 0;
371     Int_t del = 1100;
372     if ( clevel2->trigty != 2. ){
373     for (Int_t sec = 0; sec < 4; sec++){
374     val = (Int_t)de->calselftrig[sec][6];
375     del = delay(val);
376     if ( del < 1100 ){
377     clevel2->trigty = 3.;
378     break;
379     };
380     };
381     };
382     //
383     Int_t se = 5;
384     Int_t done = 0;
385     Int_t pre = -1;
386     Bool_t isCOMP = false;
387     Bool_t isFULL = false;
388     Bool_t isRAW = false;
389     Float_t ener;
390     Int_t doneb = 0;
391     Int_t donec = 0;
392     Int_t ck = 0;
393     Int_t ipre = 0;
394     Int_t ip[3] = {0};
395     Float_t base0, base1, base2;
396     base0 = 0.;
397     base1 = 0.;
398     base2 = 0.;
399     Float_t qpre[6] = {0.,0.,0.,0.,0.,0.};
400     Float_t ene[96];
401     Int_t chdone[4] = {0,0,0,0};
402     Int_t pe = 0;
403     //
404     // run over views and planes
405     //
406     for (Int_t l = 0; l < 2; l++){
407     for (Int_t m = 0; m < 22; m++){
408     //
409     // determine the section number
410     //
411     se = 5;
412     if (l == 0 && m%2 == 0) se = 3;
413     if (l == 0 && m%2 != 0) se = 2;
414     if (l == 1 && m%2 == 0) se = 1;
415     if (l == 1 && m%2 != 0) se = 0;
416     //
417     // determine what kind of event we are going to analyze
418     //
419     isCOMP = false;
420     isFULL = false;
421     isRAW = false;
422     if ( de->stwerr[se] & (1 << 16) ) isCOMP = true;
423     if ( de->stwerr[se] & (1 << 17) ) isFULL = true;
424     if ( de->stwerr[se] & (1 << 3) ) isRAW = true;
425     if ( !chdone[se] ){
426     //
427     // check for any error in the event
428     //
429     clevel2->crc[se] = 0;
430     if ( de->perror[se] == 132 ){
431     clevel2->crc[se] = 1;
432     pe++;
433     };
434     clevel2->perr[se] = 0;
435     if ( de->perror[se] != 0 ){
436     clevel2->perr[se] = 1;
437     pe++;
438     };
439     clevel2->swerr[se] = 0;
440     for (Int_t j = 0; j < 7 ; j++){
441     if ( (j != 3) && (de->stwerr[se] & (1 << j)) ){
442     clevel2->swerr[se] = 1;
443     pe++;
444     };
445     };
446     chdone[se] = 1;
447     };
448     if ( clevel2->crc[se] == 0 && (clevel1->good2 == 1 || clevel2->trigty >= 2) ){
449     pre = -1;
450     //
451     for (Int_t nn = 0; nn < 96; nn++){
452     ene[nn] = 0.;
453     dexy[l][m][nn] = de->dexy[l][m][nn] ;
454     dexyc[l][m][nn] = de->dexyc[l][m][nn] ;
455     };
456     //
457     // run over preamplifiers
458     //
459     pre = -1;
460     for (Int_t i = 0; i < 3; i++){
461     for (Int_t j = 0; j < 2; j++){
462     pre = j + i*2;
463     //
464     // baseline check and calculation
465     //
466     if ( !isRAW ) {
467     base[l][m][pre] = de->base[l][m][pre] ;
468     } else {
469     //
470     // if it is a raw event and we haven't checked
471     // yet, calculate the baseline.
472     //
473     FindBaseRaw(l,m,pre);
474     };
475     };
476     };
477     //
478     // run over strips
479     //
480     pre = -1;
481     for (Int_t i = 0 ; i < 3 ; i++){
482     ip[i] = 0;
483     for (Int_t n = i*32 ; n < (i+1)*32 ; n++){
484     if (n%16 == 0) {
485     ck = 0;
486     done = 0;
487     doneb = 0;
488     donec = 0;
489     pre++;
490     qpre[pre] = 0;
491     };
492     //
493     // baseline check and calculation
494     //
495     // no suitable new baseline, use old ones!
496     //
497     if ( !done ){
498     if ( (base[l][m][pre] == 31000. || base[l][m][pre] == 0.) ){
499     ck = 1;
500     if (pre%2 == 0) {
501     ip[i] = pre + 1;
502     } else {
503     ip[i] = pre - 1;
504     };
505     if ( (base[l][m][ip[i]] == 31000. || base[l][m][ip[i]] == 0.) ){
506     //
507     ck = 2;
508     if ( sbase[l][m][pre] == 31000. || sbase[l][m][pre] == 0. ) {
509     ck = 3;
510     };
511     };
512     done = 1;
513     };
514     };
515     //
516     // CALIBRATION ALGORITHM
517     //
518     if ( !doneb ){
519     switch (ck) {
520     case 0:
521     base0 = base[l][m][pre];
522     base2 = calbase[l][m][pre];
523     break;
524     case 1:
525     base0 = base[l][m][ip[i]];
526     base2 = calbase[l][m][ip[i]];
527     break;
528     case 2:
529     base0 = sbase[l][m][pre];
530     base2 = calbase[l][m][pre];
531     break;
532     case 3:
533     base0 = calbase[l][m][pre];
534     base2 = calbase[l][m][pre];
535     break;
536     };
537     base1 = calbase[l][m][pre];
538     doneb = 1;
539     };
540     ener = dexyc[l][m][n];
541     clevel1->estrip[n][m][l] = 0.;
542     if ( base0>0 && base0 < 30000. ){
543     if ( !donec && (base0 - base1 + base2) != 0. ){
544     sbase[l][m][pre] = base0 - base1 + base2;
545     donec = 1;
546     };
547     if ( ener > 0. ){
548     clevel1->estrip[n][m][l] = (ener - calped[l][m][n] - base0 - base1 + base2)/mip[l][m][n] ;
549     //
550     // OK, now in estrip we have the energy deposit in MIP of all the strips for this event (at the end of loops of course)
551     //
552     qpre[pre] += clevel1->estrip[n][m][l];
553     };
554     };
555     };
556     if (ck == 1){
557     if (ip[i]%2 == 0) {
558     ipre = ip[i] + 1;
559     } else {
560     ipre = ip[i] - 1;
561     };
562     for (Int_t j = ipre*16 ; j < (ipre+1)*16 ; j++){
563     clevel1->estrip[j][m][l] = clevel1->estrip[j][m][l] + (qpre[ipre] - qpre[ip[i]]) * 0.00478;
564     };
565     };
566     if (ck == 2){
567     for (Int_t j = i*32 ; j < (i+1)*32 ; j++){
568     ipre = j/16 + 1;
569     clevel1->estrip[j][m][l] = clevel1->estrip[j][m][l] + qpre[ipre] * 0.00478;
570     };
571     };
572     };
573     //
574     Int_t j4 = -4;
575     Int_t jjj = -3;
576     Int_t jj = -2;
577     for (Int_t j = 0 ; j < 100 ; j++){
578     jj++;
579     jjj++;
580     j4++;
581     if ( j < 96 ) ene[j] = clevel1->estrip[j][m][l];
582     if ( jj >= 0 && jj < 96 ){
583     if ( jj != 0 && jj != 32 && jj != 64 ) ene[jj-1] = ene[jj-1] - clevel1->estrip[jj][m][l] * 0.01581;
584     if ( jj != 31 && jj != 63 && jj != 95 ) ene[jj+1] = ene[jj+1] - clevel1->estrip[jj][m][l] * 0.01581;
585     };
586     if ( jjj >= 0 && jjj < 96 ){
587     if ( jjj != 0 && jjj != 32 && jjj != 64 ) clevel1->estrip[jjj-1][m][l] = clevel1->estrip[jjj-1][m][l] - ene[jjj] * 0.01581;
588     if ( jjj != 31 && jjj != 63 && jjj != 95 ) clevel1->estrip[jjj+1][m][l] = clevel1->estrip[jjj+1][m][l] - ene[jjj] * 0.01581;
589     };
590     if ( j4 >= 0 && j4 < 96 ){
591     //
592     // NOTICE: THE FOLLOWING LINE EXCLUDE ALL STRIPS FOR WHICH THE RMS*4 IS GREATER THAN 26 !!! <===V============ IMPORTANT! =================>
593     //
594     if ( clevel1->estrip[j4][m][l]!=0. && ( clevel1->estrip[j4][m][l] < clevel1->emin || calrms[l][m][j4] > 26 )){
595     clevel1->estrip[j4][m][l] = 0.;
596     };
597     if ( clevel1->estrip[j4][m][l] > clevel1->emin ){
598     if ( l == 0 ){
599     //
600     // +-PPSSmmmm.mmmm
601     //
602     svstrip[istrip] = ((Float_t)m)*1000000. + ((Float_t)j4)*10000. + clevel1->estrip[j4][m][l];
603     } else {
604     svstrip[istrip] = -(((Float_t)m)*1000000. + ((Float_t)j4)*10000. + clevel1->estrip[j4][m][l]);
605     };
606     istrip++;
607     };
608     };
609     };
610     //
611     } else {
612     for (Int_t nn = 0; nn < 96; nn++){
613     clevel1->estrip[nn][m][l] = 0.;
614     };
615     };
616     };
617     };
618     if ( !pe ){
619     clevel2->good = 1;
620     } else {
621     clevel2->good = 0;
622     };
623     return(0);
624     }
625    
626     void CaloProcessing::GetTrkVar(){
627     calol2tr();
628     }
629    
630     void CaloProcessing::FillTrkVar(CaloLevel2 *ca, Int_t nutrk){
631     //
632     CaloTrkVar *t_ca = new CaloTrkVar();
633     //
634     t_ca->trkseqno = trkseqno;
635     t_ca->ncore = (Int_t)clevel2->ncore;
636     t_ca->qcore = clevel2->qcore;
637     t_ca->noint = (Int_t)clevel2->noint;
638     t_ca->ncyl = (Int_t)clevel2->ncyl;
639     t_ca->qcyl = clevel2->qcyl;
640     t_ca->qtrack = clevel2->qtrack;
641     t_ca->qtrackx = clevel2->qtrackx;
642     t_ca->qtracky = clevel2->qtracky;
643     t_ca->dxtrack = clevel2->dxtrack;
644     t_ca->dytrack = clevel2->dytrack;
645     t_ca->qlast = clevel2->qlast;
646     t_ca->nlast = (Int_t)clevel2->nlast;
647     t_ca->qpre = clevel2->qpre;
648     t_ca->npre = (Int_t)clevel2->npre;
649     t_ca->qpresh = clevel2->qpresh;
650     t_ca->npresh = (Int_t)clevel2->npresh;
651     t_ca->qtr = clevel2->qtr;
652     t_ca->ntr = (Int_t)clevel2->ntr;
653     t_ca->planetot = (Int_t)clevel2->planetot;
654     t_ca->qmean = clevel2->qmean;
655     t_ca->dX0l = clevel2->dX0l;
656     t_ca->qlow = clevel2->qlow;
657     t_ca->nlow = (Int_t)clevel2->nlow;
658     //
659     memcpy(t_ca->tibar,clevel2->tibar,sizeof(clevel2->tibar));
660     memcpy(t_ca->tbar,clevel2->tbar,sizeof(clevel2->tbar));
661     //
662     if ( trkseqno == -1 ){
663     ca->impx = clevel2->impx;
664     ca->impy = clevel2->impy;
665     ca->tanx = clevel2->tanx;
666     ca->tany = clevel2->tany;
667     ca->elen = clevel2->elen;
668     ca->selen = clevel2->selen;
669     memcpy(ca->cibar,clevel2->cibar,sizeof(clevel2->cibar));
670     memcpy(ca->cbar,clevel2->cbar,sizeof(clevel2->cbar));
671     memcpy(ca->planemax,clevel2->planemax,sizeof(clevel2->planemax));
672     memcpy(ca->varcfit,clevel2->varcfit,sizeof(clevel2->varcfit));
673     memcpy(ca->npcfit,clevel2->npcfit,sizeof(clevel2->npcfit));
674     };
675     //
676     TClonesArray &t = *ca->CaloTrk;
677     new(t[nutrk]) CaloTrkVar(*t_ca);
678     //
679     ClearTrkVar();
680     }
681    
682     void CaloProcessing::GetCommonVar(){
683     calol2cm();
684     }
685    
686     void CaloProcessing::FillCommonVar(CaloLevel2 *ca){
687     //
688     ca->good = clevel2->good;
689     if ( clevel2->trigty == 2. ){
690     ca->selftrigger = 1;
691     } else {
692     ca->selftrigger = 0;
693     };
694     memcpy(ca->perr,clevel2->perr,sizeof(clevel2->perr));
695     memcpy(ca->swerr,clevel2->swerr,sizeof(clevel2->swerr));
696     memcpy(ca->crc,clevel2->crc,sizeof(clevel2->crc));
697     ca->estrip = TArrayF(0,svstrip);
698     ca->nstrip = (Int_t)clevel2->nstrip;
699     ca->qtot = clevel2->qtot;
700     ca->impx = clevel2->impx;
701     ca->impy = clevel2->impy;
702     ca->tanx = clevel2->tanx;
703     ca->tany = clevel2->tany;
704     ca->nx22 = (Int_t)clevel2->nx22;
705     ca->qx22 = clevel2->qx22;
706     ca->qmax = clevel2->qmax;
707     ca->elen = clevel2->elen;
708     ca->selen = clevel2->selen;
709     ca->estrip = TArrayF(ca->nstrip,svstrip);
710     memcpy(ca->qq,clevel2->qq,sizeof(clevel2->qq));
711     memcpy(ca->planemax,clevel2->planemax,sizeof(clevel2->planemax));
712     memcpy(ca->varcfit,clevel2->varcfit,sizeof(clevel2->varcfit));
713     memcpy(ca->npcfit,clevel2->npcfit,sizeof(clevel2->npcfit));
714     memcpy(ca->cibar,clevel2->cibar,sizeof(clevel2->cibar));
715     memcpy(ca->cbar,clevel2->cbar,sizeof(clevel2->cbar));
716     //
717     }
718    
719     void CaloProcessing::ClearStructs(){
720     ClearTrkVar();
721     ClearCommonVar();
722     }
723    
724     void CaloProcessing::RunClose(){
725     l0tr->Delete();
726     ClearStructs();
727     for ( Int_t l = 0; l < 2; l++ ){
728     for ( Int_t m = 0; m < 22; m++ ){
729     for ( Int_t n = 0; n < 96; n++ ){
730     dexy[l][m][n] = 0.;
731     dexyc[l][m][n] = 0.;
732     if ( n < 6 ){
733     base[l][m][n] = 0.;
734     sbase[l][m][n] = 0.;
735     };
736     };
737     };
738     };
739     }
740    
741     //
742     // Private methods
743     //
744    
745     void CaloProcessing::ClearTrkVar(){
746     clevel2->ncore = 0;
747     clevel2->qcore = 0.;
748     clevel2->noint = 0.;
749     clevel2->ncyl = 0.;
750     clevel2->qcyl = 0.;
751     clevel2->qtrack = 0.;
752     clevel2->qtrackx = 0.;
753     clevel2->qtracky = 0.;
754     clevel2->dxtrack = 0.;
755     clevel2->dytrack = 0.;
756     clevel2->qlast = 0.;
757     clevel2->nlast = 0.;
758     clevel2->qpre = 0.;
759     clevel2->npre = 0.;
760     clevel2->qpresh = 0.;
761     clevel2->npresh = 0.;
762     clevel2->qlow = 0.;
763     clevel2->nlow = 0.;
764     clevel2->qtr = 0.;
765     clevel2->ntr = 0.;
766     clevel2->planetot = 0.;
767     clevel2->qmean = 0.;
768     clevel2->dX0l = 0.;
769     clevel2->elen = 0.;
770     clevel2->selen = 0.;
771     memcpy(clevel1->al_p,e_clevel1->al_p,sizeof(clevel1->al_p));
772     memcpy(clevel2->tibar,e_clevel2->tibar,sizeof(clevel2->tibar));
773     memcpy(clevel2->tbar,e_clevel2->tbar,sizeof(clevel2->tbar));
774     }
775    
776     void CaloProcessing::ClearCommonVar(){
777     istrip = 0;
778     clevel2->trigty = -1.;
779     clevel2->good = 0;
780     clevel2->nstrip = 0.;
781     clevel2->qtot = 0.;
782     clevel2->impx = 0.;
783     clevel2->impy = 0.;
784     clevel2->tanx = 0.;
785     clevel2->tany = 0.;
786     clevel2->qmax = 0.;
787     clevel2->nx22 = 0.;
788     clevel2->qx22 = 0.;
789     memcpy(clevel2->perr,e_clevel2->perr,sizeof(clevel2->perr));
790     memcpy(clevel2->swerr,e_clevel2->swerr,sizeof(clevel2->swerr));
791     memcpy(clevel2->crc,e_clevel2->crc,sizeof(clevel2->crc));
792     memcpy(clevel2->qq,e_clevel2->qq,sizeof(clevel2->qq));
793     memcpy(clevel2->planemax,e_clevel2->planemax,sizeof(clevel2->planemax));
794     memcpy(clevel2->varcfit,e_clevel2->varcfit,sizeof(clevel2->varcfit));
795     memcpy(clevel2->npcfit,e_clevel2->npcfit,sizeof(clevel2->npcfit));
796     memcpy(clevel2->cibar,e_clevel2->cibar,sizeof(clevel2->cibar));
797     memcpy(clevel2->cbar,e_clevel2->cbar,sizeof(clevel2->cbar));
798     }
799    
800     void CaloProcessing::ClearCalibVals(Int_t s){
801     //
802     for ( Int_t d=0 ; d<11 ;d++ ){
803     Int_t pre = -1;
804     for ( Int_t j=0; j<96 ;j++){
805     if ( j%16 == 0 ) pre++;
806     if ( s == 2 ){
807     calped[0][2*d+1][j] = 0.;
808     cstwerr[3] = 0.;
809     cperror[3] = 0.;
810     calgood[0][2*d+1][j] = 0.;
811     calthr[0][2*d+1][pre] = 0.;
812     calrms[0][2*d+1][j] = 0.;
813     calbase[0][2*d+1][pre] = 0.;
814     calvar[0][2*d+1][pre] = 0.;
815     };
816     if ( s == 3 ){
817     calped[0][2*d][j] = 0.;
818     cstwerr[1] = 0.;
819     cperror[1] = 0.;
820     calgood[0][2*d][j] = 0.;
821     calthr[0][2*d][pre] = 0.;
822     calrms[0][2*d][j] = 0.;
823     calbase[0][2*d][pre] = 0.;
824     calvar[0][2*d][pre] = 0.;
825     };
826     if ( s == 0 ){
827     calped[1][2*d][j] = 0.;
828     cstwerr[0] = 0.;
829     cperror[0] = 0.;
830     calgood[1][2*d][j] = 0.;
831     calthr[1][2*d][pre] = 0.;
832     calrms[1][2*d][j] = 0.;
833     calbase[1][2*d][pre] = 0.;
834     calvar[1][2*d][pre] = 0.;
835     };
836     if ( s == 1 ){
837     calped[1][2*d+1][j] = 0.;
838     cstwerr[2] = 0.;
839     cperror[2] = 0.;
840     calgood[1][2*d+1][j] = 0.;
841     calthr[1][2*d+1][pre] = 0.;
842     calrms[1][2*d+1][j] = 0.;
843     calbase[1][2*d+1][pre] = 0.;
844     calvar[1][2*d+1][pre] = 0.;
845     };
846     };
847     };
848     return;
849     }
850    
851     Int_t CaloProcessing::Update(TSQLServer *dbc, ULong64_t atime, Int_t s){
852     //
853     Int_t sgnl = 0;
854     //
855     GL_CALO_CALIB *glcalo = new GL_CALO_CALIB();
856     //
857     sgnl = 0;
858     //
859     idcalib[s] = 0ULL;
860     fromtime[s] = 0ULL;
861     totime[s] = 0ULL;
862     calibno[s] = 0;
863     ClearCalibVals(s);
864     //
865     sgnl = glcalo->Query_GL_CALO_CALIB(atime,s,dbc);
866     if ( sgnl < 0 ){
867     if ( verbose ) printf(" CALORIMETER - ERROR: error from GLTables\n");
868     return(sgnl);
869     };
870     //
871     idcalib[s] = glcalo->ID_REG_CALIBCALPED;
872     fromtime[s] = glcalo->FROM_TIME;
873     totime[s] = glcalo->TO_TIME;
874     calibno[s] = glcalo->EV_REG_CALIBCALPED;
875     //
876     if ( totime[s] == 0ULL){
877     if ( verbose ) printf(" CALORIMETER - WARNING: data with no associated calibration\n");
878     ClearCalibVals(s);
879     sgnl = 100;
880     };
881     //
882     // determine path and name and entry of the calibration file
883     //
884     GL_ROOT *glroot = new GL_ROOT();
885     if ( verbose ) printf("\n");
886     if ( verbose ) printf(" ** SECTION %i **\n",s);
887     //
888     sgnl = glroot->Query_GL_ROOT(idcalib[s],dbc);
889     if ( sgnl < 0 ){
890     if ( verbose ) printf(" CALORIMETER - ERROR: error from GLTables\n");
891     return(sgnl);
892     };
893     //
894     stringstream name;
895     name.str("");
896     name << glroot->PATH.Data() << "/";
897     name << glroot->NAME.Data();
898     //
899     fcalname[s] = (TString)name.str().c_str();
900     if ( verbose ) printf(" - event at time %llu. From time %llu to time %llu \n use file %s \n calibration at entry %i \n\n",atime,fromtime[s],totime[s],fcalname[s].Data(),calibno[s]);
901     //
902     sgnl = LoadCalib(s);
903     //
904     if ( sgnl != 0 ) return(sgnl);
905     //
906     return(0);
907     //
908     }
909    
910     Int_t CaloProcessing::LoadCalib(Int_t s){
911     //
912     ifstream myfile;
913     myfile.open(fcalname[s].Data());
914     if ( !myfile ){
915     return(-107);
916     };
917     myfile.close();
918     //
919     TFile *File = new TFile(fcalname[s].Data());
920     if ( !File ) return(-108);
921     TTree *tr = (TTree*)File->Get("CalibCalPed");
922     if ( !tr ) return(-109);
923     //
924     TBranch *registry = tr->GetBranch("Registry");
925     TBranch *calo = tr->GetBranch("CalibCalPed");
926     //
927     pamela::RegistryEvent *reg = 0;
928     pamela::CalibCalPedEvent *ce = 0;
929     tr->SetBranchAddress("CalibCalPed", &ce);
930     tr->SetBranchAddress("Registry", &reg);
931     //
932     Long64_t ncalibs = registry->GetEntries();
933     //
934     if ( !ncalibs ) return(-110);
935     //
936     registry->GetEntry(calibno[s]);
937     //
938     calo->GetEntry(reg->event);
939     //
940     if (ce->cstwerr[s] != 0 && ce->cperror[s] == 0 ) {
941     for ( Int_t d=0 ; d<11 ;d++ ){
942     Int_t pre = -1;
943     for ( Int_t j=0; j<96 ;j++){
944     if ( j%16 == 0 ) pre++;
945     if ( s == 2 ){
946     calped[0][2*d+1][j] = ce->calped[3][d][j];
947     cstwerr[3] = ce->cstwerr[3];
948     cperror[3] = ce->cperror[3];
949     calgood[0][2*d+1][j] = ce->calgood[3][d][j];
950     calthr[0][2*d+1][pre] = ce->calthr[3][d][pre];
951     calrms[0][2*d+1][j] = ce->calrms[3][d][j];
952     calbase[0][2*d+1][pre] = ce->calbase[3][d][pre];
953     calvar[0][2*d+1][pre] = ce->calvar[3][d][pre];
954     };
955     if ( s == 3 ){
956     calped[0][2*d][j] = ce->calped[1][d][j];
957     cstwerr[1] = ce->cstwerr[1];
958     cperror[1] = ce->cperror[1];
959     calgood[0][2*d][j] = ce->calgood[1][d][j];
960     calthr[0][2*d][pre] = ce->calthr[1][d][pre];
961     calrms[0][2*d][j] = ce->calrms[1][d][j];
962     calbase[0][2*d][pre] = ce->calbase[1][d][pre];
963     calvar[0][2*d][pre] = ce->calvar[1][d][pre];
964     };
965     if ( s == 0 ){
966     calped[1][2*d][j] = ce->calped[0][d][j];
967     cstwerr[0] = ce->cstwerr[0];
968     cperror[0] = ce->cperror[0];
969     calgood[1][2*d][j] = ce->calgood[0][d][j];
970     calthr[1][2*d][pre] = ce->calthr[0][d][pre];
971     calrms[1][2*d][j] = ce->calrms[0][d][j];
972     calbase[1][2*d][pre] = ce->calbase[0][d][pre];
973     calvar[1][2*d][pre] = ce->calvar[0][d][pre];
974     };
975     if ( s == 1 ){
976     calped[1][2*d+1][j] = ce->calped[2][d][j];
977     cstwerr[2] = ce->cstwerr[2];
978     cperror[2] = ce->cperror[2];
979     calgood[1][2*d+1][j] = ce->calgood[2][d][j];
980     calthr[1][2*d+1][pre] = ce->calthr[2][d][pre];
981     calrms[1][2*d+1][j] = ce->calrms[2][d][j];
982     calbase[1][2*d+1][pre] = ce->calbase[2][d][pre];
983     calvar[1][2*d+1][pre] = ce->calvar[2][d][pre];
984     };
985     };
986     };
987     } else {
988     if ( verbose ) printf(" CALORIMETER - ERROR: problems finding a good calibration in this file! \n\n ");
989     return(-111);
990     };
991     File->Close();
992     return(0);
993     }

  ViewVC Help
Powered by ViewVC 1.1.23