Mixed Data Coincidence Analysis Software 1.0
A program to analyze files produced by the EventMixer software.
CoincidenceFinder.cc
Go to the documentation of this file.
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 }
 All Classes Files Functions Variables Defines

Back to the main page of the Precalibrated Ion Beam Identification Detector project

Created by Rikard Lundmark