Changeset 12258 for fact/tools/rootmacros
- Timestamp:
- 10/25/11 13:51:37 (13 years ago)
- Location:
- fact/tools/rootmacros
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
fact/tools/rootmacros/zerosearch.C
r12166 r12258 1 #include "Region.h" 1 2 #include <vector> 2 3 … … 8 9 // returns pointer to vetctor of ints 9 10 10 vector<int> *zerosearch(vector<float> &input, int edge =-1 , int pre=10, int post=30 ){ 11 11 vector<Region> *zerosearch( 12 vector<float> &input, 13 int edge, // search for transitions on rising edge=1, -1:falling 14 unsigned int step, // search in steps of step 15 int VerbosityLevel 16 ){ 17 18 vector<Region> * ZeroPositions = new vector<Region>; 19 Region currentRegion = {0, 0, 0, 0.0}; 20 if (step < 1){ 21 if (VerbosityLevel > 0) 22 cout << "zerosearch - stepsize=" << step 23 << " is smaller than 1. returning." << endl; 24 return ZeroPositions; 25 } 26 if (input.size() < step){ 27 if (VerbosityLevel > 0) 28 cout << "zerosearch - input-vector.size()="<< input.size() 29 << " is smaller than stepsize=" << step 30 << "returning." << endl; 31 return ZeroPositions; 32 } 12 33 13 vector<int> * zeroPositions = new vector<int>; 34 if (edge > 0) // search for zero-x-ings on the rising edge 35 { 36 for (unsigned int sl = 0 ; sl < (input.size()-step) ; sl+=step) 37 { 38 if (input[sl] > 0.0) // can't be a rising 0-x-ing 39 { 40 continue; 41 } 42 if (input[sl] * input[sl+step] <= 0.0) // 0-x-ing or both are 0 43 { 44 currentRegion.begin = sl; 45 currentRegion.end = sl+step; 46 ZeroPositions->push_back(currentRegion); 47 } 48 } 49 } 50 else if (edge < 0) // search for zero-x-ings on the falling edge 51 { 52 for (unsigned int sl = 0 ; sl < (input.size()-step) ; sl+=step) 53 { 54 if (input[sl] < 0.0) // can't be a falling 0-x-ing 55 { 56 continue; 57 } 58 if (input[sl] * input[sl+step] <= 0.0) // 0-x-ing or both are 0 59 { 60 currentRegion.begin = sl; 61 currentRegion.end = sl+step; 62 ZeroPositions->push_back(currentRegion); 63 } 64 } 65 66 } 67 else // search for zero-x-ings on both esges 68 { 69 for (unsigned int sl = 0 ; sl < (input.size()-step) ; sl+=step) 70 { 71 if (input[sl] * input[sl+step] <= 0.0) // 0-x-ing or both are 0 72 { 73 currentRegion.begin = sl; 74 currentRegion.end = sl+step; 75 ZeroPositions->push_back(currentRegion); 76 } 77 } 78 } 79 14 80 15 for (int sl =pre ; sl < input.size()-post; sl++){ 16 //cout << "sl:" << sl << endl; 17 if (input[sl] * input[sl-1] < 0 || input[sl]==0.0 ){ // sign change --> zero crossing OR really zero 18 19 if ( (input[sl-1] - input[sl]) * edge < 0){ // this is the crossing the user wanted 20 81 return ZeroPositions; 82 } 83 84 size_t ShiftRegionBy(vector<Region> &src, 85 int Shift, 86 int VerbosityLevel) 87 { 88 vector<Region>::iterator it; 89 // I copy code here ... not good, but I hope nobody is giving VL > 10 ever... 90 if (VerbosityLevel > 10){ 91 for (it = src.begin() ; it < src.end() ; it++){ 92 cout << " it->begin="<< it->begin; 93 it->begin += Shift; 94 cout << "--> shifted="<< it->begin << endl; 95 cout << " it->end="<< it->end; 96 it->end += Shift; 97 cout << "--> shifted="<< it->end << endl; 98 cout << " it->maxPos="<< it->maxPos; 99 it->maxPos += Shift; 100 cout << "--> shifted="<< it->maxPos << endl; 101 } 102 return src.size(); 103 } 104 105 for (it = src.begin() ; it < src.end() ; it++){ 106 it->begin += Shift; 107 it->end += Shift; 108 it->maxPos += Shift; 109 } 110 return src.size(); 111 } 112 113 size_t EnlargeRegion(vector<Region> &src, 114 int Left, 115 int Right, 116 int VerbosityLevel) 117 { 118 vector<Region>::iterator it; 119 // I copy code here ... not good, but I hope nobody is giving VL > 10 ever... 120 if (VerbosityLevel > 10){ 121 for (it = src.begin() ; it < src.end() ; it++){ 122 cout << " it->begin="<< it->begin; 123 it->begin -= Left; 124 cout << "--> enlarged="<< it->begin << endl; 125 cout << " it->end="<< it->end; 126 it->end += Right; 127 cout << "--> enlarged="<< it->end << endl; 128 } 129 return src.size(); 130 } 131 132 133 for (it = src.begin() ; it < src.end() ; it++){ 134 it->begin -= Left; 135 it->end += Right; 136 } 137 return src.size(); 138 139 } 140 141 #include <limits> 142 size_t findAbsMaxInRegions( 143 vector<Region> ®ions, 144 vector<float> &data, 145 int VerbosityLevel) 146 { 147 vector<Region>::iterator reg; 148 for (reg = regions.begin() ; reg < regions.end() ; reg++){ 149 reg->maxVal=-numeric_limits<float>::max(); 150 // 1st check if both ends of the region are in the data-vector 151 if (reg->begin < 0) reg->begin=0; 152 if ((unsigned int)reg->end > data.size()-1) reg->end=data.size()-1; 153 154 // TODO or TOTHINKOF: 155 // Region might overlap ... I don't care .. I just search 156 // in a later step Maxima at the same Positions can be removed... 157 // of course this means, some searches were needless ... 158 //cout << "searching from " << reg->begin << " to " << reg->end << endl; 159 for (unsigned int pos=reg->begin; pos <= (unsigned int)reg->end; pos++){ 160 if (data[pos] > reg->maxVal){ 161 reg->maxVal = data[pos]; 162 reg->maxPos = pos; 163 } 164 } 165 if (VerbosityLevel > 3) { 166 cout << "findAbsMaxInRegions - found Max at:" 167 << reg->maxPos << " with Value:" << reg->maxVal << endl; 168 } 169 } 170 return regions.size(); 171 } 172 173 #include <algorithm> 174 bool compMaxPosOfRegions (Region a, Region b) { 175 return (a.maxPos == b.maxPos); 176 } 177 178 size_t removeEqualMaxima( 179 vector<Region> ®ions, 180 int VerbosityLevel) 181 { 182 if (VerbosityLevel > 2){ 183 cout << "removeEqualMaxima:" << endl; 184 cout << "region before contains:" << endl; 185 for (unsigned int i=0; i<regions.size(); i++){ 186 cout << i <<"\t"; 187 cout << regions[i].begin <<"\t"; 188 cout << regions[i].end <<"\t"; 189 cout << regions[i].maxPos <<"\t"; 190 cout << regions[i].maxVal <<"\t"; 191 cout << endl; 192 } 193 } 194 195 vector<Region>::iterator it; 196 it = unique (regions.begin(), regions.end() , compMaxPosOfRegions); 197 regions.resize( it - regions.begin() ); 198 199 if (VerbosityLevel > 1){ 200 cout << "region now contains:" << endl; 201 for (unsigned int i=0; i<regions.size(); i++){ 202 cout << i <<"\t"; 203 cout << regions[i].begin <<"\t"; 204 cout << regions[i].end <<"\t"; 205 cout << regions[i].maxPos <<"\t"; 206 cout << regions[i].maxVal <<"\t"; 207 cout << endl; 208 } 209 } 210 return regions.size(); 211 } 212 213 214 size_t removeReginWithMaximaOnEdge( 215 vector<Region> ®ions, 216 unsigned int EdgeWidth, 217 int VerbosityLevel) 218 { 219 if (EdgeWidth < 1){ 220 if (VerbosityLevel > 0) 221 cout << "removeReginWithMaximaOnEdge: EdgeWidth < 1" << endl; 222 cout << "EdgeWidth=" << EdgeWidth << endl; 223 cout << "returning." << endl; 224 return regions.size(); 225 } 226 227 vector<Region>::iterator it = regions.begin(); 228 while( it != regions.end() ) 229 { 230 // cout << it->begin << "\t"; 231 // cout << it->maxPos << "\t"; 232 // cout << it->end << "\t"; 233 // cout << it->maxVal << endl; 234 235 if (it->maxPos < (int)(it->begin+EdgeWidth)) { 236 if (VerbosityLevel > 3) 237 cout << "erasing Region(max@left edge) " << it->maxPos << endl; 238 it = regions.erase( it ) ; 239 //++it; 240 }else if (it->maxPos > (int)(it->end-EdgeWidth)) { 241 if (VerbosityLevel > 3) 242 cout << "erasing Region(max@right edge) " << it->maxPos << endl; 243 it = regions.erase( it ) ; 244 //++it; 245 }else 246 ++it; 247 248 } 249 250 return regions.size(); 251 } 252 253 size_t removeMaximaBelow( 254 vector<Region> ®ions, 255 float threshold, 256 int VerbosityLevel) 257 { 258 if (threshold < 0){ 259 if (VerbosityLevel > 0) 260 cout << "removeMaximaBelow: threshold < 0" << endl; 261 cout << "threshold=" << threshold << endl; 262 cout << "returning." << endl; 263 return regions.size(); 264 } 265 266 vector<Region>::iterator it = regions.begin(); 267 while( it != regions.end() ) 268 { 269 if (it->maxVal < threshold ) { 270 if (VerbosityLevel > 3){ 271 cout << "removing max " << it->maxVal << "\t"; 272 cout << " @ " << it->maxPos << "\t"; 273 cout << endl; 274 } 275 it = regions.erase( it ) ; 276 }else 277 ++it; 278 } 279 280 return regions.size(); 281 } 282 283 284 //////////////// 285 ////////////// old Version of the code 286 /* 287 for (unsigned int sl = step; sl < input.size(); sl+=step){ 288 if (input[sl] * input[sl-] < 0 || input[sl]==0.0 ){ // sign change --> zero crossing OR really zero 289 290 if ( (input[sl-1] - input[sl]) * edge < 0){ // this is the crossing the user wanted 291 21 292 // check if we go lower than a certain limit in the next few slices 22 293 for ( int lala=0; lala<post; lala++){ 23 if (input[sl+lala] < -1.5) {294 if (input[sl+lala] > 1.5) { 24 295 zeroPositions->push_back(sl); 25 296 sl += lala; … … 33 304 34 305 } else { // sl and sl-1 are equal .. don't know waht do to... 35 36 } 37 38 } 306 307 } 308 309 } 39 310 40 311 } // end of loop over slices - between pre and post 41 312 42 43 return zeroPositions; 44 } 313 */
Note:
See TracChangeset
for help on using the changeset viewer.