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

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

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

revision 1.16 by mocchiut, Thu Feb 7 20:02:09 2008 UTC revision 1.20 by mocchiut, Fri Apr 18 18:55:47 2008 UTC
# Line 729  Int_t CaloLevel0::CalcCrossTalkCorr(GL_T Line 729  Int_t CaloLevel0::CalcCrossTalkCorr(GL_T
729  }  }
730    
731  void CaloLevel0::FindBaseCompress(Int_t l, Int_t m, Int_t pre){  void CaloLevel0::FindBaseCompress(Int_t l, Int_t m, Int_t pre){
732      Int_t n = 0;
733      Float_t q = 0;
734      this->FindBaseCompress(l,m,pre,n,q);
735    }
736    
737    void CaloLevel0::FindBaseCompress(Int_t l, Int_t m, Int_t pre, Int_t &nst, Float_t &qp){
738    for (Int_t e = pre*16; e < (pre+1)*16 ; e++){    for (Int_t e = pre*16; e < (pre+1)*16 ; e++){
739      dexy[l][m][e] = dexyc[l][m][e];      dexy[l][m][e] = dexyc[l][m][e];
740    };      };  
741    this->FindBaseRaw(l,m,pre);    this->FindBaseRaw(l,m,pre,nst,qp);
742  }  }
743    
744  void CaloLevel0::FindBaseRaw(Int_t l, Int_t m, Int_t pre){  void CaloLevel0::FindBaseRaw(Int_t l, Int_t m, Int_t pre){
745      Float_t minstrip = 100000.;    Int_t n = 0;
746      Float_t rms = 0.;    Float_t q = 0;
747      base[l][m][pre] = 0.;    this->FindBaseRaw(l,m,pre,n,q);
748    }
749    
750    void CaloLevel0::FindBaseRaw(Int_t l, Int_t m, Int_t pre, Int_t &nst, Float_t &qp){
751      //
752      Float_t minstrip = 100000.;
753      Float_t rms = 0.;
754      base[l][m][pre] = 0.;
755      qp = 0.;
756      //
757      for (Int_t e = pre*16; e < (pre+1)*16 ; e++){
758        if ( calgood[l][m][e] == 0. && obadmask[l][m][e] == 0 &&  dexy[l][m][e]-calped[l][m][e] < minstrip &&  dexy[l][m][e] > 0.) {
759          minstrip = dexy[l][m][e]-calped[l][m][e];
760          rms = calthr[l][m][pre];
761        };
762        qp += (dexy[l][m][e]-calped[l][m][e]-sbase[l][m][e]);
763      };
764      //
765      if ( debug && l==1 ){
766        printf("\n BASELINE CALCULATION for view %i pl %i pre %i: \n => minstrip %f rms %f \n => qp = %f \n",l,m,pre,minstrip,rms,qp);
767      };
768      if ( minstrip != 100000. ) {
769        Float_t strip6s = 0.;
770      for (Int_t e = pre*16; e < (pre+1)*16 ; e++){      for (Int_t e = pre*16; e < (pre+1)*16 ; e++){
771          if ( calgood[l][m][e] == 0. && obadmask[l][m][e] == 0 &&  dexy[l][m][e]-calped[l][m][e] < minstrip &&  dexy[l][m][e] > 0.) {        if ( (dexy[l][m][e]-calped[l][m][e]) >= minstrip && (dexy[l][m][e]-calped[l][m][e]) <= (minstrip+rms) ) {
772              minstrip = dexy[l][m][e]-calped[l][m][e];          strip6s += 1.;
773              rms = calthr[l][m][pre];          base[l][m][pre] += (dexy[l][m][e] - calped[l][m][e]);
774          };        };
775          //
776          //  compression
777          //
778          if ( abs((int)(dexy[l][m][e]-calped[l][m][e])) <= (minstrip+rms) ) {
779            dexyc[l][m][e] = 0.;
780          } else {
781            dexyc[l][m][e] = dexy[l][m][e];
782          };
783      };      };
784        //
785        nst = (Int_t)strip6s;
786        //
787      if ( debug && l==1 ){      if ( debug && l==1 ){
788        printf("\n BASELINE CALCULATION for view %i pl %i pre %i: \n => minstrip %f rms %f \n",l,m,pre,minstrip,rms);        printf(" strip6s %f \n",strip6s);
789      };      };
790      if ( minstrip != 100000. ) {      //  if ( strip6s >= 9. ){      
791          Float_t strip6s = 0.;      if ( strip6s >= 2. ){          
792          for (Int_t e = pre*16; e < (pre+1)*16 ; e++){        Double_t arro = base[l][m][pre]/strip6s;
793              if ( (dexy[l][m][e]-calped[l][m][e]) >= minstrip && (dexy[l][m][e]-calped[l][m][e]) <= (minstrip+rms) ) {        Float_t deci = 1000.*((float)arro - float(int(arro)));                  
794                  strip6s += 1.;        if ( deci < 500. ) {
795                  base[l][m][pre] += (dexy[l][m][e] - calped[l][m][e]);          arro = double(int(arro));
796              };        } else {
797              //          arro = 1. + double(int(arro));
798              //  compression        };
799              //        base[l][m][pre] = arro;
800              if ( abs((int)(dexy[l][m][e]-calped[l][m][e])) <= (minstrip+rms) ) {        //
801                  dexyc[l][m][e] = 0.;        // if too few strips were used to determine the baseline check if it is comparable with the previous event, if not mark it as bad
802              } else {        //
803                  dexyc[l][m][e] = dexy[l][m][e];        if ( debug && l==1 ) printf(" Calculated baseline: base %f sbase*1.02 %f \n",base[l][m][pre],1.02*sbase[l][m][pre]);
804              };        //
805          };        if ( strip6s < 4 && base[l][m][pre] > 1.02*sbase[l][m][pre] && sbase[l][m][pre] > 0. ){
806          if ( debug && l==1 ){          if ( debug ) printf(" Suspicious calculated baseline: base %f sbase*1.02 %f strip6s %i \n",base[l][m][pre],1.02*sbase[l][m][pre],(Int_t)strip6s);
807            printf(" strip6s %f \n",strip6s);          base[l][m][pre] = 31000.;      
808          };        };
         //      if ( strip6s >= 9. ){        
         if ( strip6s >= 2. ){        
             Double_t arro = base[l][m][pre]/strip6s;  
             Float_t deci = 1000.*((float)arro - float(int(arro)));                      
             if ( deci < 500. ) {  
                 arro = double(int(arro));  
             } else {  
                 arro = 1. + double(int(arro));  
             };  
             base[l][m][pre] = arro;  
         } else {  
             base[l][m][pre] = 31000.;  
             for (Int_t e = pre*16; e < (pre+1)*16 ; e++){  
                 dexyc[l][m][e] = dexy[l][m][e];  
             };  
         };  
809      } else {      } else {
810          base[l][m][pre] = 31000.;        base[l][m][pre] = 31000.;
811          for (Int_t e = pre*16; e < (pre+1)*16 ; e++){
812            dexyc[l][m][e] = dexy[l][m][e];
813          };
814      };      };
815      } else {
816        base[l][m][pre] = 31000.;
817      };
818  }  }
819    
820  Int_t CaloLevel0::Calibrate(Int_t ei){  Int_t CaloLevel0::Calibrate(Int_t ei){
# Line 843  Int_t CaloLevel0::Calibrate(Int_t ei){ Line 872  Int_t CaloLevel0::Calibrate(Int_t ei){
872    Float_t ener;    Float_t ener;
873    Int_t doneb = 0;    Int_t doneb = 0;
874    Int_t donec = 0;    Int_t donec = 0;
875    Int_t ck = 0;    Int_t ck[6] = {0,0,0,0,0,0};
876    Int_t ipre = 0;    Int_t ipre = 0;
877    Int_t ip[3] = {0};    //  Int_t ip[3] = {0};
878      Int_t ip[3] = {0,0,0};
879    Float_t base0, base1, base2;    Float_t base0, base1, base2;
880    base0 = 0.;    base0 = 0.;
881    base1 = 0.;    base1 = 0.;
# Line 921  Int_t CaloLevel0::Calibrate(Int_t ei){ Line 951  Int_t CaloLevel0::Calibrate(Int_t ei){
951          //          //
952          pre = -1;          pre = -1;
953          cbase0 = 0.;          cbase0 = 0.;
954            Int_t nstt[2];
955            Float_t rqp[2];
956          for (Int_t i = 0; i < 3; i++){          for (Int_t i = 0; i < 3; i++){
957              nstt[0] = 0;
958              nstt[1] = 0;
959              rqp[0] = 0.;
960              rqp[1] = 0.;
961            for (Int_t j = 0; j < 2; j++){            for (Int_t j = 0; j < 2; j++){
962              pre = j + i*2;              pre = j + i*2;
963              //              //
964              // baseline check and calculation              // baseline check and calculation
965              //              //
966              if ( !isRAW ){              if ( !isRAW ){
967                  //
968                  // if it is a compress event with fully transmitted pre try to calculate the baseline
969                  //
970                if ( de->base[l][m][pre] != 0. && de->base[l][m][pre]<31000. ) {                if ( de->base[l][m][pre] != 0. && de->base[l][m][pre]<31000. ) {
971                  base[l][m][pre] = de->base[l][m][pre] ;                    base[l][m][pre] = de->base[l][m][pre] ;  
972                } else {                } else {
973                  FindBaseCompress(l,m,pre);                  FindBaseCompress(l,m,pre,nstt[j],rqp[j]);
974                };                };
975                cbase0 += base[l][m][pre];                cbase0 += base[l][m][pre];
976              } else {              } else {
977                //                //
978                // if it is a raw event and we haven't checked                // if it is a raw event calculate the baseline.
               // yet, calculate the baseline.  
979                //                //
980                FindBaseRaw(l,m,pre);                FindBaseRaw(l,m,pre,nstt[j],rqp[j]);
981                cbase0 += base[l][m][pre];                cbase0 += base[l][m][pre];
982              };              };
983            };            };
984              //
985              // if we are able to calculate the baseline with more than 3 strips on one pre and not in the other one choose the pre with more calculated strips
986              //
987              if ( nstt[0] < 4 && nstt[1] >= 4 ) base[l][m][pre-1] = 31000.;
988              if ( nstt[0] >= 4 && nstt[1] < 4 ) base[l][m][pre] = 31000.;
989    //        //
990    //        // if we are NOT able to calculate the baseline with more than 3 strips on both pres take the baseline (if any) of the one which has less energy
991    //        //
992    //        if ( nstt[0] < 4 && nstt[1] < 4 ){
993    //          if ( rqp[0] >= rqp[1] ) base[l][m][pre-1] = 31000.;
994    //          if ( rqp[0] < rqp[1] ) base[l][m][pre] = 31000.;
995    //        };
996          };          };
997          //          //
998          // run over strips          // run over strips
# Line 953  Int_t CaloLevel0::Calibrate(Int_t ei){ Line 1003  Int_t CaloLevel0::Calibrate(Int_t ei){
1003            ip[i] = 0;            ip[i] = 0;
1004            for (Int_t n = i*32 ; n < (i+1)*32 ; n++){                            for (Int_t n = i*32 ; n < (i+1)*32 ; n++){                
1005              if (n%16 == 0) {              if (n%16 == 0) {
               ck = 0;  
1006                done = 0;                done = 0;
1007                doneb = 0;                doneb = 0;
1008                donec = 0;                donec = 0;
1009                pre++;                pre++;
1010                  ck[pre] = 0;
1011                qpre[pre] = 0.;                qpre[pre] = 0.;
1012              };              };
1013              //              //
# Line 967  Int_t CaloLevel0::Calibrate(Int_t ei){ Line 1017  Int_t CaloLevel0::Calibrate(Int_t ei){
1017              //              //
1018              if ( !done ){              if ( !done ){
1019                if ( (base[l][m][pre] == 31000. || base[l][m][pre] == 0.) ){                if ( (base[l][m][pre] == 31000. || base[l][m][pre] == 0.) ){
1020                  ck = 1;                  ck[pre] = 1;
1021                  if (pre%2 == 0) {                  if (pre%2 == 0) {
1022                    ip[i] = pre + 1;                    ip[i] = pre + 1;
1023                  } else {                  } else {
# Line 975  Int_t CaloLevel0::Calibrate(Int_t ei){ Line 1025  Int_t CaloLevel0::Calibrate(Int_t ei){
1025                  };                  };
1026                  if ( (base[l][m][ip[i]] == 31000. || base[l][m][ip[i]] == 0. || !crosst ) ){                  if ( (base[l][m][ip[i]] == 31000. || base[l][m][ip[i]] == 0. || !crosst ) ){
1027                    //                    //
1028                    ck = 2;                    ck[pre] = 2;
1029                    if ( sbase[l][m][pre] == 31000. || sbase[l][m][pre] == 0. ) {                    if ( sbase[l][m][pre] == 31000. || sbase[l][m][pre] == 0. ) {
1030                      ck = 3;                      ck[pre] = 3;
1031                    };                    };
1032                  };                  };
1033                  done = 1;                  done = 1;
# Line 987  Int_t CaloLevel0::Calibrate(Int_t ei){ Line 1037  Int_t CaloLevel0::Calibrate(Int_t ei){
1037              // CALIBRATION ALGORITHM              // CALIBRATION ALGORITHM
1038              //              //
1039              if ( !doneb ){              if ( !doneb ){
1040                if ( debug ) printf(" ck is %i \n",ck);                if ( debug ) printf(" ck[pre] is %i \n",ck[pre]);
1041                switch (ck) {                switch (ck[pre]) {
1042                case 0:                case 0:
1043                  base0 = base[l][m][pre];                  base0 = base[l][m][pre];
1044                  base2 = calbase[l][m][pre];                  base2 = calbase[l][m][pre];
# Line 1035  Int_t CaloLevel0::Calibrate(Int_t ei){ Line 1085  Int_t CaloLevel0::Calibrate(Int_t ei){
1085              };              };
1086            };            };
1087            if ( crosst ){            if ( crosst ){
1088              if (ck == 1){              if (ck[pre] == 1 || ck[pre-1] == 1){
1089                if (ip[i]%2 == 0) {                if (ck[pre] == 1){
1090                  ipre = ip[i] + 1;                  ipre = pre;
1091                    ip[i] = pre - 1;
1092                } else {                } else {
1093                  ipre = ip[i] - 1;                  ipre = pre - 1;
1094                    ip[i] = pre;
1095                };                };
1096                  //              if (ip[i]%2 == 0) {
1097                  //                ipre = ip[i] + 1;
1098                  //              } else {
1099                  //                ipre = ip[i] - 1;
1100                  //              };
1101                for (Int_t j = ipre*16 ; j < (ipre+1)*16 ; j++){                for (Int_t j = ipre*16 ; j < (ipre+1)*16 ; j++){
1102                  if ( !ctground ){                  if ( !ctground ){
1103                    clevel1->estrip[j][m][l] += (qpre[ipre] - qpre[ip[i]]) * ctprecor[l][m][ipre];                    clevel1->estrip[j][m][l] += qpre[ipre] * ctprecor[l][m][ipre] - qpre[ip[i]] * ctprecor[l][m][ip[i]];
1104                  } else {                  } else {
1105                    clevel1->estrip[j][m][l] += (qpre[ipre] - qpre[ip[i]]) * 0.00478;                    clevel1->estrip[j][m][l] += (qpre[ipre] - qpre[ip[i]]) * 0.00478;
1106                  };                  };
1107                };                };
1108              };              };
1109              if (ck == 2){              if (ck[pre] == 2 && ck[pre-1] == 2){
1110                for (Int_t j = i*32 ; j < (i+1)*32 ; j++){                for (Int_t j = i*32 ; j < (i+1)*32 ; j++){
1111                  ipre = j/16 + 1;                  //              ipre = j/16 + 1;
1112                    ipre = j/16 ;
1113                  if ( !ctground ){                  if ( !ctground ){
1114                    clevel1->estrip[j][m][l] +=  qpre[ipre] * ctprecor[l][m][ipre];                    clevel1->estrip[j][m][l] +=  qpre[ipre] * ctprecor[l][m][ipre];
1115                  } else {                  } else {

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

  ViewVC Help
Powered by ViewVC 1.1.23