00001 #ifndef LongMuonFinder_H
00002 #define LongMuonFinder_H
00003
00004 #include "NueAna/ParticlePID/ParticleFinder/Managed/ClusterManager.h"
00005 #include "NueAna/ParticlePID/ParticleFinder/Particle3D.h"
00006 #include "NueAna/ParticlePID/ParticleFinder/Chain.h"
00007 #include <vector>
00008 #include "Conventions/Detector.h"
00009
00010 class LongMuonFinder
00011 {
00012 public:
00013
00014 LongMuonFinder(Detector::Detector_t d);
00015 ~LongMuonFinder();
00016
00017
00018 int FindLongMuon(Managed::ClusterManager *cm);
00019
00020
00021 Particle3D* GetParticle3D(){if(foundparticle)return foundparticle3d;return 0;};
00022 Chain * GetChain(int view){if(foundparticle){if(view==2)return chain_u;if(view==3)return chain_v;}return 0;};
00023
00024
00025 int FoundSingleViewLongMuon(){return single_view_long_muon;};
00026
00027 private:
00028
00029 int CheckChainQuality(Chain *c, int view, int partialcount);
00030
00031
00032 Chain * FindMuonChain(Managed::ClusterManager *cl, int view);
00033
00034 void Reset();
00035
00036
00037 void MakeParticle3D();
00038
00039 void AbsorbMuonClusters(Chain *c,int view,double past_z);
00040 void RemoveNonMuonEnergy(Chain *c,int view,double past_z);
00041
00042
00043
00044 std::pair<int,int> CountInPartiallyInstrumentedRegion(Chain *viewU, Chain *viewV);
00045
00046 static Particle3D * foundparticle3d;
00047 int foundparticle;
00048 static Chain * chain_u;
00049 static Chain * chain_v;
00050
00051 void DumpParticle3D();
00052
00053 Managed::ClusterManager *cluster_manager;
00054
00055
00056 int single_view_long_muon;
00057 double FindIsolationZ();
00058
00059
00060
00061 void MergeChainClusters(Chain * ch, std::vector<int> *clusters);
00062
00063 int CheckChainOverlap(Chain * chain_u, Chain * chain_v, double isolation_z);
00064 void ClearFrontVertex(Chain * chain_u, Chain * chain_v);
00065 Detector::Detector_t detector;
00066
00067 int IsPartiallyInstrumented(double t, double z, int view);
00068
00069 };
00070
00071 #endif
00072