00001 #ifndef SIMCH_CC
00002 #define SIMCH_CC
00003
00004 #include "simch.hh"
00005
00006 namespace larlight {
00007
00008
00009 void ide::clear_data()
00010
00011 {
00012 TObject::Clear();
00013 trackID = DATA::INVALID_INT;
00014 numElectrons = DATA::INVALID_DOUBLE;
00015 energy = DATA::INVALID_DOUBLE;
00016
00017 x = DATA::INVALID_DOUBLE;
00018 y = DATA::INVALID_DOUBLE;
00019 z = DATA::INVALID_DOUBLE;
00020 }
00021
00022
00023 simch::simch(DATA::DATA_TYPE type) : data_base(type)
00024
00025 {
00026 if(_type != DATA::SimChannel) {
00027
00028 Message::send(MSG::ERROR,__FUNCTION__,
00029 Form("Provided data type (%s) not supported! Reset to default.",DATA::DATA_TREE_NAME[_type].c_str()));
00030
00031 _type=DATA::SimChannel;
00032 }
00033
00034 clear_data();
00035
00036 }
00037
00038
00039 void simch::clear_data()
00040
00041 {
00042 data_base::clear_data();
00043 fChannel = DATA::INVALID_USHORT;
00044 fTDCIDEs.clear();
00045 }
00046
00047
00048 std::vector<larlight::ide> simch::TrackIDsAndEnergies(UShort_t startTDC,
00049 UShort_t endTDC) const
00050
00051 {
00052
00053 std::map<UInt_t, larlight::ide> idToIDE;
00054
00055 std::vector<larlight::ide> ides;
00056 if(startTDC > endTDC) return ides;
00057
00058 std::map<UShort_t, std::vector<larlight::ide> >::const_iterator mitr;
00059 std::map<UShort_t, std::vector<larlight::ide> >::const_iterator start = fTDCIDEs.lower_bound(startTDC);
00060 std::map<UShort_t, std::vector<larlight::ide> >::const_iterator end = fTDCIDEs.upper_bound(endTDC);
00061
00062 for(mitr = start; mitr != end; mitr++){
00063
00064
00065 const std::vector<larlight::ide> &idelist = (*mitr).second;
00066 std::vector<larlight::ide>::const_iterator itr = idelist.begin();
00067
00068 while( itr != idelist.end() ){
00069
00070 if( idToIDE.find((*itr).trackID) != idToIDE.end() ){
00071 Double_t nel1 = idToIDE[(*itr).trackID].numElectrons;
00072 Double_t nel2 = (*itr).numElectrons;
00073 Double_t en1 = idToIDE[(*itr).trackID].energy;
00074 Double_t en2 = (*itr).energy;
00075 Double_t energy = en1+en2;
00076 Double_t weight = nel1 + nel2;
00077
00078 idToIDE[(*itr).trackID].x = ((*itr).x*nel2 + idToIDE[(*itr).trackID].x*nel1)/weight;
00079 idToIDE[(*itr).trackID].y = ((*itr).y*nel2 + idToIDE[(*itr).trackID].y*nel1)/weight;
00080 idToIDE[(*itr).trackID].z = ((*itr).z*nel2 + idToIDE[(*itr).trackID].z*nel1)/weight;
00081 idToIDE[(*itr).trackID].numElectrons = weight;
00082 idToIDE[(*itr).trackID].energy = energy;
00083 }
00084 else{
00085 larlight::ide temp(*itr);
00086 idToIDE[(*itr).trackID] = temp;
00087 }
00088
00089 itr++;
00090 }
00091 }
00092
00093
00094 ides.reserve(idToIDE.size());
00095
00096 for(auto itr = idToIDE.begin(); itr != idToIDE.end(); itr++)
00097
00098 ides.push_back((*itr).second);
00099
00100
00101 return ides;
00102 }
00103
00104
00105 Double_t simch::Charge(UShort_t tdc) const
00106
00107 {
00108 auto const tdc_itr = fTDCIDEs.find(tdc);
00109 if(tdc_itr == fTDCIDEs.end()) return 0;
00110
00111 Double_t charge = 0;
00112 for(auto const this_ide : (*tdc_itr).second)
00113
00114 charge += this_ide.numElectrons;
00115
00116 return charge;
00117 }
00118
00119
00120 Double_t simch::Energy(UShort_t tdc) const
00121
00122 {
00123 auto const tdc_itr = fTDCIDEs.find(tdc);
00124 if(tdc_itr == fTDCIDEs.end()) return 0;
00125
00126 Double_t energy = 0;
00127 for(auto const this_ide : (*tdc_itr).second)
00128
00129 energy += this_ide.energy;
00130
00131 return energy;
00132 }
00133
00134
00135 void simch::add_ide(UShort_t tdc, ide in)
00136
00137 {
00138 auto tdc_itr = fTDCIDEs.find(tdc);
00139
00140 if(tdc_itr == fTDCIDEs.end()) {
00141
00142 fTDCIDEs.insert(std::pair<UShort_t,std::vector<larlight::ide> >(tdc,std::vector<larlight::ide>(1,in)));
00143 return;
00144 }
00145
00146
00147 for(auto i_ide : (*tdc_itr).second) {
00148
00149 if(i_ide.trackID == in.trackID) {
00150
00151 Double_t weight = i_ide.numElectrons + in.numElectrons;
00152
00153 i_ide.x = (i_ide.x * i_ide.numElectrons + in.x * in.numElectrons)/weight;
00154 i_ide.y = (i_ide.y * i_ide.numElectrons + in.y * in.numElectrons)/weight;
00155 i_ide.z = (i_ide.z * i_ide.numElectrons + in.z * in.numElectrons)/weight;
00156 i_ide.numElectrons = weight;
00157 i_ide.energy += in.energy;
00158
00159 return;
00160 }
00161
00162 }
00163
00164
00165 (*tdc_itr).second.push_back(in);
00166 return;
00167
00168 }
00169
00170
00171
00172 event_simch::event_simch(DATA::DATA_TYPE type) : std::vector<larlight::simch>(),
00173 event_base(type)
00174
00175 {
00176 if(_type != DATA::SimChannel) {
00177
00178 Message::send(MSG::ERROR,__FUNCTION__,
00179 Form("Provided data type (%s) not supported! Reset to default.",DATA::DATA_TREE_NAME[_type].c_str()));
00180
00181 _type=DATA::SimChannel;
00182 }
00183
00184 clear_data();
00185
00186 }
00187
00188 }
00189 #endif