![]() |
Mixed Data Coincidence Analysis Software 1.0
A program to analyze files produced by the EventMixer software.
|
00001 #include "CoincidenceFinder.hh" 00002 00003 CoincidenceFinder::CoincidenceFinder(FileEventParser * fParser, double maxWait, int nTubes, float detEps, float minGe, float maxGe, unsigned int multiImplant, float decayCut) 00004 :multipleImplant(multiImplant), decayCutTime(decayCut), maxDecayWait(maxWait), minGeEnergy(minGe), maxGeEnergy(maxGe) 00005 { 00006 numberOfTubes = nTubes; 00007 detectorEpsilon = detEps; 00008 myParser = fParser; 00009 for(int i = 0; i<numberOfTubes; i++) 00010 { 00011 pair<list<EventHit*>, double> tmp; 00012 tmp.second=0-maxWait; 00013 myScintillatorTubes.push_back(tmp); 00014 detectorCount.push_back(0); 00015 } 00016 00017 //For statistics purpose. 00018 noHits = 0; 00019 noImplantations = 0; 00020 noDecays = 0; 00021 noOther = 0; 00022 noCorrectImplantations = 0; 00023 noDoubleHit = 0; 00024 noGeHit = 0; 00025 noNonAssociatedDecays = 0; 00026 noCorrConnected = 0; 00027 noErrConnected = 0; 00028 noDestroyedByOther = 0; 00029 noCorrCoincidence = 0; 00030 noFoundCoincidences = 0; 00031 timeSpan = 0; 00032 00033 memset(failureReasons, 0, sizeof(failureReasons)); 00034 00035 00036 FindNextCoincidence(); 00037 } 00038 00039 CoincidenceFinder::~CoincidenceFinder() 00040 { 00041 for(vector<pair<list<EventHit*>,double> >::iterator it = myScintillatorTubes.begin(); it!=myScintillatorTubes.end(); it++) 00042 { 00043 if(it->second>0) 00044 for(list<EventHit*>::iterator ig = it->first.begin(); ig!=it->first.end(); ig++) 00045 { 00046 delete *ig; 00047 } 00048 } 00049 } 00050 00051 void CoincidenceFinder::DoImplantation(EventHit * myHit) 00052 { 00053 ++noImplantations; 00054 int scNr=myHit->implantationType.affectedScintillators.front(); 00055 timeSpan = myHit->time; //in ns. 00056 if(myScintillatorTubes[scNr].second+maxDecayWait<myHit->time ) //Availible for implantation (time-out). 00057 { 00058 ++noCorrectImplantations; 00059 if(myScintillatorTubes[scNr].first.size()>=multipleImplant) //We cannot add more, yet it is availible, so it is OK to clear it. 00060 { 00061 if(myScintillatorTubes[scNr].second>0) //If we have reset the time behind zero, we shall not delete the object since this means that we have returned this event to somewhere else. 00062 for(list<EventHit*>::iterator ig = myScintillatorTubes[scNr].first.begin(); ig!=myScintillatorTubes[scNr].first.end(); ig++) 00063 { 00064 delete *ig; 00065 ig=myScintillatorTubes[scNr].first.erase(ig); 00066 ig--; 00067 } 00068 myScintillatorTubes[scNr].first.clear(); 00069 } 00070 00071 myScintillatorTubes[scNr].first.push_back(myHit); 00072 if(myScintillatorTubes[scNr].first.size()>=multipleImplant) //No more, please. 00073 myScintillatorTubes[scNr].second=myHit->time; 00074 else 00075 myScintillatorTubes[scNr].second=-maxDecayWait; //Add more, please. 00076 00077 return; 00078 } 00079 else //not availible for implantation, delete all elements and mark as unavailible. 00080 { 00081 ++noDoubleHit; 00082 myScintillatorTubes[scNr].second=myHit->time; //mark it as unavailible for an even longer time. 00083 delete myHit; 00084 for(list<EventHit*>::iterator ig = myScintillatorTubes[scNr].first.begin(); ig!=myScintillatorTubes[scNr].first.end(); ig++) 00085 { 00086 delete *ig; 00087 } 00088 myScintillatorTubes[scNr].first.clear(); 00089 return; 00090 } 00091 } 00092 00093 int CoincidenceFinder::DoDecay(EventHit * myHit) 00094 { 00095 ++noDecays; 00096 int toReturn = 0; 00097 if(myHit->Ge>detectorEpsilon) 00098 { 00099 ++noGeHit; 00100 } 00101 00102 if(!myScintillatorTubes[myHit->implantationType.affectedScintillators.front()].first.empty() && myHit->time - myScintillatorTubes[myHit->implantationType.affectedScintillators.front()].second < decayCutTime) //This decay can be associated with one/more specific implantation(s), hooray! 00103 { 00104 bool corrConnected = false; 00105 00106 for(list<EventHit*>::iterator ig = myScintillatorTubes[myHit->implantationType.affectedScintillators.front()].first.begin(); ig!=myScintillatorTubes[myHit->implantationType.affectedScintillators.front()].first.end(); ig++) 00107 { 00108 if((*ig)->eventno==myHit->eventno) 00109 { 00110 corrConnected = true; 00111 ++noCorrConnected; 00112 } 00113 else 00114 { 00115 ++noErrConnected; 00116 } 00117 } 00118 00119 //Now, if we could only have the gamma energy... 00120 if(myHit->Ge>minGeEnergy && myHit->Ge<maxGeEnergy) 00121 { 00122 //Now we have coincidence beta-gamma. Let's store the both events, and clean up. 00123 for(list<EventHit*>::iterator ig = myScintillatorTubes[myHit->implantationType.affectedScintillators.front()].first.begin(); ig!=myScintillatorTubes[myHit->implantationType.affectedScintillators.front()].first.end(); ig++) 00124 { 00125 nextCoincidence.push_back(make_pair(*ig,myHit)); 00126 ++toReturn; 00127 } 00128 myMoreCoincidences = true; 00129 ++detectorCount[myHit->implantationType.affectedScintillators.front()]; 00130 if(corrConnected) 00131 ++noCorrCoincidence; 00132 } 00133 myScintillatorTubes[myHit->implantationType.affectedScintillators.front()].first.clear(); 00134 00135 myScintillatorTubes[myHit->implantationType.affectedScintillators.front()].second=-maxDecayWait; 00136 } 00137 else 00138 { 00139 ++noNonAssociatedDecays; 00140 } 00141 00142 return toReturn; 00143 } 00144 00145 void CoincidenceFinder::DoOther(EventHit * myHit) 00146 { 00147 ++noOther; 00148 if(myHit->implantationType.affectedScintillators.size()<4) 00149 { 00150 for(vector<int>::iterator it = myHit->implantationType.affectedScintillators.begin(); it!=myHit->implantationType.affectedScintillators.end(); it++) 00151 { 00152 for(list<EventHit*>::iterator ig = myScintillatorTubes[*it].first.begin(); ig!=myScintillatorTubes[*it].first.end(); ig++) 00153 { 00154 if(myScintillatorTubes[*it].second>0) 00155 { 00156 delete *ig; 00157 noDestroyedByOther++; 00158 } 00159 ig=myScintillatorTubes[*it].first.erase(ig); 00160 ig--; 00161 } 00162 myScintillatorTubes[*it].second=myHit->time; //Block. 00163 } 00164 } 00165 delete myHit; 00166 return; 00167 } 00168 00169 void CoincidenceFinder::FindNextCoincidence() 00170 { 00171 if(!nextCoincidence.empty()) 00172 return; 00173 myMoreCoincidences=false; 00174 EventHit * myHit; 00175 while(myParser->hasMoreEvents() && (myHit = myParser->getNextEventHit())!=NULL) 00176 { 00177 ++noHits; 00178 if(myHit->implantationType.statvar>0) 00179 ++failureReasons[myHit->implantationType.statvar-1]; 00180 00181 if(myHit->implantationType.wasImplantation) //Implantation into one and only one scintillator. 00182 { 00183 DoImplantation(myHit); 00184 continue; 00185 } 00186 if(myHit->implantationType.wasDecay)//Decay in one and only one of the scintillators. 00187 { 00188 int add = DoDecay(myHit); 00189 if(add>0) 00190 { 00191 noFoundCoincidences+=add; 00192 return; 00193 } 00194 else 00195 continue; 00196 } 00197 if(myHit->implantationType.wasOther) 00198 { 00199 DoOther(myHit); 00200 } 00201 } 00202 } 00203 00204 pair<EventHit*, EventHit*> CoincidenceFinder::getNextCoincidence() 00205 { 00206 pair<EventHit*, EventHit*> toReturn = nextCoincidence.front(); 00207 nextCoincidence.erase(nextCoincidence.begin()); 00208 FindNextCoincidence(); 00209 return toReturn; 00210 } 00211 00212 int CoincidenceFinder::getFailureReason(int reason) 00213 { 00214 return failureReasons[reason]; 00215 } 00216 00217 int CoincidenceFinder::getNoImplantations() 00218 { 00219 return noImplantations; 00220 } 00221 00222 int CoincidenceFinder::getNoDecays() 00223 { 00224 return noDecays; 00225 } 00226 00227 double CoincidenceFinder::getTimeSpan() 00228 { 00229 return timeSpan; 00230 } 00231 00232 int CoincidenceFinder::getNoOther() 00233 { 00234 return noOther; 00235 } 00236 00237 int CoincidenceFinder::getNoCorrectImplantations() 00238 { 00239 return noCorrectImplantations; 00240 } 00241 00242 int CoincidenceFinder::getNoDoubleHit() 00243 { 00244 return noDoubleHit; 00245 } 00246 00247 int CoincidenceFinder::getNoGeHit() 00248 { 00249 return noGeHit; 00250 } 00251 00252 int CoincidenceFinder::getNoNonAssociatedDecays() 00253 { 00254 return noNonAssociatedDecays; 00255 } 00256 00257 int CoincidenceFinder::getNoCorrConnected() 00258 { 00259 return noCorrConnected; 00260 } 00261 00262 int CoincidenceFinder::getNoErrConnected() 00263 { 00264 return noErrConnected; 00265 } 00266 00267 int CoincidenceFinder::getNoDestroyedByOther() 00268 { 00269 return noDestroyedByOther; 00270 } 00271 00272 int CoincidenceFinder::getNoCorrCoincidence() 00273 { 00274 return noCorrCoincidence; 00275 } 00276 00277 int CoincidenceFinder::getNoFoundCoincidences() 00278 { 00279 return noFoundCoincidences; 00280 } 00281 00282 int CoincidenceFinder::getNoHits() 00283 { 00284 return noHits; 00285 } 00286 00287 bool CoincidenceFinder::hasMoreCoincidences() 00288 { 00289 return myMoreCoincidences; 00290 } 00291 00292 vector<int> CoincidenceFinder::getDetectorCount() 00293 { 00294 return detectorCount; 00295 }