![]() |
![]() |
00001 #include <SimCalorimetry/EcalTrigPrimAlgos/interface/EcalFenixAmplitudeFilter.h> 00002 #include "CondFormats/EcalObjects/interface/EcalTPGWeightIdMap.h" 00003 #include "CondFormats/EcalObjects/interface/EcalTPGWeightGroup.h" 00004 #include "CondFormats/EcalObjects/interface/EcalTPGGroups.h" 00005 #include "FWCore/MessageLogger/interface/MessageLogger.h" 00006 #include <iostream> 00007 00008 EcalFenixAmplitudeFilter::EcalFenixAmplitudeFilter() 00009 :inputsAlreadyIn_(0), shift_(6) { 00010 } 00011 00012 EcalFenixAmplitudeFilter::~EcalFenixAmplitudeFilter(){ 00013 } 00014 00015 int EcalFenixAmplitudeFilter::setInput(int input) 00016 { 00017 if(input>0X3FFFF) 00018 { 00019 std::cout<<"ERROR IN INPUT OF AMPLITUDE FILTER"<<std::endl; 00020 return -1; 00021 } 00022 if(inputsAlreadyIn_<5) 00023 { 00024 buffer_[inputsAlreadyIn_]=input; 00025 inputsAlreadyIn_++; 00026 } 00027 else 00028 { 00029 for(int i=0; i<4; i++) buffer_[i]=buffer_[i+1]; 00030 buffer_[4]=input; 00031 } 00032 return 1; 00033 } 00034 00035 void EcalFenixAmplitudeFilter::process(std::vector<int> &addout,std::vector<int> &output) 00036 { 00037 // test 00038 inputsAlreadyIn_=0; 00039 for (unsigned int i =0;i<5;i++) buffer_[i]=0;//FIXME: 5 00040 00041 // test end 00042 00043 for (unsigned int i =0;i<addout.size();i++){ 00044 00045 setInput(addout[i]); 00046 output[i]=process(); 00047 } 00048 // shift the result by 1! 00049 for (unsigned int i=0 ; i<(output.size());i++){ 00050 if (i!=output.size()-1) output[i]=output[i+1]; 00051 else output[i]=0; 00052 } 00053 return; 00054 } 00055 00056 int EcalFenixAmplitudeFilter::process() 00057 { 00058 //UB FIXME: 5 00059 if(inputsAlreadyIn_<5) return 0; 00060 int output=0; 00061 for(int i=0; i<5; i++) 00062 { 00063 output+=(weights_[i]*buffer_[i])>>shift_; 00064 } 00065 if(output<0) output=0; 00066 if(output>0X3FFFF) output=0X3FFFF; 00067 return output; 00068 } 00069 00070 void EcalFenixAmplitudeFilter::setParameters(uint32_t raw,const EcalTPGWeightIdMap * ecaltpgWeightMap,const EcalTPGWeightGroup * ecaltpgWeightGroup) 00071 { 00072 uint32_t params_[5]; 00073 const EcalTPGGroups::EcalTPGGroupsMap & groupmap = ecaltpgWeightGroup -> getMap(); 00074 EcalTPGGroups::EcalTPGGroupsMapItr it = groupmap.find(raw); 00075 if (it!=groupmap.end()) { 00076 uint32_t weightid =(*it).second; 00077 const EcalTPGWeightIdMap::EcalTPGWeightMap & weightmap = ecaltpgWeightMap -> getMap(); 00078 EcalTPGWeightIdMap::EcalTPGWeightMapItr itw = weightmap.find(weightid); 00079 (*itw).second.getValues(params_[0],params_[1],params_[2],params_[3],params_[4]); 00080 // we have to transform negative coded in 7 bits into negative coded in 32 bits 00081 // maybe this should go into the getValue method?? 00082 for (int i=0;i<5;++i){ 00083 weights_[i] = (params_[i] & 0x40) ? (int)( params_[i] | 0xffffffc0) : (int)(params_[i]); 00084 } 00085 } 00086 else edm::LogWarning("EcalTPG")<<" could not find EcalTPGGroupsMap entry for "<<raw; 00087 } 00088 00089 00090 00091