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

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

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.1 by mocchiut, Wed Nov 22 08:31:10 2006 UTC revision 1.16 by mocchiut, Fri Jun 6 14:18:16 2014 UTC
# Line 3  Line 3 
3   * \author Emiliano Mocchiutti   * \author Emiliano Mocchiutti
4   *   *
5  **/  **/
 #include <TObject.h>  
6  #include <CaloLevel1.h>  #include <CaloLevel1.h>
   
7  //  //
8  ClassImp(CaloStrip);  ClassImp(CaloStrip);
9  ClassImp(CaloLevel1);  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   * CaloStrip default constructor
18  **/  **/
19  CaloStrip::CaloStrip() {  CaloStrip::CaloStrip() {
20    c1 = 0;    c1 = 0;
21      debug = false;
22      this->Clear();
23    };
24    
25    /**
26     * CaloStrip default constructor
27    **/
28    CaloStrip::CaloStrip(Bool_t mechalig) {
29      c1 = 0;
30      debug = false;
31    this->Clear();    this->Clear();
32      if ( mechalig ){
33        ismech = true;
34        paramload = true;
35        UXal = MECHCTX;
36        UYal = MECHCTY;
37        UZal = MECHCTZ;
38      } else {
39        ismech = false;
40        UseStandardAlig();
41      };
42  };  };
43    
44  /**  /**
# Line 23  CaloStrip::CaloStrip() { Line 46  CaloStrip::CaloStrip() {
46  **/  **/
47  CaloStrip::CaloStrip(CaloLevel1 *calo) {  CaloStrip::CaloStrip(CaloLevel1 *calo) {
48    c1 = calo->GetCaloLevel1();    c1 = calo->GetCaloLevel1();
49      debug = false;
50      this->Clear();
51      ismech = false;
52      UseStandardAlig();
53    };
54    
55    /**
56     * CaloStrip default constructor
57    **/
58    CaloStrip::CaloStrip(CaloLevel1 *calo, Bool_t mechalig) {
59      c1 = calo->GetCaloLevel1();
60      debug = false;
61    this->Clear();    this->Clear();
62      if ( mechalig ){
63        ismech = true;
64        paramload = true;
65        UXal = MECHCTX;
66        UYal = MECHCTY;
67        UZal = MECHCTZ;
68      } else {
69        ismech = false;
70        UseStandardAlig();
71      };
72  };  };
73    
74  /**  /**
75   * Clear variables   * Clear variables
76  **/  **/
77  void CaloStrip::Clear() {  void CaloStrip::Clear(Option_t *t) {  
78    fE = 0.;    fE = 0.;
79    fX = 0.;    fX = 0.;
80    fY = 0.;    fY = 0.;
# Line 40  void CaloStrip::Clear() { Line 85  void CaloStrip::Clear() {
85  };  };
86    
87  /**  /**
88     * Connect to the DB and retrieve alignement parameters
89     **/
90    void CaloStrip::UseStandardAlig(){
91      //
92      if ( !paramload ){
93        //
94        paramload = true;
95        ismech = false;
96        //
97        stringstream aligfile;
98        Int_t error = 0;
99        FILE *f = 0;
100        ifstream badfile;
101        GL_PARAM *glparam = new GL_PARAM();
102        //
103        TString host = "mysql://localhost/pamelaprod";
104        TString user = "anonymous";
105        TString psw = "";
106        const char *pamdbhost=gSystem->Getenv("PAM_DBHOST");
107        const char *pamdbuser=gSystem->Getenv("PAM_DBUSER");
108        const char *pamdbpsw=gSystem->Getenv("PAM_DBPSW");
109        if ( !pamdbhost ) pamdbhost = "";
110        if ( !pamdbuser ) pamdbuser = "";
111        if ( !pamdbpsw ) pamdbpsw = "";
112        if ( strcmp(pamdbhost,"") ) host = pamdbhost;
113        if ( strcmp(pamdbuser,"") ) user = pamdbuser;
114        if ( strcmp(pamdbpsw,"") ) psw = pamdbpsw;
115        TSQLServer *dbc = TSQLServer::Connect(host.Data(),user.Data(),psw.Data());
116        //
117        UXal = 0.;
118        UYal = 0.;
119        UZal = 0.;
120        //
121        if ( dbc ){
122          //
123          // determine where I can find calorimeter ADC to MIP conversion file  
124          //
125          if ( debug ) printf(" Querying DB for calorimeter parameters files...\n");
126          //
127          //
128          //
129          error = 0;
130          error = glparam->Query_GL_PARAM(1000,102,dbc);
131          if ( error >= 0 ){
132            //
133            aligfile.str("");
134            aligfile << glparam->PATH.Data() << "/";
135            aligfile << glparam->NAME.Data();
136            //
137            if (debug) printf("\n Using parameter file: \n %s \n",aligfile.str().c_str());
138            f = fopen(aligfile.str().c_str(),"rb");
139            if ( f ){
140              //
141              fread(&UXal,sizeof(UXal),1,f);
142              fread(&UYal,sizeof(UYal),1,f);
143              fread(&UZal,sizeof(UZal),1,f);
144              //
145              fclose(f);
146            };
147            //
148          };
149          dbc->Close();
150          delete dbc;
151          dbc = 0;
152        };
153        if ( !UXal ){
154          //
155          printf(" No able to query DB for calorimeter parameters files\n Using hard-coded parameters \n");
156          UXal = CTX;
157          UYal = CTY;
158          UZal = CTZ;
159        };
160        //  
161      };
162      //
163    };
164    
165    /**
166   * Given a strip returns its position in the PAMELA reference system   * Given a strip returns its position in the PAMELA reference system
167  **/  **/
168  void CaloStrip::Set(Int_t view, Int_t plane, Int_t strip) {  void CaloStrip::Set(Int_t view, Int_t plane, Int_t strip) {
# Line 70  void CaloStrip::Set(Int_t view, Int_t pl Line 193  void CaloStrip::Set(Int_t view, Int_t pl
193    fView = view + 1;    fView = view + 1;
194    fPlane = plane + 1;    fPlane = plane + 1;
195    fStrip = strip + 1;    fStrip = strip + 1;
196      //
197    if ( fPlane%2 ){    if ( fPlane%2 ){
198      lShift = -0.5;      lShift = +0.5;
199    } else {    } else {
200      lShift = 0.5;      lShift = -0.5;
201    };    };
202    //    //
203    shift_.shift = lShift;    shift_.shift = lShift;
# Line 96  void CaloStrip::Set(Int_t view, Int_t pl Line 220  void CaloStrip::Set(Int_t view, Int_t pl
220      //      //
221      // X view      // X view
222      //      //
223      fX = (lPos - CTX)/10.;      fX = (lPos - UXal)/10.;
224      fY = 0.;      fY = 0.;
225      fZ = (zplane[fPlane-1] - 5.81 + CTZ)/10.;          fZ = (zplane[fPlane-1] - 5.81 + UZal)/10.;    
226    } else {      //
227       } else {
228      //      //
229      // Y view      // Y view
230      //      //
231      fX = 0;      fX = 0;
232      fY = (lPos - CTY)/10.;      fY = (lPos - UYal)/10.;
233      fZ = (zplane[fPlane-1] + CTZ)/10.;      fZ = (zplane[fPlane-1] + UZal)/10.;
234    };    };
235    //      //  
236  };  };
# Line 115  void CaloStrip::Set(Int_t view, Int_t pl Line 240  void CaloStrip::Set(Int_t view, Int_t pl
240  **/  **/
241  void CaloStrip::Set(Float_t X, Float_t Y, Float_t Z) {  void CaloStrip::Set(Float_t X, Float_t Y, Float_t Z) {
242    //    //
243  //   Float_t lShift = 0.;    fX = X;
244  //   Float_t lPos = 0.;    fY = Y;
245  //   extern struct shift shift;    fZ = Z;
246  //   //    //
247  //   fView = view++;    Float_t zplane[22];
248  //   fPlane = plane++;    zplane[0] = 0.;
249  //   fStrip = strip++;    Int_t ii = 0;
250  //   if ( fPlane%2 ){    for ( Int_t i = 2; i < 23; i++){
251  //     lShift = -0.5;      ii = i-1;
252  //   } else {      if ( i%2 ){
253  //     lShift = 0.5;        zplane[ii] = zplane[ii-1] - 10.09;
254  //   };      } else {
255  //   //        zplane[ii] = zplane[ii-1] - 8.09;
256  //   shift.shift = lShift;      };
257  //   //    };
258  //   Float_t zplane[22];    //
259  //   zplane[0] = 0.;    Float_t dzx[22];
260  //   Int_t ii = 0;    Float_t dzy[22];
261  //   for ( Int_t i = 2; i < 23; i++){    for ( Int_t i=0; i < 22; i++){
262  //     ii = i-1;      dzx[i] = fabs(fZ*10. - (zplane[i] - 5.81 + UZal));
263  //     if ( i%2 ){      dzy[i] = fabs(fZ*10. - (zplane[i] + UZal));    
264  //       zplane[ii] = zplane[ii-1] - 10.09 + CTZ;    };
265  //     } else {    //
266  //       zplane[ii] = zplane[ii-1] - 8.09 + CTZ;    Float_t minx = TMath::MinElement(22,dzx);
267  //     };    Float_t miny = TMath::MinElement(22,dzy);
268  //   };    //
269  //   //    // find view
270  //   millim_(&fStrip,&lPos);    //
271  //   //    if ( minx < miny ){
272  //   if ( fView == 1 ){      fView = 1;
273  //     //    } else {
274  //     // X view      fView = 2;
275  //     //    };
276  //     fX = lPos;    //
277  //     fY = 0.;    // find plane
278  //     fZ = zplane[fPlane-1] - 5.81;        //
279  //   } else {    Float_t pos = 0.;
280  //     //    //
281  //     // Y view    for ( Int_t i=0; i < 22; i++){
282  //     //      if ( fView == 1 ){
283  //     fX = 0.;        if ( dzx[i] == minx ){
284  //     fY = lPos;          fPlane = i+1;
285  //     fZ = zplane[fPlane-1];          pos = fX*10. + UXal;
286  //   };        };
287        } else {
288          if ( dzy[i] == miny ){
289            fPlane = i+1;
290            pos = fY*10. + UYal;
291        };
292        };
293      };
294      //
295      // find strip
296      //
297      Float_t dxy[96];
298      Float_t stpos = 0.;
299      //
300      CaloStrip *ca = new CaloStrip();
301      //
302      for ( Int_t i=0; i < 96; i++){
303        ca->Set(fView-1,fPlane-1,i);
304        if ( fView == 1 ){
305          stpos = ca->GetX()*10. + UXal;
306        } else {
307          stpos = ca->GetY()*10. + UYal;
308        };
309        dxy[i] = fabs(pos - stpos);
310      };
311      //
312      delete ca;
313    //      //  
314      Float_t mins =  TMath::MinElement(96,dxy);
315      //
316      for ( Int_t i=0; i < 96; i++){
317        if ( dxy[i] == mins ) fStrip = i+1;
318      };
319  };  };
 //                      DISTY = PIANO(I)                  
 //                      YY(I) = DISTY * TG(2) + CY  
 //                      BAR(M,I) = YY(I)  
 //                      CBAR(M,I) = (-YALIG + YY(I))/10.  
 // C      
 //                   ENDIF  
 //                   CALL LASTRISCIA(BAR(M,I),IBAR(M,I))  
 //                   CIBAR(M,I) = IBAR(M,I)  
 //                ENDDO              
 //             ENDIF  
 // C  
 //          ENDDO  
   
320    
321    /**
322     * Given a point in the space or a strip it returns the Silicon sensor number. Numbering goes like this:
323     *
324     * y ^
325     *   |
326     *   |    6 7 8
327     *   |    3 4 5  
328     *   |    0 1 2
329     *   | -----------> x
330     *
331    **/
332    Int_t CaloStrip::GetSiSensor() {
333      //
334      // fX fY fZ // fView fPlane
335      //
336      Float_t deadsi = 0.096;
337      Float_t dead = 0.05;
338      Float_t sidim = 8.00;
339      //  Float_t stripdim = 0.244;
340      Float_t sensitarea = 7.808;
341      //
342      Float_t xoffset = 0.;
343      Float_t yoffset = 0.;
344      //
345      if ( (fView-1) == 0 && !((fPlane-1)%2) ){
346        xoffset = +0.05;
347        yoffset = 0.0;
348      };
349      if ( (fView-1) == 0 && ((fPlane-1)%2) ){
350        xoffset = -0.05;
351        yoffset = -0.20;
352      };
353      if ( (fView-1) == 1 && !((fPlane-1)%2) ){
354        xoffset = +0.10;
355        yoffset = -0.05;
356      };
357      if ( (fView-1) == 1 && ((fPlane-1)%2) ){
358        xoffset = -0.10;
359        yoffset = -0.15;
360      };
361      //
362      Int_t iind = -1;
363      Int_t jind = -1;
364      //
365      for (Int_t i = 0; i < 3; i++){
366        if ( (fX+xoffset+12.1) >= (deadsi+(sidim+dead)*i) && (fX+xoffset+12.1) <= (sensitarea+deadsi+(sidim+dead)*i) ){
367          iind = i;
368          break;
369        };
370      };
371      //
372      for (Int_t j = 0; j < 3; j++){
373        if ( (fY+yoffset+12.1) >= (deadsi+(sidim+dead)*j) && (fY+yoffset+12.1) <= (sensitarea+deadsi+(sidim+dead)*j) ){
374          jind = j;
375          break;
376        };
377      };
378      //
379      Int_t sensor = -1;
380      if ( iind != -1 &&  jind != -1 ){
381        sensor = iind + jind * 3;
382      };
383      //
384      //  printf(" View %i Plane %i x %f y %f z %f xoffset %f yoffset %f iind %i jind %i \n",fView,fPlane,fX,fY,fZ,xoffset,yoffset,iind,jind);
385      //
386      return(sensor);
387      //
388    };
389    
390  /**  /**
391   * CaloLevel1 constructor   * CaloLevel1 constructor
# Line 190  CaloLevel1::CaloLevel1() {     Line 401  CaloLevel1::CaloLevel1() {    
401  /**  /**
402   * Clear the CaloLevel1 object   * Clear the CaloLevel1 object
403   **/   **/
404  void CaloLevel1::Clear() {      void CaloLevel1::Clear(Option_t *t) {    
405    //    //
406    istrip = 0;    istrip = 0;
407    estrip.Reset();    estrip.Reset();
# Line 228  Float_t CaloLevel1::GetEstrip(Int_t svie Line 439  Float_t CaloLevel1::GetEstrip(Int_t svie
439   * Given estrip entry returns energy plus view, plane and strip numbers   * Given estrip entry returns energy plus view, plane and strip numbers
440  **/  **/
441  Float_t CaloLevel1::DecodeEstrip(Int_t entry, Int_t &view, Int_t &plane, Int_t &strip){  Float_t CaloLevel1::DecodeEstrip(Int_t entry, Int_t &view, Int_t &plane, Int_t &strip){
442      Bool_t sat = false;
443      Float_t mip=this->DecodeEstrip(entry,view,plane,strip,sat);
444      return(mip);
445    };
446    
447    /**
448     * Given estrip entry returns energy plus view, plane, strip numbers and saturation info
449    **/
450    Float_t CaloLevel1::DecodeEstrip(Int_t entry, Int_t &view, Int_t &plane, Int_t &strip, Bool_t &saturated){
451    //    //
452    if ( entry>istrip ) return(0.);    if ( entry>istrip ){
453        //
454        printf(" ERROR: problems decoding entry %i, it seems that number of entries is %i\n",entry,istrip);
455        //
456        return(0.);
457      };
458    //    //
459    //  printf(" num lim %f \n",std::numeric_limits<Float_t>::max());    //  printf(" num lim %f \n",std::numeric_limits<Float_t>::max());
460    //  printf(" estrip.At(%i) = %i \n",entry,estrip.At(entry));    //  printf(" estrip.At(%i) = %i \n",entry,estrip.At(entry));
# Line 271  Float_t CaloLevel1::DecodeEstrip(Int_t e Line 496  Float_t CaloLevel1::DecodeEstrip(Int_t e
496    //    //
497    strip = (Int_t)truncf((Float_t)((eval - fbi*1000000000 -plom*10000000)/100000));    strip = (Int_t)truncf((Float_t)((eval - fbi*1000000000 -plom*10000000)/100000));
498    //    //
499    Float_t mip = ((Float_t)(eval - fbi*1000000000 -plom*10000000 -strip*100000))/tim;    Double_t mip = (Double_t)(((Float_t)(eval - fbi*1000000000 -plom*10000000 -strip*100000))/tim);
500    //    //
501    if ( mip > 0. && mip < 99999. ) return(mip);    saturated = false;
502      if ( mip > 5000. ){
503        mip -= 5000.;
504        saturated = true;
505      };
506      if ( mip > 0. && mip < 99999. ) return((Float_t)mip);
507    //    //
508    printf(" WARNING: problems decoding value %i at entry %i \n",estrip.At(entry),entry);    printf(" ERROR: problems decoding value %i at entry %i \n",estrip.At(entry),entry);
509    //    //
510    view = -1;    view = -1;
511    plane = -1;    plane = -1;
# Line 283  Float_t CaloLevel1::DecodeEstrip(Int_t e Line 513  Float_t CaloLevel1::DecodeEstrip(Int_t e
513    return(0.);      return(0.);  
514  }  }
515    
516    /*
517     * Returns energy released on plane nplane (where 0<= nplane <= 43, 0 = 1Y, 1 = 1X, 2 = 2Y, 3 = 2X, etc. etc.).
518     */
519    Float_t CaloLevel1::qtotpl(Int_t nplane){
520      Bool_t sat = false;
521      Float_t mip = this->qtotpl(nplane,sat);
522      return(mip);
523    };
524    
525    /*
526     * Returns energy released on plane nplane (where 0<= nplane <= 43, 0 = 1Y, 1 = 1X, 2 = 2Y, 3 = 2X, etc. etc.).
527     */
528    Float_t CaloLevel1::qtotpl(Int_t nplane, Bool_t &sat){
529      //
530      sat = false;
531      Int_t sview = 1;
532      if ( nplane%2 ) sview = 0;
533      //
534    //  Int_t splane = nplane-(sview+1)/2;
535      Int_t splane = (nplane+sview-1)/2;
536      //
537      Float_t totmip = qtotpl(sview,splane,sat);
538      //
539      return(totmip);
540      //
541    };
542    
543    /*
544     * Returns energy released on view "view" (0 = X, 1 = Y) and plane "plane" ( 0 <= plane <= 21 ).
545     */
546    Float_t CaloLevel1::qtotpl(Int_t sview, Int_t splane){
547      Bool_t sat = false;
548      Float_t mip = this->qtotpl(sview,splane,sat);
549      return(mip);
550    };
551    
552    /*
553     * Returns energy released on view "view" (0 = X, 1 = Y) and plane "plane" ( 0 <= plane <= 21 ).
554     */
555    Float_t CaloLevel1::qtotpl(Int_t sview, Int_t splane, Bool_t &sat){
556      //
557      Int_t view = -1;
558      Int_t plane = -1;
559      Int_t strip = -1;
560      Bool_t lsat = false;
561      sat = false;
562      //
563      Float_t mip = 0.;
564      Float_t totmip = 0.;
565      //
566      if ( istrip == 0 ) return(0.);
567      //
568      for (Int_t i = 0; i<istrip; i++ ){
569        //
570        mip = DecodeEstrip(i,view,plane,strip,lsat);
571        //
572        if ( view == sview && splane == plane ){
573          if ( lsat ) sat = true;
574          totmip += mip;
575          //printf(" totmip %f mip %f \n",totmip,mip);
576        };
577        //
578        // entry are ordered by strip, plane and view number. Go out if you pass the input strip
579        //
580        if ( view == sview && plane > splane ) return(totmip);
581        if ( view > sview ) return(totmip);
582        //
583      };
584      //
585      return(totmip);
586      //
587    };

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.16

  ViewVC Help
Powered by ViewVC 1.1.23